Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.13;
Скачать: CL | DM;

Вниз

try... except   Найти похожие ветки 

 
Vint ©   (2002-05-20 13:02) [0]

Уважаемые мастера, помогите пожалуйста у кого есть свободная минутка, что я делаю неправильно?

Переношу данные, при появлении одинаковых индексов надо обработать "Key violation" и продолжить копирование ...

пытаюсь сделать что-то вот так:

Form85.Table1.First;

while not Form85.Table1.Eof do
begin
Form1.Table1.Insert;
Form1.Table1.Edit;
try
Form1.Table1.FieldByName... := Form85.Table1.FieldByName...;
.
.
.
except
on EDBEngineError do
MessageDlg("Ошибка записи",
mtWarning, [mbOk], 0);

Form1.Table1.Post;
Form85.Table1.Delete;
end;
end
else
Form85.Table1.Next;
end;


 
Destroyer   (2002-05-20 13:08) [1]

А что не работает, какую ошибку выдает? По ходу дела все неправильно...


 
Vint ©   (2002-05-20 13:23) [2]

>Destroyer (20.05.02 13:08) спасибо Вам :-)

Все работает, только при появлении записи с одинаковым значением выдается "Key violation",
а мне надо чтобы перенос данных не прерывался этим сообщением, а запись вызывающая ошибку осталась во второй таблице (Form85).


 
Destroyer   (2002-05-20 13:32) [3]

1. Зачем Edit после Insert? Ведь Insert и так переводит таблицу в режим редактирования...
2. Ошибка должна возникать при вызове метода Post, а я его в теле Try не наблюдаю.
3. К чему относится else?????


 
Vint ©   (2002-05-20 14:34) [4]

>Destroyer (20.05.02 13:32)

Да Вы правы, я немного напутал когда копировал из программы.
Прошу меня простить

while not Form85.Table1.Eof do
begin
Form1.Table1.Insert;
try
Form1.Table1.FieldByName... := Form85.Table1.FieldByName...;
.
.
.
except
on EDBEngineError do
MessageDlg("Ошибка записи",
mtWarning, [mbOk], 0);

end;
Form1.Table1.Post;
Form85.Table1.Delete;

end;
Form85.Table1.Next;
end;

Вот вроде так. Вопрос в том, куда вставить
try ...
except
чтобы не прерывалось копирование?


 
Jony ©   (2002-05-20 16:25) [5]

А не появляется ли это сообщение на Form1.Table1.Post; Ведь ты пытаешься сохранить ошибочную запись уже в except. Там скорей Cancel ставить надо.


 
Vint ©   (2002-05-20 16:51) [6]

>Jony © (20.05.02 16:25)
объясните пожалуйста, если можно с примером,я просто никогда не работал с try ... except и ни как не могу с ним разобраться...

Таблица проиндексирована, как сделать чтобы перенос данных не прерывался, а одинаковые записи (которые вызывают "Key violation") остались во второй таблице?


 
Anatoly Podgoretsky ©   (2002-05-20 17:05) [7]

Post и Delete должны быть дo учсузе, вообще это программа сплошная ошибка, второй вариант просто немного лучше


 
Cranium ©   (2002-05-20 17:10) [8]

Все просто
try
{Исолняемы код в котором может возникнуть Исключение (ошибка)}
Table1.Post;

except
{тут прописываешь код который нужно выполнить в случае возникновения ошибки к примеру}
MessageDlg("Ошибка при записи в Базу!!!!", mtConfirmation, [mbYes, mbNo], 0)
end;


 
Vint ©   (2002-05-20 17:19) [9]

>Anatoly Podgoretsky © (20.05.02 17:05)

Сделал, как Вы написали...
вылетает мое сообщение ("Ошибка записи") и на этом прог. зацикливается...
снимаю задачу, таблица пустая.


 
Anatoly Podgoretsky ©   (2002-05-20 17:20) [10]

Наверно у тебя еще много ошибок осталось, последний код никто не видел


 
Vint ©   (2002-05-20 17:22) [11]

>Cranium © (20.05.02 17:10)

А где писать Form85.Table1.Next,
до или после except?


 
Vint ©   (2002-05-20 17:27) [12]

>Anatoly Podgoretsky © (20.05.02 17:20)

Вот мой код:

Form85.Table1.First;

while not Form85.Table1.Eof do
begin
if Form85.Table1.FieldByName("N_PAKT").AsInteger = 0 then
begin
try
Form1.Table1.Insert;

{Здесь приравниваются поля из Form85.Table1 в Form1.Table1}

m := m+1;
Form1.Table1.Post;
Form85.Table1.Delete;
except
on EDBEngineError do
MessageDlg("Ошибка записи",mtWarning, [mbOk], 0);
end;

end
else
Form85.Table1.Next;

Gauge1.Progress := Gauge1.Progress + 1;
end;



 
Anatoly Podgoretsky ©   (2002-05-20 17:44) [13]

