XML Publisher - Definição de dados em XML e LOV's

Oracle Business Intelligence, Oracle Warehouse Builder OWB, Oracle Discoverer, BI Publisher, XML Publisher, OLAP, Data Mining, ODI Oracle Data Integrator, etc
Responder
Renan Castro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 22 Fev 2011 11:01 am
Localização: Juiz de Fora

Fala pessoal! Bom dia a todos,

ultimamente aqui na empresa temos feitos muitos desenvolvimentos para XML Publisher com procedures que escrevem o XML.

Quando imaginamos que um relatório parece ser mais simples usamos Definição de Dados (Data Template ou Data definition), acontece que me deparei com um problema bizarro esses dias:

Eu gero o meu relatório a partir de um programa concorrente, então tenho a minha lista de valores de fornecedores que exibe um nome ao usuário e joga o ID para o relatório.

Acontece que ao imprimir os parâmetros informados pelo usuário no relatório eu não quero o ID do fornecedor e sim o nome do mesmo.

Em package eu resolvia isso com uma função que recebia o ID e preenchia uma tag com o nome do mesmo.

Fiz algumas gambiarras aqui em definição de dados mais ainda não descobri um jeito legal e funcional(o jeito que estou usando não exibe parâmetros se o relatório não retornar dados) de se fazer isso em DD...

Alguém sabe de alguma solução ou pode me dar um caminho para a solução deste problema??

Desde já agradeço,
Renan.
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

Você pode tratar isso direto no seu SELECT dentro do Data Definition.

Exemplo:
Digamos que você tenha um parametro chamado p_representante (que é um codigo "20" que vem do concurrent). Mas é um parametro opcional, pode vir nulo.

Dai no seu select, você faz join buscando a DESCRICAO do representante normalmente:

Selecionar tudo

SELECT
  A.ID_REPRES
, B.NOME_REPRESENTANTE
, A.VALOR
FROM 
  SUATABELA A
, REPRESENTANTES B
WHERE A.ID_REPRES = B.ID_REPRES
  -- trata parametro opcional. Se é null, busca tudo. Se veio preenchido, filtra buscando apenas o repres informado.
  AND ( p_representante IS NULL
        OR
        A.ID_REPRES = p_representante
      )
Uma outra forma que é perfeitamente possível, é você criar um outro SELECT dentro do data definition. Dai basta você usar ele como quiser.

Exemplo:

Selecionar tudo

<?xml version="1.0" encoding="UTF-8"?>
<dataTemplate name="XXXXXXXX" description="RELATORIO DE TESTE" version="1.0">
<parameters> 
  <parameter name="p_gl_period"       dataType="varchar2" />
  <parameter name="p_tipo_comissao"   dataType="varchar2" />
  <parameter name="p_repres_numero"   dataType="varchar2" />
</parameters>
<dataQuery>

<sqlStatement name="Q_DATAS">
<![CDATA[

--BUsca as datas do periodo informado
SELECT
  to_char(start_date, 'dd/mm/yyyy')  DTINI 
, to_char(end_date,   'dd/mm/yyyy')  DTFIM
FROM gl_periods 
WHERE UPPER(period_name) = UPPER(:p_gl_period)   --'JAN-11'--
AND period_set_name      = 'GL_CALENDARIO'
]]> 
</sqlStatement>


<sqlStatement name="Q_PRINC">
<![CDATA[ 
SELECT BLA BLA BLA BLA BLA BLA
]]> 
</sqlStatement>

