Dicas Rápidas de XML Publisher

Oracle Business Intelligence, Oracle Warehouse Builder OWB, Oracle Discoverer, BI Publisher, XML Publisher, OLAP, Data Mining, ODI Oracle Data Integrator, etc
Responder
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Um simples IF ENDIF

Selecionar tudo

<?if:OU_REGION2='SP'?> SE REGIÃO FOR SP VAI MOSTRAR ESSE TEXTO, CAMPOS, ETC <?end if?>
Testar se um campo é NULO

Selecionar tudo

<?if: ITEM_ANTIGO != ''?> SE TEM ITEM ANTIGO ISSO VAI APARECER <?end if?>
Fazer NVL dentro XML Publisher
Após várias tentativas, essa é a forma que se mostrou mais eficiente:

Selecionar tudo

<?choose:?>
  <?when:PROMISED_DATE!=''?> AQUI VAI TEXTO E CAMPOS <?end when?>
  <?otherwise:?> SE O PROMISED_DATE FOR NULO, VAI  VAI MOSTRAR ISSO <?end otherwise?>
<?end choose?>
IF ELSE com SUBSTR

Selecionar tudo

<?xdoxslt:ifelse(substring(ITEM,1,4)='JOAO', 'JOAO DA SILVA', 'não é o joao')?>
PAGE BREAK condicional

Selecionar tudo

<?if:CF_LPN_FLAG='Y'?>
 <?split-by-page-break: ?>
<?end if?>
Ou

Selecionar tudo

