ALV tree展BOM

此博客展示了如何在SAP ABAP中使用ALV Tree控件显示物料清单(BOM)。通过调用函数'CS_BOM_EXPL_MAT_V2'来获取BOM数据,并使用CL_GUI_COLUMN_TREE类进行数据显示和处理。博客内容涉及到数据获取、数据处理、节点布局及事件处理等步骤,以便在ALV Tree中以树状结构展示物料及其组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



*&---------------------------------------------------------------------*
*& Report  ZTEST_Y006
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZTEST_Y006 NO STANDARD PAGE HEADING.


TABLESSTPOX,MARA.
CLASSCL_GUI_COLUMN_TREE DEFINITION LOAD,
CL_GUI_CFW DEFINITION LOAD .
DATATREE1  TYPE REF TO CL_HRPAYNA_GUI_ALV_TREE," CL_GUI_ALV_TREE ,
      MR_TOOLBAR TYPE REF TO CL_GUI_TOOLBAR .
DATAGS_STPOX       TYPE STPOX,
      GT_STPOX       TYPE STPOX OCCURS 0,
      GT_FIELDCATALOG  TYPE LVC_T_FCAT,
      GT_ITEM_LAYOUT   TYPE LVC_T_LACI,
      GS_ITEM_LAYOUT   TYPE LVC_S_LACI,
      OKCODE           LIKE SY-UCOMM .
TYPESBEGIN OF GS_F.
        INCLUDE STRUCTURE STPOX.
TYPESNODE_KEY      TYPE LVC_NKEY,
*         MENGE_EA TYPE stpo-menge,   "CHANGE BY XULE 20160308
        MENGE_EA TYPE DECIMALS 0,"ADD BY XULE 20160308
       MEINS_EA TYPE STRING,
*         MENGE_DEL TYPE stpo-menge,
       STATUS_STR(255)   TYPE C,
END   OF GS_F.
DATAGS_XSTPOX       TYPE GS_F ,
      WA_XSTPOX       TYPE GS_F,
      GT_XSTPOX       TYPE GS_F OCCURS 0.
DATA GT_TREETAB TYPE GS_F OCCURS 0.
DATAL_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

DATA:  WA_TOPMAT TYPE CSTMAT,
      WA_DSTST TYPE CSDATA-XFELD.
DATAIT_MATCAT TYPE STANDARD TABLE OF CSCMAT.

DATA:BEGIN OF GT_MSPR OCCURS 0,
      MATNR LIKE MSPR-MATNR,"物料
      WERKS LIKE MSPR-WERKS,"工厂
      LGORT LIKE MSPR-LGORT,"库存地点
      LGOBE LIKE T001L-LGOBE,"库存地点描述
      SOBKZ LIKE MSPR-SOBKZ,"特殊库存标识
      PSPNR LIKE MSPR-PSPNR,"WBS
      PRLAB LIKE MSPR-PRLAB,"项目库存数量
  END OF GT_MSPR.

DATA:BEGIN OF GT_MARM OCCURS 0,
  MATNR TYPE MARM-MATNR,
  MEINH TYPE MARM-MEINH,
  BRGEW TYPE MARM-BRGEW,
  UMREN TYPE MARM-UMREN,
END OF GT_MARM.

DATA:BEGIN OF GT_AFKO OCCURS 0,
      AUFNR LIKE AFKO-AUFNR,
      PLNBEZ LIKE AFKO-PLNBEZ,
      GAMNG LIKE AFKO-GAMNG,
  END OF GT_AFKO.

DATA:BEGIN OF GT_MSEG OCCURS 0,
      MBLNR LIKE MSEG-MBLNR,
      MATNR LIKE MSEG-MATNR,
  END OF GT_MSEG.




PARAMETERS:

*p_matnr LIKE mara-matnr ,
P_WERKS LIKE EKPO-WERKS DEFAULT 'HB01' .
SELECT-OPTIONS S_MATNR FOR MARA-MATNR.
*INCLUDE ZPPR016_LCL.

START-OF-SELECTION.

  PERFORM GETDATA USING 'X'.

  PERFORM FRM_PROCESS_DATA.

START-OF-SELECTION.
  CALL SCREEN 0100.
*&---------------------------------------------------------------------*
*&      Form  getdata
*&---------------------------------------------------------------------*
FORM GETDATA USING PV_MEHRS.
  REFRESH GT_MARM.
  DATA:BEGIN OF LT_MATNR OCCURS 0,
    MATNR TYPE MATNR,
    MAKTX TYPE MAKT-MAKTX,
    MEINS TYPE MARA-MEINS,
  END OF LT_MATNR.

  SELECT A~MATNR B~MAKTX C~MEINS INTO TABLE LT_MATNR
    FROM MARC AS JOIN MAKT AS B
    ON A~MATNR B~MATNR
    JOIN MARA AS C
    ON C~MATNR A~MATNR
    WHERE A~MATNR IN S_MATNR AND A~WERKS P_WERKS
    AND B~SPRAS SY-LANGU.

  LOOP AT LT_MATNR.
    REFRESH GT_STPOX.
    CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
      EXPORTING
        CAPID                 'PP01'      " p_capid
        DATUV                 SY-DATUM
        MEHRS                 PV_MEHRS
