Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос к знатокам FIBPlus [D7, IB6.x]


Boroda Oleg ©   (2004-02-02 13:05:00) 

Вопрос такого плана:

Имеется TpFIBDataSet. Поля базы посредством TDataSource выложены на форму компонентами типа TDBEdit, TDBDateEdit, TDBComboBox и т.д. В самой TpFIBDataSet в SelectSQL встраивается запрос на получение из базы одной записи. Все это делается для того, чтобы автоматически обновлялась база, т.е. меняются значения в визуальных компонентах - автоматом они меняются и в таблице - не нужно голову забивать. :))
При активации формы с визуальными компонентами в Form.Activate выполняются следующие функции:

DM.IBDataSet.Close;
DM.IBDataSet.SelectSQL.Clear;
DM.IBDataSet.SelectSQL.Add("SELECT * FROM ACCOUNT");
DM.IBDataSet.SelectSQL.Add("WHERE ID_ACCOUNT = "+IntToStr(GlobalID));
DM.IBDataSet.Open;

При выполнении комманды DM.IBDataSet.Open возникает ошибка "DataSet not in Edit or Insert mode..."
Почему? И как этого можно избежать?


Boroda Oleg   (2004-02-03 11:04:00) [1]

Блин, нашел.
Действительно, на onChange, у CheckBox. Он сволочуга в конец затесался, я его нашел только когда начал отрубать все подряд чтобы вычислить из-за чего сыпется программа.

Спасибо всем за помощь!!!


Boroda Oleg   (2004-02-02 20:31:00) [2]

При вызове ChangeViewAdd изменяется только несколько Label, которые к БД никакого отношения не имеют.

А насчет EditSQL и InsertSQL - действительно, ошибка другой быть должна


MV   (2004-02-02 17:50:00) [3]

"DataSet not in Edit or Insert mode..."

он бы сказал что-то из:

"Can""t insert into dataset. (%s)",
"Can""t post. (%s) ",
"Can""t update. (%s)",
"Can""t delete from dataset. (%s)",
"Can""t refresh row. (%s)",


Соловьев   (2004-02-02 17:44:00) [4]

А на что же?


MV   (2004-02-02 17:25:00) [5]

Ну, ты и подколол... TpFIBDataSet не на это же ругается!


Соловьев   (2004-02-02 17:23:00) [6]

Читать про TpFIBDataSet.AutoUpdateOptions
Или все-таки заполнить не только RefreshSQL, но и EditSQL, InsertSQL


MV   (2004-02-02 17:22:00) [7]

А что происходит при вызове:

ChangeViewAdd(DM.IBDataSet.FieldByName("EXPORT").AsInteger,DM.IBDataSet.FieldByName("POSTTOV").AsInteger);

НЕ ИЗМЕНЯЕТЕ ЛИ ВЫ ТАМ ЭТИ ПОЛЯ?


Boroda Oleg   (2004-02-02 17:12:00) [8]

Ну, весь - это и топика не хватит :))

Сделал вырезку со всеми основными функциями:

procedure TfDogEdit.BitBtn1Click(Sender: TObject);
begin
NeedPost(DM.DataSource.DataSet);
end;

procedure TfDogEdit.FormActivate(Sender: TObject);
begin
DM.IBDataSet.Close;
DM.IBDataSet.SelectSQL.Clear;
DM.IBDataSet.SelectSQL.Add("SELECT * FROM ACCOUNT");
DM.IBDataSet.SelectSQL.Add("WHERE ID_ACCOUNT = "+IntToStr(GlobalID));
DM.IBDataSet.RefreshSQL.Clear;
DM.IBDataSet.RefreshSQL.Add("SELECT * FROM ACCOUNT");
DM.IBDataSet.RefreshSQL.Add("WHERE ID_ACCOUNT = "+IntToStr(GlobalID));
DM.IBDataSet.Open;
ChangeViewAdd(DM.IBDataSet.FieldByName("EXPORT").AsInteger,DM.IBDataSet.FieldByName("POSTTOV").AsInteger);

