Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gu Oliveira

[Resolvido] Oracle não ignorar "NULOS"

Recommended Posts

Pessoal,

Estou criando um arquivo de importação de edi, através de uns dados do oracle, porém estou com a seguinte dificuldade, tentarei explicar da forma mais clara possível:

Imaginem que a partir da posição 400, só tenho dados "nulos" porém para a criação do arquivo, eles terão de vir preenchidos com space.

No comando SELECT rpad(' ', 50, chr(32)) , o oracle acaba por não gerar todo o arquivo, ele simplismente ignora o retorno pois os dados são todos nulos...

 

Consegui ser claro?

 

 

 

Desde já, obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou testar!!

Obrigado pela dica, e desculpe a demora no agradecimento.

 

Testei porém sem sucesso...

Se no final do comando por exemplo, eu pedir para ele concatenar com algum caracter qualquer, a linha é gerada completa ( aprox: 987 colunas ), porém da forma como eu estava tentando, ou como você sugeriu, a linha fica pela metade, 485 colunas, pois após isso, é só espaço em branco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como ficou a linha de comando?

 

Fiz o seguinte teste:

select '-'||rpad(nvl(NULL, ' ' ),1, ' ')||'-'||rpad(nvl(NULL, ' ' ),1, ' ')||'-' as COL from dual

 

Aparentemente o resultado parace o esperado, se for NULO coloca um espaço ' '. Resultado:

COL
- - -

 

Verifique.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verificou se no arquivo estão vindo caracteres como fim de linha.

 

CR(11) e Cr(13) salvo me engano.

 

Use um replace para limpar se for o caso.

 

LPAD E RPAD funcionam.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de mais nada, peço desculpas, acho que não fui claro, na verdade, errei ao descrever o problema mesmo.

Acontece que o arquivo que eu tenho que gerar, tem que ter por exemplo, 490 colunas, porém se eu concatenar todos os campos que eu tenho em minha tabela, dará 300 por exemplo, a orientação do cliente e que os o restante do arquivo seja completado com espaço, até completar o minimo de caracteres solicitado.

 

 

Oq eu havia feito é, após o meu comando, usei a seguinte linha:

rpad(' ', 100, ' ')

Porém o oracle ignora isso...

 

Lembrando que estou gerando o arquivo via spool ...

 

Obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será algo assim :

 

BEGIN
 ...
 VS_LINHA := CAMPO1 || CAMPO2 || CAMPO3 || ... CAMPON;
 VS_LINHA := RPAD(VS_LINHA,490,' ');
 SYS.UTL_FILE.PUT_LINE(<ARQ>,VS_LINHA);  
 ...
END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

Segue o comando que eu estava usando...

 

set linesize 100000000000
set verify off
set head off
set feed off
set wrap on

col arquivo new_value arquivo


SELECT 'C:\PRE05' || TO_CHAR(SYSDATE, 'yyyymmddhhmmss') || '.txt' as arquivo
FROM DUAL;         

set termout on 
spool "&arquivo" 

-- pagina 19