<sqlStatement name="Q_EMPRESA">
<![CDATA[ 
SELECT XG_FUN_XX_ORG_LE(  TO_NUMBER(fnd_profile.value('ORG_ID'))  ) NOME_EMPRESA
FROM dual
]]>
</sqlStatement>
</dataQuery>
<dataStructure>
  <group name="G_EMPRESA" source="Q_EMPRESA">
    <element name="NOME_EMPRESA"                    value="NOME_EMPRESA" />
  </group>
  <group name="G_DATAS" source="Q_DATAS">
    <element name="DTINI"                           value="DTINI" />
    <element name="DTFIM"                           value="DTFIM" />
  </group>
  <group name="G_REPRES" source="Q_PRINC">
    <element name="VENDOR_NAME"                       value="VENDOR_NAME" />
    <element name="INSCRICAO"                         value="INSCRICAO" />
    <element name="T_REPRES_COMISSAO"                 value="G_LINHAS.COMISSAO"     function="SUM()"/>
    <element name="T_REPRES_BASE"                     value="G_LINHAS.BASE"         function="SUM()"/>
    <group name="G_TIPO" source="Q_PRINC">
      <element name="TIPO"                              value="TIPO" />
      <element name="T_TIPO_COMISSAO"                   value="G_LINHAS.COMISSAO"     function="SUM()"/>
      <element name="T_TIPO_BASE"                       value="G_LINHAS.BASE"         function="SUM()"/>
      <group name="G_LINHAS" source="Q_PRINC">
        <element name="CLIENTE_NOME"                      value="CLIENTE_NOME" />
        <element name="PEDIDO"                            value="PEDIDO" />
        <element name="NOTA"                              value="NOTA" />
        <element name="TITULO"                            value="TITULO" />
        <element name="EMISSAO"                           value="EMISSAO" />
        <element name="VENCIMENTO"                        value="VENCIMENTO" />
        <element name="PAGTO"                             value="PAGTO" />
        <element name="BASE"                              value="BASE" />
        <element name="PERCENTUAL"                        value="PERCENTUAL" />
        <element name="COMISSAO"                          value="COMISSAO" />
        <element name="CATEGORY"                          value="CATEGORY" />

      </group>
    </group>
  </group>
  <element name="T_TOT_COMISSAO"                   value="G_LINHAS.COMISSAO"     function="SUM()"/>
  <element name="T_TOT_BASE"                       value="G_LINHAS.BASE"         function="SUM()"/>
</dataStructure>
</dataTemplate>
Esse é um exemplo bem "completo", pois eu estou usando um monte de somatórios por grupo também.

Se tiver dúvida, manda o codigo aí pra gente ver e poder dar um help melhor!
Renan Castro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 22 Fev 2011 11:01 am
Localização: Juiz de Fora

Opa, muito obrigado pela resposta!!!

O segundo exemplo parece resolver o meu problema com clareza!!!

Eu criei um select separado e tal, ai lá embaixo eu setava um grupamento da mesma forma que você fez:

Selecionar tudo

  <group name="G_EMPRESA" source="Q_EMPRESA"> 
    <element name="NOME_EMPRESA"       value="NOME_EMPRESA"/> 
  </group> 
Só que não cheguei a submeter, o que eu fazia era o seguinte:
- Salvava o xml
- Carregava no template builder indo em Dados -> Carregar Esquema XML

Só que ele simplismente não exibe grupamentos que não tenham pais ou filhos igual esse ai de empresa que você fez...

O correto seria então eu fazer upload desta definição, geração de um XML de dados e importação do mesmo no bi publisher pelos Dados -> Carregar Dados??? Que ai sim ele traria esses campos de nome isolados para mim???

Valeu!
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

Bom, se o campo possui referencia dentro do dataStructure (lá onde se diz de qual SQL vem cada campo e também a estrutura dos grupos do XML), então ele tem que aparecer na saída do XML.

Normalmente, eu faço assim pra testar:
* Após carregado o data-definition dentro do XML-Publisher, eu rodo o concurrent, mas antes de submeter, eu tiro o LAYOUT associado no concurrent. (deixo tudo nulo, a LINGUA, LAYOUT, saida PDF, etc).

Dai submeto. Com isso, o request vai ficar amarelo, em WARNING. Isso porque não tinha nenhum layout associado. Se você clicar em SAIDA, vai aparecer o XML pra você salvar e ler no WORD.
Renan Castro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 22 Fev 2011 11:01 am
Localização: Juiz de Fora

Muito obrigado pela sua ajuda dr_gori!

Para desativar o modelo RTF eu geralmente desativava o mesmo no admin do xml publisher colocando uma data final anterior ao dia atual.

Esse jeito que você mostrou parece bem mais prático!

Questão resolvida, obrigado e abraços.
Responder
  • Informação
  • Quem está online

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