APEX - Создание страницы с несколькими формами, связанными с несколькими связанными таблицами ... которые все отправляются одной кнопкой? - PullRequest
8 голосов
/ 24 октября 2011

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

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

Ответы [ 2 ]

18 голосов
/ 24 октября 2011

Встроенные формы 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;
1 голос
/ 11 октября 2018

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

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

...