Lendo arquivo localmente com ABAP
Problema
Criar um programa para ler um arquivo local e mostrar o seu conteúdo em um relatório simples.
Um exemplo de arquivo a ser lido está neste link e ele possui o seguinte formato:
Campo | Descrição | Tipo | Posição Inicial | Tamanho |
---|---|---|---|---|
CARRID | Airline Code | Char | 1 | 3 |
CONNID | Flight Connection Number | Chara | 4 | 4 |
FLDATE | Flight date | Char | 8 | 8 |
PLANETYPE | Plane type | Char | 16 | 10 |
SEATSMAX | Maximum capacity in economy class | Char | 26 | 10 |
SEATSOCC | Occupied seats in economy class | Char | 36 | 10 |
O programa deve ter uma tela de seleção onde o usuário entra com o diretório e nome do arquivo e daí executar o programa.
Solução
1 – Criar um programa tipo executável.
2 – Tela de seleção:
PARAMETERS: p_file TYPE filename-fileextern.
Nota: É possível fazer uma search help para que o usuário possa buscar o arquivo na sua máquina. Mas isso será assunto para outro post 🙂 .
3 -Declarar uma tabela com apenas um campo para receber as linhas do arquivo e outra tabela interna com a estrutura do arquivo (descrita acima).
TYPES: BEGIN OF ty_line,
line(50) TYPE c,
END OF ty_line.
TYPES: BEGIN OF ty_sflight,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
planetype TYPE sflight-planetype,
seatsmax TYPE sflight-seatsmax,
seatsocc TYPE sflight-seatsocc,
END OF ty_sflight.
DATA: it_file TYPE TABLE OF ty_line,
wa_line LIKE LINE OF it_line,
wa_sflight LIKE LINE OF it_sflight.
4 – Chamar a Function Module GUI_UPLOAD.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = v_filename
filetype = 'ASC'
TABLES
data_tab = it_file.
5 – Imprimir o relatório que é baseado no conteúdo do arquivo.
Execução e Teste
Para executar o programa apenas rode, preencha a tela de seleção com a localização do arquivo, por exemplo: C:\TEMP\upload.txt
Discussão
Como você pode verificar, a FM GUI_UPLOAD usa uma tabela interna para receber os dados do arquivo. A função devolve a tabela interna preechida com as linhas do arquivo. Por isso, eu criei a tabela interna com apenas um campo, de 49 posições, que é o tamanho máximo das linhas do arquivo em questão.
Outro ponto interessante é como eu criei a estrutura ty_sflight, com todos os campos tipo char. Isso por que a estrutura ty_line é char e como estou em um ambiente unicode, ele não aceita assign de estruturas com tipos diferentes.
MOVE wa_line TO wa_sflight.
Anexos
zfdownload – Programa completo.