Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / RTF-шаблон в Oracle BI / 12 сообщений из 12, страница 1 из 1
22.09.2020, 09:36
    #40001185
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Добрый день!
Вероятно, здесь можно быстрее найти помощь по oracle bi, чем в других разделах. Имею bi11, модель данных, которая возвращает следующее:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<UNICA_BINS>
<CAMPAIGN_DATE>22.09.2020</CAMPAIGN_DATE>
<BIN1>0000000000</BIN1>
<SIEBEL_DATA>
  <COMP_ROW_ID>1</COMP_ROW_ID>
  <CONTACT_ROW_ID>99</CONTACT_ROW_ID>
  <BIN_>0000000000</BIN_>
  <COMPANY_NAME>Рога и Копыта</COMPANY_NAME>
<FIO>Иванов Иван Иванович</FIO>
</SIEBEL_DATA>
<SIEBEL_DATA>
  <COMP_ROW_ID>1</COMP_ROW_ID>
  <CONTACT_ROW_ID>99</CONTACT_ROW_ID>
  <BIN_>0000000000</BIN_>
  <COMPANY_NAME>Копыта и Рога</COMPANY_NAME>
  <FIO>Петров Петр Петрович</FIO>
</SIEBEL_DATA>
</UNICA_BINS>




Датасеты из разных БД, в один запрос не скрутить. Связаны между собой ссылкой, где UNICA_BINS.BIN1=SIEBEL_DATA.BIN_

Необходимо эти данные отразить в rtf-шаблоне с той же логикой, что в XML:
- данные из UNICA_BINs отражаются всегда, даже если нет вложенных SIEBEL_DATA
- если в SIEBEL_DATA несколько записей на одну запись из UNICA_BINs, то вывести их обе в шаблон; поля из UNICA_BINs соответственно продублировать

Вроде все просто и понятно, но не могу понять, как делать repeating group в шаблоне:
- если делаю все столбцы for-each для UNICA_BINs, то выводится только по одной записи из связанных SIEBEL_DATA
- если делаю все столбцы for-each для SIEBEL_DATA, то не выводятся данные из UNICA_BINs (что тоже логично вроде)

Получилось вывести данные корректно, если в шаблоне в табличной части вывода сделать две строки - первую для UNICA_BINs, вторую для записей SIEBEL_DATA. Некое дерево получается. Но выглядит уродски, хотелось бы все в одной строке сделать.


Спасибо!
...
Рейтинг: 0 / 0
22.09.2020, 10:39
    #40001217
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Мне кажется, проблема скорее с запросом, чем с шаблоном. Вроде типовой LEFT OUTER JOIN получается, но у Вас отчетное средство "left outer" забыло )))

Получилось вывести данные корректно, если в шаблоне в табличной части вывода сделать две строки - первую для UNICA_BINs, вторую для записей SIEBEL_DATA. Некое дерево получается. Но выглядит уродски, хотелось бы все в одной строке сделать.

Тут скорее нужно в форум XML/XSLT обращаться, можно ли на XPath изобразить union двух поддеревьев (не знаю, как это назвать). Выражение, которое указывается в for-each это просто Xpath.

Если удалось изобразить работающий шаблон (я так понимаю, в первом цикле нужно было еще if по count(SIEBEL_DATA)=0 проверять) - то лично я бы так и оставил.

p.s. по xpath union в гугле нашлось:

Где-то в инетеUnion (|) Operator

XML Path Language (XPath) supports the set operation |. The |, or union, operator returns the union of its two operands, which must be node-sets. For example, //company | //employee returns a node-set that combines all the //company nodes and all the //employee nodes. Multiple union operators can be chained together to combine multiple node-sets. For example, //company | //employee | //sales | //consultant returns a node-set containing all //company , //employee , //sales , and //consultant elements. The union operator preserves document order and does not return duplicates.
...
Рейтинг: 0 / 0
22.09.2020, 12:16
    #40001242
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Leonid Kudryavtsev,

