Форум: "Базы";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизВопрос к знатокам 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.03 c