SL нет поколения - PullRequest
       28

SL нет поколения

0 голосов
/ 25 декабря 2018

enter image description here В качестве мастера проектов используется имя мастер-таблицы

В другой форме, если я выберу проект-1 sl, генерация проекта не требуется (21819001).после успешного сохранения 1 записи, если я выберу тот же проект-1 sl, не нужно генерировать как 21819002, для следующих 21819003 и т. д.

Опять после сохранения 3 записи, если я выберу проекты, 3 sl должен сгенерировать как 41819001и так далее.

Я использую Oracle Forms 10g.

1 Ответ

0 голосов
/ 26 декабря 2018

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

PROJECTS_MASTER таблица и некоторые примеры данных:

SQL> create table projects_master
  2    (project number primary key);

Table created.

SQL> insert into projects_master
  2    select 21819001 from dual union all
  3    select 41819001 from dual;

2 rows created.

Эта таблица будет содержать самые последние SL_NO для каждого проекта

SQL> create table projects_sl_no
  2    (project number constraint fk_prsl references projects_master (project),
  3     sl_no   number);

Table created.

Сама функция;если строка для PAR_PROJECT существует, она обновит ее.В противном случае он создаст новую строку в таблице PROJECTS_SL_NO.

SQL> create or replace function f_proj_sl_no
  2    (par_project in projects_master.project%type)
  3     return projects_sl_no.sl_no%type
  4  is
  5    pragma autonomous_transaction;
  6    l_sl_no projects_sl_no.sl_no%type;
  7  begin
  8    select b.sl_no + 1
  9      into l_sl_no
 10      from projects_sl_no b
 11      where b.project = par_project
 12      for update of b.sl_no;
 13
 14    update projects_sl_no b
 15      set b.sl_no = l_sl_no
 16      where b.project = par_project;
 17
 18    commit;
 19    return (l_sl_no);
 20  exception
 21    when no_data_found
 22    then
 23      lock table projects_sl_no in exclusive mode;
 24
 25      insert into projects_sl_no (project, sl_no)
 26        values (par_project, par_project);
 27
 28      commit;
 29      return (par_project);
 30  end f_proj_sl_no;
 31  /

Function created.

Тестирование:

SQL> select f_proj_sl_no(21819001) sl_no from dual;

     SL_NO
----------
  21819001

SQL> select f_proj_sl_no(21819001) sl_no from dual;

     SL_NO
----------
  21819002

SQL> select f_proj_sl_no(21819001) sl_no from dual;

     SL_NO
----------
  21819003

SQL> select f_proj_sl_no(41819001) sl_no from dual;

     SL_NO
----------
  41819001

SQL> select * from projects_sl_no;

   PROJECT      SL_NO
---------- ----------
  21819001   21819003
  41819001   41819001

SQL>

При использовании форм вы можете вызвать функцию F_PROJ_SL_NO вТриггер WHEN-VALIDATE-RECORD, PRE-INSERT или даже создание перед вставкой триггера базы данных, если вы вставляете в более сложную таблицу, чем те, которые я создал для целей тестирования.Во всяком случае, это должно быть более простой частью истории.

...