概要
アプリケーションサーバーからファイルを読み込んだり、書き込んだりする方法は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命令を使用する事でファイルへ書き込む事ができます。
最近のコメント