*       stlal                 = '01' "可选BOM
*       stlan                 = '2' "BOM 用途
        MTNRV                 LT_MATNR-MATNR
        WERKS                 P_WERKS
*       emeng                 = 1
      IMPORTING
        TOPMAT                WA_TOPMAT
        DSTST                 WA_DSTST
      TABLES
        STB                   GT_STPOX
        MATCAT                IT_MATCAT
      EXCEPTIONS
        ALT_NOT_FOUND         1
        CALL_INVALID          2
        MATERIAL_NOT_FOUND    3
        MISSING_AUTHORIZATION 4
        NO_BOM_FOUND          5
        NO_PLANT_DATA         6
        NO_SUITABLE_BOM_FOUND 7
        CONVERSION_ERROR      8
        OTHERS                9.


    CLEAR GS_XSTPOX.
    GS_XSTPOX-STUFE 1.
    GS_XSTPOX-OJTXB LT_MATNR-MAKTX.
    GS_XSTPOX-IDNRK LT_MATNR-MATNR.

    SELECT SINGLE BMENG INTO GS_XSTPOX-MENGE
    FROM STKO AS A
      JOIN MAST AS B
      ON A~STLNR B~STLNR
      AND A~STLAL B~STLAL
      WHERE A~STLTY 'M'
        AND B~STLAN '1'
        AND B~MATNR LT_MATNR-MATNR
        AND B~WERKS P_WERKS.

    GS_XSTPOX-MEINS LT_MATNR-MEINS.
    GS_XSTPOX-OJTXP LT_MATNR-MAKTX.
    GS_XSTPOX-XTLTY 1.
    GS_XSTPOX-XTLNR 1.
    GS_XSTPOX-XTLAN 1.
    GS_XSTPOX-XTLAL 1.
    APPEND GS_XSTPOX TO GT_TREETAB.
    APPEND GS_XSTPOX TO GT_XSTPOX.

    LOOP AT GT_STPOX INTO GS_STPOX.
      MOVE-CORRESPONDING GS_STPOX TO GS_XSTPOX .
      GS_XSTPOX-STUFE GS_XSTPOX-STUFE + 1.
      APPEND GS_XSTPOX TO GT_XSTPOX.
    ENDLOOP.
  ENDLOOP.

  IF GT_XSTPOX[] IS NOT INITIAL .
    SELECT MATNR
    MEINH
    BRGEW
    UMREN
    INTO TABLE GT_MARM FROM MARM
    FOR ALL ENTRIES IN GT_XSTPOX
    WHERE MATNR GT_XSTPOX-IDNRK
    AND MEINH <> GT_XSTPOX-MEINS.

    LOOP AT GT_XSTPOX INTO GS_XSTPOX.
      CLEAR GT_MARM.
      READ TABLE GT_MARM WITH KEY MATNR GS_XSTPOX-IDNRK.
      IF SY-SUBRC EQ AND GT_MARM-BRGEW <> 0.
        GS_XSTPOX-MENGE_EA GS_XSTPOX-MENGE * GT_MARM-UMREN / GT_MARM-BRGEW.

        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
          EXPORTING
            INPUT          GT_MARM-MEINH
            LANGUAGE       SY-LANGU
          IMPORTING
*           LONG_TEXT      =
*           OUTPUT         =
            SHORT_TEXT     GS_XSTPOX-MEINS_EA
          EXCEPTIONS
            UNIT_NOT_FOUND 1
            OTHERS         2.
        IF SY-SUBRC <> 0.
* Implement suitable error handling here
        ENDIF.
      ENDIF.

      MODIFY GT_XSTPOX FROM GS_XSTPOX.
    ENDLOOP.
  ENDIF.

  IF GT_XSTPOX[] IS NOT INITIAL .
    SELECT A~MATNR A~WERKS A~LGORT B~LGOBE A~SOBKZ A~PSPNR A~PRLAB
    INTO TABLE GT_MSPR
    FROM MSPR AS A INNER JOIN T001L AS ON A~LGORT B~LGORT AND A~WERKS B~WERKS
    FOR ALL ENTRIES IN GT_XSTPOX
    WHERE A~MATNR GT_XSTPOX-IDNRK
    AND A~WERKS P_WERKS
    AND A~SOBKZ 'Q'
    AND A~PRLAB NE 0.

*      从表AFKO中取出该物料用到哪个生产订单中
    SELECT AUFNR PLNBEZ GAMNG INTO TABLE GT_AFKO
    FROM AFKO
    FOR ALL ENTRIES IN GT_XSTPOX
    WHERE PLNBEZ GT_XSTPOX-IDNRK
    AND PLNBEZ NOT LIKE 'N%'.
*    从表MSEG中取出移动类型为261的物料
    SELECT MATNR  INTO CORRESPONDING FIELDS OF TABLE GT_MSEG
    FROM AUFM
    FOR ALL ENTRIES IN GT_XSTPOX
    WHERE MATNR GT_XSTPOX-IDNRK
    AND WERKS P_WERKS
    AND BWART '261'.
  ENDIF.

  SORT GT_MSPR BY MATNR .
  SORT GT_AFKO BY PLNBEZ.
  SORT GT_MSEG BY MATNR.
ENDFORM.                    "getdata
*----------------------------------------------------------------------*

"定义事件注册类(使用双击事件)
*----------------------------------------------------------------------*
*   INCLUDE BCALV_TREE_EVENT_REC_DRAGDROP                              *
*----------------------------------------------------------------------*
CLASS cl_tree_event_receiver DEFINITION.

  PUBLIC SECTION.
*   double click item
    METHODS handle_double_click
      FOR EVENT node_double_click OF cl_gui_alv_tree_simple
      IMPORTING index_outtab
                grouplevel.
ENDCLASS.                    "CL_TREE_EVENT_RECEIVER DEFINITION
*---------------------------------------------------------------------*
*       CLASS CL_TREE_EVENT_RECEIVER IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS cl_tree_event_receiver IMPLEMENTATION.
  METHOD handle_double_click.
    CHECK NOT index_outtab IS INITIAL.
    "获取当前行
*   READ TABLE gt_show(数据内表) INTO l_wa_data INDEX index_outtab.
    if sy-subrc  0.
    "事件操作
    endif.
  ENDMETHOD.                    "HANDLE_DOUBLE_CLICK
ENDCLASS.                    "CL_TREE_EVENT_RECEIVER IMPLEMENTATION


*  MODULE status_9000 OUTPUT
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'MAIN'.
  SET TITLEBAR 'TITLE'.
  IF TREE1 IS INITIAL.
    PERFORM INIT_TREE.
  ENDIF.
  CALL METHOD CL_GUI_CFW=>FLUSH.
ENDMODULE.                 " PBO_9000  OUTPUT
*----------------------------------------------------------------------*
*  MODULE user_command_9000 INPUT
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  CASE OKCODE.
    WHEN 'EXIT' OR 'CANC'.
      CALL METHOD TREE1->FREE.
      LEAVE PROGRAM .
    WHEN 'BACK'.
      CALL METHOD TREE1->FREE.
      LEAVE TO SCREEN 0.
    WHEN 'EXCEL'.
      CALL FUNCTION 'ZXLWB_CALLFORM'
        EXPORTING
          IV_FORMNAME                   'ZXLS_TREE'
          IV_CONTEXT_REF                TREE1
*       IV_VIEWER_TITLE               = SY-TITLE
*       IV_VIEWER_CALLBACK_PROG       = SY-CPROG
*       IV_VIEWER_CALLBACK_FORM       =
*       IV_VIEWER_SUPPRESS            =
*       IV_PROTECT                    =
*       IV_SAVE_AS                    =
*       IT_DOCPROPERTIES              =
*     IMPORTING
*       EV_DOCUMENT_RAWDATA           =
       EXCEPTIONS
         PROCESS_TERMINATED            1
         OTHERS                        2
                .
    WHEN 'EXCEL_ALL'.

      REFRESH GT_XSTPOX.
      PERFORM GETDATA USING 'X'.
      PERFORM FRM_PROCESS_DATA.

      TREE1->FREE).
      PERFORM INIT_TREE.
*     PERFORM FRM_GRANCE_TREE_DATA.
*    LOOP AT GT_XSTPOX INTO WA_xstpox.
*      PERFORM frm_add_nodes USING WA_xstpox.
*    ENDLOOP.

*      CALL FUNCTION 'ZXLWB_CALLFORM'
*      EXPORTING
*        IV_FORMNAME                   = 'ZXLS_TREE'
*        IV_CONTEXT_REF                = TREE1
**       IV_VIEWER_TITLE               = SY-TITLE
**       IV_VIEWER_CALLBACK_PROG       = SY-CPROG
**       IV_VIEWER_CALLBACK_FORM       =
**       IV_VIEWER_SUPPRESS            =
**       IV_PROTECT                    =
**       IV_SAVE_AS                    =
**       IT_DOCPROPERTIES              =
**     IMPORTING
**       EV_DOCUMENT_RAWDATA           =
*      EXCEPTIONS
*        PROCESS_TERMINATED            = 1
*        OTHERS                        = 2
*        .

    WHEN OTHERS.
      CALL METHOD CL_GUI_CFW=>DISPATCH.
  ENDCASE.
  CLEAR OKCODE.
  CALL METHOD CL_GUI_CFW=>FLUSH.
ENDMODULE.                 " okcode  INPUT
*&---------------------------------------------------------------------*
*&      Form  init_tree
*&---------------------------------------------------------------------*
FORM INIT_TREE .
*  APPEND LINES OF GT_XSTPOX to GT_TREETAB.
*  CREATE OBJECT TREE_EVENT_RECEIVER.
 DATAtree_event_receiver TYPE REF TO cl_tree_event_receiver.
 CREATE OBJECT tree_event_receiver.


  PERFORM BUILD_FIELDCATALOG.
  CREATE OBJECT TREE1
  EXPORTING
*      parent                      = l_custom_container
    PARENT                      CL_GUI_CONTAINER=>SCREEN0
    NODE_SELECTION_MODE         CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
    ITEM_SELECTION              'X'
    NO_HTML_HEADER              'X'
    NO_TOOLBAR                  ' '
  EXCEPTIONS
    CNTL_ERROR                  1
    CNTL_SYSTEM_ERROR           2
    CREATE_ERROR                3
    LIFETIME_ERROR              4
    ILLEGAL_NODE_SELECTION_MODE 5
    FAILED                      6
    ILLEGAL_COLUMN_NAME         7.
  IF SY-SUBRC <> 0.
    MESSAGE '创建TREE错误' TYPE 'E'.
  ENDIF.
  DATA L_HIERARCHY_HEADER TYPE TREEV_HHDR.
  PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.
  DATALS_VARIANT TYPE DISVARIANT.
  LS_VARIANT-REPORT SY-REPID.