select 'A' || -- OPERAÇÃO (01) ( VARCHAR ) -- OBRIGATÓRIO 
      rpad(a.numpedido, 30, ' ')|| -- REC_ORDER_CODE (30) ( VARCHAR ) -- OBRIGATÓRIO
      rpad(a.clmcl, 10, ' ')|| -- WAREHOUSE_CODE (10) ( VARCHAR ) -- OBRIGATÓRIO
      rpad(' ', 20, ' ')|| -- SUPPLIER_CODE (20) ( VARCHAR )
      rpad(' ', 20, ' ')|| -- CARRIER_CODE (20)  ( VARCHAR )
      rpad(a.numnf, 50, ' ')|| -- DOCUMENT (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| -- TRANSPORT_TYPE (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| -- MAIN_TRANSPORT (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| -- AUX_TRANSPORT (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| -- SOURCE (50) ( VARCHAR )
      rpad(a.tiporecebimento, 100, ' ')|| -- DESCRIPTION  (100) ( VARCHAR )
      rpad(' ', 14, ' ')|| --EXPECTED_DATE (14) ( DATE )
      rpad(' ', 17, ' ')|| --CONTAINERS (12,5) (NUMBER)
      rpad(' ', 30, ' ')|| --ORDER_TYPE (30) ( VARCHAR )
      rpad(' ', 12, ' ')|| --ACCOUNT_CODE (12) ( VARCHAR )
      rpad(' ', 50, ' ')|| --COMPANY (50)  ( VARCHAR )
      lpad(' ', 17, ' ')|| --DAYS_FROM_REC (12,5) ( NUMBER )
      rpad(' ', 12, ' ')|| --DOOR_CODE (12) ( VARCHAR )
      lpad(a.numlinha, 10, 0)|| -- num_linha (10) (NUMBER)
      chr(13)||--QUEBRA DE LINHA
      '/'|| --DETAIL_LINE_START (1) ( VARCHAR )  -- OBRIGATÓRIO
      rpad(a.sku, 50, ' ')|| --PRODUCT_CODE (50)  ( VARCHAR ) -- OBRIGATÓRIO
      lpad(a.quantidade, 17, 0)|| -- QUANTITY  (12,5) (NUMBER) -- OBRIGATÓRIO
      rpad(' ', 10, ' ')|| --UOM_CODE (10) ( VARCHAR )
      rpad(' ', 50, ' ')|| --LOT (50) ( VARCHAR )
      rpad(' ', 14, ' ')|| --EXP_DATE (14) ( DATE )
      rpad(' ', 50, ' ')|| --SERIAL (50)  ( VARCHAR )
      rpad(' ', 12, ' ')|| --OWNER_CODE (12) ( VARCHAR )
      rpad(' ', 50, ' ')|| --CONTAINER_NO (50) ( VARCHAR )
      rpad(' ', 3, ' ')|| --STOCK_STATUS_CODE (3) ( VARCHAR )
      rpad(' ', 1, '0')|| --REQ_MANIPULATION (1) ( BOLEAN )
      rpad(' ', 100, ' ')|| --MANIPULATION_DESC (100) ( VARCHAR )
      rpad(' ', 17, ' ')|| --PURCHASE_PRICE (12,5) ( NUMBER )
      rpad(' ', 17, ' ')|| --RECEIVE_LIFE (12,5) ( NUMBER )
      rpad(' ', 10, ' ')|| --LINE_NUMBER (10) ( NUMBER )
      rpad(' ', 1, '0')|| --ALLOW_REC_LESS (1) ( BOLEAN )
      rpad(' ', 1, '0')|| --ALLOW_REC_MORE (1) ( BOLEAN )
      rpad(' ', 7, ' ')|| --REC_MORE_PERCENT (5,2) ( NUMBER )
      rpad(' ', 20, ' ')|| --LOCATION_LABEL (20) ( VARCHAR )
      rpad(' ', 10, ' ')|| --INBOUND_SUBWARE_CODE (10) ( VARCHAR )
      rpad(' ', 14, ' ')|| --BEST_BEFORE_DATE (14) ( DATE )
      rpad(' ', 14, ' ')|| --PRODUCTION_DATE (14) ( DATE )
      rpad(' ', 50, ' ')|| --QUALITY (50) ( VARCHAR )
      rpad(' ', 17, ' ')|| --SHELF_LIFE (12,5) ( NUMBER )
      rpad(' ', 50, ' ')|| --PACK (50) ( VARCHAR )
      rpad(' ', 20, ' ')|| --SUPPLIER_CODE (20) ( VARCHAR )
      rpad(' ', 50, ' ')|| --SIZE_CODE (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| --COLOR_CODE (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| --SOURCE (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| --VERSION_CODE (50) ( VARCHAR )
      rpad(' ', 50, ' ')|| --PRODUCTION_METHOD (50) ( VARCHAR )
      rpad(' ', 50, ' ') --POST_PRODUCTION_TREATMENT (50) ( VARCHAR )
 from custom_pre a;


SPOOL OFF;

 

Do jeito que você postou, acha mais apropriado? :)

Compartilhar este post


Link para o post
Compartilhar em outros sites
select rpad(
           'A' || -- OPERAÇÃO (01) ( VARCHAR ) -- OBRIGATÓRIO 
           rpad(a.numpedido, 30, ' ')|| -- REC_ORDER_CODE (30) ( VARCHAR ) -- OBRIGATÓRIO

           ...

           rpad(' ', 50, ' ') --POST_PRODUCTION_TREATMENT (50) ( VARCHAR )
          ,490
          ,' '
          )
 from custom_pre a;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Mota, fiz um teste no formato que você postou, no oracle, o retorno é OK, com todas os "campos" preenchidos, porém no spool, o resultado deu o mesmo...

Você acredita que pode ser alguma configuração do próprio spool?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa... Tentou os parametros com ON?

 

Não tenho mais opções. :(

 

Minha última sugestão é que tente usar o comando COLUMN.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá uma lida nisto.

 

Falando de Sql Plus.

 

Neste caso eu acho que está vindo algum cr(11) ou cr(13) vindo no arquivo fazendo a linha saltar, seria meu palpite inicial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.