Я бы посоветовал вам использовать встроенные возможности Forms и тратить время и энергию на что-то еще.
Я хочу отобразить одну запись при нажатии кнопки вперед и все записи при нажатии кнопки дважды вперед
Я предполагаю, что эти кнопки («одинарный» и «двойной вперед») являются пользовательскими кнопками (т. Е. Вы их создали).
Если это так, «Двойная пересылка» проста - поместите EXECUTE_QUERY
в его триггер WHEN-BUTTON-PRESSED
(при условии, что это блок данных, основанный на таблице).
«Одиночная пересылка» не так проста, как вы не можете выполнить запрос , поэтому вам нужно написать некоторый код. Например, вы можете «подготовить» набор данных результатов в другую таблицу, указав номер строки, чтобы вы могли впоследствии использовать его:
insert into temp_table (rn, deptno, dname, loc)
select rownum, deptno, dname, loc
from dept
where ...
WHERE
предложение довольно сложно, потому что пользователь может ввести критерии поиска. Как это узнать? Используйте GET_BLOCK_PROPERTY
. Так как он приносит запах динамического SQL , вам нужно составить оператор INSERT
- рассмотрите возможность создания хранимой процедуры, которая использует EXECUTE IMMEDIATE
(или, альтернативно, посмотрите, можно ли использовать FORMS_DDL
) ,
Поскольку многие пользователи могут использовать одну и ту же форму одновременно, эта «временная таблица» должна быть глобальной временной таблицей или, если нет, вам также придется сохранять пользовательскую информацию; в противном случае вы создадите хаос.
Предположим, данные подготовлены. В форме вам нужно будет создать параметр (или глобальную переменную), который будет содержать текущее значение «номер строки» (rn). Триггер кнопки «Вперед» будет тогда
last_record;
create_record;
select deptno, dname, loc
into :blk.deptno, :blk.dname, :blk.loc
from temp_table where rn = :parameter.rn;
-- prepare the next row
:parameter.rn := :parameter.rn + 1;
ОК, теперь у вас есть данные, и появляются новые проблемы. Так как это блок данных, вставка значений в него таким образом предполагает, что вы вставили новый набор информации, и формы будут с ним так обращаться. Поэтому, если вы попытаетесь сохранить его, вы получите нарушение уникального ключа (что в порядке) или дублирование данных (что плохо).
Это означает, что «блок данных» должен фактически быть «блоком управления», который не связан с таблицей. Кроме того, это означает, что «Двойная перемотка вперед» не может работать так, как я описал, но путем изменения кода кнопки «Одной перемотки вперед» (не извлекайте построчно, но все сразу).
Если это контрольный блок, теперь вам нужно найти способ хранения измененных значений, а также вновь добавленных записей, чтобы вам пришлось создавать собственные триггеры ON-INSERT
, ON-UPDATE
и т. Д.
Короче, я не думаю, что то, что вы хотите, является простой задачей. Я уже говорил, что вы не должны делать это в первую очередь? Ну, я все еще так думаю.
Надеюсь, у кого-то еще будет лучшее, более простое предложение.