Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.25;
Скачать: CL | DM;

Вниз

Вопрос к знатокам FIBPlus   Найти похожие ветки 

 
Boroda Oleg   (2004-02-02 13:05) [0]

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

Имеется 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..."
Почему? И как этого можно избежать?


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

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

Какой?


 
MV   (2004-02-02 13:18) [2]

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

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


 
Johnmen ©   (2004-02-02 13:21) [3]

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


 
MV   (2004-02-02 13:23) [4]

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


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

Да, на 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, а у меня его нету, исходника в смысле.


 
Johnmen ©   (2004-02-02 14:02) [6]

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


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

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


 
MV   (2004-02-02 15:28) [8]

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

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

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


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

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


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

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


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

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

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

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;


 
MV   (2004-02-02 17:22) [12]

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

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

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


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

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


 
MV   (2004-02-02 17:25) [14]

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


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

А на что же?


 
MV   (2004-02-02 17:50) [16]

"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)",


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

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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.02.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
14-80290
Miwa
2004-02-03 11:30
2004.02.25
F4 не работает...


14-80125
EAlexander
2004-02-02 17:22
2004.02.25
IE


14-80158
syte_ser78
2004-01-27 17:24
2004.02.25
Новая ОС от микрософта


1-79994
Oleg_
2004-02-13 13:47
2004.02.25
drowing not allowed


3-79607
Michail Dalakov
2004-02-02 17:51
2004.02.25
upWhereKeyOnly?