powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / RTF-шаблон в Oracle BI
12 сообщений из 12, страница 1 из 1
RTF-шаблон в Oracle BI
    #40001185
Master_Detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Вероятно, здесь можно быстрее найти помощь по 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
RTF-шаблон в Oracle BI
    #40001217
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, проблема скорее с запросом, чем с шаблоном. Вроде типовой 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
RTF-шаблон в Oracle BI
    #40001242
Master_Detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

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

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
RTF-шаблон в Oracle BI
    #40001326
Master_Detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev
Такое нужно? Почему все такие безрукие (((


Ну не гневайтесь, боярин Руки вроде есть, да еще не дошли покумекать по сути вашего ответа и xpath в частности. Спасибо за ваш вариант, попробую!
...
Рейтинг: 0 / 0
RTF-шаблон в Oracle BI
    #40001365
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]?>

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

ну в общем, вариантов много, нужно тестировать
...
Рейтинг: 0 / 0
RTF-шаблон в Oracle BI
    #40001800
Master_Detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
RTF-шаблон в Oracle BI
    #40001812
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
RTF-шаблон в Oracle BI
    #40001825
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и повторю 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
RTF-шаблон в Oracle BI
    #40001850
Master_Detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

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

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

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


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