А где отмена операции при ошибке - Cancel?
Next вообще почему то срабатывает по условию else предполагается снятие задачи только по трем кнопкам. Лишнии begin end, что отнюдь не облегчает понимание. Вывод диалога в агрегатной процедуре не завидую оператору.


 
Lusha ©   (2002-05-20 17:45) [14]

>Vint © (20.05.02 17:19)
вылетает мое сообщение ("Ошибка записи") и на этом прог. зацикливается...

И правильно делает. Цикл то пока не Eof, а в обработчике исключительной ситуации только выдача сообщения... Перемещаться по набору данных кто будет, Пушкин?


 
Vint ©   (2002-05-20 18:32) [15]

>Anatoly Podgoretsky © (20.05.02 17:44)

> не завидую операторуСпасибо за критику ...
только диалог :
on EDBEngineError do MessageDlg("Ошибка записи",mtWarning, [mbOk], 0);
мне вообще не нужен, я его просто из примера взял.

где отмена операции при ошибке - Cancel?, а где она должна быть???



>Lusha © (20.05.02 17:45)

Перемещаться по набору данных кто будет, Пушкин?
перемещаюсь с помощью Next, или я чего не понял?
а except я хочу использовать, чтобы не вылетал "Key violation Error" вернее чтобы не прерывался перенос данных.






 
Anatoly Podgoretsky ©   (2002-05-20 19:01) [16]

Cancel должен быть в процедуре обработки ошибки, а в ней также желательно сделать счетчик необработаных.
Перемещаться то ты перемещаесься, но только по условию N_PAKT = 0 в остальных случаях твоя программа висит.
Ты бы сел с карандашом, наривовал бы схемку и проиграл в уме операци, очень поможет, сразу начнешь понимать, что делаешь и что надо делать, только просмотри все варианты ошибок.


 
Vint ©   (2002-05-20 19:14) [17]

>Anatoly Podgoretsky © (20.05.02 19:01)
нет, нет!!!
она не висит, понимаете данные переносятся из Form85 в Form1, но не все, а только те котрые "N_PAKT" = 0

т.е. я делаю Delete и курсор уходит на следующую запись!

а если "N_PAKT" <> 0 тогда Next, и запись остается в таблице в Form85


 
Vint ©   (2002-05-20 19:19) [18]

>Anatoly Podgoretsky © (20.05.02 19:01)

> Cancel должен быть в процедуре обработки ошибки, а в ней также желательно сделать счетчик необработаных.
Да это все я понял, но только как это сделать???
если я пишу Cancel так:
except
on EDBEngineError do
MessageDlg("Ошибка записи",mtWarning, [mbOk], 0);
Cancel;
end;
то компилятор дает ошибку :-)



 
dimis   (2002-05-20 20:14) [19]

надо вынести код добавления записи в отдельную функцию и в ней делать try except
а в основной процедуре делать итерации по form85.Table1.Тогда будет работать
а еще лучше просто написать нормальный SQL запрос, который сделает все автоматически


 
Anatoly Podgoretsky ©   (2002-05-20 20:26) [20]

Form1.Table1.Cancel;

else
Form85.Table1.Next;
Другого .Next; нет
Ты бы попробовал сначала выпольнить все на бумаге, то этих проблем бы не было, а было бы полное понимание


 
Vint ©   (2002-05-20 20:58) [21]

Неее, наверно я такой тупой, ничего с этим неподелаешь!
>Anatoly Podgoretsky © (20.05.02 20:26)
Все сделал как написали все равно Key violation выскакивает.
Ты бы попробовал сначала выпольнить все на бумаге
да что тут представлять, что за сверх сложный алгоритм то!
Издеваетесь что ли?

>dimis (20.05.02 20:14)
написать нормальный SQL запрос
немогу!!! ключевое поле формируется на ходу, во время переброски, в зависимости от содержимого нескольких полей в таблице и даты.

Может еще какие идеи есть :-)


 
Vint ©   (2002-05-20 21:42) [22]

>Anatoly Podgoretsky © (20.05.02 20:26)

Прошу простить, заработался!
Ошибку обрабатывал компилятор, приложение работает!
УРА РАБОТАЕТ, УРААААА!!!


Всем большое спасибо!


 
Anatoly Podgoretsky ©   (2002-05-20 21:51) [23]

Vint © (20.05.02 20:58)
Да какое там и в мыслях не было.
Просто для такого простого кода на удивление много ошибок и непонимания



Страницы: 1 вся ветка

Текущий архив: 2002.06.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
1-40102
maxim2
2002-06-03 10:13
2002.06.13
Как выключить и перезагрузить комп из проги


3-39976
Abu
2002-05-20 17:37
2002.06.13
изменения в ячейках Grid-a


4-40209
KoLega
2002-04-11 23:09
2002.06.13
А как програмно удалить файл, чтобы он не попадал в корзину?


7-40192
Sasha9
2002-02-24 13:51
2002.06.13
Вопрос Реальным Мастерам


3-39931
Катерина
2002-05-18 13:16
2002.06.13
Общий тип поля