Гость
Map
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Как в Forms обновить запись? / 6 сообщений из 6, страница 1 из 1
21.04.2006, 16:33
    #33683306
Mr_Frost
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Forms обновить запись?
Скажите, кто-нибудь решал в Forms такую задачу: если текущая строка формы была изменена хранимой процедурой, то дальше ее редактировать невозможно, пока Execute_query не выполнишь, иначе ошибка "Запись была изменена другим пользователем". Хочется обновить все поля в текущей строке (не делая Execute_query, т.к. обновятся и другие строки) каким-нибудь простым способом - но есть ли он?
...
Рейтинг: 0 / 0
21.04.2006, 16:35
    #33683315
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Forms обновить запись?
Mr_FrostСкажите, кто-нибудь решал в Forms такую задачу: если текущая строка формы была изменена хранимой процедурой, то дальше ее редактировать невозможно, пока Execute_query не выполнишь, иначе ошибка "Запись была изменена другим пользователем". Хочется обновить все поля в текущей строке (не делая Execute_query, т.к. обновятся и другие строки) каким-нибудь простым способом - но есть ли он?
Есть. С некоторыми ограничениями. Для себя написал такую библиотечную функцию...
Сейчас принцип опишу...
...
Рейтинг: 0 / 0
21.04.2006, 16:52
    #33683381
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Forms обновить запись?
Заготавливаю строку
l_select:='select rowid';
1. Пробегаюсь по блоку
l_itm := Get_Block_Property(l_block,First_Item);
while l_itm is not null loop
1.1 и если тип элемента Get_Item_Property(l_block||'.'||l_itm,ITEM_TYPE) среди TEXT ITEM,CHECKBOX,LIST,RADIO GROUP (остальные мне не нужно было) то его обрабатываем
1.2 Если поле базовое - обрабатываем, небазовые пропускаем.
1.3 нахожу, какое поле из таблицы ему соответствует l_col_name:=get_item_property(l_block||'.'||l_itm,column_name);
Если пусто - значит имя элемента есть имя поля.
1.4 наращиваю строку l_select:=l_select||','||l_col_name;
1.5 конец цикла
На выходе имею кусок селекта и запомненные (я не указал это) поля в списке полей с их типом (дата, число, строка).
2. завершаю строку l_select - определяю на какой таблице строится блок и делаю ограничения по rowid или каким-то еще известным характеристикам ИМЕННО НУЖНОЙ СТРОКИ.
3. Устанавливаю блоку set_block_property(l_block,LOCKING_MODE,DELAYED); (предварительно запомнив, что было), и если строка в статусе Query - ставлю ей Changed. Не помню для чего, но раз сделал, значит ломалось. Сам бы я это с нуля не стал писать.
4. Открываю курсор l_cursor := dbms_sql.open_cursor;
5. Парсю строку l_select для курсора l_cursor
6. Далее биндю все поля в соответствии с собранными. в п1.
7. выполняю курсор и фетчу строку.
8. Бегаю по собранным элементам блока и пихаю в них собранные значения.
9. Закрываю курсор
10. Восстанавливаю set_block_property(l_block,LOCKING_MODE,l_rest_lck);
11. Если нахожусь в обрабаываемом блоке, то выполняю execute_trigger('POST-QUERY'); Чтобы заполнились небазовые поля и прочая дребедень.
12. Ставлю строке статус query - мне так удобно. Это уже по обстоятельствам.

Ограничения: как видно - работает только на таблицах, так как используется rowid.
Но если подумать, возможно есть варианты.
...
Рейтинг: 0 / 0
21.04.2006, 16:59
    #33683407
