Problema com Case When no Report Builder 6.0.8.13.1

Dicas e truques sobre Oracle Reports Builder - modo gráfico ou modo caractere, ascii, arquivo .PRT, etc
Responder
Mangaba
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 15 Out 2008 10:59 am
Localização: Rio de Janeiro - RJ

Fala Galera!

Rodo esse SQL no Report e ele Funciona:

Selecionar tudo

select t.ds_tp_laudo
     , l.cd_paciente
     , p.nm_paciente
     , l.dt_historico
     , l.ds_historico
     , l.ds_observacao
     , l.cd_prestador
     , 'Rio de Janeiro, '|| to_char (dt_liberacao, 'dd')|| ' de '|| to_char (dt_liberacao, 'month')|| 'de '|| to_char (dt_liberacao, 'yyyy')|| '.'
     , m.nm_prestador
     , c.ds_conselho
     , m.ds_codigo_conselho
     , l.cd_laudo_same
     , decode (l.tp_destino, 'C', 'Continua tratamento no ambulatório', 'E', 'Encaminhado(a) à Fisioterapia', 'T', 'Transferido(a) para outro Serviço')
     , '*' || l.cd_laudo_same || '*' as cd_barras
     , l.cd_seguranca
  from cpd.laudo_same l
     , dbamv.prestador m
     , dbamv.conselho c
     , dbamv.paciente p
     , cpd.tipo_laudo t
 where l.cd_prestador = m.cd_prestador(+)
   and m.cd_conselho = c.cd_conselho(+)
   and l.cd_paciente = p.cd_paciente(+)
   and l.cd_tp_laudo = t.cd_tp_laudo(+)
   and l.cd_laudo_same = :p_cd_laudo_same
Alterei para que seja colocado "." a cada 5 caracteres no campo cd_seguranca, para que seja melhor visualizado!
Só que quando altero, aparecem vários erros que no SQL acima não aparecia, como erro de variáveis de ligação e parametro que ele não acha mais!
SQL NOVO:

Selecionar tudo

select t.ds_tp_laudo
     , l.cd_paciente
     , p.nm_paciente
     , l.dt_historico
     , l.ds_historico
     , l.ds_observacao
     , l.cd_prestador
     , 'Rio de Janeiro, '||to_char(dt_liberacao,'dd')||' de '||to_char(dt_liberacao,'month')||'de '||to_char(dt_liberacao,'yyyy')||'.'
     , m.nm_prestador
     , c.ds_conselho
     , m.ds_codigo_conselho
     , l.cd_laudo_same
     , decode(l.tp_destino,'C','Continua tratamento no ambulatório',
                           'E','Encaminhado(a) à Fisioterapia',
                           'T','Transferido(a) para outro Serviço')
     , '*'||l.cd_laudo_same||'*' as cd_barras
     , case when (length(l.cd_seguranca)>=25) then
                  substr(l.cd_seguranca,1,5)||'.'||
                  substr(l.cd_seguranca,6,5)||'.'||
                  substr(l.cd_seguranca,11,5)||'.'||
                  substr(l.cd_seguranca,16,5)||'.'||
                  substr(l.cd_seguranca,20,5)
              else l.cd_seguranca  
         end cd_seguranca
     
from   cpd.laudo_same l
     , dbamv.prestador m
     , dbamv.conselho c
     , dbamv.paciente p
     , cpd.tipo_laudo t
       
where  l.cd_prestador = m.cd_prestador(+)
   and m.cd_conselho  = c.cd_conselho(+)
   and l.cd_paciente  = p.cd_paciente(+)
   and l.cd_tp_laudo  = t.cd_tp_laudo(+)
   and l.cd_laudo_same = :p_cd_laudo_same

O que fazer nesse caso?

Abs!
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE

Se você postar o erro ajudaria.

mas uma alternativa do case é o decode.
Tenta isso aqui:

Selecionar tudo

decode(sign(length(l.cd_seguranca) - 24),
      1,
      substr(l.cd_seguranca, 1, 5) || '.' || substr(l.cd_seguranca, 6, 5) || '.' ||
      substr(l.cd_seguranca, 11, 5) || '.' || substr(l.cd_seguranca, 16, 5) || '.' ||
      substr(l.cd_seguranca, 20),
      l.cd_seguranca) cd_seguranca
LordElfo
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 111
Registrado em: Qui, 22 Fev 2007 2:34 pm
Localização: DF
________________
http://lordelfo.blogspot.com
Thiago Façanha

Só uma dúvida Mangaba.
Você realmente deseja todos estes outer joins?
Esses do 'l' , 'm' e 'c' .....

Dá uma validada se não seria melhor o código abaixo, pois da forma que está ele vai trazer todos os registros de 'l' , tendo prestador ou não na tabela 'm'... e além disso todos os registros de 'm'... tendo conselho ou não na tabela 'c'

Selecionar tudo

SELECT t.ds_tp_laudo, l.cd_paciente, p.nm_paciente, l.dt_historico,
       l.ds_historico, l.ds_observacao, l.cd_prestador,
          'Rio de Janeiro, '
       || TO_CHAR (dt_liberacao, 'dd')
       || ' de '
       || TO_CHAR (dt_liberacao, 'month')
       || 'de '
       || TO_CHAR (dt_liberacao, 'yyyy')
       || '.',
       m.nm_prestador, c.ds_conselho, m.ds_codigo_conselho, l.cd_laudo_same,
       DECODE (l.tp_destino,
               'C', 'Continua tratamento no ambulatório',
               'E', 'Encaminhado(a) à Fisioterapia',
               'T', 'Transferido(a) para outro Serviço'
              ),
       '*' || l.cd_laudo_same || '*' AS cd_barras, l.cd_seguranca
  FROM cpd.laudo_same l
       LEFT OUTER JOIN
       (dbamv.prestador m LEFT OUTER JOIN dbamv.conselho c
       ON m.cd_conselho = c.cd_conselho)
       ON l.cd_prestador = m.cd_prestador
       LEFT OUTER JOIN dbamv.paciente p ON l.cd_paciente = p.cd_paciente
       LEFT OUTER JOIN cpd.tipo_laudo t ON l.cd_tp_laudo = t.cd_tp_laudo
 WHERE l.cd_laudo_same = :p_cd_laudo_same

Vlw
Mangaba
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 15 Out 2008 10:59 am
Localização: Rio de Janeiro - RJ

Fala galera, obrigado pelas dicas!

Usei uma função para resolver o problema:

Selecionar tudo

FUNCTION F_AGRUPA_NUMERO_LAUDO
  ( texto IN varchar2)
  RETURN  varchar2 IS

BEGIN 
    IF length(texto) <> 25 THEN
       RETURN texto;
    ELSE
       RETURN SUBSTR(texto,1,5) || '.' || SUBSTR(texto,6,5) || '.' || SUBSTR(texto,11,5) || '.' || SUBSTR(texto,16,5) || '.' || SUBSTR(texto,21,5);
    END IF;
EXCEPTION
   WHEN OTHERS THEN
       RETURN texto;
END;
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

No lançamento do Reports, o SQL da Oracle não aceitava alguns comandos, como CASE e subselects. Apesar desses comandos rodarem, frequentemente causam problemas. Então o negócio é evitar ao máximo.
A solução é usar DECODE no lugar de CASE e evitar ao máximo subqueries (subqueries são aceitas sem problemas com IN).
Responder
  • Informação
  • Quem está online

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