Posted by mara on 2005-01-27 11:57 上午
|
PROGRAM P1MAIN.
DATA: BEGIN OF STR,
A VALUE 'a',
B VALUE 'b',
C VALUE 'c',
D VALUE 'd',
END OF STR,
CN(5) VALUE 'D'.
FIELD-SYMBOLS <FS> TYPE ANY.
DO 3 TIMES.
ASSIGN COMPONENT SY-INDEX OF
STRUCTURE STR TO <FS>.
IF SY-SUBRC <> 0. EXIT. ENDIF.
WRITE <FS>.
ENDDO.
ASSIGN COMPONENT CN OF STRUCTURE STR TO <FS>.
WRITE <FS>.
Output: a b c d
|
|
Posted by xianer on 2005-07-11 02:03 下午
|
下面是我作的一个动态编程的一个例子,感兴趣的参考一下
其中的文字是日文的,自己改成中文的就可以了.
REPORT Z_GET_STURC_NAME .
*----------------------------------------------------------------------*
* 定数の定義 *
*----------------------------------------------------------------------*
CONSTANTS: BEGIN OF CNS,
PRONAME(16) TYPE C VALUE 'Z_GET_STURC_NAME',
END OF CNS.
*----------------------------------------------------------------------*
* 構造体の定義 *
*----------------------------------------------------------------------*
DATA: BEGIN OF WRK_TEST,
COL1(10) TYPE C VALUE 'VAL_COL1',
COL2(20) TYPE C VALUE 'VAL_COL2',
COL3(30) TYPE C VALUE 'VAL_COL3',
COL4(40) TYPE C VALUE 'VAL_COL4',
END OF WRK_TEST.
TYPE-POOLS: SYDES.
DATA: TD TYPE SYDES_DESC.
DATA: WRK_TD TYPE SYDES_NAMEINFO.
DATA: WRK_TYPE(1) TYPE C,
WRK_LENGTH TYPE I,
WRK_NUM TYPE P,
WRK_RELEN TYPE P,
WRK_STRLEN TYPE P,
SAV_INDEX LIKE SY-INDEX.
FIELD-SYMBOLS: <F01> TYPE ANY.
*----------------------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------------------*
START-OF-SELECTION.
* プログラム名の長さを取得する
WRK_STRLEN = STRLEN( CNS-PRONAME ).
DO.
* WRK_TD構造体の項目を取得する
ASSIGN COMPONENT SY-INDEX
OF STRUCTURE WRK_TD TO <F01>.
IF SY-SUBRC = 0 .
* 構造体のNAME項目の長さを取得する
CHECK SY-INDEX = 2.
DESCRIBE FIELD <F01> OUTPUT-LENGTH WRK_LENGTH.
* プログラム名長さと構造体NAME項目長さの整数部分を取得する
WRK_NUM = WRK_STRLEN DIV WRK_LENGTH.
* プログラム名長さと構造体NAME項目長さの余数部分を取得する
WRK_RELEN = WRK_STRLEN MOD WRK_LENGTH.
* 余数が0ではないなら項目名がTD-NAMES内部テーブルの
* インデェックスを取得する
IF WRK_RELEN <> 0.
SAV_INDEX = WRK_NUM + 1.
ELSE.
SAV_INDEX = WRK_NUM.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLEAR: WRK_NUM, WRK_LENGTH, WRK_RELEN, WRK_STRLEN.
DESCRIBE FIELD WRK_TEST INTO TD.
* ヘッダの出力
WRITE: /002 '項目名',
010 '項目タイプ',
024 '項目長さ',
036 '項目VALUE'.
SKIP.
DO.
ASSIGN COMPONENT SY-INDEX
OF STRUCTURE WRK_TEST TO <F01>.
IF SY-SUBRC = 0.
WRK_NUM = SY-INDEX + SAV_INDEX.
DESCRIBE FIELD <F01> OUTPUT-LENGTH WRK_LENGTH.
DESCRIBE FIELD <F01> TYPE WRK_TYPE.
* TD-NAMES内部テーブルに1レコード目がプログラム名ですけど
* プログラム名長さが15を超えたら内部テーブルの2レコード目に
* なることです
READ TABLE TD-NAMES INTO WRK_TD INDEX WRK_NUM .
WRITE: /002 WRK_TD-NAME,
014 WRK_TYPE,
020 WRK_LENGTH,
038 <F01>.
ELSE.
EXIT.
ENDIF.
ENDDO.
|
|