<?for-each:DEPT?>
...
...
...
<?split-by-page-break:?>
<?end for-each?>
Converter data DD-MON-YYYY para DD/MM/YYYY
Existem casos que não se pode alterar a query (principalmente em relatórios Core, onde o data definition não é um XML, e sim alguma rotina em java. Aí é possível formatar a data usando DECODE (este caso não importa se é ingles ou portugues)

Selecionar tudo

<?xdofx:substr(PROMISED_DATE,1,2)?><?xdofx:decode(substr(PROMISED_DATE,4,3),'JAN','/01/','FEB','/02/','FEV','/02/','MAR','/03/'
,'APR','/04/','ABR','/04/','MAY','/05/','MAI','/05/','JUN','/06/','JUL','/07/','AUG','/08/','AGO','/08/','SEP','/09/','SET','/09/'
,'OCT','/10/','OUT','/10/','NOV','/11/','DEC','/12/','DEZ','/12/')?><?xdofx:substr(PROMISED_DATE,8,4)?>
Tag para inicializar HEADER e FOOTER complexos
O problema do header padrão do RTF/Word é que eles não aceitam uso de "campos". Em resumo, o código ocupa bastante espaço físico. Dai pode acontecer que o header fique até a metade da página! (e esse tamanho é fixo). Para solucionar o problema, não se usa o HEADER padrão do word. A gente coloca o cabeçalho na própria página e informa o Bi Publisher onde fica o header, o corpo e footer por essas tags especiais:

Selecionar tudo

SEU_CABEÇALHO COMPLEXO AQUI
SEU_CABEÇALHO COMPLEXO AQUI
<?start:body?>
CORPO DO RELATÓRIO
CORPO DO RELATÓRIO
<?end body?>
FOOTER DO RELATORIO
Teve casos que isso acima não funcionou. Então eu usei as seguintes tags que funcionaram:

Selecionar tudo

<?body-start?>
<?body-end?>
Fazer um somatório usando Variáveis

1. Inicialize a variável "var" fora do grupo de repetição :

Selecionar tudo

<?xdoxslt:set_variable($_XDOCTX,’var’,0)?>  


2. Dentro do grupo, some o valor de um campo (neste caso, o LINE_AMOUNT). Como o campo vem formatado com vírgulas, ele retira e coloca ponto onde deve:

Selecionar tudo

<?xdoxslt:set_variable($_XDOCTX,’var’,xdoxslt:get_variable($_XDOCTX,’var’)+ translate(translate(LINE_AMOUNT,'.',''),',','.'))?>
3. No final do relatório, mostra o valor de VAR formatado:

Selecionar tudo

<? format-number: xdoxslt:get_variable($_XDOCTX,’var’); '999G999G999D99' ?>
DICA: Você pode inicializar a variável com algum valor. Isso é útil pra fazer somatórios POR PAGINA, por exemplo... OU no meu caso, utilizar um total anterior pra fazer a soma de débito e crédito diário.

Grupo de repetição com ordenação em 2 campos

Selecionar tudo

<?for-each:LINE_LOCATIONS_ROW?>
<?sort:../../LINE_NUM;'ascending';data-type='number'?>
<?sort:PROMISED_DATE;'ascending';data-type='text'?>
Esta é mais pra consulta rápida, pois é possível fazer isso usando os wizards, etc.
Este exemplo está criando um Loop em Line_Locations_ROW e forçando a ordenação pelo LINE_NUM em 2 níveis anteriores E também no Promised_date.

Exportar cadastro do XML Publisher via FNDLOAD
Exemplo:

Selecionar tudo

FNDLOAD apps/senha 0 Y DOWNLOAD $XDO_TOP/patch/115/import/xdotmpl.lct ~/thomas/seu_arq.ldt XDO_DS_DEFINITIONS APPLICATION_SHORT_NAME=XG DATA_SOURCE_CODE=XG_XML_AP_001
O próximo exemplo baixa um único DataDefinition (ARXCOBLX) e um template específico:

Selecionar tudo

FNDLOAD user/pword@mydb 0 Y DOWNLOAD
$XDO_TOP/patch/115/import/xdotmpl.lct XMLPData.ldt XDO_DS_DEFINITIONS
APPLICATION_SHORT_NAME=AR DATA_SOURCE_CODE=ARXCOBLX
TMPL_APP_SHORT_NAME=AR
TEMPLATE_CODE=ARLETTER1
Intercalar cores de cada linha (tipo zebra)
É possível fazer com que o relatório saia cada linha com uma cor, exemplo: Branco, cinza, branco, cinza, etc.

Selecionar tudo

<?choose:?>
 <?when:position() mod 2=0?>
 <?attribute@incontext:background-color;'Yellow'?>
 <?end when?>
 <?otherwise:?>
 <?attribute@incontext:background-color;'Red'?>
 <?end otherwise?>
<?end choose?>
Neste LINK tem uma listagem das cores e outras formas de colorir.

Manter zeros na esquerda quando a saída é excel
O Excel é tão esperto que quando ele vê um 00001, ele coloca 1. O problema é que as vezes a gente quer que apareça os zeros na frente. Pra fazer isso, basta utilizar o código abaixo: (e substituia o ITEM_NUMBER pelo seu campo com zeros)

Selecionar tudo

<fo:bidi-override direction="ltr" unicode-bidi="bidi-override">
<?ITEM_NUMBER?>
</fo:bidi-override> 
Outra forma é colocar assim:

Selecionar tudo

="<seu_campo_aqui>"
Ou seja, coloca um =" e fecha aspas no fim. Dai o excel deixa os zeros! Tive que usar dessa forma pois da forma acima o usuário não consegue fazer PROC-V.

Formatar valores - dinheiro
Este comando formata a saída de valores em dinheiro, conforme a moeda.
https://blogs.oracle.com/xmlpublisher/e ... rrencies_1

Selecionar tudo

<?format-currency:CAMPO_VALOR;CAMPO_CURRENCY_CODE;'false'?>
Encontrar mais detalhes de erro no LOG do OPP.
As vezes o XML Publisher apenas dá uma mensagem:
Post-processing of request 39113073 failed at 14-MAR-2014 19:19:13 with the error message:
One or more post-processing actions failed. Consult the OPP service log for details.
Nestes casos, a gente roda a seguinte query pra achar o arquivo contendo mais detalhes:

Selecionar tudo

SELECT fcpp.concurrent_request_id req_id, fcp.node_name, fcp.logfile_name
  FROM fnd_conc_pp_actions fcpp, fnd_concurrent_processes fcp
 WHERE fcpp.processor_id = fcp.concurrent_process_id
   AND fcpp.action_type = 6
   AND fcpp.concurrent_request_id = 39113073   -- this is the request id
Ver note 364547.1 do metalink.

Comparação XSLT e BI Publisher tags
2023-12-12_14-56.png
2023-12-12_14-57.png
LINK: https://docs.oracle.com/cd/E12844_01/do ... 481158.htm
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 8 visitantes