CftClub.ru
Клуб специалистов ЦФТ-Банк

Владелец массива поиск по записи на которую ссылается массив
На страницу 1, 2, 3  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 14:34   Владелец массива поиск по записи на которую ссылается массив Ответить с цитатой
Полезность: Нет оценки
Коллеги, добрый день!
Проблемка такая: есть некое ТБП с реквизитом типа массив ссылок на документ (DOC_REF_ARR). Документы в массиве типа Финансовое распоряжение (FIN_ORDER). Хочется от конкретного ФР (ссылка на которое существует в массиве) вычислить экземпляр ТБП?
Сама таблица Z#DOCUMENT_REF имеет колонки С_VALUE и С_COLLECTION_ID, но в Адм.словаря они не видны, соответственно из операций к ним не обратиться. Логично найти ссылку и от нее - родителя, но!
Строка
Код:
locate docref in ::[DOCUMENT_REF] collections where docref=P_FIN_ORDER

компилится в
Код:
declare
   plp$2$1   number;
   cursor c_obj is
      select  a1.id
      from Z#DOCUMENT_REF a1
      where a1.COLLECTION_ID is not NULL
      (a1.C_VALUE = plp$2$1);
begin
   plp$2$1 := P_FIN_ORDER;
   plp$ID_1 := NULL;
   for plp$c_obj in c_obj loop
      plp$ID_1 := plp$c_obj.id;  exit;
   end loop;
   if plp$ID_1 is NULL then raise rtl.NO_DATA_FOUND; end if;
end;
При выполнении вываливается с необработанным исключением, т.к. в цикле по курсору ничего не находится (plp$ID_1 - NULL)
Попытка написать через pl/sql-ный блок тоже к успеху не привела.
Вот вроде тривиальный вопрос, а затык... Crying or Very sad


Последний раз редактировалось: Alex2019 (Вт Авг 05, 2008 16:05), всего редактировалось 1 раз
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 05, 2008 14:59    Ответить с цитатой
Полезность: Нет оценки
можно попробовать.. хотя не проерял

Код:
for doc_1 in ::[FIN_ORDER].[DOCUMENT_REF] loop
    for doc_2 in ::[MAIN_DOCUM]
    where doc_1.[IN_FOLDER].[DOCS_IN_FOLD].[DOCUMENT]
             =doc_2.[IN_FOLDER].[DOCS_IN_FOLD].[DOCUMENT]
     loop
....
     end loop;
end loop;


правда это очень грубо.. думаю что можно оптимизировать
_________________
всегда есть как минимум 2 выхода
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 15:07    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
можно попробовать.. хотя не проерял
Алексей, прежде всего, спасибо Smile
Правда не ясно, для чего цикл по ФР, ведь мы "пляшем" от конкретного экземпляра распоряжения. И что мы ищем в MAIN_DOCUM? Они тут вроде никаким боком. Требуется как минимум найти collection_id ссылки на ФР
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 05, 2008 15:13    Ответить с цитатой
Полезность: Нет оценки
Alex2019 пишет:
Alexsey пишет:
можно попробовать.. хотя не проерял
Алексей, прежде всего, спасибо Smile
Правда не ясно, для чего цикл по ФР, ведь мы "пляшем" от конкретного экземпляра распоряжения. И что мы ищем в MAIN_DOCUM? Они тут вроде никаким боком. Требуется как минимум найти collection_id ссылки на ФР


тогда можно просто оттолкнуться от

Код:

for doc_1 in ::[FIN_ORDER].[DOCUMENT_REF] loop

_________________
всегда есть как минимум 2 выхода
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 15:20    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
тогда можно просто оттолкнуться от
Код:

for doc_1 in ::[FIN_ORDER].[DOCUMENT_REF] loop

