Gerar string de tamanho fixo para campo VARCHAR2

Oracle

18/02/2008

Amigos,

Um sistema que uso (delphi/oracle) permite gerar arquivos para integrações diversas.

Tenho uma situação de geração de pedido de compra para integração com o sistema do fornecedor.

A rotina que gera arquivos permite a busca de informações via SQL e gera saida em diversos formatos, entre eles TXT de tamanho fixo, que é justamente a situação de um de nossos fornecedores.

Pois bem, tenho no sistema alguns campos de observação que são VARCHAR2 porém o resultado precisa ser de tamanho fixo. Tentei usar o comand RPAD para definir o tamanho que quero, porém quando campos do tipo varchar2 estão vazios o rpad também retorna conteudo vazio.

Alguem teria alguma solução para este caso?

Segue abaixo o SQL que estou usando para essa busca:

SELECT 
  ´C´      as TIPO, 
  ´000000´ as PEDIDO, 
  ´000004´ as CLIENTE, 
  ´1111´   as SETOR, 
  ´0040´   as ROTA,
  ´00´     as VAGO1,
  ´0000´   as DESCONTO,
  TO_CHAR(PCPEDIDO.DTEMISSAO, ´DD/MM/YYYY´) as DATA,
  RPAD(PCPEDIDO.OBS,40) || RPAD(PCPEDIDO.OBS2,40) || substr(PCPEDIDO.OBS3,1,16) as OBS,
--  RPAD(´ ´,96) as OBS,
  ´TP´     as CODTP,
  ´CO´     as CORTESIA,
  TO_CHAR(PCPEDIDO.DTPREVENT, ´DD/MM/YYYY´) as ENTREGA,
  substr(PCPEDIDO.OBS4,1,20) as OBSPED,
--  RPAD(´ ´,20) as OBSPED,
  ´0000´   as PAGTO,
  TO_CHAR(PCPEDIDO.NUMPED,´9999999999999999999´) as NUMPED,
  ´C´      as FRETE,
  PCPEDIDO.OBS5 || substr(PCPEDIDO.OBS6,1,70) as OBSNEW,
--  RPAD(´ ´,150) as OBSNEW,
  ´J´      as TIPOCLI,
  substr(PCFILIAL.CGC,1,2) || ´.´ || substr(PCFILIAL.CGC,3,3) || ´.´ || substr(PCFILIAL.CGC,6,3) || ´/´ || 
  substr(PCFILIAL.CGC,9,4) || ´-´ || substr(PCFILIAL.CGC,13,2) as CNPJ
FROM PCPEDIDO, PCFILIAL
WHERE PCPEDIDO.CODFILIAL = :CODFILIAL
  AND PCFILIAL.CODIGO    = :CODFILIAL
  AND PCPEDIDO.NUMPED    = :PEDIDO


Reparem as linhas comentadas que foram paleativos que funcionaram na geração do arquivo de tamanho fixo, porém não estão trazendo o conteudo dos campos, apenas espaços.


Aerreira

Aerreira

Curtidas 0

Respostas

Flyskin

Flyskin

18/02/2008

O mais rápido e fácil é você criar uma function que realize este trabalho para você e apartir daí colocar a chamada da function no teu select...

Ex.
SELECT
A.CODIGO,
FN_PREENCHE_STRING(A.NOME, 50) AS NOME
FROM
CLIENTE A


É por aí...


GOSTEI 0
Aerreira

Aerreira

18/02/2008

O mais rápido e fácil é você criar uma function que realize este trabalho para você (...)


Hum... O pior é que não saco muito de Oracle para poder criar essa função.. Uso mais o Firebird, porém como o sistema é de outra empresa, estou lá como usuário somente, não tenho muitas opções.

Vou estudar melhor como montar essa função no banco, se tiver dúvidas à respeito faço nova interação aqui nesse tópico.

Valeu pela dica.


GOSTEI 0
Aerreira

Aerreira

18/02/2008

Eu tinha me esquecido de postar a solução, que foi usando NVL:

RPAD(NVL(PCPEDIDO.OBS,´ ´),40) || RPAD(NVL(PCPEDIDO.OBS2,´ ´),40) || RPAD(NVL(PCPEDIDO.OBS3,´ ´),16) as OBS,


GOSTEI 0
Flyskin

Flyskin

18/02/2008

então acho que não tinha entendido o seu problema, pois o nvl só funciona se o campo estiver com null. era este o problema? campo com valor null?


GOSTEI 0
Aerreira

Aerreira

18/02/2008

(...) porém quando campos do tipo varchar2 estão vazios o rpad também retorna conteudo vazio (...)


Sim, como pode ver acima era o que ocorria.


GOSTEI 0
POSTAR