Форум: "Базы";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c