APEX — создание страницы с несколькими формами, связанными с несколькими связанными таблицами… что все отправляются одной кнопкой?

#forms #oracle-apex

#формы #oracle-apex

Вопрос:

У меня есть две таблицы в APEX, которые связаны их первичным ключом. Одна таблица (APEX_MAIN) содержит основные метаданные документа в нашей системе, а другая (APEX_DATES) содержит важные даты, связанные с обработкой этого документа.

Для своей команды я создал панель управления, где они могут взаимодействовать со всеми этими данными. Проблема в том, что прямо сейчас они изменяют информацию в APEX_MAIN на странице, а затем изменяют APEX_DATES на другой. Мне бы очень хотелось иметь возможность размещать эти формы на одной странице и отправлять обновления для их соответствующих таблиц и строк с помощью одной кнопки отправки. В настоящее время я настроил это, используя две разные области на одной странице, но я получаю ошибки как при начальной выборке строк (какая из когда-либо выбранных строк 2-я, кажется, работает, но затем элементы страницы в форме, которая была выбрана 1-й, пусты?), Так и при отправке (это дает некоторыеошибка о том, что информация в БД была изменена с момента отправки запроса на обновление). Кто-нибудь может мне помочь?

Комментарии:

1. Не могли бы мы также прокомментировать возможность разделения формы одной таблицы на несколько областей?

Ответ №1:

К сожалению, встроенные формы Apex ограничиваются тем, что у вас может быть только один автоматический процесс выборки строк на страницу. У вас может быть более одной области формы на страницу, но вам нужно самостоятельно кодировать всю обработку выборки и отправки, если вы это сделаете (на самом деле это не так сложно, но вам нужно позаботиться о оптимистичной блокировке и т. Д. вы тоже).

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

Создание форм вручную довольно просто, но требует немного больше работы.

Товары

Для них должен быть установлен источник «Статический текст», а не столбец базы данных.

Кнопки

Вам понадобятся кнопки типа Создать, Применить изменения, Удалить, которые отправляют страницу. Им нужны уникальные значения запроса, чтобы вы знали, какая таблица обрабатывается, например, CREATE_EMP . Вы можете сделать так, чтобы кнопки отображались условно, например. Создавать только тогда, когда элемент PK равен нулю.

Процесс выборки строк

Это будет простой процесс PL / SQL, например:

 select ename, job, sal
into :p1_ename, :p1_job, :p1_sal
from emp
where empno = :p1_empno;
 

Он должен быть условным, чтобы срабатывал только при входе в форму, а не после каждой загрузки страницы — в противном случае при наличии ошибок проверки все изменения будут потеряны. Этим можно управлять с помощью скрытого элемента, который изначально имеет значение null, но при загрузке страницы ему присваивается ненулевое значение. Извлекайте строку только в том случае, если скрытый элемент имеет значение null.

Процесс (ы) отправки

У вас может быть 3 отдельных процесса для вставки, обновления, удаления, связанных с кнопками, или один процесс, который просматривает :request значение, чтобы увидеть, что нужно делать. В любом случае процессы будут содержать простой DML, например:

 insert into emp (empno, ename, job, sal)
values (:p1_empno, :p1_ename, :p1_job, :p1_sal);
 

Оптимистичная блокировка

Я опустил это выше для простоты, но одна вещь, которую встроенные формы делают для вас, — это обработка «оптимистической блокировки», чтобы предотвратить одновременное обновление 2 пользователями одной и той же записи, при этом обновление одного перезаписывает обновление другого. Для этого можно использовать различные методы. Распространенным вариантом является использование OWA_OPT_LOCK .КОНТРОЛЬНАЯ СУММА для сравнения записи в том виде, в каком она была выбрана, с тем, какая она есть в момент фиксации обновления.

В процессе выборки:

 select ename, job, sal, owa_opt_lock.checksum('SCOTT','EMP',ROWID)
into :p1_ename, :p1_job, :p1_sal, :p1_checksum
from emp
where empno = :p1_empno;
 

В процессе отправки для обновления:

 update emp
set job = :p1_job, sal = :p1_sal
where empno = :p1_empno
and  owa_opt_lock.checksum('SCOTT','EMP',ROWID) = :p1_checksum;

if sql%rowcount = 0 then
    -- handle fact that update failed e.g. raise_application_error
end if;
 

Комментарии:

1. На самом деле я попытался разделить форму одной таблицы на несколько областей (исключительно ради удобства использования), и это сработало. Я использую только один процесс выборки и обновления, и поскольку он из той же таблицы и в нем нет повторяющихся строк, это, похоже, не доставляет мне никаких проблем. Спасибо за информацию о формах с несколькими таблицами, хотя … не могли бы вы рассказать о том, как можно обойти эту проблему, как вы обсуждали?

2. Вау! Вы действительно приложили все усилия к этому ответу! Спасибо! 🙂

Ответ №2:

Другим, более простым решением для части выборки является создание представления со всеми необходимыми полями.

Слабым местом является то, что позже вам нужно будет изменить код «отправки» для вставки в таблицы, которые являются источником данных представления