Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > БД Paradox


Автор: Spawn 27.6.2002, 13:31
Я рештил настройки меню загружать и сохранять в базу данных(Paradox).
Насколько я понял для того, чтобы загрузить данные из БД нужно использовать
DataSourse и Table(или Query, если надо взять часть данных), но я не могу понять как сохранить данные в БД. К примеру у меня есть DBCheckBox1. После компиляции и активизации формы в него автоматически идет закрузка того статуса, который был установлен в БД(False или True, соответственно cbUnchecked и cbChecked). Но как произвести сохранение изменение
изменения статуса DBCheckBox1? Подскажите ПЛЗ для меня енто очень важно.
:baaa

Автор: VoL 27.6.2002, 13:35
Вообще, сохранение должно производиться автоматически при переходе на другое поле: Table.Next

Автор: VoL 27.6.2002, 13:36
Когда я делал с этим боксом, у меня вес работало... Правда я использовал dbase IV

Автор: Spawn 27.6.2002, 13:50
Дело в том, что когда я в активной форме нажимаю на ДБЧекБокс, то смены его статуса не происходит!!!

Автор: Vit 27.6.2002, 14:16
Table1.post;

Автор: VoL 27.6.2002, 14:25
А ты уверен, что там не стоит какого-либо запрета, типа ReadOnly?

Автор: Spawn 27.6.2002, 15:09
Цитата(VoL @ 27.6.2002, 15:25)
А ты уверен, что там не стоит какого-либо запрета, типа ReadOnly?

Уже исправил. Ошибка была в Active=False :)
Но встала другая проблема:
если делать так, как сказал Vit то появляется сообщение об ошибке(типа того, что "таблица находится не в режиме редактирования или вставки", хотя ReadOnly стоит в False).

Автор: Vit 27.6.2002, 15:46
Так тебе надо проверять, и делать post только в случае режима Edit - т.е. если информация была изменена.

Автор: Spawn 27.6.2002, 17:25
На счет Query:
Когда я делаю запрос в таблицу, которая имеет значение полей типа String, то все нормально загружает в DBGrid:

Select Name FROM AdminBase

Но если таким же способом пататься загрузить данные типа Boolean(поставить True на Active), то возникает Еррор:'Invalid use of keyword'
В чем может быть дело?

Автор: Spawn 27.6.2002, 18:26
Попробовал так, но се равно Еррор:

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.State=cbChecked then
  begin
    with Table1 do begin
      Active:=True;
      Edit;
      FieldByName('Stet').AsBoolean:=True;
      Post;
     Active:=False;
   end;
 end
else begin
 with Table1 do begin
   Active:=True;
   Open;
   Edit;
   FieldByName('Stet').AsBoolean:=false;
   Post;
  Active:=False;
 end;
end;
end;

Автор: Spawn 27.6.2002, 20:21
Цитата(Spawn @ 27.6.2002, 19:26)
Попробовал так, но се равно Еррор:

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.State=cbChecked then
  begin
    with Table1 do begin
      Active:=True;
      Edit;
      FieldByName('Stet').AsBoolean:=True;
      Post;
     Active:=False;
   end;
 end
else begin
 with Table1 do begin
   Active:=True;
   Open;
   Edit;
   FieldByName('Stet').AsBoolean:=false;
   Post;
  Active:=False;
 end;
end;
end;

А все дело в том, что надо было кое-что подделать и запускать не из Делфи так как в ентом случае 2 приложения юзают БД и возникал еррор :)  :)  :)

Автор: Vit 27.6.2002, 20:57
Я что-то не понял ты используешь TDBCheckBox или TCheckBox?

Автор: Spawn 27.6.2002, 21:39
Цитата(Vit @ 27.6.2002, 21:57)
Я что-то не понял ты используешь TDBCheckBox или TCheckBox?

И то и другое :)  :)
Я пробую разные варианты :)

Автор: Vit 27.6.2002, 22:02
C TCheckBox этот код должен работать:
Код

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 Table1.active:=true;
 Table1.First;
 Table1.edit;
 Table1.FieldByName('Stet').AsBoolean:=CheckBox1.checked;
 try
   Table1.post;
 except
   on e:exception do
     begin
       showmessage(e.message);
       Table1.cancel;
     end;
 end;
 Table1.active:=false;
end;

Только в таблице должна быть хотя бы одна запись, если таблица пустая то код работать не будет, так как тогда надо не редактировать а вставлять запись.