*  BREAK-POINT.

  CALL METHOD TREE1->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_HIERARCHY_HEADER L_HIERARCHY_HEADER
      I_BACKGROUND_ID     'ALV_BACKGROUND'
      I_SAVE              'A'
      IS_VARIANT          LS_VARIANT
    CHANGING
*     IT_OUTTAB           = GT_STPOX "table must be emty !!
      IT_OUTTAB           GT_TREETAB"table must be emty !!
      IT_FIELDCATALOG     GT_FIELDCATALOG.

  PERFORM FRM_GRANCE_TREE_DATA.

  PERFORM REGISTER_EVENTS.

*  SET HANDLER TREE_EVENT_RECEIVER->EXPAND_NC  FOR TREE1.
*  SET HANDLER TREE_EVENT_RECEIVER->HANDLE_DOUBLE_CLICK  FOR TREE1.
  CALL METHOD TREE1->UPDATE_CALCULATIONS.
  CALL METHOD TREE1->FRONTEND_UPDATE.
ENDFORM.                    " init_tree
*&---------------------------------------------------------------------*
*&      Form  build_fieldcatalog
*&---------------------------------------------------------------------*
FORM BUILD_FIELDCATALOG.
  DATALS_FIELDCATALOG TYPE LVC_S_FCAT.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      I_STRUCTURE_NAME 'STPOX'
    CHANGING
      CT_FIELDCAT      GT_FIELDCATALOG.

*  BREAK-POINT.
  LOOP AT GT_FIELDCATALOG INTO LS_FIELDCATALOG.
*    CASE ls_fieldcatalog-fieldname.
*      WHEN 'CARRID' OR 'CONNID' OR 'FLDATE'.
*        ls_fieldcatalog-no_out = 'X'.
*        ls_fieldcatalog-key    = ''.
*      WHEN 'PRICE' OR 'SEATSOCC' OR 'SEATSMAX' OR 'PAYMENTSUM'.
**        ls_fieldcatalog-do_sum = 'X'.
*      WHEN 'PLANETYPE'.
*        ls_fieldcatalog-edit = 'X'.
*        ls_fieldcatalog-style = cl_gui_alv_grid=>mc_style_enabled .
*    ENDCASE.
*    MODIFY GT_FIELDCATALOG FROM LS_FIELDCATALOG.
    CASE LS_FIELDCATALOG-FIELDNAME.
*    WHEN 'OJTXB'.
*      LS_FIELDCATALOG-COL_POS = '1'.
      WHEN 'IDNRK'.
        LS_FIELDCATALOG-COL_POS '1'.
      WHEN 'MENGE'.
        LS_FIELDCATALOG-COL_POS '2'.
      WHEN 'MEINS'.
        LS_FIELDCATALOG-COL_POS '3'.
      WHEN OTHERS.
        DELETE GT_FIELDCATALOG INDEX SY-TABIX .
        CONTINUE.
    ENDCASE.

    MODIFY GT_FIELDCATALOG FROM LS_FIELDCATALOG TRANSPORTING COL_POS.
  ENDLOOP.
  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-COL_POS '4'.
  LS_FIELDCATALOG-FIELDNAME 'MENGE_EA'.
  LS_FIELDCATALOG-DATATYPE  'QUAN'.
  LS_FIELDCATALOG-INTTYPE  'P'.
  LS_FIELDCATALOG-INTLEN  '13'.
  LS_FIELDCATALOG-REPTEXT  '件数'.
  LS_FIELDCATALOG-DD_OUTLEN  '13'.
*    LS_FIELDCATALOG-REF_FIELD = 'INSTPATH'.
*    LS_FIELDCATALOG-REF_TABLE = 'TSKTL'.
  LS_FIELDCATALOG-SCRTEXT_M '件数'.
  LS_FIELDCATALOG-SCRTEXT_S LS_FIELDCATALOG-SCRTEXT_M.
  LS_FIELDCATALOG-SCRTEXT_L LS_FIELDCATALOG-SCRTEXT_M.
  APPEND LS_FIELDCATALOG TO GT_FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-COL_POS '5'.
  LS_FIELDCATALOG-FIELDNAME 'MEINS_EA'.
  LS_FIELDCATALOG-DATATYPE  'CHAR'.
  LS_FIELDCATALOG-INTTYPE  'C'.
  LS_FIELDCATALOG-INTLEN  '6'.
  LS_FIELDCATALOG-REPTEXT  '附加单位'.
  LS_FIELDCATALOG-DD_OUTLEN  '6'.
