ABAP 动态内表 动态ALV

时间:2022-04-09 13:34:18
  DATA: DY_TABLE TYPE REF TO DATA,
DY_WA TYPE REF TO DATA. FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE, "是一个标志,可以理解为一个指针,将来创建的内表就要通过它们来访问
<DYN_WA> TYPE ANY,
<FS> TYPE ANY.
  DATA: L_SCRFNAME  TYPE SCRFNAME,
LS_LAYOUT TYPE LVC_S_LAYO,
LT_FIELDCAT TYPE LVC_T_FCAT,
LT_EXCLUDE TYPE UI_FUNCTIONS.
*  此方法用于构建动态内表,输入=构建的结构,输出=dy_table
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = LT_FIELDCAT
IMPORTING
EP_TABLE = DY_TABLE. ASSIGN DY_TABLE->* TO <DYN_TABLE>.
CREATE DATA DY_WA LIKE LINE OF <DYN_TABLE>.
ASSIGN DY_WA->* TO <DYN_WA>. DATA FIELDNAME().
SORT IT_DAT_KY[] BY MATNR.
LOOP AT IT_DAT_KY.
"这里把日期类型定义为char型,因为用DATS报错。
FIELDNAME = IT_DAT_KY-DATUM.
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <dyn_wa> TO <FS>.
<FS> = IT_DAT_KY-MENGE.
ASSIGN COMPONENT 'MGSUM' OF STRUCTURE <dyn_wa> TO <FS>.
<FS> = <FS> + IT_DAT_KY-MENGE.
AT END OF MATNR.
"分配结构里的物料号,用FS字段 指向它
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <dyn_wa> TO <FS>.
<FS> = IT_DAT_KY-MATNR.
ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <dyn_wa> TO <FS>.
SELECT SINGLE MAKTX INTO @DATA(L_MAKTX) FROM MAKT
WHERE MATNR = @IT_DAT_KY-MATNR AND SPRAS = @SY-LANGU.
<FS> = L_MAKTX.
APPEND <dyn_wa> TO <dyn_table>.
CLEAR <dyn_wa>.
ENDAT.
ENDLOOP.
*& 102
DEFINE FCAT.
CLEAR : LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = &.
LS_FIELDCAT-COLTEXT = &.
LS_FIELDCAT-SELTEXT = &.
LS_FIELDCAT-SCRTEXT_L = &.
LS_FIELDCAT-INTLEN = &.
LS_FIELDCAT-INTTYPE = 'C'.
LS_FIELDCAT-OUTPUTLEN = .
IF & = 'MATNR'.
LS_FIELDCAT-KEY = 'X'.
LS_FIELDCAT-REF_TABLE = 'MARA'.
LS_FIELDCAT-REF_FIELD = 'MATNR'.
ENDIF.
IF & = 'MAKTX'.
LS_FIELDCAT-KEY = 'X'.
LS_FIELDCAT-OUTPUTLEN = .
ENDIF.
IF & = 'MGSUM'.
LS_FIELDCAT-JUST = 'R' .
LS_FIELDCAT-EMPHASIZE = 'C310' .
ENDIF.
APPEND LS_FIELDCAT TO P_LT_FIELDCAT.
END-OF-DEFINITION. CLEAR P_LS_LAYOUT.
P_LS_LAYOUT-BOX_FNAME = 'SEL'.
P_LS_LAYOUT-ZEBRA = 'X'. CLEAR P_LT_FIELDCAT.
LS_FIELDCAT-CHECKBOX = 'X'.
LS_FIELDCAT-FIELDNAME = 'SEL'.
LS_FIELDCAT-SCRTEXT_L = '选择'.
LS_FIELDCAT-NO_OUT = 'X'.
LS_FIELDCAT-EDIT = 'X'.
APPEND LS_FIELDCAT TO P_LT_FIELDCAT. SORT TDATE[].
LOOP AT TDATE.
CLEAR L_DATUM.
CALL FUNCTION 'FORMAT_DATE_4_OUTPUT'
EXPORTING
DATIN = TDATE
FORMAT = 'YYYY.MM.DD'
IMPORTING
DATEX = L_DATUM .
FCAT TDATE L_DATUM ''.
ENDLOOP.