Да нет, с запросом то все ок. Я привел фрагмент, где есть записи в SIEBEL_DATA. Но есть и те, где в SIEBEL_DATA нет записей, а UNICA_BINS имеется. Дело в том, какие инструкции нужно указать в шаблоне, чтобы работало правильно
...
Рейтинг: 0 / 0
22.09.2020, 14:39
    #40001321
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Такое нужно? Почему все такие безрукие (((

note: деньги на пиво перечислять Санкт-Петербург, бар Твин-Пикс, Лиговский просп., 9/31
note2: первая строчка может дублироваться, т.к. придет и с UNICA_BINS и с SIEBEL_DATA, поэтому из SIEBEL_DATA ее нужно выкидывать.
note3: Так же фигня с адресацией UNICA_BINS внутри цикла, т.к. при обработке SIEBEL_DATA нужно добавлять две точки. Если имена полей между таблицами не совпадают, то проще тем же самым union сделать по методу "первый попавшийся". Если имена полей могут совпадать, то тогда нужно if'ами, т.к. может быть ошибка "первый попавшийся, не попал". Но if'ами скорее всего будет намного больше букв, т.ч. лучше имена делать уникальными.

IMHO

2.xml
Код: xml
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.
<?xml version="1.0" encoding="windows-1251"?>
<GLOBAL>
<UNICA_BINS>
<CAMPAIGN_DATE>01.01.2020</CAMPAIGN_DATE>
<BIN1>9999999999</BIN1>
</UNICA_BINS>
<UNICA_BINS>
<CAMPAIGN_DATE>22.09.2020</CAMPAIGN_DATE>
<BIN1>0000000000</BIN1>
<SIEBEL_DATA>
  <COMP_ROW_ID>1</COMP_ROW_ID>
  <CONTACT_ROW_ID>99</CONTACT_ROW_ID>
  <BIN_>0000000000</BIN_>
  <COMPANY_NAME>Рога и Копыта</COMPANY_NAME>
<FIO>Иванов Иван Иванович</FIO>
</SIEBEL_DATA>
<SIEBEL_DATA>
  <COMP_ROW_ID>1</COMP_ROW_ID>
  <CONTACT_ROW_ID>99</CONTACT_ROW_ID>
  <BIN_>0000000000</BIN_>
  <COMPANY_NAME>Копыта и Рога</COMPANY_NAME>
  <FIO>Петров Петр Петрович</FIO>
</SIEBEL_DATA>
</UNICA_BINS>
</GLOBAL>




2.rtf<?for-each: UNICA_BINS | SIEBEL_DATA[position()>1]?>
UNICA_BINS=<?BIN1 | ../BIN1?> <?CAMPAIGN_DATE | ../CAMPAIGN_DATE?>
SIEBEL_DATA =<?COMPANY_NAME?>
<?end for-each?>


outputUNICA_BINS=9999999999 01.01.2020
SIEBEL_DATA =
UNICA_BINS=0000000000 22.09.2020
SIEBEL_DATA =Рога и Копыта
UNICA_BINS=0000000000 22.09.2020
SIEBEL_DATA =Копыта и Рога
...
Рейтинг: 0 / 0
22.09.2020, 14:50
    #40001326
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Leonid Kudryavtsev
Такое нужно? Почему все такие безрукие (((


Ну не гневайтесь, боярин Руки вроде есть, да еще не дошли покумекать по сути вашего ответа и xpath в частности. Спасибо за ваш вариант, попробую!
...
Рейтинг: 0 / 0
22.09.2020, 16:10
    #40001365
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Цикл можно заменить на:

<?for-each: SIEBEL_DATA | UNICA_BINS[count(SIEBEL_DATA)=0]?>

или на два цикла

<?for-each: UNICA_BINS?>
<?for-each: SIEBEL_DATA | parent::UNICA_BINS[count(SIEBEL_DATA)=0]?>

с последним не очень уверен, плохо знаю XPath (((

ну в общем, вариантов много, нужно тестировать
...
Рейтинг: 0 / 0
23.09.2020, 18:06
    #40001800
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Leonid Kudryavtsev
Цикл можно заменить на:

<?for-each: SIEBEL_DATA | UNICA_BINS[count(SIEBEL_DATA)=0]?>

или на два цикла

<?for-each: UNICA_BINS?>
<?for-each: SIEBEL_DATA | parent::UNICA_BINS[count(SIEBEL_DATA)=0]?>



Спасибо, работают оба варианта. Union как бы работает, но при обоих циклах не выводятся BIN1 и CAMPAIGN_DATE из UNICA_BINS. Предполагая, что дело в том, что в поле указан запрос типа <?CAMPAIGN_DATE?> без абсолютных путей. Прописал в обоих полях:

Код: xml
1.
2.
<?/DATA_DS/UNICA_BINS/BIN1?>
<?/DATA_DS/UNICA_BINS/CAMPAIGN_DATE?>



Столбцы заполняются, но значение дублируется одно и то же с первой записи UNICA_BINS :(
...
Рейтинг: 0 / 0
23.09.2020, 18:19
    #40001812
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Master_Detail

но при обоих циклах не выводятся BIN1 и CAMPAIGN_DATE из UNICA_BINS. Предполагая, что дело в том, что в поле указан запрос типа <?CAMPAIGN_DATE?> без абсолютных путей


стоп стоп.
В 22201928 у меня все выводится.

Проблема в том, что получается "мешанина" из SIEBEL_DATA и UNICA_BINS

данные BIN1 и CAMPAIGN_DATE в этом случае есть, но их положение совершенно разное. Для "итерации" которыя запустилась по SIEBEL_DATA нужно обращаться как
../CAMPAIGN_DATE
а для "итерации" которая запустилась по UNICA_BINS просто
CAMPAIGN_DATE

Тут или нужно сложный XPath для for-each придумывать (но это нужно в профильный подфорум, я XPath настолько хорошо не знаю) или разводить IF'ами или брать оба варианта и дальше "первое попавшиеся"

<?../CAMPAIGN_DATE | CAMPAIGN_DATE?>

Master_Detail
столбцы заполняются, но значение дублируется одно и то же с первой записи UNICA_BINS :(


Вы же так и сказали. Пойди в самый верх документа, потом ниже....пока не найдешь значение по такому пути. В документе таких значений масса - возврашается самое первое.

Поскольку путь абсолютный, то на for-each он банально не обращает внимание.

IMHO могу ошибаться. Документацию читал давно. С XML Publisher плотно работал лет 10 назад. Терминологию и детали уже не помню.
...
Рейтинг: 0 / 0
23.09.2020, 18:29
    #40001825
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Ну и повторю IMHO

Обрабатывать данные в XML Publisher это тупиковый путь. Простейшую обработку сделать можно, все же XSLT и XPath имеют достаточно возможностей. Но увлекаться не стоит:
1. требуются продвинутые знания XML/XSLT/Xpath и пр
2. требуется опыт
3. тестирование сложнее, чем тестирование SELECT'ов
4. с учетом 1-3 как такой отчет потом сопровождать - не очень понятно

Все же, если есть возможность, лучше данные формировать в удобном виде на стороне сервера.

Когда мы рисовали отчеты, мы часто даже даты / числа в текст перегоняли на стороне SQL Server'а. Т.к. даже заниматься форматированием вывода чисел на стороне XML Publisher'а - можно, но все же более сложно, чем привычными SELECT'ами, TO_CHAR'ами

AFAIK & IMHO
...
Рейтинг: 0 / 0
23.09.2020, 19:00
    #40001850
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Leonid Kudryavtsev,

Огромная благодарность вам за помощь! В итоге и сделал как <?../CAMPAIGN_DATE | CAMPAIGN_DATE?>

Насчет обработки - да, абсолютно с вами согласен. Форматирование и приведение к тексту тоже в запросе. Но в этой ситуации проблема в том, что два датасета тянут данные с разных БД. Линков между БД нет и по безопасности быть не может (банк, такие условия). Поэтому и приходится связывать датасет между собой линком в паблишере, а потом уже работать с XML
...
Рейтинг: 0 / 0
23.09.2020, 19:27
    #40001868
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
Master_Detail
два датасета тянут данные с разных БД. Линков между БД нет и по безопасности быть не может (банк, такие условия). Поэтому и приходится связывать датасет между собой линком в паблишере, а потом уже работать с XML

Хм... В банках часто бывают всякие интеграционные решения.
Почему не применить их для формирования XML-документа, скармливаемого паблишеру (а паблишер питается именно xml-документами, даже если Вы написали sql)?
Заодно по-человечески разведете ситуации недоступности одного из источников.
...
Рейтинг: 0 / 0
23.09.2020, 19:38
    #40001873
Master_Detail
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RTF-шаблон в Oracle BI
andrey_anonymous,
Да, но там свои вопросы. Нужно этот инструмент искать(а владельцу его надо обосновать необходимость), формировать там xml, помещать xml на сервер bi. А за пару-тройку лет, пока идет проект, это первая ситуация такого рода. Если станет типовой, тогда, думаю, ваш совет очень пригодится!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / RTF-шаблон в Oracle BI / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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