Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.092 c
1-79834
karburator
2004-02-10 11:05
2004.02.25
Как узнать путь к программе из запущенного ею потока?


14-80234
LordOfSilence
2004-02-06 09:39
2004.02.25
Взрыв в московском метро


3-79640
makz
2004-02-01 08:29
2004.02.25
Что делать с CONTAINING?


3-79675
Zorik
2004-01-30 13:51
2004.02.25
DLL и приложение


1-79949
Khabibulin
2004-02-13 21:38
2004.02.25
ShellExecute





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский