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

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

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

1 ответов


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

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

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

предметы

они должны иметь исходный набор "статический текст", а не столбец базы данных.

кнопки

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

Процесс Выборки Строк

это будет простой процесс PL / SQL, как:

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

он должен быть условным, чтобы он срабатывал только при входе в форму, а не после каждой загрузки страницы - в противном случае, если есть ошибки проверки, любые изменения будут потеряны. Это может управляться скрытым элементом, который изначально имеет значение null, но имеет значение non-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;