Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Master-Detail запрос в обе таблицы / 15 сообщений из 15, страница 1 из 1
17.02.2012, 12:29
    #37666921
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
Есть два блока. Блок1 - глава семьи, блок2-состав семьи. Связаны :блок1.id=:блок2.parent_id. Задача организовать поиск по ФИО в обеих таблицах. На форме присутствуют поля ФИО блока1 и поля ФИО блока2. Для поиска используются поля блока1. Например нужно найти лицо ИВАНОВА ИВАНА ИВАНОВИЧА, т.е. найти его в главах семей и найти главу семьи в блоке1, если он нашелся в таблице состав семьи (блок2). Надеюсь понятно изложил. Как реализовать такое?
...
Рейтинг: 0 / 0
17.02.2012, 13:22
    #37667096
-=APS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
Тупо, навскидку, нужно просто установить соответствующее условие отбора на блок1: fio = :fio or exists (select что там у вас ... where fio = :fio)
Вы хоть как-то пытались решить эту задачу или сразу на форум писать побежали?
...
Рейтинг: 0 / 0
17.02.2012, 13:52
    #37667177
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
-=APS=-, конечно я пытался. И тырнэт перекапывал, и этот форум весь просмотрел. Пробовал в DEFAULT_WHERE блока1 добавлять условие, но т.к. формс сам форматирует where, то получается следующее.
Вообще нужно добиться конечного вида запроса как:

Код: plsql
1.
2.
3.
4.
5.
6.
select * from table1 
where (table1.fam='ИВАНОВ' and table1.imj='ИВАН') 
      or exists (select 'x' from table2 
                   where table2.fam='ИВАНОВ' 
                     and table2.imj = 'ИВАН' 
                     and table2.parent_id=table1.id)



как такого запроса добиться я не могу понять. Если DEFAULT_WHERE блока1 заполнен условием, то формс его ставит сразу после WHERE, а потом добавляет AND (поле = значение) AND (поле = значение)
...
Рейтинг: 0 / 0
17.02.2012, 14:37
    #37667278
-=APS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
А вы пытаетесь прицепить функционал поиска по detail-строкам зависимого блока к СТАНДАРТНОМУ формсовскому функционалу Enter-Query/Execute Query? Ммм... Как-то не очень идеологически, по-моему. Это обязательное требование?
Почему нельзя, например, сделать отдельный блок для ввода требуемых реквизитов поиска с кнопкой "Искать", по нажатию на которую будет происходить фильтрация/перезапрос данных в ваш блок1?
...
Рейтинг: 0 / 0
17.02.2012, 14:51
    #37667313
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
В общем-то можно и отдельный блок сделать для поиска, но опять не понятно как сформировать такой запрос. Что там в триггере писать?
...
Рейтинг: 0 / 0
17.02.2012, 16:01
    #37667476
-=APS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
Ну, раз можно, тогда сделайте блок, например, CRITERIA с айтемами FAM, IMJ и кнопкой "Искать".
В блоке для TABLE1 в условии WHERE укажите ваше условие, которое вы уже писали выше:
Код: plsql
1.
(fam = :criteria.fam and imj = :criteria.imj) or exists (select 'x' from table2 where table2.fam = :criteria.fam and table2.imj = :criteria.imj and table2.parent_id = id)


В триггер на кнопку: go_block(table1), execute_query.
-
Ну, способ упрощенный, конечно... Но основную функцию (отображать данные по указанным условиям) выполнит.
...
Рейтинг: 0 / 0
17.02.2012, 16:25
    #37667511
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
Как вариант пойдет. Спасибо за помощь! В понедельник попробую.
...
Рейтинг: 0 / 0
18.02.2012, 13:37
    #37668392
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
Есть еще идеи?
...
Рейтинг: 0 / 0
18.02.2012, 20:19
    #37668687
gural
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
revenko@@,
in pre_query trigger of parent block

set_block_property('PARENTBLOCK','DEFAULT_WHERE', ' table1.fam=||''''||:FIND.LAST_NAME||''''|| OR existst (select 1 from table2
where table2.parent_id=table1.id and table2.fam=''''||:FIND.LAST_NAME ||''''||')';
...
Рейтинг: 0 / 0
18.02.2012, 20:22
    #37668690
gural
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
guralrevenko@@,
in pre_query trigger of parent block

set_block_property('PARENTBLOCK','DEFAULT_WHERE', ' table1.fam=||''''||:FIND.LAST_NAME||''''|| OR existst (select 1 from table2
where table2.parent_id=table1.id and table2.fam=''''||:FIND.LAST_NAME ||''''||')';

