Форум: "Базы";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
ВнизОбработка Событий TTable Найти похожие ветки
← →
MishaS (2003-03-28 17:02) [0]Имеется таблица Paradox :
Id:первичный ключ, autoincrement
Name:Alpha(50)
N: LongInteger
F:Number
Все поля должны быть обязательно заполнены
Редактирование данных выполняется прямо в TDBGrid, который вязан с Table3 . Как предотвратить следующую ситуацию:
создана новая запись, но не все поля в ней заполнены и производится попытка создать ещё одну запись или перейти на одну из уже существующих. Для этого я написал в обработчике
события OnAfterScroll следующий код, но это не помогло
procedure TForm1.Table3AfterScroll(DataSet: TDataSet);
Var R_C:Integer;
Num:Integer;
begin
//ShowMessage("OnBeforeSkroll");
R_C:=Form1.Table3.RecordCount;
Num:=Form1.Table3.RecNo;
Form1.Caption:="T3RecCount="+IntToStr(R_C)+" Num="+IntToStr(Num);
Form1.Caption:="T3RecCount="+IntToStr(R_C)+" Num="+IntToStr(Num);
if (Trim(Table3.FieldByName("Name").AsString)="")or
(Form1.Table3.FieldByName("F").AsFloat<0)or
(Trim(Form1.Table3.FieldByName("F").AsString)="")or
(Form1.Table3.FieldByName("N").AsString="") then
Begin
If(R_C<>0)and(not(Table3.Eof))then
Begin
ShowMessage("Ошибка при перемещении");
Abort;
end;
end;
end;
← →
Mike Kouzmine (2003-03-28 17:05) [1]BeforeInsert
if Pole1.isNull or Pole2.isNull .... then Abort; Или что-то в этом роде.
← →
MishaS (2003-03-28 17:16) [2]Я попробовал, но это не помогло
procedure TForm1.Table3BeforeInsert(DataSet: TDataSet);
begin
if(Table3.FieldByName("Name").isNull)or
(Table3.FieldByName("N").isNull)or
(Table3.FieldByName("F").isNull)
then
Begin
ShowMessage("Ошибка");
Abort;
end;
← →
Leran2002 (2003-03-28 17:22) [3]Попробуй запихать этоже в OnAfterPost - до сохранения записи...
← →
Mike Kouzmine (2003-03-28 17:26) [4]А если raise Exception.Create("ОШИБКА")
← →
MishaS (2003-03-28 17:29) [5]Я пробовал всёэто запихать в onAfterPost, но это не помогло.
← →
MsGuns (2003-03-28 17:40) [6]Причем здесь AfterPost, усли надо проверка ДО (Before) ?
← →
MsGuns (2003-03-28 17:44) [7]Вообще, если хочешь минимум траблов при коррекции таблиц Парадокс прямо через грид (ИМХО, это самый гиблый способ), грид должен быть при просмотре в состоянии ReadOnly, а переходить в
режим доступа к редактированию по "кнопкам". После каждого постирования или отмены грид переводить в ReadOnly.
← →
MishaS (2003-04-01 11:54) [8]А если я буду кешировать таблицу, то как узнать о внесённых изменениях до сохранения или отмены
← →
Johnmen (2003-04-01 12:10) [9]>MsGuns © (28.03.03 17:44)
Весьма спорное заявление, Серега...
← →
MishaS (2003-04-01 12:16) [10]Т.е. какие события надо обрабатывать. И ещё такой вопрос, почему
при кешировании в тех полях DBGrid, для которых заданы значения по умолчанию ничего не появляется.
← →
MsGuns (2003-04-01 12:36) [11]>Johnmen © (01.04.03 12:10)
>Весьма спорное заявление, Серега...
Спорить, конечно, можно, но не нужно ;)
← →
Johnmen (2003-04-01 12:40) [12]1. MsGuns © (28.03.03 17:40) + Abort
2. Где заданы значения по умолчанию ? И вообще-то в DBGrid полей нет :)))
← →
MsGuns (2003-04-01 12:42) [13]>MishaS © (01.04.03 12:16
>Т.е. какие события надо обрабатывать
Если все же хочешь "ловить" переходы на с измененной/добавленной записи на другую (по кнопкам Arrow или клику юзера), то BeforePost должна тебе помочь. Причем, если переход нежелателен, то выход из обработчика делается не Exit`от? а Abort`ом
>при кешировании в тех полях DBGrid, для которых заданы значения по умолчанию ничего не появляется.
Грид не кэшируется и у нет не может быть никаких значений по умолчанию. Все это относится к набору данных.
← →
MishaS (2003-04-01 12:55) [14]Значения по умолчанию заданы у меня в таблице. Я пробовал, но Abort не ромогает
← →
MsGuns (2003-04-01 13:05) [15]>MishaS © (01.04.03 12:55)
>Значения по умолчанию заданы у меня в таблице. Я пробовал, но Abort не ромогает
Странно все это. Такое чувство, что грид у тебя реагирует на изменения, а датасет нет. Проверь связку TTable>TDataSource>TDBGrid. Чтоб везде стояло ReadOnly = false.
Да, и для эксперимента убери CachedUpdates
← →
zacho (2003-04-01 13:54) [16]
> MishaS © (01.04.03 12:55)
> Я пробовал, но Abort не ромогает
Приведи код полностью.
← →
MishaS (2003-04-01 14:31) [17]MsGuns, без CachedUpdates у меня значения по умолчанию сразу же
отображаются.
Код обработчика:
procedure TForm1.Table3BeforePost(DataSet: TDataSet);
begin
if(Table3.FieldByName("Name").isNull)or
(Table3.FieldByName("N").isNull)or
(Table3.FieldByName("F").isNull)
then
Begin
ShowMessage("Ошибка");
Abort;
end;
end;
Мне нужно, чтобы переход на другую запись был невозможен до тех пор, пока пользователь не заполнит все поля только что созданной
записи. Для достижения данной цели мной используется DBGrid,
DataSet, Table
← →
Соловьев (2003-04-01 14:38) [18]
> пользователь не заполнит все поля только что созданной
> записи.
а выставить у полей NOT NULL?
← →
MishaS (2003-04-01 14:45) [19]а выставить у полей NOT NULL?
Я это сделал ещё в DBDesctop при создании таблицы
← →
Соловьев (2003-04-01 14:55) [20]так у тебя при сохранении должна выскакивать ошибка если ты не ввел чего-то...
← →
MishaS (2003-04-01 15:03) [21]Она у меня и выскакивает. А я пытаюсь сделать, чтобы выскакивала
не она, а выолнялась её обработка кодом, написанным мною
← →
Соловьев (2003-04-01 15:06) [22]
try
except
end;
← →
MishaS (2003-04-01 15:45) [23]А какую ошибку там обрабптывать и как. И ещё, можно ли как-нибудь получить номер записи, которая была текущей
← →
Соловьев (2003-04-01 15:59) [24]
> А какую ошибку там обрабптывать и как.
когда идет сохранение.
try
...
Table.Post
except
//тут отлавливать код ошибки
end;
← →
MishaS (2003-04-01 16:28) [25]Я также раньше делал.
procedure TForm1.DataSource3DataChange(Sender: TObject; Field: TField);
Begin
try
if (Table3.State=dsInsert)then Table3.Post;
except
ShowMessage("Ошибка");
Abort;
end;
end;
Но в этом случае ошибка выскакивает когда выполняется метод
Insert, т.к. в результате его действия создаётся пустая запись.
И мне надо каким-то образом отследить, что она только создалась.
← →
MsGuns (2003-04-01 17:05) [26]>MishaS © (01.04.03 16:28)
Боже тебя упаси использовать события датасорса для подобных целей ! Зацикливания и подвисаниями компа (BDE+Парадокс, блин !)при попытках вернуться в дельфи тебе гарантированы !
Тебе же сказали:
1. Использовать BeforePost
В котором:
- если запись пустая давать Cancel (если узер просто нажал Down на последней записи курсора, а потом типа хочет вернуться разад), после чего abort
- если запись не пустая, то проверка всех нужных условий (непонятно, правда, зачем тогда в DBD указывал обязательность)
При ошибке мессага и abort. Если все Ok, то выход по exit
- кэширование изменений на фиг !
А вообще наморочишься ты с этим делом пока не послушаешь выстраданного совета. См. MsGuns © (28.03.03 17:44)
Никаких редактирование таблиц (не запросов) в гриде для Парадокса !!!!
НИ ОДНОЙ БУМАГИ НА СТОЛЕ !
(Г.Жеглов)
:))))))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.17;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.009 c