Mr_Frost
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Forms обновить запись?
Ок, спасибо, идею понял.
Жаль, что у Формса нет встроенного чего-то подобного :-(
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
23.01.2018, 11:46
    #39588987
MillyTlt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Forms обновить запись?
Mr_Frost, Спасибо большое!!!!

Модератор: Тема перенесена из форума "Oracle".
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.02.2019, 11:52
    #39776101
medium
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в Forms обновить запись?
По мотивам Pamir, с некоторыми упрощениями, допущением, что ключ числовой из одного поля.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
PROCEDURE refresh_record(par_block_name VARCHAR2) IS
  charpattern          VARCHAR2(2000);
  v_block              VARCHAR2(30);
  v_item               VARCHAR2(30);
  v_old_update_allowed VARCHAR2(30);
  v_opd_locking_mode   VARCHAR2(30);
  v_column_name        VARCHAR2(30);
  v_data_type          VARCHAR2(30);
  v_format             VARCHAR2(50);
  v_key_string         VARCHAR2(1000);
  v_source             VARCHAR2(1000);
  v_cursor             INTEGER;
  v_result             INTEGER;
  j                    NUMBER;
  v_sql                VARCHAR2(1000);
BEGIN
  v_block              := par_block_name;
  v_old_update_allowed := get_block_property(v_block, update_allowed);
  v_opd_locking_mode   := get_block_property(v_block, locking_mode);
  v_source := get_block_property(v_block, query_data_source_name);
  v_item   := get_block_property(v_block, first_item);
  set_block_property(v_block, update_allowed, property_true);
  set_block_property(v_block, locking_mode, delayed);
  LOOP
    IF get_item_property(v_block || '.' || v_item, primary_key) = 'TRUE'
    THEN
      v_key_string := ' where ' || get_item_property(v_block || '.' || v_item, column_name) || '=' ||
                      to_char(name_in(v_block || '.' || v_item));
      EXIT;
    END IF;
    IF v_item = get_block_property(v_block, last_item)
    THEN
      return;-- ÓÏÑ, íè÷åãî íå ïîëó÷èëîñü, êëþ÷à íåòó.
    END IF;
    v_item := get_item_property(v_block || '.' || v_item, nextitem);
  END LOOP;
  v_item := get_block_property(v_block, first_item);
  LOOP
    IF get_item_property(v_block || '.' || v_item, item_type) IN ('CHECKBOX', 'LIST', 'TEXT ITEM')
    THEN
      v_column_name := get_item_property(v_block || '.' || v_item, column_name);
      v_data_type   := get_item_property(v_block || '.' || v_item, datatype);
      IF get_item_property(v_block || '.' || v_item, item_type) IN ('TEXT ITEM')
      THEN
        v_format := get_item_property(v_block || '.' || v_item, format_mask);
      ELSE
        v_format := NULL;
      END IF;
      IF v_column_name IS NOT NULL
      THEN
        IF v_data_type IN ('DATE', 'DATETIME')
        THEN
          IF v_format IS NOT NULL
          THEN
            v_sql := 'select to_char(' || v_column_name || ',''' || v_format || ''') as res from ' ||
                     v_source || v_key_string;
          ELSE
            v_sql := 'select to_char(' || v_column_name || ') as res from ' || v_source ||
                     v_key_string;
          END IF;
        
        ELSIF v_data_type IN ('NUMBER')
        THEN
          IF v_format IS NOT NULL
          THEN
            v_sql := 'select to_char(' || v_column_name || ',''' || v_format || ''') as res from ' ||
                     v_source || v_key_string;
          ELSE
            v_sql := 'select to_char(' || v_column_name || ')  as res from ' || v_source ||
                     v_key_string;
          END IF;
        ELSIF v_data_type IN ('CHAR')
        THEN
          v_sql := 'select ' || v_column_name || ' as res from ' || v_source || v_key_string;
        END IF;
        j        := 1;
        v_cursor := dbms_sql.open_cursor;
        dbms_sql.parse(v_cursor, v_sql, 1);
        dbms_sql.define_column(v_cursor, j, charpattern, 1000);
        v_result := dbms_sql.execute(v_cursor);
      
        IF dbms_sql.fetch_rows(v_cursor) > 0
        THEN
          dbms_sql.column_value(v_cursor, 1, charpattern);
          copy(charpattern, v_block || '.' || v_item);
          dbms_sql.close_cursor(v_cursor);
        END IF;
      END IF;
    END IF;
    IF v_item = get_block_property(v_block, last_item)
    THEN
      EXIT;
    END IF;
    v_item := get_item_property(v_block || '.' || v_item, nextitem);
  END LOOP;
  execute_trigger('POST-QUERY');   
  set_record_property(get_block_property(v_block, current_record), v_block, status, new_status);
  set_record_property(get_block_property(v_block, current_record), v_block, status, query_status);
  IF v_old_update_allowed = 'FALSE'
  THEN
    set_block_property(v_block, update_allowed, property_false);
  END IF;
  set_block_property(v_block, locking_mode, IMMEDIATE);
END;
...
Рейтинг: 0 / 0
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Как в Forms обновить запись? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]