Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Вниз

Глюк с DBGridEh? Или со мной что-то не то?   Найти похожие ветки 

 
supersan   (2003-06-09 12:38) [0]

Господа, здавствуйте. Никто не встречался с такой ситуацией?
Есть Datamodule, там расположен набор для соединения с Interbase, в частности, есть таблица ibtWB. Есть форма, на которой, в числе прочих, есть DBGridEh, соединенная с этой таблицей (в частности, есть еще и TDBLookupComboboxEh, но они с ней не соединены). У этой таблицы описаны обработчики ibtWBBeforeInsert и ibtWBBeforePost (опять-таки, в числе прочих). Код, конечно, я могу привести, но он, почти уверен, роли не играет. Так вот, после обработки ibtWBBeforeInsert САМОПРОИЗВОЛЬНО вызывается ibtWBBeforePost, хотя никаких предпосылок в моем коде для этого нет. Трассировка показала, что начинается выполнение множества действий в модулях DBGridEh и DBLookupEh (все до конца я их не прошел, терпежу не хватило). И вот после выполнения в них каких-то действий (?) и происходит вызов ibtWBBeforePost.
Собственно вопрос: никто с таким же делом не сталкивался, а если да, то получилось ли исправить, а если да, то каким образом (если не секрет)?
PS Вроде версия EhLib 3.0
PPS Не хотелось бы от DBGridEh отказываться... :-/


 
Zacho   (2003-06-09 12:44) [1]

Imho, DBGridEh к этому не причастен - просто BeforePost вызывается перед Post и в случае редактирования и в случае вставки, так что все нормально.


 
supersan   (2003-06-09 12:59) [2]

Дак в том-то и дело, что я и не пытаюсь постить. Только-только начинаю добавлять запись, вызывается ibtWBBeforeInsert, НИКАК не делаю поста, т.е. не использую никаких из действий:
1. Вызов в программе метода Post
2. Скроллинг в DBGridEh
3. Нажатие на кнопку Post в DBNavigator"е
ну то есть совсем ничего!!! Оно само вызывается!!!
Я уж в ауте, столько времени на это дело угрохал. Может, еще есть какие соображения?


 
Johnmen   (2003-06-09 13:10) [3]

Видимо, присутствует неявный вызов Post. Надо ковырять свой код...:)
А DBGridEh в "чистом" виде, конечно же, непричем...


 
roottim   (2003-06-09 13:18) [4]

отключи от НД ешгрид.. прицепи обычный..
сделай все теже действия... получиш 2 варианта твоего трабла
1. это твой глюк..
2. это действительно еш-глюк
а далее думай


 
supersan   (2003-06-09 13:36) [5]

2 Johnmen © (09.06.03 13:10)
Доковырялся до того, что вообще выбросил данные обработчики. Все равно при попытке вставить запись происходит Пост. Следовательно, это не в моем коде ошибка.
Да, еще забыл. Кроме этой таблицы, также присутствуют еще несколько подобных таблиц, с которыми происходит то же самое.
Если исключить неправильность в EhLib, то, получается, что ошибка еще где-то.
Вообще-то, у меня Дэльфа в последнее время глючила, может, в этом дело? Я, конечно, переставлю, если надо будет, просто много возни, поэтому хочу исключить другие варианты. Будут еще какие идеи?


 
supersan   (2003-06-09 13:41) [6]