*    LS_FIELDCATALOG-REF_FIELD = 'INSTPATH'.
*    LS_FIELDCATALOG-REF_TABLE = 'TSKTL'.
  LS_FIELDCATALOG-SCRTEXT_M '附加单位'.
  LS_FIELDCATALOG-SCRTEXT_S LS_FIELDCATALOG-SCRTEXT_M.
  LS_FIELDCATALOG-SCRTEXT_L LS_FIELDCATALOG-SCRTEXT_M.
  APPEND LS_FIELDCATALOG TO GT_FIELDCATALOG.

  CLEAR LS_FIELDCATALOG.
  LS_FIELDCATALOG-COL_POS '6'.
  LS_FIELDCATALOG-FIELDNAME 'STATUS_STR'.
  LS_FIELDCATALOG-DATATYPE  'CHAR'.
  LS_FIELDCATALOG-INTTYPE  'C'.
  LS_FIELDCATALOG-INTLEN  '255'.
  LS_FIELDCATALOG-REPTEXT  '状态'.
  LS_FIELDCATALOG-DD_OUTLEN  '255'.
*    LS_FIELDCATALOG-REF_FIELD = 'INSTPATH'.
*    LS_FIELDCATALOG-REF_TABLE = 'TSKTL'.
  LS_FIELDCATALOG-SCRTEXT_M '状态'.
  LS_FIELDCATALOG-SCRTEXT_S LS_FIELDCATALOG-SCRTEXT_M.
  LS_FIELDCATALOG-SCRTEXT_L LS_FIELDCATALOG-SCRTEXT_M.
  APPEND LS_FIELDCATALOG TO GT_FIELDCATALOG.
ENDFORM.                               " build_fieldcatalog
*&---------------------------------------------------------------------*
*&      Form  build_hierarchy_header
*&---------------------------------------------------------------------*
FORM BUILD_HIERARCHY_HEADER CHANGING
  P_HIERARCHY_HEADER TYPE TREEV_HHDR.
*
  P_HIERARCHY_HEADER-HEADING 'BOM层次'.
  P_HIERARCHY_HEADER-TOOLTIP 'ToolTip'.
  P_HIERARCHY_HEADER-WIDTH 30.
  P_HIERARCHY_HEADER-WIDTH_PIX ''.
*
ENDFORM.                               " build_hierarchy_header
*&---------------------------------------------------------------------*
*&      Form  add_complete_line
*&---------------------------------------------------------------------*
FORM ADD_COMPLETE_LINE USING  PS_STPOX TYPE GS_F "STPOX
      P_RELAT_KEY TYPE LVC_NKEY
CHANGING  P_NODE_KEY TYPE LVC_NKEY.

  DATAL_NODE_TEXT TYPE LVC_VALUE.
* set item-layout
  DATALT_ITEM_LAYOUT TYPE LVC_T_LAYI,
        LS_ITEM_LAYOUT TYPE LVC_S_LAYI.
*  DATA: stufe_num(2) TYPE n.
  DATA LS_LVC_LAYN TYPE LVC_S_LAYN.

  LS_ITEM_LAYOUT-FIELDNAME TREE1->C_HIERARCHY_COLUMN_NAME.
  LS_ITEM_LAYOUT-CLASS     CL_GUI_COLUMN_TREE=>ITEM_CLASS_TEXT.
*  ls_item_layout-editable  = 'X'.
  LS_ITEM_LAYOUT-CHOSEN    'X'.  " 设置为选中状态

  IF PS_STPOX-XTLTY IS INITIAL
  AND PS_STPOX-XTLNR IS INITIAL
  AND PS_STPOX-XTLAN IS INITIAL
  AND PS_STPOX-XTLAL IS INITIAL.

    LS_LVC_LAYN-ISFOLDER    ' '.  " 文件夹格式
    LS_LVC_LAYN-EXPANDER    ' '.  " 展开
    LS_LVC_LAYN-N_IMAGE    '@05@'.  " 展开
  ELSE.
    LS_LVC_LAYN-ISFOLDER    'X'.  " 文件夹格式
    LS_LVC_LAYN-EXPANDER    'X'.  " 展开
    LS_LVC_LAYN-N_IMAGE    '@04@'.  " 展开
    LS_LVC_LAYN-EXP_IMAGE    '@05@'.  " 展开
  ENDIF.

  APPEND LS_ITEM_LAYOUT TO LT_ITEM_LAYOUT.
*  l_node_text =  ps_stpox-ojtxp.
*  stufe_num = ps_stpox-stufe.
*
*  CONCATENATE stufe_num ',' ps_stpox-ojtxp INTO l_node_text.

  L_NODE_TEXT PS_STPOX-OJTXP.

  CALL METHOD TREE1->ADD_NODE
    EXPORTING
      I_RELAT_NODE_KEY P_RELAT_KEY
      I_RELATIONSHIP   CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
      IS_OUTTAB_LINE   PS_STPOX
      IS_NODE_LAYOUT   LS_LVC_LAYN
      I_NODE_TEXT      L_NODE_TEXT
      IT_ITEM_LAYOUT   LT_ITEM_LAYOUT
    IMPORTING
      E_NEW_NODE_KEY   P_NODE_KEY.
ENDFORM.                               " add_complete_line
*&---------------------------------------------------------------------*
*&      Form  REGISTER_EVENTS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM REGISTER_EVENTS .
  DATALT_EVENTS TYPE CNTL_SIMPLE_EVENTS,
        L_EVENT TYPE CNTL_SIMPLE_EVENT.
