Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка Событий TTable [D5, Paradox]


Страницы:   1 2

MishaS ©   (2003-03-28 17:02:00) 

Имеется таблица 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;


MsGuns   (2003-04-01 17:05:00) [1]

>MishaS © (01.04.03 16:28)

Боже тебя упаси использовать события датасорса для подобных целей ! Зацикливания и подвисаниями компа (BDE+Парадокс, блин !)при попытках вернуться в дельфи тебе гарантированы !

Тебе же сказали:
1. Использовать BeforePost
В котором:
- если запись пустая давать Cancel (если узер просто нажал Down на последней записи курсора, а потом типа хочет вернуться разад), после чего abort
- если запись не пустая, то проверка всех нужных условий (непонятно, правда, зачем тогда в DBD указывал обязательность)
При ошибке мессага и abort. Если все Ok, то выход по exit
- кэширование изменений на фиг !

А вообще наморочишься ты с этим делом пока не послушаешь выстраданного совета. См. MsGuns © (28.03.03 17:44)
Никаких редактирование таблиц (не запросов) в гриде для Парадокса !!!!

НИ ОДНОЙ БУМАГИ НА СТОЛЕ !
(Г.Жеглов)

:))))))


MishaS   (2003-04-01 16:28:00) [2]

Я также раньше делал.
procedure TForm1.DataSource3DataChange(Sender: TObject; Field: TField);
Begin
try
if (Table3.State=dsInsert)then Table3.Post;
except
ShowMessage("Ошибка");
Abort;
end;
end;
Но в этом случае ошибка выскакивает когда выполняется метод
Insert, т.к. в результате его действия создаётся пустая запись.
И мне надо каким-то образом отследить, что она только создалась.


Соловьев   (2003-04-01 15:59:00) [3]


> А какую ошибку там обрабптывать и как.

когда идет сохранение.
try
...
Table.Post
except
//тут отлавливать код ошибки
end;


MishaS   (2003-04-01 15:45:00) [4]

А какую ошибку там обрабптывать и как. И ещё, можно ли как-нибудь получить номер записи, которая была текущей


Соловьев   (2003-04-01 15:06:00) [5]

try
except
end;


MishaS   (2003-04-01 15:03:00) [6]

Она у меня и выскакивает. А я пытаюсь сделать, чтобы выскакивала
не она, а выолнялась её обработка кодом, написанным мною


Соловьев   (2003-04-01 14:55:00) [7]

так у тебя при сохранении должна выскакивать ошибка если ты не ввел чего-то...


MishaS   (2003-04-01 14:45:00) [8]

а выставить у полей NOT NULL?
Я это сделал ещё в DBDesctop при создании таблицы




Соловьев   (2003-04-01 14:38:00) [9]


> пользователь не заполнит все поля только что созданной
> записи.

а выставить у полей NOT NULL?


MishaS   (2003-04-01 14:31:00) [10]

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



zacho   (2003-04-01 13:54:00) [11]


> MishaS © (01.04.03 12:55)
> Я пробовал, но Abort не ромогает

Приведи код полностью.


MsGuns   (2003-04-01 13:05:00) [12]

>MishaS © (01.04.03 12:55)
>Значения по умолчанию заданы у меня в таблице. Я пробовал, но Abort не ромогает

Странно все это. Такое чувство, что грид у тебя реагирует на изменения, а датасет нет. Проверь связку TTable>TDataSource>TDBGrid. Чтоб везде стояло ReadOnly = false.
Да, и для эксперимента убери CachedUpdates


MishaS   (2003-04-01 12:55:00) [13]

Значения по умолчанию заданы у меня в таблице. Я пробовал, но Abort не ромогает


MsGuns   (2003-04-01 12:42:00) [14]

>MishaS © (01.04.03 12:16
>Т.е. какие события надо обрабатывать

Если все же хочешь "ловить" переходы на с измененной/добавленной записи на другую (по кнопкам Arrow или клику юзера), то BeforePost должна тебе помочь. Причем, если переход нежелателен, то выход из обработчика делается не Exit`от? а Abort`ом


>при кешировании в тех полях DBGrid, для которых заданы значения по умолчанию ничего не появляется.

Грид не кэшируется и у нет не может быть никаких значений по умолчанию. Все это относится к набору данных.


Johnmen   (2003-04-01 12:40:00) [15]

1. MsGuns © (28.03.03 17:40) + Abort
2. Где заданы значения по умолчанию ? И вообще-то в DBGrid полей нет :)))


MsGuns   (2003-04-01 12:36:00) [16]

>Johnmen © (01.04.03 12:10)
>Весьма спорное заявление, Серега...

Спорить, конечно, можно, но не нужно ;)


MishaS   (2003-04-01 12:16:00) [17]

Т.е. какие события надо обрабатывать. И ещё такой вопрос, почему
при кешировании в тех полях DBGrid, для которых заданы значения по умолчанию ничего не появляется.


Johnmen   (2003-04-01 12:10:00) [18]

>MsGuns © (28.03.03 17:44)

Весьма спорное заявление, Серега...


MishaS   (2003-04-01 11:54:00) [19]

А если я буду кешировать таблицу, то как узнать о внесённых изменениях до сохранения или отмены


MsGuns   (2003-03-28 17:44:00) [20]

Вообще, если хочешь минимум траблов при коррекции таблиц Парадокс прямо через грид (ИМХО, это самый гиблый способ), грид должен быть при просмотре в состоянии ReadOnly, а переходить в
режим доступа к редактированию по "кнопкам". После каждого постирования или отмены грид переводить в ReadOnly.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо