как отобразить одну запись в табличной форме? - PullRequest
0 голосов
/ 02 июля 2018

Я хочу отображать одну запись по одной при нажатии кнопки в табличной форме

как это сделать в оракуле?

1 Ответ

0 голосов
/ 04 июля 2018

Я бы посоветовал вам использовать встроенные возможности 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 и т. Д.


Короче, я не думаю, что то, что вы хотите, является простой задачей. Я уже говорил, что вы не должны делать это в первую очередь? Ну, я все еще так думаю.

Надеюсь, у кого-то еще будет лучшее, более простое предложение.

...