サーバーファイル

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: / '書き込みが完了しました。'.


研修の詳細はこちら