Наверное, только от ::[FIN_ORDER].[DOCUMENT]? (т.к реквизита ..._REF вроде нет). Хорошо бы, но на что он ссылается? Я посмотрел в SQL-навигаторе, по тому ID, что прописан в этом поле вовсе ничего не находится. Ни в Z#DOCUMENT, ни в Z#DOCUMENT_REF. А в ЦФТ-навигаторе оно пустое
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 05, 2008 15:29    Ответить с цитатой
Полезность: Нет оценки
Alex2019 пишет:
Alexsey пишет:
тогда можно просто оттолкнуться от
Код:

for doc_1 in ::[FIN_ORDER].[DOCUMENT_REF] loop

Наверное, только от ::[FIN_ORDER].[DOCUMENT]? (т.к реквизита ..._REF вроде нет). Хорошо бы, но на что он ссылается? Я посмотрел в SQL-навигаторе, по тому ID, что прописан в этом поле вовсе ничего не находится. Ни в Z#DOCUMENT, ни в Z#DOCUMENT_REF. А в ЦФТ-навигаторе оно пустое

да именно.. прошу прощения
а далее уже будет несложно получить ID документа
ибо это будет
doc_1.[IN_FOLDER].[DOCS_IN_FOLD].[DOCUMENT]
_________________
всегда есть как минимум 2 выхода


Последний раз редактировалось: Alexsey (Вт Авг 05, 2008 15:33), всего редактировалось 1 раз
German
Профи


Вступление в Клуб: 25.06.2007
СообщениеВт Авг 05, 2008 15:30   Re: Работа со ссылками на документ Ответить с цитатой
Полезность: Нет оценки
Alex2019 пишет:
Строка
Код:
locate docref in ::[DOCUMENT_REF] collections where docref=P_FIN_ORDER

компилится в
Код:
declare
   plp$2$1   number;
   cursor c_obj is
      select  a1.id
      from Z#DOCUMENT_REF a1
      where a1.COLLECTION_ID is not NULL
      (a1.C_VALUE = plp$2$1);
begin
   plp$2$1 := Z#FIN_ORDER#INTERFACE.get_ref(P_FIN_ORDER,'IN_FOLDER');
   plp$ID_1 := NULL;
   for plp$c_obj in c_obj loop
      plp$ID_1 := plp$c_obj.id;  exit;
   end loop;
   if plp$ID_1 is NULL then raise rtl.NO_DATA_FOUND; end if;
end;
При выполнении вываливается с необработанным исключением, т.к. в цикле по курсору ничего не находится (plp$ID_1 - NULL)


А финраспоряжение, которое передано в P_FIN_ORDER, точно содержится хотя бы в одном массиве "некого ТБП" ? Курсор-то вроде корректный...
_________________
Homo homini
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 15:33    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
ID в ТБП Z#DOCUMENT можно получить так
Код:
for doc_1 in ::[FIN_ORDER].[DOCUMENT_REF] loop
doc_1.[IN_FOLDER].[DOCS_IN_FOLD].[DOCUMENT] --id из  Z#DOCUMENT

по другому никак
Стоп! Я чего-то недопонял. Для экземпляра финордера ID в Z#DOCUMENT и FIN_ORDER совпадают, т.к. второе - подкласс первого. Мне нужен ID экземпляра в DOCUMENT_REF, у которого C_VALUE=ID финордера
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 15:36   Re: Работа со ссылками на документ Ответить с цитатой
Полезность: Нет оценки
German пишет:

А финраспоряжение, которое передано в P_FIN_ORDER, точно содержится хотя бы в одном массиве "некого ТБП" ? Курсор-то вроде корректный...

Абсолютно точно. Вручную в SQL-навигаторе проверял. В том-то и дело, что все вроде правильно, а результат кривой...
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 05, 2008 15:36    Ответить с цитатой
Полезность: Нет оценки
Alex2019 пишет:
Alexsey пишет:
ID в ТБП Z#DOCUMENT можно получить так
Код:
for doc_1 in ::[FIN_ORDER].[DOCUMENT_REF] loop
doc_1.[IN_FOLDER].[DOCS_IN_FOLD].[DOCUMENT] --id из  Z#DOCUMENT

