概要
アプリケーションサーバーからファイルを読み込んだり、書き込んだりする方法はOPEN DATASET命令を使用する事で可能です。
ローカルとのやりとりのように内部テーブルを使用する事はできず、一行ずつ書き込む、又は読み込む必要があります。
また、外部システムと連携する場合は固定長のか、可変長なのか、また、可変長の場合はタブ区切り・カンマ区切りなのかをきちんと確認しておく必要があるだろう。
サンプルコード:読み込み
TYPES:
BEGIN OF t_file,
data(1000) TYPE c,
END OF t_file.
TYPES:
BEGIN OF t_data,
col1(10) TYPE c,
col2(10) TYPE c,
col3(10) TYPE c,
END OF t_data.
DATA:
v_file TYPE string,
v_cnt TYPE i,
wa_file TYPE t_file,
it_file TYPE TABLE OF t_file,
wa_data type t_data,
it_data type table of t_Data.
CONSTANTS:
c_tab type c
value cl_abap_char_utilities=>horizontal_tab.
v_file = '/usr/sap/trans/test.txt'.
OPEN DATASET v_file
FOR INPUT IN TEXT MODE ENCODING DEFAULT WITH WINDOWS LINEFEED.
IF sy-subrc <> 0.
* MESSAGE XXX WITH v_file.
ENDIF.
DO.
READ DATASET v_file INTO wa_file.
CASE sy-subrc.
WHEN 0.
APPEND wa_file TO it_file.
WHEN 4.
EXIT.
ENDCASE.
ENDDO.
CLOSE DATASET v_file.
LOOP AT it_file INTO wa_file.
v_cnt = v_cnt + 1.
* ヘッダ行がある場合は、無視する
IF v_cnt <= 1.
CONTINUE.
ENDIF.
SPLIT wa_file AT c_tab
INTO wa_data-col1
wa_data-col2
wa_data-col3.
APPEND wa_data TO it_data.
ENDLOOP.
説明
まず、OPEN DATASET命令でファイルを開きます。他のプログラムがファイルが開いているとエラーとなります。
今回は、WINDOWS LINEFEEDと記述しているがこれは改行コードがCRLFになっている為である。もし改行コードがLFの場合はUNIX LINEFEEDとする必要がある。
また、ファイルが読み込めなかった時はENCODINGの指定とファイルの文字コードも確認してみてください。
ファイルが読み込めた場合は、READ DATASET命令により一行読み込み内部テーブルに書き込むというのを繰り返します。
この時取得した値はフラットなデータである事に注意してください。その後、定義に合わせてヘッダを取り除いたり、区切ったりという加工をしなければいけません。
サンプルコード:書き込み
OPEN DATASET v_file FOR OUTPUT
IN TEXT MODE ENCODING DEFAULT WITH WINDOWS LINEFEED.
IF sy-subrc <> 0.
* MESSAGE XXX WITH v_file.
ENDIF.
LOOP AT it_data INTO wa_data.
CONCATENATE
wa_data-col1
wa_data-col2
wa_data-col3
INTO wa_file SEPARATED BY c_tab.
TRANSFER wa_file TO v_file.
ENDLOOP.
説明
同じようにOPEN DATASET命令でファイルを開きます。存在しなくても問題ありません。
次に内部テーブルの値をフラットなデータに加工(今回はタブ区切り)にしTRANSFER命令を使用する事でファイルへ書き込む事ができます。
最近のコメント