ABAPでの金額処理
0 3939

ABAPにおける金額項目は常に特定の通貨と結び付けられています。異なる通貨の金額換算や、内部書式と外部書式間の変換など、SAP標準から様々な汎用モジュールを用意されています。 このトピックでは、金額処理に関わる様々な方法を目的毎に纏めて説明します。

通貨換算係数取得

CURRENCY_CONVERTING_FACTOR

通貨換算係数を取得する関数。

DATA: WK_WAERS TYPE VBRK-WAERK. 
DATA: WK_FACTOR TYPE P DECIMALS 3.
CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'  
EXPORTING   
 CURRENCY = WK_WAERS “ 通貨コード  
IMPORTING   
 FACTOR = WK_FACTOR ” 通貨換算係数  
EXCEPTIONS   
 TOO_MANY_DECIMALS = 1   
 OTHERS = 2.

為替レート換算係数取得

READ_EXCHANGE_RATE

為替レート取得

READ_EXCHANGE_RATE

外貨通貨→国内通貨

外貨通貨金額から国内通貨金額を換算するには、汎用モジュールCONVERT_TO_LOCAL_CURRENCYを利用できます。

REPORT  Y_TEST_XXXX.
DATA:
      F_CURR       TYPE TCURR-FCURR,
      L_CURR       TYPE TCURR-TCURR,
      F_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      L_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      EX_RATE      TYPE TCURR-UKURS,
      F_FACTOR     TYPE TCURR-FFACT,
      L_FACTOR     TYPE TCURR-TFACT.
F_CURR  = 'JPY'.
L_CURR  = 'THB'.
F_VALUE = '0.02'.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
  EXPORTING
*   CLIENT           = SY-MANDT
    DATE             = SY-DATUM  "為替レート自動取得時の基準日
    FOREIGN_AMOUNT   = F_VALUE   "外貨通貨金額
    FOREIGN_CURRENCY = F_CURR    "外貨通貨
    LOCAL_CURRENCY   = L_CURR    "国内通貨
*    RATE            = '29.36'   "為替レートを指定する場合は、このパラメータを利用すると
                                 "ともにREAD_TCURRを''にする
    TYPE_OF_RATE     = 'B'       "為替レートタイプ B:
    READ_TCURR       = 'X'       "'X':為替レートはTCURRより取得、'':為替レートは
                                 "RATEパラメータの値を使用
  IMPORTING
    EXCHANGE_RATE       = EX_RATE   "換算時の為替レート
    FOREIGN_FACTOR      = F_FACTOR  "換算時の換算係数(外貨)
    LOCAL_AMOUNT        = L_VALUE   "換算後国内通貨金額
    LOCAL_FACTOR        = L_FACTOR  "換算時の換算係数(国内通貨)
*   EXCHANGE_RATEX          =
*   FIXED_RATE              =
*   DERIVED_RATE_TYPE       =
* EXCEPTIONS
*   NO_RATE_FOUND           = 1
*   OVERFLOW                = 2
*   NO_FACTORS_FOUND        = 3
*   NO_SPREAD_FOUND         = 4
*   DERIVED_2_TIMES         = 5
*   OTHERS                  = 6
   .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
WRITE:/'FOREIGN CURRENCY=', F_CURR,
      /'FOREIGN_FACTOR=', F_FACTOR,
      /'FOREIGN VALUE=', F_VALUE,
      /'EXCHANGE_RATE=', EX_RATE,
      /'LOCAL CURRENCY=', L_CURR,
      /'LOCAL_FACTOR=', L_FACTOR,
      /'LOCAL VALUE=',  L_VALUE.
WRITE:/ F_CURR,F_VALUE  CURRENCY F_CURR.
WRITE:/ L_CURR,L_VALUE  CURRENCY L_CURR.

国内通貨→外貨通貨

CONVERT_TO_FOREIGN_CURRENCY 国内通貨額の外貨への換算

REPORT  Y_TEST_XXXX.
DATA:
      F_CURR       TYPE TCURR-FCURR,
      L_CURR       TYPE TCURR-TCURR,
      F_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      L_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      EX_RATE      TYPE TCURR-UKURS,
      F_FACTOR     TYPE TCURR-FFACT,
      L_FACTOR     TYPE TCURR-TFACT.
F_CURR  = 'JPY'.
L_CURR  = 'THB'.
L_VALUE = '3'.
CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
  EXPORTING
*   CLIENT           = SY-MANDT
    DATE             = SY-DATUM  "為替レート自動取得時の基準日
    LOCAL_AMOUNT   = L_VALUE   "国内通貨金額
    FOREIGN_CURRENCY = F_CURR    "外貨通貨
    LOCAL_CURRENCY   = L_CURR    "国内通貨
*    RATE            = '0.07'   "為替レートを指定する場合は、このパラメータを利用すると
                                 "ともにREAD_TCURRを''にする
    TYPE_OF_RATE     = 'B'       "為替レートタイプ B:
    READ_TCURR       = 'X'       "'X':為替レートはTCURRより取得、'':為替レートは
                                 "RATEパラメータの値を使用
  IMPORTING
    EXCHANGE_RATE       = EX_RATE   "換算時の為替レート
    FOREIGN_FACTOR      = F_FACTOR  "換算時の換算係数(外貨)
    FOREIGN_AMOUNT     = F_VALUE   "換算後外貨金額
    LOCAL_FACTOR        = L_FACTOR  "換算時の換算係数(国内通貨)
*   EXCHANGE_RATEX          =
*   FIXED_RATE              =
*   DERIVED_RATE_TYPE       =
* EXCEPTIONS
*   NO_RATE_FOUND           = 1
*   OVERFLOW                = 2
*   NO_FACTORS_FOUND        = 3
*   NO_SPREAD_FOUND         = 4
*   DERIVED_2_TIMES         = 5
*   OTHERS                  = 6
   .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
WRITE:
      /'LOCAL CURRENCY=', L_CURR,
      /'LOCAL_FACTOR=', L_FACTOR,
      /'LOCAL VALUE=',  L_VALUE,
      /'FOREIGN CURRENCY=', F_CURR,
      /'FOREIGN_FACTOR=', F_FACTOR,
      /'FOREIGN VALUE=', F_VALUE,
      /'EXCHANGE_RATE=', EX_RATE
      .
WRITE:/ L_CURR,L_VALUE  CURRENCY L_CURR.
WRITE:/ F_CURR,F_VALUE  CURRENCY F_CURR.

任意通貨間の換算

任意通貨間の換算に関しては、標準から以下二つの汎用モジュールが提供されていますが、

  • CONVERT_FOREIGN_TO_FOREIGN_CUR 外貨金額の別外貨通貨への換算
  • CONVERT_CURRENCY_BY_RATE 与えられたレートを使用した通貨の変換

いずれも未リリースの属性状態であり、正しく動作しないようです。

SAPシステムでは、多通貨が混在しているため、実際に内部管理された金額値は、通貨毎にそれぞれ異なります。例えば、JPYの通貨型項目は通常本来の値の1/100で内部格納されています。 そのため、金額を入出力する際に、内部⇔外部の間に都度書式を変換する必要があります。

外部書式→内部書式変換

汎用モジュール利用

 
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL' 
EXPORTING 
currency = 'JPY' 
amount_external = l_external_amount 
max_number_of_digits = 15 
IMPORTING 
amount_internal = l_internal_amount. 

内部書式→外部書式変換

汎用モジュール利用

 
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL' 
EXPORTING 
currency = 'JPY' 
amount_internal = l_internal_amount 
IMPORTING 
amount_external = l_external_amount.

命令利用

WRITE XXX TO XXX 'JPY' 

0 3939
みんなのツイート (0)

関連サマリー


  • プログラミング基礎 0 Votes 1076 閲覧数


    このトピックでは内部テーブル全体に対する操作を取り上げて説明します。

    割当

    内部テーブルの割り当ては、MOVE命令を使用します。 MOVE itab1 TO itab2. なお、代入演算子も同様の働きを持ちます。 itab2 = itab1.

    上記の命令が実行された結果、内部テーブルitab1の内容が内部テーブルitab2にコピーされることになります。

    初期化

    内部テーブルを初期化するには、clear、fresh、freeなどの命令を使用します。

    clear構文1:clear itab[]
    内部テーブルの本体を初期化します。
    内部テーブルは初期メモリ所要量が予約され、その以外のメモリ領域がすべて解放されます。構文2:clear itab
    ヘッダ行を含まない内部テーブルの場合は、この命令はclear itab[]と同様に動作します。
    ヘッダ行を含る内部テーブルの場合は、ヘッダ行(作業領域)の名前が内部テーブルと同じであるため、このテーブルは単なるヘッダ行のクリアのみとなります。fresh構文:fresh itab
    常に内部テーブルの本体を初期化します。この命令はclear itab[]と同様に動作します。free構文:fresh itab
    常に内部テーブルの本体を初期化します。この命令はclear、fresh命令と異なり、内部テーブルに対して、初期メモリ所要量を含めた記憶域全体をすべて解放します。比較

    ABAPでは、内部テーブルも論理式内のオペランドとして比較することができます。

    ソート

    内部テーブルのソートはSORT命令を使用します。

    SORT itab [ASCENDING|DESCENDING] [AS text] [STABLE].

    属性取得

    DESCRIBE TABLE命令を使用して、件数などの内部テーブルの各属性を取得することができます。

    DESCRIBE TABLE
    構文:DESCRIBE TABLE itab [LINES lin] [OCCURS n] [KIND knd].パラメータ:LINES
    内部テーブルのレコード件数を取得します。パラメータ:OCCURS
    内部テーブルの初期サイズを取得します。パラメータ:KIND
    内部テーブルの種類を取得します。


  • プログラミング基礎 0 Votes 4688 閲覧数


    このトピックはテーブルのデータ行に対して、読み込みや変更などの操作方法を取り上げて説明します。

    読み込み

    内部テーブルから単一行を読み込みするには、以下の命令を使用します。

    READ TABLE itab search-key search-result.検索キーを指定

    読み込む対象となるデータ行の検索キーを指定する方法を説明します。

    (1)テーブルキー指定

    検索キーとして itab のテーブルキーを使用するには、以下のように key を入力します。

    READ TABLE itab FROM wa result.

    または

    READ TABLE itab WITH TABLE KEY k1 = f1 … kn = fn result.

    全タイプの内部テーブルに対して、この方法を利用することができます。

    (2)任意キー指定

    テーブルキー以外の項目も検索キーとして指定することができます。

    READ TABLE itab WITH KEY k1 = f1 … kn = fn result.

    標準テーブルの場合、「BINARY SEARCH」をつけて検索の高速化を図ることができます。これは、標準テーブルが検索キー項目によってソートされていることを前提にしています、そうではない場合、エラーにならないが、意図しないデータ行が読み出されることになってしまいます。

    (3)index指定

    標準テーブルおよびソートテーブルに限りますが、読み込む行のテーブル索引を明示的にidxによって指定することができます。

    READ TABLE 読出元の内部テーブル INTO 読み出し先構造 INDEX idx

    idx は、i 型のデータオブジェクトである必要があります。

    取得できたかをチェック

    対象データが取得できた場合と取得できなかった場合、それぞれ以下のようにシステム項目に値が設定されます。

    取得できた場合sy-subrc: 0sy-tabix: 取得された行のインデックス取得できなかった場合sy-subrc: エラーコード(0でない数字)対象行のデータを照会

    検索対象行のデータを照会するには、作業領域かフィールドシンボルかを使用することができます。

    作業領域を使用
    READ TABLE itab key INTO waフィールドシンボルを使用
    READ TABLE itab key ASSIGNING <fs>.存在チェック

    対象データ行の内容を関心せず、対象データが存在しているかどうかのみをチェックする場合があります。その際、「READ TABLE」命令に「NO FIELDS」オプションをつけることができます。

    挿入単一行挿入

    単一行を内部テーブルの特定の箇所に挿入する場合は、「INSERT」を使用します。

    INSERT wa INTO TABLE itab INDEX idx.複数行挿入

    複数行を内部テーブルの特定の箇所に挿入する場合は「INSERT LINES OF」を使用します。

    INSERT LINES OF itab1 FROM idx1_1 TO idx1_2 INTO TABLE itab2 INDEX idx2.変更単一行変更

    単一行を変更するには、以下の命令を使用します。

    MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 …].複数行変更

    条件を使用して 1 行または複数行を変更するには、以下の命令を使用します。 MODIFY itab FROM wa TRANSPORTING f1 f2 …WHERE cond.

    削除単一行削除

    内部テーブルの単一行を削除する場合は、DELETE 命令を使用します。

    DELETE TABLE itab FROM wa.

    または

    DELETE TABLE itab WITH TABLE KEY k1 = f1 … kn = fn.

    または

    DELETE TABLE itab Index idx複数行削除

    内部テーブルの行を複数まとめて削除する場合には、「DELETE .. WHERE」文を使用します。

    DELETE TABLE itable WHERE key = value.走査

    内部テーブルを走査するには、命令LOOP~ENDLOOPを使用します。 FROM を指定できるのは、 標準テーブルおよび ソートテ ーブルの場合に限られます。 すべてのテーブルデータ型について WHERE を指定することができます。

    DATA : T_WITH_ITEM TYPE TABLE OF WITH_ITEM, W_WITH_ITEM TYPE WITH_ITEM. * 処理 LOOP AT T_WITH_ITEM INTO W_WITH_ITEM WHERE BELNR = W_BELNR AND BUZEI = W_BUZEI. * 処理  

    ENDLOOP.


  • プログラミング基礎 0 Votes 895 閲覧数


    テーブルデータ型は、ABAP における内部テーブルの構造と機能属性を示します。このトピックでは、テーブルデータ型を取り上げて、その構成や種類などを説明します。

    構成

    テーブルデータ型は、行データ型、キー、およびアクセス方法によって完全指定されます。

    (source:SAP Help Portal)

    行データ型

    通常、内部テーブルのデータ型は構造であり、その構造の各コンポーネントは、それぞれ内部テーブル内の1つの列になります。 ただし、内部テーブルのデータ型の仕様としては、構造以外の任意のデータ型を使用することも可能です。

    キー

    テーブル行データはキーによって識別されます。キーは、システムからデフォルトで生成されるは標準キーのほかに、ユーザから定義することもできます。ユーザ定義キーはUNIQUE または NON-UNIQUE として指定することができます。

    アクセス方法

    内部テーブルのアクセス方法は以下三つの種類から指定できます。

    標準テーブル
    標準テーブルは内部的な線型索引を持ちます。
    索引を使用して個別のテーブルエントリをアドレス指定する予定がある場合には、これが最適なデータ型です。ソートテーブル
    ソートテーブルは常にキー別にソートされ、保存されます。ソートテーブルも内部索引を持ちます。
    バイナリ検索が求められる場合には、これが最適なデータ型です。ハッシュテーブル
    ハッシュテーブルは線型索引を持ちません。キーを使用した場合にのみハッシュテーブルにアクセスすることができます。
    ハッシュ検索が求められる場合には、これが最適なデータ型です。分類

    テーブルデータ型は以下の階層図で示されたように、内部テーブルのアクセス方法により分類することができます。

    (source:SAP Help Portal)

    完全指定のテーブルデータ型

    内部テーブルのアクセス方法が明示されたテーブルデータ型です。

    STANDARD TABLE または TABLE
    標準テーブルを登録します。SORTED TABLE
    ソートテーブルを登録します。HASHED TABLE
    ハッシュテーブルを登録します。ジェネリックテーブルデータ型

    内部テーブルのアクセス方法が明示されたテーブルデータ型です。

    INDEX TABLE
    索引アクセスを使用するジェネリックテーブルデータ型を登録します。ANY TABLE
    完全なジェネリックテーブルデータ型を登録します。

    ジェネリックテーブルデータ型は動的なプログラミングでよく使用されます。

    定義

    テーブルデータ型は、ローカルまたはグローバルに定義することができます。

    ローカル定義

    プログラムの中でTYPE命令を使用してテーブルデータ型をローカルに定義することができます。 構文:

    TYPES type TYPE|LIKE tabkind OF linetype [WITH key] [INITIAL SIZE n].グローバル定義

    ABAP ディクショナリのデータ型としてテーブルデータ型をグローバルに定義することもできます。 例として、標準のMMPUR_REQUISITION_ITEMSを取り上げてそのイメージを示します。


  • プログラミング基礎 0 Votes 931 閲覧数


    このトピックでは、SAP標準で用意された採番システムの使用方法を取り上げて説明します。

    概要

    採番処理のために共通的な仕組みを提供します。 

    格納テーブルNRIV
    番号範囲間隔
    メンテナンスSNRO
    番号範囲オブジェクト


    SM56
    番号範囲バッファの管理汎用モジュール

    下記の汎用モジュールを使用できます。

    NUMBER_GET_NEXT 採番NUMBER_GET_INFO 情報取得NUMBER_CHECK チェック


  • プログラミング基礎 0 Votes 731 閲覧数


    実行時データ型識別、略語は RTTI です。プログラム実行時にデータ型を識別して処理を行う仕組みです。。

    DESCRIBE FIELD命令を使用

    DESCRIBE FIELD命令を使用して、変数のデータタイプを取得することができます。

    構文

    DESCRIBE FIELD obj TYPE typ.

    obj
    データ型を取得したいデータオブジェクト。通常の変数やフィールドシンポルなどを使用することができます。typ
    取得したデータ型が格納されるデータオブジェクト。データ型

    データ型は1 桁のIDで識別され、IDでは大文字と小文字が区別されます。

    IDデータ型b基本タイプB:1バイト整数(内部用)C基本タイプC:固定長テキスト項目D基本タイプD:日付項目F基本タイプF:浮動小数点数g基本タイプSTRING:可変長文字順序h内部テーブルi基本タイプI:整数lデータ参照N基本タイプN:数値テキスト項目P基本タイプP:パック数値rオブジェクト参照s基本タイプS:2バイト整数(内部用)T基本タイプT:時刻項目uフラット構造vディープ構造X基本タイプX:16進数y基本タイプXSTRING:可変長バイト順序サンプルソースFORM PARSE_STRING_TO_STRUC USING U_STR TYPE STRING CHANGING C_STRUC. CONSTANTS: CONST_DT_DATE TYPE C VALUE 'D', CONST_TAB TYPE STRING VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB. DATA: VL_STRINGS TYPE STRING_TABLE, VL_STR TYPE STRING, VL_DATE TYPE D, VL_TYPE TYPE C. FIELD-SYMBOLS: <FS_WA> TYPE ANY, <FS_COMP> TYPE ANY. SPLIT U_STR AT CONST_TAB INTO TABLE VL_STRINGS. ASSIGN C_STRUC TO <FS_WA>. TRY. LOOP AT TG_STRING INTO VG_STRING. ASSIGN COMPONENT SY-TABIX OF STRUCTURE <FS_WA> TO <FS_COMP>. DESCRIBE FIELD <FS_COMP> TYPE vl_type. IF vl_type = CONST_DT_DATE. "日付型 CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL' EXPORTING date_external = VL_STR accept_initial_date = 'X' IMPORTING date_internal = vl_date EXCEPTIONS date_external_is_invalid = 1 OTHERS = 2. IF sy-subrc = 0. VL_STR = vl_date. ENDIF. ENDIF. ENDIF. MOVE VL_STR TO <FS_COMP>. ENDLOOP. CATCH CX_SY_CONVERSION_ERROR. CLEAR: EX_AFDATA. ENDTRY. ENDFORM.RTTS関連クラスを使用

    CL_ABAP_TYPEDESCR

    | |--CL_ABAP_DATADESCR | | | |--CL_ABAP_ELEMDESCR | |--CL_ABAP_REFDESCR | |--CL_ABAP_COMPLEXDESCR | | | |--CL_ABAP_STRUCTDESCR | |--CL_ABAP_TABLEDESCR | |--CL_ABAP_OBJECTDESCR | |--CL_ABAP_CLASSDESCR |--CL_ABAP_INTFDESCR

    データ型を判定

    型毎のメタ情報

    属性名意味基本型参照型構造型テーブル型クラス型インタフェース型absolute_name型名称○○○○○○type_kind内部ABAPデータ型○○○○○○length内部長○○○○○○decimals小数桁数P×××××OUTPUT_LENGTH出力長○×××××STRUCT_KIND構造タイプ××○×××COMPONENTSコンポーネント(name/type_kind/length/decimals)テーブル××○×××KEYテーブルキー×××○××INITIAL_SIZEテーブルの初期サイズ×××○××KEY_DEFKINDテーブルデータ型定義×××○××HAS_UNIQUE_KEY一意キー定義×××○××TABLE_KINDテーブルカテゴリ×××○××CLASS_KINDクラスタイプ××××○×CREATE_VISIBILITY可視性登録××××○×INTF_KINDインタフェースタイプ×××××○


  • プログラミング基礎 0 Votes 786 閲覧数


    概要バリアントとは

    バリアントとは、同じ選択条件で実行することが多いプログラムに対して、入力値のセットを保存させておくものです。 レポートプログラムバリアント、画面バリアント、トランザクションバリアントなどがあります。

    バリアント変数とは

    バリアント変数とは、バリアントに格納される値を変数化したものです。 バリアント変数は二つのタイプがあります。

    TYPE P
    単一値を定義することができます。TYPE S
    選択テーブルとして条件を定義することができます。格納テーブル

    バリアント変数の値定義はテーブルTVARVCに格納されます。

    メンテナンストランザクション利用

    バリアント変数のメンテナンスは、トランザクションSTVARVとSTVARVCを使用します。

    STVARV
    クライアント000用STVARVC
    現在のクライアント用プログラム利用

    以下はバリアント変数をABAPプログラムで動的に変更して使用する方法です。

    * バリアント変数テーブルを更新 UPDATE TVARVC SET LOW = WK_FROM   HIGH = WK_TO WHERE NAME = 'VAL_NAME' 

    AND TYPE = 'S'. "タイプ S:SELECT OPTIONS、P:パラメータ


  • プログラミング基礎 0 Votes 2844 閲覧数


    フィールドシンボルとは、物理的なメモリを占有せずに、任意の変数(単一変数、構造、内部テーブルなど)に 割り当てる(Assign)ことで、任意の変数を指し示すことができます。C言語でいうポインタのようなものです。

    宣言

    フィールドシンボルを宣言するには、以下のような構文を使用します。

    FIELD-SYMBOLS <FS> [< データ型 >|STRUCTURE <s> DEFAULT <wa>]. <FS>にある角かっこも構文の一部です、タイプ指定しない場合は、TYPE ANYで宣言することができます。

    FIELD-SYMBOLS <FS1> TYPE ANY. FIELD-SYMBOLS <FS2> TYPE ANY TABLE.

    割り当て

    Assign命令を使います。

    参照と書き込み

    フィールドシンボルにやまかっこをつけて、フィールドシンボルがアドレスするデータを参照または書き込みすることができます。

    FORM f_get_range_table USING u_setclass u_subclass u_setname CHANGING r_range TYPE TABLE. DATA: lt_set LIKE setleaf OCCURS 0 WITH HEADER LINE, wl_range TYPE REF TO DATA . FIELD-SYMBOLS : <fs_rec>,<fs_itm> .

    SELECT * FROM setleaf
      INTO TABLE lt_set
      WHERE setclass = u_setclass
      AND subclass = u_subclass
      AND setname = u_setname.

    LOOP AT lt_set.
    CREATE DATA wl_range LIKE LINE OF r_range.
    ASSIGN wl_range->* TO <fs_rec>.
    ASSIGN COMPONENT 'SIGN' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valsign.
    ASSIGN COMPONENT 'OPTION' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valoption.
    ASSIGN COMPONENT 'LOW' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valfrom.
    ASSIGN COMPONENT 'HIGH' OF STRUCTURE <fs_rec> TO <fs_itm>.
    <fs_itm> = lt_set-valto.
    APPEND wl_range to r_range.
      ENDLOOP.
    ENDFORM.


  • プログラミング基礎 0 Votes 660 閲覧数


    このトピックでは、動的な名称の使用方法を取り上げて説明します。

    動的な名称とは

    ABAPプログラムでは、以下のように様々な名称が使用されます。

    データ型を指定するための名称データオブジェクトを参照するための名称SQL文に記述されるテーブル名称…

    通常はプログラムを作成する際に明示的に記述しますが、より機能性が高いプログラムを作成する場合、その名前を可変にしなければならないケースがあります。この可変の名前は動的な名前と呼ばれます。

    基本的な構文

    基本構文は以下のようになります (名称が格納された変数)

    REPORT Y_TEST. DATA: A TYPE C, V1 TYPE C. FIELD-SYMBOLS <FS> TYPE ANY. A = 'T'. V1 = 'A'. ASSIGN (V1) TO <FS>. WRITE: <FS> . 活用される場面ツール型のプログラム作成

    テーブル内容をエクスポートするツールを例とします、テーブル名はユーザから任意に指定可能です。

    以下はその実装の抜粋です。

    PARAMETERS: pn TYPE dd02l-tabname obligatory. START-OF-SELECTION. DATA: t_itab TYPE REF TO DATA. FIELD-SYMBOLS: <itab> TYPE STANDARD TABLE. CREATE DATA t_itab TYPE STANDARD TABLE OF (pn). ASSIGN t_itab->* TO <itab>. SELECT * FROM (pn) INTO TABLE <itab>. *後続は省略コードの簡潔化

    名前が番号違いだけである複数の変数に対してそれぞれ何かの処理を行う時に、動的に変数を割り当てループ処理化することにより、コーディング記述量を劇的に減らすことができます。

    REPORT Y_VARNAME_TEST. DATA:V1(2) TYPE C, V2(2) TYPE C, V3(2) TYPE C, V4(2) TYPE C, V5(2) TYPE C, V6(2) TYPE C, V7(2) TYPE C, V8(2) TYPE C, V9(2) TYPE C.

    DATA: VNAME(5) TYPE c ,
    VINDEX TYPE c.

    FIELD-SYMBOLS <FS> TYPE ANY.
    START-OF-SELECTION.
    DO 9 TIMES.
    VINDEX = SY-INDEX.
    CONCATENATE 'V' VINDEX INTO VNAME.
    ASSIGN (VNAME) TO <FS>.
    CONCATENATE 'X' VINDEX INTO <FS>.
    ENDDO.
    DO 9 TIMES.
    VINDEX = SY-INDEX.
    CONCATENATE 'V' VINDEX INTO VNAME.
    ASSIGN (VNAME) TO <FS>.

    WRITE:/ VNAME,
    : '=' ,
    : <FS>.
    ENDDO.

    上記のサンプルの実行結果は以下の図で示します。

    変数参照制限の回避

    ABAPでは異なるプログラム(レポート、汎用グループetc)のグローバル変数を直接参照することができません。 但し、Exit実装のアドオンプログラムから、直接拡張された標準プログラムのグローバル変数を直接参照したいというニーズはたまたま発生します。 そこで裏技になりますが、動的な変数名を利用すれば、プログラムを跨ってグローバル変数を参照できないというABAP言語の制限を回避することができます。

    以下はそのサンプルです。

    *
    DATA: I_OKCODE(17) TYPE C VALUE '(SAPLMR1M)OK-CODE'.
    FIELD-SYMBOLS: <FS_OKCODE> TYPE ANY.
    ASSIGN (I_OKCODE) TO <FS_OKCODE>.