powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Изменение данных через формы ORALCE FORMS. Другой подход.
1 сообщений из 1, страница 1 из 1
Изменение данных через формы ORALCE FORMS. Другой подход.
    #39983779
medium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в FORMS есть блок, связанный с данными БД, которые пользователь может изменить в FORMS, то
В этом блоке должны быть триггеры ON-INSERT, ON-UPDATE, ON-DELETE, которые должны содержать единственный оператор NULL;. Это для надёжности.
В этом блоке свойство DML Data Target Type Property должно иметь значение NONE. Тоже для надежности.
Перенос данных из формы на сервер БД целиком и полностью выполняется программным кодом, написанным разработчиком.
Перенос выполняется на триггерах
WHEN-VALIDATE-RECORD;
WHEN-VALIDATE-ITEM;
WHEN-CHECKBOX-CHANGED;
(а также некоторые другие - для списков и радиобаттонов - но это экзотика).
Если нет острой необходимости в "досрочном" переносе, то предпочтение для переноса - триггер WHEN-VALIDATE-RECORD.
Для обработки переноса данных пишется специальный пакет в БД ORACLE, например, пакет PKG_PROBLEM_014_FMB.
Запрещено присвоение значения ключевому полю в FORMS из последовательности в свойстве поля Initial Value.
Также запрещено это действие на триггере PRE-INSERT.
Значение ключевого поля должно формироваться на сервере БД в процедуре валидации пакета PKG_PROBLEM_014_FMB и должно явно присваиваться полю блока FORMS в триггере WHEN-VALIDATE... или WHEN-...-CHANGED после успешного выполнения процедуры пакета PKG_PROBLEM_014_FMB.
Если ключевое поле блока находится на NULL канве, то не надо заморачиваться с установкой свойства этого поля ITEM_IS_VALID.
Если при выполнении процедуры пакета PKG_PROBLEM_014_FMB. возникла ошибка(нарушены бизнес-правила) - она должна быть на русском понятном языке и должна быть отображена в форме.
Например, в триггере WHEN-VALIDATE-RECORD должен присутствовать код:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    /* переносим значения из полей текущей записи блока db_problem в запись vr_current_record */
    .....
    /* Проверяем бизнес-логику, заносим в БД, проверяем сообщения об ошибках*/    
    pkg_problem_014_fmb.validate_problem_record(par_problem_rec => vr_current_record);
    IF pkg_problem_014_fmb.get_error_text IS NOT NULL
    THEN
        show_message_by_alert('Ошибка', pkg_problem_014_fmb.get_error_text);
        raise form_trigger_failure;
    END IF;
    /*Присвоение сформированного значения ключевому полю.*/
    :db_problem.problem_id := vr_current_record.problem_id;    


Напоминание разработчику: вызов raise form_trigger_failure; в любом триггере валидации запрещает пользователю покинуть поле или запись до тех пор, пока ошибка при валидации не будет устранена.
После завершения переноса валидируемой строки или элемента формы статус строки помечается QUERY.
Например:
Код: plsql
1.
2.
3.
4.
    /*через промежуточный статус НОВЫЙ установим статус строки ЗАПРОС (QUERY)*/
    /*и тогда механизм ORACLE FORMS не будет пытаться перенести эту запись на сервер БД*/
      set_record_property(v_rec_no, v_block_name, status, new_status);
      set_record_property(v_rec_no, v_block_name, status, query_status);


Если надо удалить строку, то перед удалением ее статус помечается NEW. Например, в триггере KEY-DELREC:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    pkg_problem_014_fmb.delete_record_from_database(par_key => 2000);
    IF pkg_problem_014_fmb.get_error_text IS NOT NULL
    THEN
        show_message_by_alert('Ошибка', pkg_problem_014_fmb.get_error_text);
        raise form_trigger_failure;
    END IF;    
      /*Данные удалены из БД, теперь почистим в форме*/      
      /*установим сразу перед удалением статус строки НОВЫЙ*/      
      set_record_property(v_rec_no, v_block_name, status, new_status);
      /*и тогда механизм ORACLE FORMS не будет пытаться удалить эту запись с сервера БД*/      
      :system.message_level := 20;
      delete_record;
      :system.message_level := v_message_level;


Таким образом в любой момент FORMS понимает, что серверу приложений не надо заниматься переносом данных в БД и не пытается ничего перенести.
Подтверждение изменений данных COMMIT - в триггере KEY-COMMIT формы, а также в триггере WHEN-WINDOW-CLOSED и KEY-EXIT формы.
Разработчик должен отслеживать факт: вносил ли пользователь в форме изменения, которые пока не подтверждены и при попытке выхода из формы задать вопрос о необходимости подтверждения сделанных изменений.
Перед подтверждением изменений настоятельно рекомендуется выполнить validate(form_scope);
Если валидация выполнена успешно, то вызывается pkg_problem_014_fmb.do_commit, где происходят проверки бизнес-логики и окончательный коммит.
А на триггере POST_FORM выполняется
Код: plsql
1.
2.
3.
BEGIN
    pkg_problem_014_fmb.do_rollback;
END;


Если при валидации элемента формы необходимо отобразить измененные данные в нескольких записях (в триггере WHEN-VALIDATE-ITEM есть ограничения, которые не позволяют выполнять некоторые действия,
например нельзя выполнять EXECUTE_QUERY), то допускается запуск таймера.
Если поле блока, расположенное на какой-то канве, было изменено программно, надо немедленно установить свойство ITEM_IS_VALID в значение PROPERY_TRUE (программно валидировать).
Если это поле на NULL канве - то не надо заморачиваться ITEM_IS_VALID.

Остается открытым вопрос о CALL_FORM.
О CALL вызове другой формы, в которой также могут происходить изменения данных БД.
О том, что COMMIT в вызываемой форме может привести к нежелательной фиксации данных в вызывающей форме.
Но это легко решаемый, вопрос, имеющий очевидное решение..
Рекомендации по этому вопросу будут сформулированы при наличии заинтересовавшихся.

Также по понятным причинам не рекомендуется пользоваться OPEN_FORM(...NO_SESSION...)(default).
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Изменение данных через формы ORALCE FORMS. Другой подход.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (2)
Пользователи онлайн (11): Анонимы (8), Yandex Bot 1 мин., Google Bot 2 мин., Bing Bot 3 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]