Встроенные формы Apex ограничены тем, что, к сожалению, у вас может быть только один процесс автоматического извлечения строк на страницу. Вы можете иметь более одной области формы на страницу, но вам придется кодировать всю выборку и отправлять обработку самостоятельно, если вы это делаете (на самом деле это не сложно, но вам также нужно позаботиться об оптимистической блокировке и т. Д.).
Разделение формы одной таблицы на несколько областей вполне возможно, даже с использованием встроенной функциональности формы, поскольку сам регион является просто объектом макета, с ним не связано никаких функций.
Создание форм вручную довольно просто, но немного сложнее.
Предметы
В качестве источника должен быть установлен статический текст, а не столбец базы данных.
Кнопка
Вам понадобятся такие кнопки, как «Создать», «Применить изменения», «Удалить» для отправки страницы. Это требует уникальных значений запроса, чтобы вы знали, какая таблица обрабатывается, например, CREATE_EMP. Вы можете настроить отображение кнопок условно, например, Создайте, только когда элемент PK пуст.
Процесс извлечения строк
Это будет простой процесс PL / SQL, такой как:
select ename, job, sal
into :p1_ename, :p1_job, :p1_sal
from emp
where empno = :p1_empno;
Оно должно быть условным, чтобы оно срабатывало только при вводе в форму, а не после каждой загрузки страницы - в противном случае при наличии ошибок проверки любые изменения будут потеряны. Это может контролироваться скрытым элементом, который изначально имеет значение NULL, но при загрузке страницы устанавливается ненулевое значение. Выбирать строку только в том случае, если скрытый элемент равен нулю.
Процесс отправки
Вы можете иметь 3 отдельных процесса для вставки, обновления, удаления, связанных с кнопками, или один процесс, который просматривает значение :request
, чтобы увидеть, что нужно делать. В любом случае процессы будут содержать простой DML, такой как:
insert into emp (empno, ename, job, sal)
values (:p1_empno, :p1_ename, :p1_job, :p1_sal);
Оптимистическая блокировка
Я упустил это выше для простоты, но одна вещь, которую встроенные формы делают для вас, - это обрабатывать «оптимистическую блокировку», чтобы предотвратить одновременное обновление одной и той же записи двумя пользователями, причем одно обновление перезаписывает другое. Существуют различные методы, которые вы можете использовать для этого. Распространенным является использование OWA_OPT_LOCK.CHECKSUM для сравнения записи, какой она была, когда она была выбрана, с тем, как она была в момент фиксации обновления.
В процессе извлечения:
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;