кончно default_where без ковычек...
...
Рейтинг: 0 / 0
19.02.2012, 13:30
    #37669149
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
gural,

А если пользователь по другим реквизитам будет искать? Все рас сыпаться. Так я пробовал уже.
...
Рейтинг: 0 / 0
19.02.2012, 14:42
    #37669206
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
revenko@@gural,
А если пользователь по другим реквизитам будет искать? Все рассыпется. Так я пробовал уже.
К тому же формс в запрос default_where вставит и приплюсует and table1.fam='ИВАНОВ'. Можно попробовать проверять поля и вставлять в default_where только запрашиваемые и перед выполнением их очищать, чтобы формс их не добавлял к запросу. Ну скорее бы понедельник. Проверить все это надо. Обязательно отпишу результат. Спасибо всем за помощь, за идеи.
...
Рейтинг: 0 / 0
20.02.2012, 06:56
    #37669801
revenko@@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
Вот что получилось. На триггер PRE-QUERY повесил следующий код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
DECLARE
	STR  VARCHAR2(1000) := NULL;
	
BEGIN
	IF :TABLE1.FAM IS NOT NULL THEN
		STR := STR || 'S.FAM='''||:TABLE1.FAM||''' AND ';
	END IF;	
	IF :TABLE1.IMJ IS NOT NULL THEN
		STR := STR || 'S.IMJ='''||:TABLE1.IMJ||''' AND ';
	END IF;	
	IF :TABLE1.OTCH IS NOT NULL THEN
		STR := STR || 'S.OTCH='''||:TABLE1.OTCH||')';	
	ELSE /* Здесь можно и поизящней, но пока так */
		STR := RTRIM(STR, 'AND '); 
		STR := STR || ')';
	END IF;			
	IF LENGTH(STR) > 3 /*Здесь можно и поизящней, но пока так*/ THEN
		COPY(NULL, 'TABLE1.FAM');
		COPY(NULL, 'TABLE1.IMJ');
		COPY(NULL, 'TABLE1.OTCH');		
		SET_BLOCK_PROPERTY('TABLE1', DEFAULT_WHERE, '(' || REPLACE(STR, 'S.', 'TABLE1.') || ' OR EXISTS (SELECT ''X'' FROM TABLE2 S WHERE S.PARENT_NSYST = TABLE1.NSYST AND '||STR);
	END IF;			
  END;  
END;  



И в итоге получаем нужный запрос вида:
SELECT *
FROM TABLE1
WHERE (TABLE1.FAM = 'ИВАНОВ' AND TABLE1.IMJ = 'ИВАН')
OR EXISTS (SELECT 'X'
FROM TABLE2 S
WHERE S.PARENT_NSYST = TABLE1.NSYST
AND S.FAM = 'ИВАНОВ'
AND S.IMJ = 'ИВАН')
ORDER BY NSYST

Если не сделать
COPY(NULL, 'TABLE1.FAM');
COPY(NULL, 'TABLE1.IMJ');
COPY(NULL, 'TABLE1.OTCH');
то формс, конечно же, добавляет критерии в конец запроса и получается запрос вида:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT *
   FROM TABLE1
  WHERE (TABLE1.FAM = 'ИВАНОВ' AND TABLE1.IMJ = 'ИВАН')
     OR EXISTS (SELECT 'X'
           FROM TABLE2 S
          WHERE S.PARENT_NSYST = TABLE1.NSYST
            AND S.FAM = 'ИВАНОВ'
            AND S.IMJ = 'ИВАН')
	AND (TABLE1.FAM = 'ИВАНОВ') AND (TABLE1.IMJ = 'ИВАН')	
  ORDER BY NSYST



а это уже не то. Ничего не находится.
Короче работает! Еще раз благодарю за сотрудничество, товарищи! :)
...
Рейтинг: 0 / 0
20.02.2012, 10:18
    #37669899
_мод
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
[quot revenko@@]
Все просто:
1. Не надо устанавливать связь между блоками
2. Блок1 триггер when new record instance
go_block(блок2); clear_block; execute_query; go_block(блок1)

Ходим (ищем) по блок1 - блок2 отражает состав семьи
Ищем по ФИО блока2 - меняем defaul_where блока2 и execute_query
При возврате в блок1 восстанавливаем defaul_where блока2
...
Рейтинг: 0 / 0
20.02.2012, 11:23
    #37669990
-=APS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Master-Detail запрос в обе таблицы
Короче работает! Еще раз благодарю за сотрудничество, товарищи! :)(facepalm.jpg)
Поздравляю с изобретением велосипеда. А теперь поищите в нём, например, фамилию О'Хара.
...
Рейтинг: 0 / 0
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Master-Detail запрос в обе таблицы / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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