powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms
3 сообщений из 28, страница 2 из 2
Oracle Forms
    #33184965
4uBaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tolmachov DmitiryЗадавать имена полей (Name property) в блоке , а также Column Name, программно нельзя! В этом вся и загвоздка. Можно накидать в блок полей типа key, value1, value2 и т.д., выполнять запрос типа Select id as key, fio as value1 from person.
Но тогда отвалиться процесс обновления, так как форма будет пытаться выполнить команду Update person Set value1 = <...> вместо Update person Set fio = <...>. Поэтому в этой ситуации можно предложить в качестве возможного решения написать триггер ON-UPDATE, в котором, используя динамический SQL, обновлять поля.

Да-а-а-а... На это я вчера наткнулся..
Блин грустно :(
Придется корячиться и писать процедуры на вставки и обновления :((
Абидна..
...
Рейтинг: 0 / 0
Oracle Forms
    #33185278
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4uBaK Tolmachov DmitiryЗадавать имена полей (Name property) в блоке , а также Column Name, программно нельзя! В этом вся и загвоздка. Можно накидать в блок полей типа key, value1, value2 и т.д., выполнять запрос типа Select id as key, fio as value1 from person.
Но тогда отвалиться процесс обновления, так как форма будет пытаться выполнить команду Update person Set value1 = <...> вместо Update person Set fio = <...>. Поэтому в этой ситуации можно предложить в качестве возможного решения написать триггер ON-UPDATE, в котором, используя динамический SQL, обновлять поля.

Да-а-а-а... На это я вчера наткнулся..
Блин грустно :(
Придется корячиться и писать процедуры на вставки и обновления :((
Абидна..

тут нет ничего сложного (в дбф-е всего 4 типа данных). Поэтому, данные одной строки всегда могут быть помещены в одномерный массив символьного типа.

Поэтому все что вам нужно - это сделать свой "переходник" что при чтении строки из БД (ораклы уже) сразу помещает их в одномерный символьный массив. (в динамическом sql - этакий парсер свой)

И ваша задача - в Формсе - научиться демострировать "ячейки" массива в соотвествущих Айтемах, имеющих тупую нотацию ...типа фиелд_1, фиелд_2.... где индекс в имени фиелда совпадает с номером элемента массива. Тут то и используются функции copy и name_in... при момощи которых можно все в три строки цикла - все перегонять все валуе.

После этого, у вас будет обратнаяч задача - считать айтемы (в цикле) и запихать валуе в другой одномерный массив. И уже изх него - в динамическом SQL реализовать процедуру update/insert. Все надо знать для этого - структуры таблицы БД из словарей.

Мы (давно) делали эту тему - наши условия ЕЩЕ хуже были...пришлось строить Генератор БД, что генерил спец_листинги включенные в модули как инклюды. И все компилировалось. А потом - САМО все работало - универсальный доступ к данным любой таблицы БД в универсальном интерфейсе. В Оракле - все легче, ибо есть динамич SQL.
...
Рейтинг: 0 / 0
Oracle Forms
    #33185720
Фотография UK0IAI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что мне видно занятся было нечем :-) ....вот скрипт что читает данные любой таблицы и выводит их на экран . В моем случае я жестко прописал имя табло = SYS.ALL_TABLES

Код: plaintext
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.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
CREATE OR REPLACE PROCEDURE TST_SQL IS

  STMT_STR VARCHAR2( 4000 );
  PRN_STR VARCHAR2( 4000 );
  
  CUR_HDL INT;
  ROWS_PROCESSED INT;
  
  TABLE_NAME VARCHAR2( 30 );
  OWNER VARCHAR2( 30 );
  
  COLUMN_NAME VARCHAR2( 30 );
  
  TYPE REC IS RECORD
  (
      COLUMN_NAME VARCHAR2( 30 ) -- РАЗМЕРНОСТЬ НАДО УТОЧНЯТЬ ДЛЯ DBF
  );
  TYPE  T_REC  IS TABLE OF REC  INDEX BY BINARY_INTEGER;
  
  LIST_COLUMN  T_REC ;  --МАССИВ С ИМЕНАМИ ПОЛЕЙ И ГДЕ БУДУТ ЛЕЖАТЬ САМИ ВАЛУЕ
  
  NUM_COL  INTEGER;     
  CUR_COL  INTEGER;
  END_STR  VARCHAR2( 4 ) :=', ';
  
BEGIN


DBMS_OUTPUT.PUT_LINE ('==');
DBMS_OUTPUT.PUT_LINE ('== СПИСОК ПОЛЕЙ ТАБЛИЦЫ');
DBMS_OUTPUT.PUT_LINE ('==');
CUR_HDL := DBMS_SQL.OPEN_CURSOR; -- OPEN CURSOR 

STMT_STR := 
'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS 
WHERE TABLE_NAME = :T_NAME';

DBMS_OUTPUT.PUT_LINE (STMT_STR);


DBMS_SQL.PARSE(CUR_HDL, STMT_STR, DBMS_SQL.NATIVE); 
-- SUPPLY BINDS (BIND BY NAME) 
DBMS_SQL.BIND_VARIABLE(CUR_HDL, 'T_NAME', 'ALL_TABLES');  -- ПРОПИСАЛ ИМЯ ТАБЛИЦЫ -- А МОЖНО ПЕРЕДАВАТЬ КАК ПАРАМЕТР
-- DESCRIBE DEFINES 
DBMS_SQL.DEFINE_COLUMN(CUR_HDL,  1 , COLUMN_NAME,  200 ); 
ROWS_PROCESSED := DBMS_SQL.EXECUTE(CUR_HDL); 
-- EXECUTE 
NUM_COL := 0 ;
LOOP 
  -- FETCH A ROW 
  
  IF DBMS_SQL.FETCH_ROWS(CUR_HDL) >  0  THEN 
    -- FETCH COLUMNS FROM THE ROW 
    DBMS_SQL.COLUMN_VALUE(CUR_HDL,  1 , COLUMN_NAME); 
    NUM_COL := NUM_COL +  1 ;
    

    LIST_COLUMN(NUM_COL).COLUMN_NAME := COLUMN_NAME;
    DBMS_OUTPUT.PUT_LINE (LIST_COLUMN(NUM_COL).COLUMN_NAME||'--ПОЛЯ ТАБЛИЦЫ');
 ELSE
    EXIT; 
 END IF; 
END LOOP; 
DBMS_SQL.CLOSE_CURSOR(CUR_HDL); -- CLOSE CURSOR

--ЗАКОНЧИЛИ ОПРЕДЕЛЬ СПСИОК ПОЛЕЙ И НАЧНЕМ ЧИТАТЬ ДАННЫЕ
--СТРОКИ ТАБЛИЦЫ БУДУТ ЛЕЖАТЬ В ТОМ ЖЕ МАССИВЕ LIST_COLUMN()


CUR_HDL := DBMS_SQL.OPEN_CURSOR; -- OPEN CURSOR 




-- В МАССИВЕ LIST_COLUMN УЖЕ НАХОДИТСЯ СПИСОК ПОЛЕЙ ТАБЛИЦЫ 

-- ГЕНЕРИМ СЕЛЕКТ ДЛЯ ЗАППРОСА ПОЛЕЙ

STMT_STR := 'SELECT ';

NUM_COL :=  5 ; --ОГРАНИЧИМ ДЛЯ УДОБСТВА 5 ПОЛЯМИ

FOR I IN  1 ..NUM_COL LOOP
    IF I < NUM_COL THEN
       STMT_STR := STMT_STR || LIST_COLUMN(I).COLUMN_NAME|| END_STR;
    ELSE
       STMT_STR := STMT_STR || LIST_COLUMN(I).COLUMN_NAME|| ' ';
    END IF;   
END LOOP;



STMT_STR := STMT_STR || ' FROM ALL_TABLES 
WHERE OWNER <> :P_NAME';

DBMS_OUTPUT.PUT_LINE ('==');
DBMS_OUTPUT.PUT_LINE ('== SQL ЗАПРОСА К ТАБЛИЦЕ');
DBMS_OUTPUT.PUT_LINE ('==');

DBMS_OUTPUT.PUT_LINE (STMT_STR);
DBMS_OUTPUT.PUT_LINE ('==');



DBMS_SQL.PARSE(CUR_HDL, STMT_STR, DBMS_SQL.NATIVE); 
-- SUPPLY BINDS (BIND BY NAME) 
DBMS_SQL.BIND_VARIABLE(CUR_HDL, 'P_NAME', 'SYS'); 
-- DESCRIBE DEFINES 

-- В ЦИКЛЕ ОПРЕДЕЛЯЕМ КОЛОНКИ

FOR I IN  1 ..NUM_COL LOOP
    -- DBMS_SQL.DEFINE_COLUMN(CUR_HDL, 1, TABLE_NAME, 200); 
    -- DBMS_SQL.DEFINE_COLUMN(CUR_HDL, 2, OWNER, 200); 
    DBMS_SQL.DEFINE_COLUMN(CUR_HDL, I, LIST_COLUMN(I).COLUMN_NAME, 200 );
    
    
END LOOP;


DBMS_OUTPUT.PUT_LINE ('==');
DBMS_OUTPUT.PUT_LINE ('== ДАНЫЕ СТРОК ТАБЛИЦЫ ');
DBMS_OUTPUT.PUT_LINE ('==');


ROWS_PROCESSED := DBMS_SQL.EXECUTE(CUR_HDL); 
-- EXECUTE 
LOOP 
  -- FETCH A ROW 
  IF DBMS_SQL.FETCH_ROWS(CUR_HDL) >  0  THEN 
    -- FETCH COLUMNS FROM THE ROW 
    
    --ЧИТАЕМ РЕКОРД В МАССИВ LIST_COLUMN()
    FOR I IN  1 ..NUM_COL LOOP

    --DBMS_SQL.COLUMN_VALUE(CUR_HDL, 1, OWNER); 
    --DBMS_SQL.COLUMN_VALUE(CUR_HDL, 2, TABLE_NAME); 
    --DBMS_OUTPUT.PUT_LINE (OWNER ||'--'|| TABLE_NAME);
 
       DBMS_SQL.COLUMN_VALUE(CUR_HDL, I, LIST_COLUMN(I).COLUMN_NAME);
    END LOOP;

    -- ЦИКЛ ЧИСТО ДЛЯ ВЫВОДА ВАЛУЕ НА ЭКРАН
    PRN_STR := '';
    FOR I IN  1 ..NUM_COL LOOP

        PRN_STR := PRN_STR ||  LIST_COLUMN(I).COLUMN_NAME || ',  ';
    END LOOP;
    DBMS_OUTPUT.PUT_LINE (PRN_STR); 
    -- КОНЕЦ ВЫВОДА НА ЭКРАН
  ELSE
     EXIT; 
  END IF; 
END LOOP; 
DBMS_SQL.CLOSE_CURSOR(CUR_HDL); -- CLOSE CURSOR
  
END TST_SQL;

ЗАПУС ПРОЦЕДУРЫ В PL/SQL DEVELOPOER В ОКНЕ ТЕСТА

Begin
-- Call the procedure
tst_sql;
end;
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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