ローカルファイル

25.1 ローカルファイル

  • ファイルを開くダイアログ
  • ファイルのアップロード
  • ファイル保存ダイアログ
  • ファイルダウンロード

ローカルファイルとは

ローカルファイルとは、ユーザーのPCに保存されているファイルのことです。 ローカルファイル操作は、ユーザーがSAP GUI上で実行し、PC上のファイルを読み書きするケースで利用します。

ローカルファイル操作

■ ローカルファイル操作の特徴
ローカルファイル操作は、主に「CL_GUI_FRONTEND_SERVICES」クラスを使って実装します。
ここで覚えておきたい制約は次の通りです。
・SAP GUI(フロントエンド)が必要

バックグラウンドジョブ実行では使えない(または期待通り動かない)ことがあります。
・ユーザー操作が前提
ファイル選択ダイアログを開き、ユーザーがパスを選ぶ流れが基本になります。

ローカルファイル操作の流れはシンプルです。
1.ファイル選択ダイアログを表示して、ファイルパスを取得する(FILE_OPEN_DIALOG など)
2.パスを使ってアップロード(GUI_UPLOAD)または
ダウンロード(GUI_DOWNLOAD)を実行する

補足:教材では汎用モジュール例もありますが、S/4HANA時代のABAPでは、 まずクラス(CL_GUI_FRONTEND_SERVICES)を基本として扱う傾向があります。

ファイルを開くダイアログ

ローカルファイルを扱う処理では、まず「どのファイルを対象にするか」をユーザーに選んでもらう必要があります。
このときに利用するのが「ファイルを開くダイアログ」です。テキスト入力でパスを直接書くよりも、誤入力を防げるため、初心者向けの教材ではダイアログ選択を基本にします。

・メソッド(推奨):CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
S/4HANA時代の新規開発では、クラスのメソッドを利用する書き方が一般的です。

・汎用モジュール:TMP_GUI_FILE_OPEN_DIALOG ECC時代の教材や既存プログラムでは、汎用モジュール版の実装も多く見かけます。

本章では、選択画面でファイルパスを指定し、必要に応じてF4でダイアログ選択できる形を採用します。

メソッド:CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
"--- ファイルを開くダイアログ(メソッド)-------------------------
" 目的:ユーザーにローカルファイルを選択させ、パスを取得する
DATA LT_FILETAB TYPE FILETABLE.
DATA LV_RC      TYPE I.

CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(
  EXPORTING
    WINDOW_TITLE = 'CSVファイルを選択'
    FILE_FILTER  = 'CSV (*.CSV)|*.CSV|ALL (*.*)|*.*|'
  CHANGING
    FILE_TABLE   = LT_FILETAB
    RC           = LV_RC
).

" RC > 0 かつ FILE_TABLE が空でない場合に選択成功
IF LV_RC > 0 AND LT_FILETAB IS NOT INITIAL.
  DATA(LV_FILENAME) = LT_FILETAB[ 1 ]-FILENAME. "選択したファイルのフルパス
ENDIF.


汎用モジュール:TMP_GUI_FILE_OPEN_DIALOG
"--- ファイルを開くダイアログ(汎用モジュール)-------------------
" 目的:ユーザーにローカルファイルを選択させ、フルパスを取得する
DATA LT_FILEPATH TYPE TABLE OF SDOKPATH.

CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG'
  TABLES
    FILE_TABLE = LT_FILEPATH
  EXCEPTIONS
    CNTL_ERROR = 1
    OTHERS     = 2.

IF SY-SUBRC = 0 AND LT_FILEPATH IS NOT INITIAL.
  READ TABLE LT_FILEPATH INTO DATA(LV_FILENAME) INDEX 1. "フルパス
ENDIF.

ファイルのアップロード

「アップロード」は、ローカルPC上のファイル内容をABAPプログラム側に取り込む処理です。
取り込んだデータは内部テーブルに格納され、その後チェック処理や登録処理、一覧表示などに利用できます。

・メソッド(推奨):CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
文字列テーブルで扱いやすく、教材としても理解しやすい方法です。

・汎用モジュール:GUI_UPLOAD
古い資産ではこちらの実装が多いですが、環境によって受け取れる型が異なる場合があるため、教材では「確実に動作する書き方」を採用します。

本章のサンプルでは、CSVを「列に分解する」処理は扱いません。まずはファイルを読み込んで、行単位で取り込めることを確認します。

