サーバーファイル
25.2 サーバーファイル
- OPEN DATASET命令
- READ DATASET命令
- TRANSFER命令
- CLOSE DATASET命令
- サーバーファイルのアップロード/ダウンロード
サーバーファイルとは
サーバーファイル(アプリケーションサーバ上のファイル)とは、SAPが動作しているサーバ側に保存されたファイルを指します。
ローカルファイル(ユーザーPC上のファイル)と異なり、実行する端末やユーザーPCの環境に依存しないため、次のような用途に向きます。
・バックグラウンドジョブで、定期的にファイルを出力/取込したい
・連携用ディレクトリに配置されたファイルを自動処理したい
・操作ログや処理結果をサーバ側に残したい
■どちらを優先して使うべきか(最新傾向)
どちらを使うかは「目的」で決まります。目安は次の通りです。
・ローカルファイル優先(ユーザー操作がある)
例:担当者がPCのCSVを選んでアップロードして検証する、一覧をExcelに出力する
※ただし、SAP GUI前提のため、運用に組み込む場合は
「誰が・いつ・どの端末で」実行するかを整理しておきます。
・サーバーファイル優先(運用・自動処理・ジョブ)
例:夜間バッチで連携ファイルを取り込む、定期的に結果をサーバーに出力する
ユーザーPC依存を避けられ、運用設計がしやすくなります。
・最近の傾向(S/4HANAプロジェクト)
近年は、ファイル連携そのものを減らし、API/OData/IDoc/IF基盤などの
「ファイルを介さない連携」に寄せるケースも増えています。
OPEN DATASET命令
OPEN DATASETは、アプリケーションサーバ上のファイルを開く命令です。サーバーファイルは、内部テーブルへ一括で入出力するのではなく、基本的に1行(1レコード)ずつ読み書きします。 アプリケーションサーバからファイルを読み込んだりも書き込んだりする場合は、ローカルファイル操作とは異なり、OPEN DATASET命令を使用します。
構文
OPEN DATASET <dsn> [オプション].
■ 主なオプション
・FOR INPUT:読み込み用に開きます。ファイルは事前に存在している必要があります。
・FOR OUTPUT:書き込み用に開きます。存在しない場合は作成します。
・FOR APPENDING:追記用に開きます。存在しない場合は作成し、
存在する場合は末尾に追加します。
・IN BINARY MODE:バイト単位で転送します。
・IN TEXT MODE:行単位で転送します(ファイルは行構造を持つものとして扱います)。
READ DATASET命令
READ DATASET命令は、ファイルからデータを1レコード分、読み込みます。読み込んだデーダを 内部テーブルに書き込むことを繰り返します。
構文
READ DATASET <dsn> INTO <f> [LENGTH <len> ]
LENGTH <len>> は任意で、読み込んだ長さを取得できます。 読み込みに成功すると SY-SUBRC = 0、ファイルの終端まで読むと SY-SUBRC = 4 になります。
TRANSFER命令
TRANSFER は、ファイルへデータを1レコード分書き込む命令です。内部テーブルの内容を作業領域へ取り出し、TRANSFER を繰り返す形で出力します。
構文
TRANSFER <f> TO <dsn> [オプション]
CLOSE DATASET命令
OPENしたDATASET は、処理が終わったら必ずCLOSEします。CLOSEしないと、ファイルがロックされたままになったり、後続処理に影響が出たりするためです。
構文
CLOSE DATASET <ファイル名>.
サーバーファイルのアップロード/ダウンロード
ここでは、サーバーファイル入出力でよく使う「基本形」を、処理の流れとして整理します。
ファイル名は「実ファイル名が入った変数」、内部テーブルは「読み込んだ/書き出すデータ」、
作業領域は「内部テーブルと同じ構造の行」とします。
アップロード
サーバー上にあるファイルを読み込み、内部テーブルに保持します。処理の考え方は次の通りです。
① OPEN DATASET … FOR INPUT で読み込みモードで開く
② ファイルの終端までREAD DATASET を繰り返す
③ 読めた行は作業領域に入り、成功時はその内容を内部テーブルへ追加する
④ 終端(または読み込み失敗)を検知したらループを抜け、最後に CLOSE DATASET する
OPEN DATASET <ファイル名> FOR INPUT.
DO.
READ DATASET <ファイル名> INTO <作業領域>.
IF SY-SUBRC <> 0.
EXIT.
ELSE.
APPEND <作業領域> TO <内部テーブル>.
ENDIF.
ENDDO.
CLOSE DATASET <ファイル名>.
ダウンロード
内部テーブルのデータを、サーバ上にファイルとして出力します。
基本形は次の通りです。
① OPEN DATASET … FOR OUTPUTで書き込みモードで開く
② 内部テーブルを1行ずつ取り出し、TRANSFERでファイルへ書き込む
③ すべて書き込んだらCLOSE DATASETする
OPEN DATASET <ファイル名> FOR OUTPUT.
LOOP AT <内部テーブル> INTO <作業領域>.
TRANSFER <作業領域> TO <ファイル名>.
ENDLOOP.
CLOSE DATASET <ファイル名>.
■ 補足:(補足)サーバーファイル操作でつまずきやすいポイント
サーバーファイル(アプリケーションサーバ上のファイル)は、ローカルファイルと違い、
「SAPが動いているサーバ側の領域」に対して読み書きします。
ここでは初心者がつまずきやすい点だけ、先に整理しておきます。
・パス(ファイル名)はサーバ側のパス
PCのパスではなく、SAPアプリケーションサーバ上のパスを指定します。
・権限がないと開けない/書けない
うまく動かないときは、まず権限(ディレクトリ/ファイルアクセス)を疑います。
・基本は「1行ずつ」読み書きする
READ DATASETとTRANSFERを繰り返して処理します。
・OPENしたら必ずCLOSEする
CLOSE DATASETを忘れると、ロックや後続処理の不具合につながります。
本教材では、まずは「読める・書ける」を確認できる最小構成のサンプルで流れを押さえます。
(サンプル1)サーバファイル読込:OPEN → READ(繰り返し)→ CLOSE
目的:サーバ上のテキストファイルを「1行ずつ」読み込み、内部テーブルに格納する
REPORT Z_SAMPLE252_SERVER_READ.
"============================================
" サーバファイル読込(最小例)
"============================================
DATA LV_PATH TYPE STRING.
DATA LT_LINES TYPE STANDARD TABLE OF STRING WITH EMPTY KEY.
DATA LV_LINE TYPE STRING.
"※実務ではカスタマイズや論理パスを使うこともありますが、
" 教材ではまず「パスを指定して読める」ことを確認します。
LV_PATH = '/USR/SAP/INTERFACE/INPUT/TEST.TXT'.
OPEN DATASET LV_PATH FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF SY-SUBRC <> 0.
WRITE: / 'ファイルを開けませんでした。権限やパスを確認してください。'.
RETURN.
ENDIF.
DO.
READ DATASET LV_PATH INTO LV_LINE.
IF SY-SUBRC <> 0.
EXIT. "終端または読込失敗
ENDIF.
APPEND LV_LINE TO LT_LINES.
ENDDO.
CLOSE DATASET LV_PATH.
WRITE: / |読み込み行数:{ LINES( LT_LINES ) } 行|.
(サンプル2)サーバファイル書込:OPEN → TRANSFER(繰り返し)→ CLOSE
目的:内部テーブルの内容を「1行ずつ」サーバ上のテキストファイルへ書き出す
REPORT Z_SAMPLE252_SERVER_TRANSFER. "============================================ " サーバファイル読込(最小例) "============================================ DATA LV_PATH TYPE STRING. DATA LT_LINES TYPE STANDARD TABLE OF STRING WITH EMPTY KEY. DATA LV_LINE TYPE STRING. " 例:書き出す内容(本来は内部テーブルのデータを作ります) LT_LINES = VALUE #( ( `HEADER1,HEADER2` ) ( `AAA,111` ) ( `BBB,222` ) ). LV_PATH = '/USR/SAP/INTERFACE/OUTPUT/OUT.TXT'. OPEN DATASET LV_PATH FOR OUTPUT IN TEXT MODE ENCODING DEFAULT. IF SY-SUBRC <> 0. WRITE: / 'ファイルを作成できませんでした。権限やパスを確認してください。'. RETURN. ENDIF. LOOP AT LT_LINES INTO LV_LINE. TRANSFER LV_LINE TO LV_PATH. ENDLOOP. CLOSE DATASET LV_PATH. WRITE: / '書き込みが完了しました。'.