1、动态列表第一步,定义需要的 Field-Symbols
FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
<DYN_WA>, “内表工作区
<DYN_FIELD>. “内表字段
2、定义其他数据:
DATA: DY_TABLE TYPE REF TO DATA, “REF TO 引用到 DATA。
IT_STRUCTURE TYPE LVC_T_FCAT, “内表结构引用
WA_STRUCTURE TYPE LVC_S_FCAT.
3、步骤:
PERFORM READ_DATA. “第一步读取数据
PERFORM CREATE_STRUCTURE. “建立动态内表的列结构体
PERFORM CREATE_TABLE. “建立动态列的内表
PERFORM WRITE_DATA_INTO_TABLE. “将动态列的内容写入到内表
PERFORM PRINT_DATA. “打印数据
4、读取数据:
1、从MM03里面的 MARC表里面取出 MATNR 和 WERKS,物料号的LVORM不为删除标志。
2、循环从MARC里面得到的内表,从CA03里面进入到头文件里面,选择一条工艺路
发现这里 来取
每一个步骤的数据,这里得到PLKOD的结构体,进入SE11发现是包含PLKO表,然后再找MATNR发现这里没有这个字段,所以不能通过PLKO直接找到 PLNNR和PLNAL两条数据。通过ST05发现。MAPL(Assignment of Task Lists to Materials)
这个表可以通过MATNR找到PLNNR和PLNAL
3、INNER JOIN MAPL和PLKO表找到 PLKO里面的每个工序的 工序描述。这里的Where条件LOEKZ 不为删除标志 PARKZ(Indicator: inactive changes)不为X,状态为4(Release),还有 DELKZ NE ‘X’,这里表示如果没有删除标志表明此条工艺路线是有效的工艺路线。
4、LOOP 得到的内表数据,去掉工序描述 是R的数据,R为返工的工序。然后找表,进入PLFL(Task list - sequences)表,看描述应该是对应下面这个表的。
进入SE16,查看数据,发现正是这个表的。继续往下找到PLAS(Task list - selection of operations/activities)表,这个表应该是每个节点的表,SE16进去发现是对的。这里的PLNKN是关键字,通过PLNNR和PLNAL可以找到PLNKN的所有项目,这还要注意删除的标记和不激活的标记。如果没有取到数据,CONTINUE.
5、将取到的PLKNK数据放到一个 RANGE 的内表,这个内表值包含一个列,类似于.NET的ArrayList。
6、通过得到的PLNKN和之前的PLNNR取到每条工序的 UMREN UMREZ BMSCH VGW02 VGE02 VGW03 VGE03 UMREN是一个%的数据。如果单位是小时 转换为 MIN,COLLECT数据到ITAB表,找出最后一条数据的序号。
5、建立动态结构体:
1、 WA_STRUCTURE-FIELDNAME = 'MATNR'. “字段名
WA_STRUCTURE-COL_POS = 1. “字段位置
WA_STRUCTURE-INTTYPE = 'CHAR'. “字段类型
WA_STRUCTURE-INTLEN = 18. “字段长度
APPEND WA_STRUCTURE TO IT_STRUCTURE.
2、 NUMBER4 = 1.
NUMBER = 4.
DO MAX TIMES.
NUMBER2 = NUMBER4.
CONCATENATE 'MAN-HOUR' NUMBER2 INTO NAME.
WA_STRUCTURE-FIELDNAME = NAME.
WA_STRUCTURE-COL_POS = NUMBER.
WA_STRUCTURE-INTTYPE = 'P'.
WA_STRUCTURE-INTLEN = 9.
WA_STRUCTURE-DECIMALS = 3.
APPEND WA_STRUCTURE TO IT_STRUCTURE.
NUMBER = NUMBER + 1.
NUMBER4 = NUMBER4 + 1.
ENDDO.
通过循环来Append 结构体的列结构到IT_STRUCTURE,这里的列数从第4列开始,这如果存在多条有效的工艺路线,MAX就会大于1,这里就只有一个工时。
6、建立动态内表:
1、FORM CREATE_TABLE.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IT_STRUCTURE
IMPORTING
EP_TABLE = DY_TABLE.
ASSIGN DY_TABLE->* TO <DYN_TABLE>. “Release
ENDFORM.
调用CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE Function 来建立动态内表,将得到的DY_TABLE的值指向 <DYN_TABLE>.
7、将数据写入到动态内表:
1、 DATA: WA_NEW_LINE TYPE REF TO DATA. “定义建立一个Line
CREATE DATA WA_NEW_LINE LIKE LINE OF <DYN_TABLE>. “动态创建
ASSIGN WA_NEW_LINE->* TO <DYN_WA>. “DYN 指向 NEWLINE
2、去掉前导0 FUNCTION(CONVERSION_EXIT_ALPHA_OUTPUT)
3、 ASSIGN COMPONENT 'MATNR' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
MOVE ITAB-MATNR TO <DYN_FIELD>.
ASSIGN COMPONENT 'WERKS' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
MOVE ITAB-WERKS TO <DYN_FIELD>.
ASSIGN COMPONENT 'UNIT' OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
MOVE 'MIN' TO <DYN_FIELD>.
NUMBER = 1.
LOOP AT IT_STRUCTURE INTO WA_STRUCTURE.
IF WA_STRUCTURE-FIELDNAME+8(2) = ITAB-NUM.
ASSIGN COMPONENT WA_STRUCTURE-FIELDNAME OF STRUCTURE <DYN_WA>
TO <DYN_FIELD>.
MOVE ITAB-VGW02 TO <DYN_FIELD>.
ENDIF.
ENDLOOP.
COLLECT <DYN_WA> INTO <DYN_TABLE>.
CLEAR <DYN_WA>.
ENDLOOP.
将<DYN_FIELD> 指向 <DYN_WA>的MATNR这个组件,然后最后将DYN_WA这一行数据赋给然后将数据赋给 DYN_FIELD 就是赋给了 <DYN_WA>字段的MATNR这个组件。这里的
<DYN_FIELD>实际上就是一个临时的储存变量。
8、最后打印数据:
1、CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
的时候 T_OUTTAB = <DYN_TABLE> “动态表
WHEN 'LPRIO'.
FCAT-SELTEXT_L = 'Deli Priority'.
WHEN OTHERS.
FCAT-SELTEXT_L = FLD.
2、调用FIELD的时候,使用一个循环来讲FIELD-NAME赋值,动态的列表就用FLD来代替