メソッド:CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD(推奨)
"--- ファイルアップロード(メソッド)------------------------------
" 目的:ローカルファイルを読み込み、内部テーブルに格納する(行単位)
DATA LT_LINES TYPE STANDARD TABLE OF STRING WITH EMPTY KEY.

CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD(
  EXPORTING
    FILENAME = P_FPATH   "選択画面等で受け取ったフルパス
    FILETYPE = 'ASC'     "テキストとして読み込む
  CHANGING
    DATA_TAB = LT_LINES  "1行=1要素で格納される
).


汎用モジュール:GUI_UPLOAD
"--- ファイルアップロード(汎用モジュール)------------------------
" 目的:ローカルファイルを読み込み、内部テーブルに格納する(行単位)
" ※環境差を避けるため「構造+STRING項目」のテーブルで受ける例
TYPES: BEGIN OF TY_STRING_LINE,
      CONTENT TYPE STRING,
END OF TY_STRING_LINE.
DATA LT_FILEDATA TYPE STANDARD TABLE OF TY_STRING_LINE WITH EMPTY KEY.

CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
    FILENAME = P_FPATH
    FILETYPE = 'ASC'
    "CODEPAGE = '8000'  "必要時のみ(環境により調整)
TABLES
           DATA_TAB = LT_FILEDATA.

ファイルの保存ダイアログ

「保存ダイアログ」は、ダウンロード処理を行う前に、保存先(フォルダ)とファイル名をユーザーに指定してもらう機能です。
保存場所を誤って上書きする事故を防ぎ、初心者でも操作が直感的になります。

・メソッド(推奨):CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
新規開発ではメソッド版が基本です。

・汎用モジュール(既存資産でよく見る):GUI_FILE_SAVE_DIALOG (※環境により名称差がある場合があります)
既存資産の読解・保守で遭遇しやすい実装です。

本章では、保存ダイアログを「必要な場面で使える」ことを理解した上で、次の統合サンプルで一連の流れを確認します。

メソッド:CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG(推奨)
"--- ファイルの保存ダイアログ(メソッド)--------------------------
" 目的:保存先(フルパス)をユーザーに選ばせる
DATA LV_FULLPATH TYPE STRING.
DATA LV_FILENAME TYPE STRING.
DATA LV_PATH     TYPE STRING.

CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG(
  EXPORTING
    WINDOW_TITLE      = '保存先を指定'
    DEFAULT_FILE_NAME = 'DOWNLOAD.CSV'
  CHANGING
    FILENAME          = LV_FILENAME
    PATH              = LV_PATH
    FULLPATH          = LV_FULLPATH
).

IF LV_FULLPATH IS INITIAL.
  "キャンセル時は空になることがある
ENDIF.



汎用モジュール:GUI_FILE_SAVE_DIALOG(名称差がある場合あり)
"--- ファイルの保存ダイアログ(汎用モジュール)--------------------
" 目的:保存先(フルパス)をユーザーに選ばせる
DATA LV_FULLPATH TYPE STRING.
DATA LV_FILENAME TYPE STRING.
DATA LV_PATH     TYPE STRING.

CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
  EXPORTING
    WINDOW_TITLE      = '保存先を指定'
    DEFAULT_FILE_NAME = 'DOWNLOAD.CSV'
  IMPORTING
    FILENAME          = LV_FILENAME
    PATH              = LV_PATH
    FULLPATH          = LV_FULLPATH.

IF LV_FULLPATH IS INITIAL.
  "キャンセル時は空になることがある
ENDIF. 

ファイルダウンロード

「ダウンロード」は、ABAP側の内部テーブルなどのデータをローカルファイルとして保存する処理です。
ログ出力や簡易的なデータ退避、結果の確認用ファイル出力など、実務でも利用頻度が高い機能です。

・メソッド(推奨):CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
S/4HANA時代の標準的な書き方として覚えておきましょう。

・汎用モジュール:GUI_DOWNLOAD
ECC時代の資産で多く、既存プログラムの保守では理解しておくと役立ちます。

なお、出力ファイル名は固定にせず、次の「保存ダイアログ」と組み合わせてユーザーに保存先を選ばせるのが一般的です。

メソッド:CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD(推奨)
"--- ファイルダウンロード(メソッド)------------------------------
" 目的:内部テーブルをローカルファイルとして保存する(行単位)
CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD(
EXPORTING
    FILENAME = LV_FULLPATH "保存ダイアログで取得したフルパス
    FILETYPE = 'ASC'
CHANGING
    DATA_TAB = LT_OUT_LINES
).