Автор: Spawn 28.6.2002, 07:07
В своей проге я сделал так что, при регистрации нового пользователя данные записываются в БД, но потом при вводе пароля для входа под своим ником, вход происходит только после второго нажатия на кнопку:

{Связь с таблицей данных осуществляется на стадии OnCreate формы 2}
...
AName:=Edit1.Text; //Записать имя из Едит.Текста1
APass:=Edit2.Text; //Записать пароль из Едит.Текста2
Table1.Open;    //Открыть таблицу
if PageControl1.ActivePage=TabSheet1 then //если превая страница открыта ...
...
{код проверки на заполнение полей ввода данных с именем и пасом}
...
if not Table1.IsEmpty then begin
 repeat
  if (AName=Table1.FieldByName('Name').AsString) and
(APass=Table1.FieldByName('Pass').AsString) then //Если логин и пасс совпадают...
  begin
     Form1.label65.Caption:=AName;        //на Форме 1 вывести имя Админа
     Close;                        //Закрыть Форму
  end
 until not Table1.FindNext;
Table1.Close;
end;

регистрация нового пользователя осуществляется из формы 3:

...
with Form2.Table1 do begin
   Open;
   Insert;
   FieldByName('Name').AsString:=Edit1.Text;
   FieldByName('Pass').AsString:=Edit2.Text;
   Post;
 end;{наверно надо запихнуть в try .. except}
...

Из за чего же после регистрации нового юзера при вводе пароля в форме 2 он активизируется только после второго раза?(хотя в последующие разы с первого)

Автор: Spawn 28.6.2002, 10:29
Цитата(Spawn @ 28.6.2002, 08:07)
В своей проге я сделал так что, при регистрации нового пользователя данные записываются в БД, но потом при вводе пароля для входа под своим ником, вход происходит только после второго нажатия на кнопку:

{Связь с таблицей данных осуществляется на стадии OnCreate формы 2}
...
AName:=Edit1.Text; //Записать имя из Едит.Текста1
APass:=Edit2.Text; //Записать пароль из Едит.Текста2
Table1.Open;    //Открыть таблицу
if PageControl1.ActivePage=TabSheet1 then //если превая страница открыта ...
...
{код проверки на заполнение полей ввода данных с именем и пасом}
...
if not Table1.IsEmpty then begin
 repeat
  if (AName=Table1.FieldByName('Name').AsString) and
(APass=Table1.FieldByName('Pass').AsString) then //Если логин и пасс совпадают...
  begin
     Form1.label65.Caption:=AName;        //на Форме 1 вывести имя Админа
     Close;                        //Закрыть Форму
  end
 until not Table1.FindNext;
Table1.Close;
end;

регистрация нового пользователя осуществляется из формы 3:

...
with Form2.Table1 do begin
   Open;
   Insert;
   FieldByName('Name').AsString:=Edit1.Text;
   FieldByName('Pass').AsString:=Edit2.Text;
   Post;
 end;{наверно надо запихнуть в try .. except}
...

Из за чего же после регистрации нового юзера при вводе пароля в форме 2 он активизируется только после второго раза?(хотя в последующие разы с первого)

Мне пришла в голову идея, что возможно ето возникает из за того, что после вставки новых данных(Insert) они ставятся на первое место в таблице, а курсор видимо переходит во вторую строку, поетому возможно и возникает ета проблема. Можно как нить установить куроср в БД на первую строку?

Автор: Spawn 28.6.2002, 11:32
Цитата(Spawn @ 28.6.2002, 11:29)
Цитата(Spawn @ 28.6.2002, )
В своей проге я сделал так что, при регистрации нового пользователя данные записываются в БД, но потом при вводе пароля для входа под своим ником, вход происходит только после второго нажатия на кнопку:

{Связь с таблицей данных осуществляется на стадии OnCreate формы 2}
...
AName:=Edit1.Text; //Записать имя из Едит.Текста1
APass:=Edit2.Text; //Записать пароль из Едит.Текста2
Table1.Open;    //Открыть таблицу
if PageControl1.ActivePage=TabSheet1 then //если превая страница открыта ...
...
{код проверки на заполнение полей ввода данных с именем и пасом}
...
if not Table1.IsEmpty then begin
 repeat
  if (AName=Table1.FieldByName('Name').AsString) and
(APass=Table1.FieldByName('Pass').AsString) then //Если логин и пасс совпадают...
  begin
     Form1.label65.Caption:=AName;        //на Форме 1 вывести имя Админа
     Close;                        //Закрыть Форму
  end
 until not Table1.FindNext;
Table1.Close;
end;