2 roottim (09.06.03 13:18)
Действительно, что-то сам не вздогадался :-(. Но сделал так. И при добавлении в простом Гриде то же самое. В своем коде я ошибку исключил (см. supersan © (09.06.03 13:36)), также дело, получается, и не в Еш.
Что делать еще посоветуете?


 
Zacho   (2003-06-09 14:06) [7]


> supersan © (09.06.03 13:41)

Еще неявно Post может вызываться в OnNewRecord датасета или в обработчиках событий подключенного к нему DataSource. Проверь.


 
Соловьев   (2003-06-09 14:18) [8]


> supersan © (09.06.03 13:41)

попробуй просто положить на форму компонеты доступа к бд и грид и вставить запись.


 
supersan   (2003-06-09 14:18) [9]

У DataSource нет вообще никаких обработчиков, у той таблицы есть OnNewRecord, его код:

procedure TfmCard.ibtWBNewRecord(DataSet: TDataSet);
begin
DataSet.FieldByName("DATE_PR").AsDateTime:=SysDate;
DataSet.FieldByName("DATE_UV").AsDateTime:=SysDate;
DataSet.FieldByName("STAG_L").AsInteger:=0;
DataSet.FieldByName("STAG_M").AsInteger:=0;
DataSet.FieldByName("STAG_D").AsInteger:=0;
end;

Вроде ничего такого криминального? Но что характерно, до этого обработчика дело-то вообще не доходит!!! Повторяю, вызывается ibtWBBeforeInsert, потом СРАЗУ ibtWBBeforePost, хотя, по логике, должен хотя бы вызваться OnNewRecord. Но ничего такого нет, в чем и подписуюсь.
Еще какие мысли?
PS: SysDate - глобальная переменная типа TDateTime


 
Zacho   (2003-06-09 14:23) [10]


> supersan © (09.06.03 14:18)

Может быть, есть какие-либо обработчики у полей ?
Еще вариант: посмотри, что происходит вообще без DB-Aware компанентов, при вызове Insert из программы, может наведет на какие-нибудь мысли.


 
supersan   (2003-06-09 14:49) [11]

Попробовал совет Соловьев © (09.06.03 14:18), т.е. положил на форму TIBTable1, TDataSource1, TDBGrid1, связал их все, назначил TIBTable1 те же обработчики, что и для DM.ibtWB (DM - это Датамодуль). Все работает, т.е. корректно вызывается все подряд обработчики: ibtWBBeforeInsert, ibtWBNewRecord, и потом при посте - ibtWBBeforePost. Одновременно с этим DM.ibtWB не работает опять (ibtWBBeforeInsert, потом сразу ibtWBBeforePost).
Интересно, почему, может, это с Датамодулем связано?
Попробовал совет Zacho © (09.06.03 14:23, т.е. сделал кнопку, написал

procedure TfmCard.Button1Click(Sender: TObject);
begin
DM.ibtWB.Insert;
end;

Опять вызвало ibtWBBeforeInsert, потом сразу ibtWBBeforePost.
Еще какие идеи будут?


 
Sandman25   (2003-06-09 15:10) [12]

Попробуйте убрать обработчик BeforeInsert и добавить запись. Если самопроизвольного BeforePost не произойдет, значит, ошибка в убранном коде.


 
supersan   (2003-06-09 15:21) [13]

2 Sandman25 © (09.06.03 15:10)
Попробовал. Самопроизвольный BeforePost имеет место. Причем на нем зацикливается (т.е. BeforePost, BeforePost, ...)
Еще идеи?


 
roottim   (2003-06-09 15:27) [14]

всетаки выложи код обработчиков
и вызов вставки


 
supersan   (2003-06-09 15:34) [15]

2 roottim (09.06.03 15:27)
Ок, уболтал, но ничего интересного в них быть не должно, ведь без Датамодуля работает (см supersan © (09.06.03 14:49))
Итак:

procedure TfmCard.ibtWBBeforeInsert(DataSet: TDataSet);
begin
ShowState(dataset,"BeforeInsert");
HideTabbed(1);{}
DM.ibtCard.AfterScroll:=nil;{}
end;

procedure TfmCard.ibtWBNewRecord(DataSet: TDataSet);
begin
ShowState(dataset,"NewRecord");
DataSet.FieldByName("DATE_PR").AsDateTime:=SysDate;
DataSet.FieldByName("DATE_UV").AsDateTime:=SysDate;
DataSet.FieldByName("STAG_L").AsInteger:=0;
DataSet.FieldByName("STAG_M").AsInteger:=0;
DataSet.FieldByName("STAG_D").AsInteger:=0;
end;

procedure TfmCard.ibtWBBeforePost(DataSet: TDataSet);
begin
ShowState(dataset,"BeforePost");{}
DataSet.FieldByName("Deleted").AsString:="0";
end;

procedure TfmCard.ShowState (dataset: tdataset; s: string);
begin
showmessage(GetState(dataset)+": "+GetDataSet(dataset)+"."+s);
end;

function TfmCard.GetState (Dataset: TDataSet): string;
begin
case DataSet.State of
dsInactive: Result:="dsInactive";
dsBrowse: Result:="dsBrowse";
dsEdit: Result:="dsEdit";
dsInsert: Result:="dsInsert";
dsSetKey: Result:="dsSetKey";
dsCalcFields: Result:="dsCalcFields";
dsFilter: Result:="dsFilter";
dsNewValue: Result:="dsNewValue";
dsOldValue: Result:="dsOldValue";
dsCurValue: Result:="dsCurValue";
dsBlockRead: Result:="dsBlockRead";
dsInternalCalc: Result:="dsInternalCalc";
dsOpening: Result:="dsOpening";
end;
end;

function TfmCard.GetDataSet (DataSet: TDataSet): string;
var
t: TIBTable;
begin
Result:="Unknown table";
t:=TIBTable(Dataset);
if t=DM.ibtCard then Result:="ibtCard";
if t=DM.ibtKoef then Result:="ibtKoef";
if t=DM.ibtWB then Result:="ibtWB";
if t=DM.ibtPens then Result:="ibtPens";
if t=DM.ibtPV then Result:="ibtPV";
end;

procedure TfmCard.HideTabbed (n: integer);
var
i: integer;
begin
for i:=0 to pgMain.PageCount-1 do begin
if i<>n
then pgMain.Pages[i].TabVisible:=false;
end;
end;

Вот, вроде и все с этим делом связанное. Еще раз повторюсь, что без Датамодуля все обработчики работают корректно


 
roottim   (2003-06-09 15:56) [16]

а без этого
procedure TfmCard.ibtWBBeforeInsert(DataSet: TDataSet);
begin
ShowState(dataset,"BeforeInsert");
HideTabbed(1);{}
DM.ibtCard.AfterScroll:=nil;{}
end;


 
Sandman25   (2003-06-09 16:19) [17]

>Попробовал. Самопроизвольный BeforePost имеет место. Причем на нем зацикливается (т.е. BeforePost, BeforePost, ...)
Еще идеи?

Зацикливание говорит о том, что есть не 1 ошибка (или глюк), а скорее всего целых 2. Сначала лучше добиться исчезновения зацикливания. Попробуйте сделать обработчик BeforePost без присваивания DataSet.FieldByName("Deleted").AsString:="0";
а только с выводом диагностического сообщения. Когда зацикливание исчезнет, можно будет подумать, почему вызывается BeforePost там, где вроде бы еще не должен.



 
supersan   (2003-06-09 16:29) [18]

2 roottim (09.06.03 15:56)
2 Sandman25 © (09.06.03 16:19)
Если внимательно посмотреть supersan © (09.06.03 13:36), то можно заметить, что я вообще пробовал обработчики не присваивать, все равно зацикливается (где ДатаМодуль используется, без Датамодуля, повторюсь, работает и с теми же обработчиками нормально), так что дело вообще неизвестно в чем. Лично у меня идеи уже кончились :-(


 
Sandman25   (2003-06-09 16:45) [19]

Переустановите Delphi. Если стандартный Datamodule дуркует, то остается только это.


 
Sandman25   (2003-06-09 16:46) [20]

Кстати, а Вы пробовали установите breakpoints на каждом обработчике и пройти пошагово?


 
Silver_   (2003-06-09 16:48) [21]


> procedure TfmCard.ibtWBBeforeInsert(DataSet: TDataSet);
> begin
> ShowState(dataset,"BeforeInsert");
> HideTabbed(1);{}
> DM.ibtCard.AfterScroll:=nil;{}
> end;


Поясни подчеркнутое зачем?


 
supersan   (2003-06-09 17:17) [22]

2 Sandman25 © (09.06.03 16:46)
Пробовал, не помогает (см supersan © (09.06.03 12:38), там есть
мое ошибочное, как выяснилось, мнение, что виноваты EhLib компоненты, пытался с помощью трассировки отследить и зафиксить баги)
2 Silver_ © (09.06.03 16:48)
Это для того, чтобы можно было отфильтровать значения детайл-таблиц (т.к. ibtCard для них мастер) (раньше структуру этой части БД можно было посмотреть здесь http://delphimaster.net/view/3-1052124788/, но ее почему-то удалили :-(). Недавно я научился использовать MasterSource и MasterFields свойства у подчиненных таблиц, но обработчик ibtCardAfterScroll все равно остался, т.к. там еще кое-какие нужные действия выполняются. Так яснее? Все равно ведь на Пост и Инсерт это дело не влияет.
Может, действительно, Дельфу переставить? Жалко...


 
AlexGreG   (2003-06-10 08:43) [23]

перейди на D6 и IB 6.x



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

Форум: "Базы";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.009 c
14-7715
UserName
2003-06-15 00:52
2003.07.03
Подскажите плиз


14-7686
Дмитрий К.К.
2003-06-17 07:44
2003.07.03
Именинники 17 июня


1-7414
Oleg
2003-06-23 09:50
2003.07.03
Аварийное завершение программы


9-7284
K@zzel
2003-01-21 16:54
2003.07.03
Просто вопрос


1-7530
Ilg
2003-06-21 12:34
2003.07.03
TWinControl и наследование





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский