ABAP/OPEN DATASET
サーバ上にあるファイルを開く命令。
概要 †
用法 †
主にインタフェース系プログラムなどで使用する命令で、大抵は所定パスにファイル転送ツールやFTPでアップされたファイルを読み込み、SAPに取り込む目的で使用する。
あくまでアプリケーションサーバ(いわゆるサーバ)上のファイルを開く命令であり、プレゼンテーションサーバ(ローカルPC)のファイルを開きたい場合は汎用モジュール GUI_UPLOADを使用すること。
サンプル †
基本形 †
OPEN DATASET ファイルパス名 FOR INPUT IN TEXT MODE ENCODING DEFAULT.
FOR~ †
FOR INPUT
読み込みモード。ファイルが存在しなければエラー。
FOR OUTPUT
書き込みモード。ファイルが存在しなくてもok、既に存在する場合は上書きされる。
FOR APPENDING
ファイルが存在しない場合は新規書き込みモード、存在する場合はケツに追加するモード。
ログファイルの追記などに。
FOR UPDATE
読み込みおよび書き込みモード・・・とのことだが、一部書き換えのケースなどで使用するのだろうか?
個人的には、インタフェースファイルというものは基本的にそのタイミングでの最新情報を都度吐き出すべきであって既存ファイルの一部を変更すべきでないと考えているため、筆者は使用したことがない。
IN~ †
IN TEXT MODE
よく使われるのがこちらで、ファイルが行単位で処理されるオプション。
READ DATASETやTRANSFER命令を発行すると、対象となる単一の行のみ入出力処理が実行される。
この後に文字コードによってDEFAULT・UTF-8・NON-UNICODEの中からENCODINGオプションを指定する。
IN BINARY MODE
ファイルの内容が行として構成されないオプション。
IN LEGACY BINARY MODE
オプションは、BIG ENDIAN/LITTLE ENDIANとCODE PAGE xxx。
IN LEGACY TEXT MODE
オプションは、INLEGACY BINALY MODEと同じくBIG ENDIAN/LITTLE ENDIANとCODE PAGE xxx。
その他のオプション †
IGNORING CONVERSION ERRORS
文字セットの変換エラーが発生した場合には例外がトリガされるが、このオプションでハンドルが可能とのこと。
REPLACEMENT CHARACTER xx
文字セットの変換ができなかった場合に置き換える文字を指定
AT POSITION n
読み込みまたは書き込みの位置を指定できる模様。
ファイルの頭からバイト単位で計算され、以降の読み込みまたは書き込みはその位置から行われる。
TYPE ~
レコード長やブロックサイズなど、ファイルの属性を指定できるらしい。指定する書式やオプションおよび値などは、Helpを参照しつつ適切なものを指定すること。
個人的には、あまり凝ったことはしない方が無難かとは思う。
CR/LFなど改行コードの指定もここ。ヘルプには「TYPEオプションを使用しつつ改行文字を指定しない場合はファイル内が検索され、最初に見つかった改行文字が適用される」とのこと。
更に、ファイル内に改行文字がなかったり新規作成時にはプロファイルパラメータ abap/NTfopen の値が適用され、その設定がない場合はCRLFになるとのこと。この命令仕様、深すぎ。
FILTER xxx
なんと、OSコマンドが指定できる!!!らしいが、これも「プログラム内でやるべきことなのか」というと甚だ疑問に感じる。
その他 †
- ディレクトリが指定されていない場合、プロファイルパラメータ DIR_HOME の値が採用されるとのこと。
- パスの指定ミス或いは単に存在するべきファイルが存在しない場合はRC=8、既に開いているファイルを同じセッションで開くと例外 CX_SY_FILE_OPEN がトリガされる。
- 論理ファイルから物理ファイルパスを求める場合は、汎用モジュール FILE_GET_NAME を使用する。
- 権限のないファイルに対して実行した場合は例外で落ちるらしく、ヘルプには実行前に汎用モジュール AUTHORITY_CHECK_DATASET で予めチェックするよう記載があるが、大抵はバッチジョブで実行されたりシステムユーザが流したりとなるため、ケアされることは少ない。
- 関連する命令は、READ DATASET、CLOSE DATASET、DELETE DATASET、TRANSFER、GET DATASET、SET DATASET、TRUNCATE DATASETなど。
コメントはありません。 Comments/ABAP/OPEN DATASET?