Edit1.Text:=intToStr({GlobalID}uu);

BL_DE3:=true;
end;

procedure TfDogEdit.Calculator;
begin
NeedEdit(DM.IBDataSet);
DM.IBDataSet.FieldByName("DATZAKON").AsDateTime:=DM.IBDataSet.FieldByName("DATOTGRUZ").AsDateTime+10;

end;

procedure TfDogEdit.DBDateEdit3Change(Sender: TObject);
begin
IF not (DM.IBDataSet.State in [dsEdit, dsInsert]) then exit;
if BL_DE3 then Calculator(Sender);
end;

procedure TfDogEdit.FormCreate(Sender: TObject);
begin
BL_DE3:=false;
end;

procedure TfDogEdit.FormDeactivate(Sender: TObject);
begin
BL_DE3:=false;
end;


Соловьев   (2004-02-02 15:54:00) [9]

Ок. Сделал.
Приведи полностью код


Boroda Oleg   (2004-02-02 15:52:00) [10]

1. Ок. Сделал. Глюк все равно остался.
2. Да, триал. 4.8.1, вроде как. Еще не определился, нужен ли он мне на самом деле, да и с покупкой были проблеммы.


MV   (2004-02-02 15:28:00) [11]

1. Ты, парень, не мудри, а в .onChange сделай в самом начале проверку -

IF not (Dataset.State in [dsEdit, dsInsert] then exit;

2. А почему у тебя нет исходника? Триал, что ли, юзаешь?


Boroda Oleg   (2004-02-02 14:12:00) [12]

В момент входа в процедуру Form.Activate ключ BL_DE3 - false. Перед самым выполнением DM.IBDataSet.Open - тоже.
Т.е. или деактивайт отрабатывает как надо, или до него еще дело не дошло, в любом случае, ошибка возникает явно не из-за этого.


Johnmen   (2004-02-02 14:02:00) [13]

Это всё потому, что деактивейт не срабатывает.
Вообще, забудь про него !


Boroda Oleg   (2004-02-02 13:53:00) [14]

Да, на OnChange висит событие которое вызывает изменение ячеек, только вот ограничено оно на исполнение ключом. В общем виде все выглядит где-то так:

var BL_DE3 : boolean

Form.Create
BL_DE3:=false;

Form.Deactivate
BL_DE3:=false;

Form.Activate
DM.IBDataSet.Close;
...
DM.IBDataSet.Open;
BL_DE3:=true;

DBComponent.onChange
if BL_DE3 then Calculator;

Т.е. не должен onChange отрабатывать, т.к. процедура отлова события срабатывает только в случае значения BL_DE3 - true, а так может быть только если окно уже стало активным. Если только onChange не пытается сам перевести базу в положение Edit.
Только что проверил цепь еще раз - ошибка вылазит после отработки IBDataSet.DoBeforeOpen, в модуле FIBDataSet.pas, а у меня его нету, исходника в смысле.


MV   (2004-02-02 13:23:00) [15]

Да я не на Activate, я думаю, у него что-то на OnChange висит. Ох уж эти мне любители автоматического...


Johnmen   (2004-02-02 13:21:00) [16]

1. На IBDataSet висит какое-то событие, связанное с Open.
2. На Form висит какое-то событие, изменяющее состояние IBDataSet.
3. А так ли надо вешать на Activate ?


MV   (2004-02-02 13:18:00) [17]

Может быть, какие-то обработчика событий на OnChange или т.п. срабатывают при активизации формы? Если так, то перед выполнением своего "автоматического" обновления выполняй проверки типа:

if DataSet.State in [dsEdit, dsInsert] then begin
DataSet.FieldByName(Field1Name).Value := ...;
...
DataSet.Post;
end


Соловьев   (2004-02-02 13:17:00) [18]

При выполнении комманды ...

Какой?


Наверх

Титульная страница Поиск, карта сайта Написать письмо