ローカルファイル
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なし)」で保存するなど、保存形式も合わせて確認してください。