по другому никак
Стоп! Я чего-то недопонял. Для экземпляра финордера ID в Z#DOCUMENT и FIN_ORDER совпадают, т.к. второе - подкласс первого. Мне нужен ID экземпляра в DOCUMENT_REF, у которого C_VALUE=ID финордера


тогда надо смотреть только через папку.. ибо там есть и сам фин ордер и документ им порожденный
_________________
всегда есть как минимум 2 выхода
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 15:39    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
тогда надо смотреть только через папку.. ибо там есть и сам фин ордер и документ им порожденный

Алексей, документы мне совершенно незачем, они-то находятся без проблем. Посмотрите еще раз текст исходного вопроса, требуется найти ссылку на ссылку. Может тут какой-то хитрый синтаксис существует?
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 05, 2008 15:52    Ответить с цитатой
Полезность: Нет оценки
Alex2019 пишет:
Alexsey пишет:
тогда надо смотреть только через папку.. ибо там есть и сам фин ордер и документ им порожденный

Алексей, документы мне совершенно незачем, они-то находятся без проблем. Посмотрите еще раз текст исходного вопроса, требуется найти ссылку на ссылку. Может тут какой-то хитрый синтаксис существует?


тогда можно можно запустить скрипт,у меня отработал в "Жабе"
Код:

-- begin pl/sql
select s.COLLECTION_ID
from
IBS.Z#DOCUMENT_REF where
COLLECTION_ID = '47941267' --, где '47941267' ID записи
-- end pl/sql


а если боть совсем точным то

Код:

-- begin pl/sql
select s.COLLECTION_ID
from
IBS.Z#DOCUMENT_REF where
COLLECTION_ID = P_FIN_ORDER
-- end pl/sql

_________________
всегда есть как минимум 2 выхода
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 15:59    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
тогда можно можно запустить скрипт,у меня отработал в "Жабе"
Код:
select s.COLLECTION_ID
from
IBS.Z#DOCUMENT_REF s where
COLLECTION_ID = '47941267' --, где '47941267' ID записи

Опять не понял. В запросе хотим вернуть collection_id, тот же который мы задаем в условиях? Может быть имелось в виду where
s.VALUE = '47941267' ? Так практически такой же код и отрабатывает (см.выше) Но ничего не находит...
А в SQL-нав. у меня тоже все отрабатывает и находит. А в ЦФТ - нет
Alexsey
Эксперт


Вступление в Клуб: 06.09.2007
СообщениеВт Авг 05, 2008 16:01    Ответить с цитатой
Полезность: Нет оценки
Alex2019 пишет:
Alexsey пишет:
тогда можно можно запустить скрипт,у меня отработал в "Жабе"
Код:
select s.COLLECTION_ID
from
IBS.Z#DOCUMENT_REF s where
COLLECTION_ID = '47941267' --, где '47941267' ID записи

Опять не понял. В запросе хотим вернуть collection_id, тот же который мы задаем в условиях? Может быть имелось в виду where
s.VALUE = '47941267' ? Так практически такой же код и отрабатывает (см.выше) Но ничего не находит...

если хочеш получить значение VALUE то код у меня был
Код:
select s.VALUE
from
IBS.Z#DOCUMENT_REF s where
COLLECTION_ID = '47941267' --, где '47941267' ID записи

_________________
всегда есть как минимум 2 выхода


Последний раз редактировалось: Alexsey (Вт Авг 05, 2008 16:05), всего редактировалось 1 раз
Alex2019
Профи


Вступление в Клуб: 02.07.2007
СообщениеВт Авг 05, 2008 16:02    Ответить с цитатой
Полезность: Нет оценки
Alexsey пишет:
если поставить s.VALUE то скрипт не отрабатываетSad

В SQL работает, в ЦФТ - нет Sad
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2, 3  След.
Страница 1 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru