Страница 1 из 2

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

Добавлено: 15 ноя 2006, 10:42
Алексей
Есть функция _TRY которой можно ловить исключения.

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

При попытке вставить запись cmInsertRecord вылетает ошибка о дублировании. Обрабатываем исключение.
Как сделать так что бы программа осталась в этом виндове и уже введённые значения не потерялись?
Т.е. что бы она не вылетала в браузер?

Добавлено: 15 ноя 2006, 13:16
coolibin
Покажите, как связаны _try и cmInsertRecord?

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

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

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

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

Вы слишком долго программировали на другом языке, наверное, а Галактика не балует всякими best practice...

Добавлено: 15 ноя 2006, 13:21
coolibin
А предварительную проверку (чтобы не нарываться на такие "исключения") делать лучше в cmCheckRecord

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

2. cmCheckRecord Т.е. делать гетфёртс по синониму с этим же кодом и смотреть если есть запись каким событием остатся в window?

Добавлено: 15 ноя 2006, 13:58
coolibin
Нет, cmCheckRecord, не поможет остаться в окне.
Нужно понять - когда мы из окна обратно в браузер возвращаемся?

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

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

Не стоит ли у окна атрибут doAccept

Добавлено: 16 ноя 2006, 05:59
Алексей
Window wEditCatalog 'Редактирование справочника';
doAccept не стоит.
У самого интерфейса тоже
У браузера стоит Browse catals (,, sci1478EnEsc);

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

Может вы имели в виду другой способ "предотвращеня закрытию window"? :-(

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

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

if (insert current table1 <> 0)
runwindow...

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

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

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

Вроде бы проблема решилась
Да, как то всё сложно с событиями...

Добавлено: 18 ноя 2006, 12:37
Max_Fin
в событии проверку и в ней в нужном случае.
тогда цепочка последующих событий не будет выполняться

Добавлено: 20 ноя 2006, 09:47
Goblin
coolibin писал(а):... best practice...
Аксаптоид Вы наш :-)

Добавлено: 20 ноя 2006, 12:20
coolibin
Goblin писал(а): Аксаптоид Вы наш :-)
Тяжелый Вы наш патологический...

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

Добавлено: 07 мар 2012, 09:32
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) всё равно появляется предупреждение о дублированном значении уникального ключа. Как можно его подавить?

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

Добавлено: 07 мар 2012, 13:03
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);
    }

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

Добавлено: 07 мар 2012, 13:58
RAJAH
n0where писал(а): mc_pos.nrec := 0
У меня такого поля нет. Уникальный индекс у fnrec, и оно не автоинкрементно.

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

Добавлено: 07 мар 2012, 16:10
Masygreen

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

mc_pos.nrec := GetNextNREC(#mc_pos, 0);