регистрация нового пользователя осуществляется из формы 3:

...
with Form2.Table1 do begin
   Open;
   Insert;
   FieldByName('Name').AsString:=Edit1.Text;
   FieldByName('Pass').AsString:=Edit2.Text;
   Post;
 end;{наверно надо запихнуть в try .. except}
...

Из за чего же после регистрации нового юзера при вводе пароля в форме 2 он активизируется только после второго раза?(хотя в последующие разы с первого)

Мне пришла в голову идея, что возможно ето возникает из за того, что после вставки новых данных(Insert) они ставятся на первое место в таблице, а курсор видимо переходит во вторую строку, поетому возможно и возникает ета проблема. Можно как нить установить куроср в БД на первую строку?

Так и есть все дело в позиции курсора: стоило поставить First в нужное место и все стало Ок :)  :)  :)

Автор: Fantasist 28.6.2002, 14:53
Честно говоря, Дельфийские таблицы мне не очень нравятся, ровно как и DBкомпоненты типа DBGrid и т. п. На мой взгляд, удобнее работать с Query через SQL. Чаще всего, все-таки, удобнее изменять значение в базе данных не сразу после клика на какой-нибудь CheckBox, а после смены активной записи(условно говоря). Тут ты и формируешь либо 'INSERT INTO', либо 'UPDTE' на данных своих контролов.

Автор: Spawn 3.7.2002, 06:38
Я ни как не могу понять, в чем же ошибка занесения в БД новых данных:

...
if not Table1.IsEmpty then
begin
 repeat
 if (AName=Table1.FieldByName('Name').AsString) and (APass=Table1.FieldByName('Pass').AsString) then      //Если логин и пасс совпадают...
  begin
 if (Form1.Label65.Caption<>'')and(Form1.Label65.Caption=AName) then
     begin
      Table1.Edit;    {Редактировать запись}
      for j:=1 to 3 do  {цикл Чекбоксов}
       begin
        if CheckBx[j].State=cbUnchecked then            
          Table1.FieldByName(Field[j]).AsBoolean:=False  {если чекбоксы отжаты тогда False в таблице}
        else
          Table1.FieldByName(Field[j]).AsBoolean:=True; {иначе True}
       end;{for do}
       Table1.Post; {Послать изменения}
       Table1.Close;
       Close;       {Закрыть форму}
     end {if then}
     else     {иначе}
      begin
       Form1.label65.Caption:=AName; //на Форме 1 вывести имя Админа
       Close;                        //Закрыть Форму
      end;
  end   {тело repeat}
  until not Table1.FindNext;
...

Во время входа нового пользователя(набора пароля и имени ) все нормально, но как только совпадает условие(соответственно выполняются действия в етом блоке):


 if (AName=Table1.FieldByName('Name').AsString) and (APass=Table1.FieldByName('Pass').AsString) then      //Если логин и пасс совпадают...
  begin
 if (Form1.Label65.Caption<>'')and(Form1.Label65.Caption=AName) then
     
то пишет еррор: "невозможно производить какие-либо действия с закрытой БД", хотя БД на стадии OnCreat входит в состояние Active:=True и в сомой программе ни где не закрывается.

В чем может быть дело?

Автор: МММ 3.7.2002, 07:16
Пришли исходняки на мыло, можу посмотреть и сделать. Ты только скажи а как ты собираешься пароли то прятать, шифровать, если молжно любым вьювером твою базу открыть и пароли посмотреть!!! в чем смысл то?

Автор: МММ 3.7.2002, 07:26
Орс !!! у тебя же база парадокс там можно пароль ставить, звиняюсь косячок!! :sarcasm

Автор: Spawn 4.7.2002, 19:32
Цитата
Пришли исходняки на мыло, можу посмотреть и сделать. Ты только скажи а как ты собираешься пароли то прятать, шифровать, если молжно любым вьювером твою базу открыть и пароли посмотреть!!! в чем смысл то?

Спасибо, но я уже нашел ошибку :) : все дело в том, что вот в етом месте таблица закрывалась:

...
        if CheckBx[j].State=cbUnchecked then            
          Table1.FieldByName(Field[j]).AsBoolean:=False  {если чекбоксы отжаты тогда False в таблице}
        else
          Table1.FieldByName(Field[j]).AsBoolean:=True; {иначе True}
       end;{for do}
       Table1.Post; {Послать изменения}
       Table1.Close;
...
а затем шла проверка на конец записи в таблице, но так как она была уже закрыта, то это приводило к ошибке:
...
 until not Table1.FindNext;
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)