#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:
Другим, более простым решением для части выборки является создание представления со всеми необходимыми полями.
Слабым местом является то, что позже вам нужно будет изменить код «отправки» для вставки в таблицы, которые являются источником данных представления