* define the events which will be passed to the backend
  CLEAR L_EVENT.
  L_EVENT-EVENTID CL_GUI_COLUMN_TREE=>EVENTID_NODE_DOUBLE_CLICK.
  L_EVENT-APPL_EVENT 'X'.
  APPEND L_EVENT TO LT_EVENTS.
  CLEAR L_EVENT.
  L_EVENT-EVENTID CL_GUI_COLUMN_TREE=>EVENTID_EXPAND_NO_CHILDREN.
  APPEND L_EVENT TO LT_EVENTS.
  CLEAR L_EVENT.
  L_EVENT-EVENTID CL_GUI_COLUMN_TREE=>EVENTID_HEADER_CLICK.
  APPEND L_EVENT TO LT_EVENTS.

  CLEAR L_EVENT.
  L_EVENT-EVENTID CL_GUI_COLUMN_TREE=>EVENTID_NODE_KEYPRESS.
  APPEND L_EVENT TO LT_EVENTS.

  CLEAR L_EVENT.
* register events
  CALL METHOD TREE1->SET_REGISTERED_EVENTS
    EXPORTING
      EVENTS                    LT_EVENTS
    EXCEPTIONS
      CNTL_ERROR                1
      CNTL_SYSTEM_ERROR         2
      ILLEGAL_EVENT_COMBINATION 3.
  IF SY-SUBRC <> 0.
    MESSAGE X534(0K).
  ENDIF.
ENDFORM.                    " REGISTER_EVENTS
*&---------------------------------------------------------------------*
*&      Form  FRM_GRANCE_TREE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GRANCE_TREE_DATA .
  DATAL1 TYPE LVC_NKEY ,L2 TYPE LVC_NKEY ,L3 TYPE LVC_NKEY ,L4 TYPE LVC_NKEY ,
        L5 TYPE LVC_NKEY ,L6 TYPE LVC_NKEY ,L7 TYPE LVC_NKEY ,L8 TYPE LVC_NKEY ,
        L_KEY TYPE LVC_NKEY,
        L_LAST_KEY TYPE LVC_NKEY  ,
        ADDED .

  LOOP AT GT_XSTPOX INTO GS_XSTPOX .
    MOVE-CORRESPONDING GS_XSTPOX TO GS_STPOX.
*    CASE GS_STPOX-STUFE .
    CASE GS_XSTPOX-STUFE .
      WHEN '1'.
        L_KEY ''.
      WHEN '2'.
        L_KEY L1.
      WHEN '3'.
        L_KEY L2.
      WHEN '4'.
        L_KEY L3.
      WHEN '5'.
        L_KEY L4.
      WHEN '6'.
        L_KEY L5.
    ENDCASE.

    PERFORM ADD_COMPLETE_LINE USING  GS_XSTPOX L_KEY
    CHANGING L_LAST_KEY.

    GS_XSTPOX-NODE_KEY L_LAST_KEY.
    CASE GS_STPOX-STUFE .
      WHEN '1'.
        L1 L_LAST_KEY.
      WHEN '2'.
        L2 L_LAST_KEY.
      WHEN '3'.
        L3 L_LAST_KEY.
      WHEN '4'.
        L4 L_LAST_KEY.
      WHEN '5'.
        L5 L_LAST_KEY.
      WHEN '6'.
        L6 L_LAST_KEY.
    ENDCASE.
    MODIFY GT_XSTPOX FROM GS_XSTPOX .
  ENDLOOP.
ENDFORM.                    " FRM_GRANCE_TREE_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_ADD_NODES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ADD_NODES USING PS_XSTPOX TYPE GS_F.
  DATAL1 TYPE LVC_NKEY ,L2 TYPE LVC_NKEY ,L3 TYPE LVC_NKEY ,L4 TYPE LVC_NKEY ,
        L5 TYPE LVC_NKEY ,L6 TYPE LVC_NKEY ,L7 TYPE LVC_NKEY ,L8 TYPE LVC_NKEY ,
        L_KEY TYPE LVC_NKEY,
        L_LAST_KEY TYPE LVC_NKEY  ,
        ADDED .
  LOOP AT GT_XSTPOX INTO GS_XSTPOX WHERE NODE_KEY IS INITIAL.
    MOVE-CORRESPONDING GS_XSTPOX TO GS_STPOX.
    CASE GS_STPOX-STUFE .
      WHEN '1'.
        L_KEY ''.
      WHEN '2'.
        L_KEY L1.
      WHEN '3'.
        L_KEY L2.
      WHEN '4'.
        L_KEY L3.
      WHEN '5'.
        L_KEY L4.
      WHEN '6'.
        L_KEY L5.
    ENDCASE.

    PERFORM ADD_CHILD_NOTES USING  GS_XSTPOX PS_XSTPOX-NODE_KEY
    CHANGING L_LAST_KEY.

    GS_XSTPOX-NODE_KEY L_LAST_KEY.

    CASE GS_STPOX-STUFE .
      WHEN '1'.
        L1 L_LAST_KEY.
      WHEN '2'.
        L2 L_LAST_KEY.
      WHEN '3'.
        L3 L_LAST_KEY.
      WHEN '4'.
        L4 L_LAST_KEY.
      WHEN '5'.
        L5 L_LAST_KEY.
      WHEN '6'.
        L6 L_LAST_KEY.
    ENDCASE.
    MODIFY GT_XSTPOX FROM GS_XSTPOX .
  ENDLOOP.
