Форум: "Базы";
Текущий архив: 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.008 c