Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.51 MB
Время: 0.009 c
14-54874
Leon Crom
2003-04-01 19:58
2003.04.17
а вот что такое IQ...


1-54595
Roki
2003-04-04 09:45
2003.04.17
Как в TreeView при DragDrop узнать что узел может принять ветку?


4-54944
Шишкин Илья
2003-02-17 15:56
2003.04.17
Как получить список dll, используемых программой?


3-54471
Sirus
2003-03-24 07:22
2003.04.17
Как программно сделать Interbase shutdown???


9-54386
drhdh
2002-11-15 18:09
2003.04.17
Учебник





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