Обработка исключений

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Обработка исключений

Сообщение Алексей »

Есть функция _TRY которой можно ловить исключения.

Есть интерфейс - браузер по таблице.
При нажатии ф7 вызывается окно для редактировния записи этой таблицы. Проставляются значения по умолчанию.

При попытке вставить запись cmInsertRecord вылетает ошибка о дублировании. Обрабатываем исключение.
Как сделать так что бы программа осталась в этом виндове и уже введённые значения не потерялись?
Т.е. что бы она не вылетала в браузер?
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Покажите, как связаны _try и cmInsertRecord?

Зачем встала нужда обрабатывать исключение?

Какие там потенциальные проблемы у Вас могут возникать кроме дублирования?

Чем не устраивает просто

if (insert current Table1 <> 0)
...// обработка ситуации

Вы слишком долго программировали на другом языке, наверное, а Галактика не балует всякими best practice...
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

А предварительную проверку (чтобы не нарываться на такие "исключения") делать лучше в cmCheckRecord
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

1. Да пытаюсь при дублировании индекса, остатся в том же window а не вываливаться обратно в браузер. А всёж вываливается.

2. cmCheckRecord Т.е. делать гетфёртс по синониму с этим же кодом и смотреть если есть запись каким событием остатся в window?
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Нет, cmCheckRecord, не поможет остаться в окне.
Нужно понять - когда мы из окна обратно в браузер возвращаемся?

Информация к размышлению

Закрытию окна можно противостоять в cmClose окна

Не стоит ли у окна атрибут doAccept
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

Window wEditCatalog 'Редактирование справочника';
doAccept не стоит.
У самого интерфейса тоже
У браузера стоит Browse catals (,, sci1478EnEsc);

Пытаюсь при инсёрте ставить флажок в тру.
А cmClose по-этому флажку делать стоп.
Всё равно не получается. Окно закрывается и я оказываюсь в браузере с потерей всех введённых ранее в окне полей.

Может вы имели в виду другой способ "предотвращеня закрытию window"? :-(
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Алексей писал(а): Пытаюсь при инсёрте ставить флажок в тру.
А cmClose по-этому флажку делать стоп.
Не, при инсерте поздно флажок ставить. cmInsertRecord происходит когда уходим на другую запись, а закрытие окна раньше происходит.

можно в самом cmInsertRecord снова вызывать окно

if (insert current table1 <> 0)
runwindow...
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

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

события
cmInsertRecord
cmCheckRecord
происходят после закрытия окна

а вот checkfield во время ухода с поля и вот в этот делаю проверку с введённым полем в таблицу на её синоним и если нахожу такую запись то командой abort остаюсь в том поле.

Вроде бы проблема решилась
Да, как то всё сложно с событиями...
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Сообщение Max_Fin »

в событии проверку и в ней в нужном случае.
тогда цепочка последующих событий не будет выполняться
Жду выхода Вселенная 2.12!
Goblin
Местный житель
Сообщения: 474
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь-матушка
Контактная информация:

Сообщение Goblin »

coolibin писал(а):... best practice...
Аксаптоид Вы наш :-)
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Goblin писал(а): Аксаптоид Вы наш :-)
Тяжелый Вы наш патологический...
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Обработка исключений

Сообщение RAJAH »

Пытаюсь разобраться, как обрабатывать исключения.

Код: Выделить всё

_try
  {
    mc_view.insert mc_pos set
      mc_pos.fkom:=true,
      mc_pos.fkol:=zamkol,
      mc_pos.fnrec:=mcpos_view;
  }
  _except
    on ExDbDuplicateKey:
    {
message(mat);
    }
Почему-то после сообщения message(mat) всё равно появляется предупреждение о дублированном значении уникального ключа. Как можно его подавить?
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

Re: Обработка исключений

Сообщение n0where »

Код: Выделить всё

_try
  {
    mc_view.insert mc_pos set
      mc_pos.nrec := 0,
      mc_pos.fkom:=true,
      mc_pos.fkol:=zamkol,
      mc_pos.fnrec:=mcpos_view;
  }
  _except
    on ExDbDuplicateKey:
    {
message(mat);
    }
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Обработка исключений

Сообщение RAJAH »

n0where писал(а): mc_pos.nrec := 0
У меня такого поля нет. Уникальный индекс у fnrec, и оно не автоинкрементно.
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Обработка исключений

Сообщение Masygreen »

Код: Выделить всё

mc_pos.nrec := GetNextNREC(#mc_pos, 0);
Время ведет!
Ответить