ENDFORM.                    " FRM_ADD_NODES
*&---------------------------------------------------------------------*
*&      Form  ADD_CHILD_NOTES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GS_STPOX  text
*      -->P_L_KEY  text
*      <--P_L_LAST_KEY  text
*----------------------------------------------------------------------*
FORM ADD_CHILD_NOTES  USING  PS_STPOX TYPE GS_F
      P_RELAT_KEY TYPE LVC_NKEY
CHANGING  P_NODE_KEY TYPE LVC_NKEY.

  DATAL_NODE_TEXT TYPE LVC_VALUE.
* set item-layout
  DATALT_ITEM_LAYOUT TYPE LVC_T_LAYI,
        LS_ITEM_LAYOUT TYPE LVC_S_LAYI.
*  DATA: stufe_num(2) TYPE n.
  DATA LS_LVC_LAYN TYPE LVC_S_LAYN.

  LS_ITEM_LAYOUT-FIELDNAME TREE1->C_HIERARCHY_COLUMN_NAME.
  LS_ITEM_LAYOUT-CLASS     CL_GUI_COLUMN_TREE=>ITEM_CLASS_TEXT.
*  ls_item_layout-editable  = 'X'.
  LS_ITEM_LAYOUT-CHOSEN    'X'.  " 设置为选中状态

  IF PS_STPOX-XTLTY IS INITIAL
  AND PS_STPOX-XTLNR IS INITIAL
  AND PS_STPOX-XTLAN IS INITIAL
  AND PS_STPOX-XTLAL IS INITIAL.

    LS_LVC_LAYN-ISFOLDER    ' '.  " 文件夹格式
    LS_LVC_LAYN-EXPANDER    ' '.  " 展开
    LS_LVC_LAYN-N_IMAGE    '@05@'.  " 展开
  ELSE.
    LS_LVC_LAYN-ISFOLDER    'X'.  " 文件夹格式
    LS_LVC_LAYN-EXPANDER    'X'.  " 展开
    LS_LVC_LAYN-N_IMAGE    '@04@'.  " 展开
    LS_LVC_LAYN-EXP_IMAGE    '@05@'.  " 展开
  ENDIF.

  APPEND LS_ITEM_LAYOUT TO LT_ITEM_LAYOUT.

  L_NODE_TEXT PS_STPOX-OJTXP.
  CALL METHOD TREE1->ADD_NODE
    EXPORTING
      I_RELAT_NODE_KEY P_RELAT_KEY
      I_RELATIONSHIP   CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
      IS_OUTTAB_LINE   PS_STPOX
      IS_NODE_LAYOUT   LS_LVC_LAYN
      I_NODE_TEXT      L_NODE_TEXT
      IT_ITEM_LAYOUT   LT_ITEM_LAYOUT
    IMPORTING
      E_NEW_NODE_KEY   P_NODE_KEY.

ENDFORM.                    " ADD_CHILD_NOTES
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
  DATAL_LGORT LIKE T001L-LGOBE,
        L_PRLAB TYPE STRING,
        L_MENGE TYPE STRING,
        L_MEINS TYPE STRING,
        L_PRLAB1 LIKE MSEG-MENGE,
        L_MENGE1 LIKE MSEG-MENGE,
        L_MENGE_DEL TYPE STRING.
  DATAL_NUM LIKE SY-TABIX.
  DATA L_GAMNG TYPE STRING.
  DATA LV_TABIX TYPE SY-TABIX.

  LOOP AT GT_XSTPOX INTO GS_XSTPOX.
    L_MENGE1 GS_XSTPOX-MENGE.
    L_MENGE_DEL GS_XSTPOX-MENGE_EA.
    LOOP AT GT_MSPR WHERE MATNR GS_XSTPOX-IDNRK.
      LV_TABIX SY-TABIX.
      L_LGORT GT_MSPR-LGOBE.
      L_PRLAB1 GT_MSPR-PRLAB.
      IF L_MENGE1 L_PRLAB1.
        L_MENGE L_MENGE1.
        L_PRLAB L_PRLAB1.

        CLEAR GT_MARM.
        READ TABLE GT_MARM WITH KEY MATNR GS_XSTPOX-IDNRK.
        IF SY-SUBRC EQ AND GT_MARM-BRGEW <> 0.
          L_PRLAB L_PRLAB * GT_MARM-UMREN / GT_MARM-BRGEW.

          CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
            EXPORTING
              INPUT          GT_MARM-MEINH
              LANGUAGE       SY-LANGU
            IMPORTING
*             LONG_TEXT      =
*             OUTPUT         =
              SHORT_TEXT     L_MEINS
            EXCEPTIONS
              UNIT_NOT_FOUND 1
              OTHERS         2.
          IF SY-SUBRC <> 0.
* Implement suitable error handling here
          ENDIF.
        ENDIF.

        L_MENGE_DEL L_MENGE_DEL L_PRLAB.

        CONCATENATE  GS_XSTPOX-STATUS_STR L_LGORT  L_PRLAB L_MEINS INTO GS_XSTPOX-STATUS_STR.
        CONDENSE GS_XSTPOX-STATUS_STR NO-GAPS.
        DELETE GT_MSPR INDEX LV_TABIX.
        MODIFY GT_XSTPOX FROM GS_XSTPOX.
        EXIT.
      ELSEIF L_MENGE1 > L_PRLAB1.
        L_MENGE L_MENGE1.
        L_PRLAB L_PRLAB1.

        CLEAR GT_MARM.
        READ TABLE GT_MARM WITH KEY MATNR GS_XSTPOX-IDNRK.
        IF SY-SUBRC EQ AND GT_MARM-BRGEW <> 0.
          L_PRLAB L_PRLAB * GT_MARM-UMREN / GT_MARM-BRGEW.

          CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
            EXPORTING
              INPUT          GT_MARM-MEINH
              LANGUAGE       SY-LANGU
            IMPORTING
