ALV动态列表实例解析(程序非原创)。

来源:互联网 发布:电子软件是什么专业 编辑:程序博客网 时间:2024/05/21 11:29

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、最后打印数据:

  1CALL 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来代替