Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка ошибок 
:(
    Опции темы
santilaas
Дата 23.4.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 322
Регистрация: 28.8.2005
Где: Блага

Репутация: нет
Всего: нет



Ситуация такая: имеется форма, на ней DBGridEh и 3 кнопки (Кнопка1 - DM.DataSet1.Append, Кнопка2 - DM.DataSet1.Edit, Кнопка3 - DM.DataSet1.Delete). Поскольку форма содержит всего несколько полей, нет необходимости создавать для неё диалоговую форму ввода данных. Данные редактируются непосредственно в самом DBGridEh-е. Но тут у меня возникла проблема - как отслеживать правильность ввода данных (например, на случай уникальности значений одного из полей)?
т.е куда поставить блок try...except.  


--------------------
[
PM MAIL   Вверх
TheCetus
Дата 24.4.2006, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: нет
Всего: 2



try
// dm.dataset1.edit;
// dm.dataset1.delete;
  dm.dataset1.append;
except
//  dm.dataset1.cancel;
// ничего не делаем
  dm.dataset1.cancel;
end;
 
PM MAIL   Вверх
Dynamic
Дата 24.4.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 2
Всего: 15



santilaas, опять не в тот форум залез smile  


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
santilaas
Дата 30.4.2006, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 322
Регистрация: 28.8.2005
Где: Блага

Репутация: нет
Всего: нет



Цитата

try
// dm.dataset1.edit;
// dm.dataset1.delete;
  dm.dataset1.append;
except
//  dm.dataset1.cancel;
// ничего не делаем
  dm.dataset1.cancel;
end;
 - так я пробовал - не идёт.
Я вот думаю надо как-то проверять ошибки именно перед тем, как запись запостится. 


--------------------
[
PM MAIL   Вверх
Юзверь
Дата 30.4.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 5.2.2006
Где: IF.UA

Репутация: нет
Всего: нет



а события датасета "before post" или самого грида (не работал с таким)
а там ручками проверить?
типа Onbeforepost
try
   post
except
........
end
beforeInsert
............


или я не понял в чем проблема 
PM MAIL ICQ   Вверх
Vit
Дата 30.4.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Переназнать Exception от Application 


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
santilaas
Дата 2.5.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 322
Регистрация: 28.8.2005
Где: Блага

Репутация: нет
Всего: нет



Цитата
 а события датасета "before post" или самого грида (не работал с таким)
а там ручками проверить?
типа Onbeforepost
try
   post
except 
 - я делал что-то подобное и после except ставил ShowMessage('Ошибка');, но Delphi
ругается на ShowMessage (говорит - неизвестная переменная, типа того) - мож это из-за того, что у меня MDI-приложение и DataSet активизируется при OnCreate Child-формы?!  

Все реально, когда есть дополнительная форма для ввода, и там, если нажата "OK", тогда выполняется
код:
Код
try
    DM.DataSet1.Post
except
    ShowMessage('Бла бла бла');
    DM.DataSet1.Cancel;
end;

- а чтобы в DBGrid-е?   


--------------------
[
PM MAIL   Вверх
Alex
Дата 10.5.2006, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Сейчас будет много не согласных, но при вводе данных напрямую в грид обеспечить нормальную работу программы чрезвычайно сложно, а если строить грамотную обработку ошибок, так это выходит просто колоссальный труд. Мой вам совет не ленитесь, создавайте формы редактирования.

Но если уж так прям, приспичило, то у каждого поля (field) существует обработчик OnValidate
Цитата

Occurs just before the data is written to the record buffer.
 
Class 
TField 

Syntax 


[Delphi] property OnValidate: TFieldNotifyEvent;


Description 
Write an OnValidate event handler to validate changes made to the data in the field, just before the data is written to the current record buffer. The EditMask property allows validation of the data on a character by character basis while it is being entered by the user. OnValidate allows an application to validate the data as a whole. 
When the value of a field component is assigned programmatically, validation by the EditMask is bypassed, since there is no data-aware control to enforce adherence to the mask. OnValidate allows an application to validate such data before it is posted to the database table.
 
To reject the current value of the field from the OnValidate event handler, raise an exception.
 
When writing the value of a field to the current record buffer, the following steps occur:
 
1The OnValidate event handler is called to validate the data. 
2If the OnValidate event handler does not raise an exception, the data is written to the current record buffer. 
3If writing the data does not raise an exception, the OnChange event handler is called to allow a response to the change.



Добавлено @ 01:42 
У компонентов DataSet есть событие OnPostError  

Это сообщение отредактировал(а) Alex - 10.5.2006, 01:45


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
santilaas
Дата 14.5.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 322
Регистрация: 28.8.2005
Где: Блага

Репутация: нет
Всего: нет



Спасибо, за советы, но все же:
в нескольких случаях я не хочу делать дополнительных форма ввода данных и редактирую данные 
в самом DBGridEh-е:

А вопрос у меня такой:
в onBeforePost соответствующего DataSet-а проверяю значение поля на Null - всё работает,
а как там же проверить это значение на уникальность (т.е если такое значение уже есть в таблице, вывести сообщение) - сравнивать в цикле со всеми записями (это я думаю не очень рациональный подход) или как-то по-другому? 


--------------------
[
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.