汎用モジュール:GUI_DOWNLOAD
"--- ファイルダウンロード(汎用モジュール)------------------------
" 目的:内部テーブルをローカルファイルとして保存する(行単位)
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
    FILENAME = LV_FULLPATH
    FILETYPE = 'ASC'
TABLES
        DATA_TAB = LT_OUT_LINES.

■ テストデータ(CSV)の作り方
プログラム動作確認に必要なサンプルコードを作成しましょう。 テキストエディタで下記のデータを入力し、CSV形式で保存します。
品目コード,商品名,売上金額,通貨,伝票番号
MA001,テレビ,120000,JPY,A000001
MA002,冷蔵庫,98000,JPY,A000002
MA003,エアコン,45000,JPY,A000003
MA004,炊飯器,30000,JPY,A000004
MA005,加湿器,8000,JPY,A000005

■ サンプルコード(メソッド版)
*&---------------------------------------------------------------------*
*& Report Z_SAMPLE251_LOCAL_UPLOAD
*&---------------------------------------------------------------------*
*&   ローカルCSVを選択して、内容を「1行ずつそのまま」表示するサンプル。
*&---------------------------------------------------------------------*

REPORT Z_SAMPLE251_LOCAL_UPLOAD.

"------------------------------------------------------------
" 選択画面:ファイルパス(ローカル)
"------------------------------------------------------------
PARAMETERS P_FPATH TYPE STRING OBLIGATORY.


"------------------------------------------------------------
" CSVは加工しないため、1行=1文字列で保持する
"------------------------------------------------------------
TYPES TT_LINE TYPE STANDARD TABLE OF STRING WITH EMPTY KEY.

"===================================================
" 選択画面:F4ヘルプ(ここでだけファイル選択ダイアログを出す)
"===================================================

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FPATH.

  DATA LT_FILETAB TYPE FILETABLE.
  DATA LV_RC      TYPE I.

  CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG(
    EXPORTING
      WINDOW_TITLE = 'CSVファイルを選択'
      FILE_FILTER  = 'CSV (*.csv)|*.csv|Text (*.txt)|*.txt|All (*.*)|*.*|'
    CHANGING
      FILE_TABLE   = LT_FILETAB
      RC           = LV_RC
  ).

  IF LV_RC > 0 AND LT_FILETAB IS NOT INITIAL.
    P_FPATH = LT_FILETAB[ 1 ]-FILENAME.
  ENDIF.

START-OF-SELECTION.
  "------------------------------------------------------------
  " ① 入力チェック
  "------------------------------------------------------------
  IF P_FPATH IS INITIAL.
    MESSAGE 'ファイルを指定してください。' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  "------------------------------------------------------------
  " ② アップロード(ローカルファイル → 内部テーブル)
  "    ※SPLITせず、行単位でそのまま読み込む
  "------------------------------------------------------------
  DATA LT_LINES TYPE TT_LINE.

  CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD(
    EXPORTING
      FILENAME = P_FPATH
      FILETYPE = 'ASC'
    CHANGING
      DATA_TAB = LT_LINES
  ).

  IF LT_LINES IS INITIAL.
    MESSAGE 'ファイルが空です。' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  "------------------------------------------------------------
  " ③ 表示(加工しない)
  "------------------------------------------------------------
  WRITE: / |読み込み行数:{ LINES( LT_LINES ) } 行|.
  ULINE.

  LOOP AT LT_LINES INTO DATA(LV_LINE).
    WRITE: / LV_LINE.
  ENDLOOP.

■補足:文字化け対策

CSVファイルをアップロードする際、ファイルが「UTF-8」で保存されていると、環境によって文字化けが発生する場合があります。
これは、GUI_UPLOADがローカルPC上のファイルを読み込むときに、SAP GUIやログオン環境の既定コードページを基準に文字変換を行うことがあり、ファイル側のUTF-8と一致しないと正しく解釈できないためです。
また、UTF-8で保存されたCSVに「BOM(先頭に付く制御情報)」が含まれている場合、 先頭行の冒頭だけに不自然な文字が表示されることもあります。

本教材では、学習中にトラブルを避けるため、ローカルCSVは基本的にCSV(コンマ区切り)/Shift-JIS(CP932)で保存することを推奨します。
UTF-8を利用する場合は、環境差が出やすい点を理解した上で、必要に応じて「UTF-8(BOMなし)」で保存するなど、保存形式も合わせて確認してください。


NEXT>> 25.2 サーバーファイル

研修の詳細はこちら