*             LONG_TEXT      =
*             OUTPUT         = L_MEINS
              SHORT_TEXT     L_MEINS
            EXCEPTIONS
              UNIT_NOT_FOUND 1
              OTHERS         2.
          IF SY-SUBRC <> 0.
* Implement suitable error handling here
          ENDIF.
        ENDIF.

        L_MENGE_DEL L_MENGE_DEL L_PRLAB.

        CONCATENATE  GS_XSTPOX-STATUS_STR L_LGORT  L_PRLAB L_MEINS INTO GS_XSTPOX-STATUS_STR.
        CONDENSE GS_XSTPOX-STATUS_STR NO-GAPS.
        L_MENGE1 L_MENGE1 L_PRLAB.
        DELETE GT_MSPR INDEX LV_TABIX.
        MODIFY GT_XSTPOX FROM GS_XSTPOX.
        CONTINUE.
      ELSE.
        L_MENGE L_MENGE1.
        L_PRLAB L_PRLAB1.

        CLEAR GT_MARM.
        READ TABLE GT_MARM WITH KEY MATNR GS_XSTPOX-IDNRK.
        IF SY-SUBRC EQ AND GT_MARM-BRGEW <> 0.
          L_MENGE L_MENGE * GT_MARM-UMREN / GT_MARM-BRGEW.

          CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
            EXPORTING
              INPUT          GT_MARM-MEINH
              LANGUAGE       SY-LANGU
            IMPORTING
*             LONG_TEXT      =
*             OUTPUT         = L_MEINS
              SHORT_TEXT     L_MEINS
            EXCEPTIONS
              UNIT_NOT_FOUND 1
              OTHERS         2.
          IF SY-SUBRC <> 0.
* Implement suitable error handling here
          ENDIF.
        ENDIF.

        L_MENGE_DEL L_MENGE_DEL L_MENGE.

        CONCATENATE  GS_XSTPOX-STATUS_STR L_LGORT  L_MENGE L_MEINS  INTO GS_XSTPOX-STATUS_STR.
        CONDENSE GS_XSTPOX-STATUS_STR NO-GAPS.
        GT_MSPR-PRLAB L_PRLAB GS_XSTPOX-MENGE.
        MODIFY GT_MSPR.
        MODIFY GT_XSTPOX FROM GS_XSTPOX.
        EXIT.
      ENDIF.
      CLEARL_LGORT ,L_PRLAB,L_MENGE.
    ENDLOOP.

    IF L_MENGE_DEL <> GS_XSTPOX-MENGE_EA AND L_MENGE_DEL > 0.
      CONCATENATE  GS_XSTPOX-STATUS_STR '缺少:' L_MENGE_DEL L_MEINS  INTO GS_XSTPOX-STATUS_STR.
      CONDENSE GS_XSTPOX-STATUS_STR NO-GAPS.
    ENDIF.

    IF GS_XSTPOX-STATUS_STR IS INITIAL.
      CLEAR GT_MSEG.
      READ TABLE GT_MSEG WITH KEY MATNR GS_XSTPOX-IDNRK.
      IF SY-SUBRC 0.
        GS_XSTPOX-STATUS_STR '已消耗' .
        CONDENSE GS_XSTPOX-STATUS_STR.
      ENDIF.
      MODIFY GT_XSTPOX FROM GS_XSTPOX.
    ENDIF.
    IF GS_XSTPOX-STATUS_STR IS INITIAL.
      L_NUM 0.
      LOOP AT GT_AFKO WHERE PLNBEZ GS_XSTPOX-IDNRK.
        L_NUM L_NUM + 1.
        IF L_NUM EQ 1.
          CLEAR L_GAMNG.
          L_GAMNG GT_AFKO-GAMNG.
          CONCATENATE '生产订单号:' GS_XSTPOX-STATUS_STR GT_AFKO-AUFNR `数量:` L_GAMNG INTO GS_XSTPOX-STATUS_STR.
          CONDENSE GS_XSTPOX-STATUS_STR.
        ELSEIF L_NUM NE 1.
          GS_XSTPOX-STATUS_STR '有多个生产订单' .
          CONDENSE GS_XSTPOX-STATUS_STR.
          EXIT.
        ENDIF.
        MODIFY GT_XSTPOX FROM GS_XSTPOX.
      ENDLOOP.
    ENDIF.
    IF GS_XSTPOX-STATUS_STR IS INITIAL.
      GS_XSTPOX-STATUS_STR '未开始操作'.
    ENDIF.
    MODIFY GT_XSTPOX FROM GS_XSTPOX.
    CLEAR:GS_XSTPOX,L_MENGE,L_LGORT,L_PRLAB.
  ENDLOOP.
ENDFORM.                    " FRM_PROCESS_DATA
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值