生产订单批量维护(计划订单批量拆单转生产订单)

*&---------------------------------------------------------------------*
*& Report ZPPR0024
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr0024.

INCLUDE zppr0024_sel.
INCLUDE zppr0024_top.
INCLUDE zppr0024_f01.

AT SELECTION-SCREEN OUTPUT.
  IF p1 = 'X'.
    LOOP AT SCREEN.
      IF screen-group1 = 'M2'.
        screen-active = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ELSEIF p2 = 'X'.
    LOOP AT SCREEN.
      IF screen-group1 = 'M1'.
        screen-active = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

START-OF-SELECTION.
  SELECT werks INTO TABLE @DATA(lt_werks) FROM t001l WHERE werks IN @s_pwwrk.
  LOOP AT lt_werks INTO DATA(ls_werks) .
    AUTHORITY-CHECK OBJECT 'C_STUE_WRK'
        ID 'ACTVT' FIELD '03'
        ID 'CSWRK' FIELD ls_werks-werks.
    IF sy-subrc <> 0.
      MESSAGE '您没有工厂代码' && ls_werks-werks && '权限!'TYPE 'E'.
    ENDIF.
  ENDLOOP.



  IF p1 = 'X'.
    PERFORM frm_get_data.
    PERFORM frm_display_alv.
  ELSEIF p2 = 'X'.
    PERFORM frm_get_log_data.
    PERFORM frm_display_log_alv.
  ENDIF.

INCLUDE :ZPPR0024_SEL

*&---------------------------------------------------------------------*
*& 包含               ZPPR0024_SEL
*&---------------------------------------------------------------------*
TABLES:plaf,t003o,bkpf,aufk.
SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS:p1 RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND uex,
             p2 RADIOBUTTON GROUP g1.
SELECTION-SCREEN:END OF BLOCK b1.

SELECTION-SCREEN:BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
  PARAMETERS:p_auart  TYPE t003o-auart OBLIGATORY MODIF ID m1 DEFAULT 'ZP01'.

  SELECT-OPTIONS:s_auart  FOR t003o-auart MODIF ID m2,
                 s_pwwrk  FOR plaf-pwwrk,
                 s_matnr  FOR plaf-matnr,
                 s_verid  FOR plaf-verid,
                 s_dispo  FOR plaf-dispo,
                 s_plgrp  FOR plaf-plgrp MODIF ID M1,
                 s_plnum  FOR plaf-plnum,
                 s_pertr  FOR plaf-pertr,
                 s_psttr  FOR plaf-psttr,
                 s_pedtr  FOR plaf-pedtr,
                 s_datum  FOR bkpf-budat MODIF ID m2,
                 s_aufnr  FOR aufk-aufnr MODIF ID m2,
                 s_zzord  FOR aufk-aufnr MODIF ID m2.
  PARAMETERS:p_xc AS CHECKBOX DEFAULT 'X' MODIF ID m1.
SELECTION-SCREEN:END OF BLOCK b2.

INCLUDE:ZPPR0024_TOP

*&---------------------------------------------------------------------*
*& 包含               ZPPR0024_TOP
*&---------------------------------------------------------------------*
TYPE-POOLS:slis.
TABLES:sscrfields,icon.
DATA:gt_fieldcat TYPE lvc_t_fcat,
     gw_fieldcat TYPE lvc_s_fcat,
     gv_repid    TYPE sy-repid,
     gs_layout   TYPE lvc_s_layo.

TYPES:BEGIN OF tty_out,
        bapi_mtype TYPE bapi_mtype, "计划订单错误类型
        bapi_msg   TYPE bapi_msg, "计划订单转单结果错误信息
        stufe      TYPE char20,      "层级
        zzorder    TYPE aufk-zzorder, "上层生产订单
        aufnr      TYPE aufk-aufnr  , "生产订单
        auart      TYPE t003o-auart ,  "生产订单类型
        txt        TYPE t003p-txt ,    "类型描述
        matnr1     TYPE plaf-matnr,
        maktx1     TYPE makt-maktx,
        matnr      TYPE plaf-matnr,   "物料
        maktx      TYPE makt-maktx,   "物料描述
        alpgr      TYPE cs_alpgr,
        prfg_f     TYPE mkal-prfg_f, "检查生产版本的状态
        prfg_s     TYPE mkal-prfg_s, "检查生产版本的状态,BOM
        verid      TYPE plaf-verid,   "生产版本
        text1      TYPE mkal-text1,   "生产版本描述
        plnum      TYPE plaf-plnum,   "计划订单
        pwwrk      TYPE plaf-pwwrk,   "工厂
        pertr      TYPE plaf-pertr,  "计划转换日期
        psttr      TYPE plaf-psttr,  "基本开始日期
        pedtr      TYPE plaf-pedtr,  "基本完成日期
        gsmng      TYPE plaf-gsmng, "可转单数量
        meins      TYPE plaf-meins, "基本计量单位
        dispo      TYPE plaf-dispo , "MRP控制者
        fevor      TYPE plaf-plgrp, "生产管理员
        arbpl      TYPE ztpp0020-arbpl,
        zztxt      TYPE aufk-zztxt,   "备注
        mtart      TYPE mara-mtart,
        menge_bc   TYPE menge_d,
        matnr_top  TYPE matnr,
        number_top TYPE numc10,
        number     TYPE numc10,
        status     TYPE char10,
        sel(1),
      END OF tty_out.
TYPES:ty_basic TYPE TABLE OF tty_out.
DATA:ty_alv TYPE tty_out.
DATA:gt_alv      TYPE ty_basic,
     gw_alv      LIKE LINE OF gt_alv,
     gt_alv_temp TYPE ty_basic,
     gw_alv_temp LIKE LINE OF gt_alv_temp.

DATA: bdcdata    TYPE TABLE OF bdcdata WITH HEADER LINE.

TYPES:BEGIN OF tys_aufnr ,
        number  TYPE numc10,
        zzorder TYPE aufk-zzorder, "上层生产订单
        aufnr   TYPE aufk-aufnr  , "生产订单
        zztxt   TYPE aufk-zztxt,   "备注
      END OF tys_aufnr.
DATA:gt_aufnr TYPE TABLE OF zsfmpp_create_order.

DATA:BEGIN OF gt_out OCCURS 0,
       stlal       TYPE stko-stlal,
       werks       LIKE mast-werks,  "工厂
       matnr       LIKE mast-matnr, "顶层父项物料编码
       maktx       LIKE makt-maktx, "顶层父项物料描述
       emeng       LIKE stko-bmeng, "父项需求数量
       stufex(20)  TYPE c,  "级别编号
       matnr1      LIKE mast-matnr, "上层父项物料编码
       maktx1      LIKE makt-maktx, "上层父项物料描述
       posnr       LIKE stpox-posnr,  "项目编号
       postp       LIKE stpox-postp,  "项目类别
       idnrk       LIKE stpox-idnrk,  "组件物料编码
       maktx2      LIKE makt-maktx, "组件物料描述
       menge       LIKE stpox-menge,  "组件数量
       meins       LIKE stpox-meins,  "组件计量单位
       stufe       LIKE stpox-stufe,  "层级
       mtart       LIKE stpox-mtart,  "物料类型
       mmsta       LIKE stpox-mmsta,  "工厂特定的物料状态
       mmstd       LIKE stpox-mmstd,  "工厂特定物料状态有效的起始日期
       mstae       LIKE stpox-mstae,  "跨工厂物料状态
       mstde       LIKE stpox-mstde,  "从跨工厂物料状态有效起的日期
       sbdkz       LIKE stpox-sbdkz,  "独立/集中
       dismm       LIKE stpox-dismm,  "物料需求计划类型
       ausch       LIKE stpox-ausch,  "组件报废(组件物料)
       matkl       LIKE stpox-matkl,  "物料组
       lgort       LIKE stpox-lgort,  "生产存储地点
       verid       LIKE stpox-verid,  "生产版本
       schgt       LIKE stpox-schgt,  "散装物料(组件物料)
       aennr       LIKE stpox-aennr,  "变更编号
       dumps       LIKE stpox-dumps,  "虚拟标识
       datuv       LIKE stpox-datuv,  "有效期自
       datub       LIKE stpox-datub,  "有效截止日期
       sanka       LIKE stpox-sanka,  "标识:与成本核算相关的项目
       sanfe       LIKE stpox-sanfe,  "标识:与生产相关项目
       sortf       LIKE stpox-sortf,
       alprf       LIKE stpox-alprf,
       "alpgr       LIKE stpox-alpgr,
       itsob       LIKE stpox-itsob,

       bmeng       TYPE menge_d,
       zstktx      TYPE text_512,
       zpotx1      TYPE text_512,
       alpgr2      TYPE text_512,
       alpgr       TYPE text_512,
       text1       TYPE mkal-text1,   "生产版本描述
       plnum       TYPE plaf-plnum,   "计划订单
       pwwrk       TYPE plaf-pwwrk,   "工厂
       pertr       TYPE plaf-pertr,  "计划转换日期
       psttr       TYPE plaf-psttr,  "基本开始日期
       pedtr       TYPE plaf-pedtr,  "基本完成日期
       gsmng       TYPE plaf-gsmng, "可转单数量
       dispo       TYPE plaf-dispo, "MRP控制者
       fevor       TYPE plaf-plgrp, "生产管理员
       bstmi       LIKE marc-bstmi,
       bstrf       LIKE marc-bstrf,
       plifz       LIKE marc-plifz,
       dispo1      LIKE marc-dispo,  "顶层MRP控制者
       dispo2      LIKE marc-dispo,  "顶层MRP控制者
       prfg_f      TYPE mkal-prfg_f, "检查生产版本的状态
       prfg_s      TYPE mkal-prfg_s, "检查生产版本的状态,BOM
       bstma       TYPE mkal-bstma, "最大批量大小
       stlan       TYPE mkal-stlan,
       ewahr       TYPE stpo-ewahr,
       verwe       TYPE plko-verwe,
       menge_bc    TYPE menge_d,
       matnr_top   TYPE matnr,
       number      TYPE numc10,
       number_top  TYPE numc10,
       field_style TYPE lvc_t_styl, " 为内表添加设置编辑状态所需的字段
     END OF gt_out.

DATA:gt_plaf TYPE TABLE OF plaf.
DATA:gt_event TYPE slis_t_event WITH HEADER LINE.
DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
INCLUDE zppr0024_clc.
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .

TYPES:BEGIN OF tys_tab,
        plnum TYPE plaf-plnum,   "计划订单
        pwwrk TYPE plaf-pwwrk,   "工厂
        gsmng TYPE plaf-gsmng, "可转单数量
      END OF tys_tab.
DATA:gt_tab TYPE TABLE OF tys_tab,
     gw_tab TYPE tys_tab.
DATA:gv_matnr       TYPE matnr,
     gv_maktx       TYPE maktx,
     gv_psttr       TYPE plaf-psttr,  "基本开始日期
     gv_pedtr       TYPE plaf-pedtr,  "基本完成日期
     gv_gsmng_total TYPE plaf-gsmng,
     gv_gsmng       TYPE plaf-gsmng,
     gv_werks       TYPE werks_d,
     gv_plnum       TYPE plnum,
     gv_number      TYPE numc10,
     gv_number_top  TYPE numc10.

DATA:gt_ztpp0019 TYPE TABLE OF ztpp0019.
DATA:ok_code TYPE sy-ucomm.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TC_TAB' ITSELF
CONTROLS: tc_tab TYPE TABLEVIEW USING SCREEN 9000.

*&SPWIZARD: LINES OF TABLECONTROL 'TC_TAB'
DATA:     g_tc_tab_lines  LIKE sy-loopc.

*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_TAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE tc_tab_change_tc_attr OUTPUT.
  DESCRIBE TABLE gt_tab LINES tc_tab-lines.
ENDMODULE.

*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_TAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE tc_tab_get_lines OUTPUT.
  g_tc_tab_lines = sy-loopc.
ENDMODULE.

INCLUDE : ZPPR0024_F01

*&---------------------------------------------------------------------*
*& 包含               ZPPR0024_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

*函数BOM内表
  DATA:lt_stpox LIKE TABLE OF stpox WITH HEADER LINE.
  DATA:lt_stpox_xc LIKE TABLE OF stpox WITH HEADER LINE.
  DATA:lt_stpoxs LIKE TABLE OF stpox WITH HEADER LINE.

*根据工厂输入物料获取内表作为循环
  DATA:BEGIN OF lt_marc OCCURS 0,
         matnr LIKE marc-matnr,
         werks LIKE marc-werks,
         dispo LIKE marc-dispo,
         bstmi LIKE marc-bstmi,
         bstrf LIKE marc-bstrf,
         plifz LIKE marc-plifz,
         beskz LIKE marc-beskz,
       END OF lt_marc.
  DATA:lt_marc_all LIKE TABLE OF lt_marc WITH HEADER LINE.

*获取所有物料
  DATA:BEGIN OF lt_mara OCCURS 0,
         matnr LIKE mara-matnr,
       END OF lt_mara.

*获取所有物料描述
  DATA:BEGIN OF lt_makt OCCURS 0,
         matnr LIKE mara-matnr,
         maktx LIKE makt-maktx,
       END OF lt_makt.

*待更改对象
  DATA:BEGIN OF lt_objkt OCCURS 0,
         objkt LIKE aeoi-objkt,
       END OF lt_objkt.

*获取版次
  DATA:BEGIN OF lt_aeoi OCCURS 0,
         aennr LIKE aeoi-aennr,
         objkt LIKE aeoi-objkt,
         revlv LIKE aeoi-revlv,
         datuv LIKE aenr-datuv,
       END OF lt_aeoi.

  DATA:cstmat TYPE cstmat.
  DATA:cstmat_xc TYPE cstmat.
  DATA:lt_cstmat TYPE TABLE OF cstmat.
  DATA:lt_tline  TYPE STANDARD TABLE OF tline,
       lv_string TYPE string,
       lv_name   TYPE thead-tdname.
  DATA:lv_alpgr2 TYPE string,
       lv_alpgr  TYPE string.

  DATA:lv_stufe LIKE stpox-stufe,
       lv_objkt LIKE aeoi-objkt.

  DATA(lv_stlan) = VALUE mkal-stlan( ).
  DATA(lv_verwe) = VALUE plko-verwe( ).

  REFRESH:gt_plaf,gt_alv_temp,gt_alv.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE @gt_plaf
    FROM plaf
    WHERE pwwrk IN @s_pwwrk AND
          matnr IN @s_matnr AND
          verid IN @s_verid AND
          dispo IN @s_dispo AND
          plgrp IN @s_plgrp AND
          plnum IN @s_plnum AND
          pertr IN @s_pertr AND
          psttr IN @s_psttr AND
          pedtr IN @s_pedtr.

  IF gt_plaf[] IS NOT INITIAL.
    SELECT matnr,
           werks,
           verid,
           stlal,
           stlan,
           text1,
           bstma,"最大批量大小
           prfg_f,"检查生产版本的状态
           prfg_s"检查生产版本的状态,BOM
      INTO TABLE @DATA(lt_mkal)
      FROM mkal
      FOR ALL ENTRIES IN @gt_plaf
      WHERE matnr = @gt_plaf-matnr AND
            werks = @gt_plaf-pwwrk AND
            verid = @gt_plaf-verid .

    SORT lt_mkal BY matnr werks verid.

    SELECT matnr,
           werks,
           stlal,
           stlan
      INTO TABLE @DATA(lt_mkal_all)
      FROM mkal
      WHERE bdatu >= @sy-datum AND
            adatu <= @sy-datum.

    SORT lt_mkal_all BY matnr werks stlal DESCENDING.

    SELECT SINGLE txt INTO @DATA(lv_txt) FROM t003p WHERE auart = @p_auart AND spras = @sy-langu.

*    生产订单ZP01  对应BOM用途1,工艺路线用途1
*    生产订单ZP02  对应BOM用途2,工艺路线用途1
*    生产订单ZP03  对应BOM用途3,工艺路线用途1
*    生产订单ZP08  对应BOM用途Y,工艺路线用途Y
*    生产订单ZP09  对应BOM用途Y,工艺路线用途Y

    DATA:lv_number     TYPE numc10,
         lv_number_top TYPE numc10.

    CLEAR:lv_number,lv_number_top.

    LOOP AT gt_plaf INTO DATA(lw_plaf).
      CALL FUNCTION 'ENQUEUE_EZPLNUM'
        EXPORTING
          mode_plaf      = 'E'
          mandt          = sy-mandt
          plnum          = lw_plaf-plnum
        EXCEPTIONS
          foreign_lock   = 1
          system_failure = 2
          OTHERS         = 3.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

      CLEAR:lv_stlan.
      lv_number_top = lv_number_top + 1.
      READ TABLE lt_mkal INTO DATA(lw_mkal) WITH  KEY  matnr = lw_plaf-matnr
                                                       werks = lw_plaf-pwwrk
                                                       verid = lw_plaf-verid BINARY SEARCH.

      DATA(lv_stlal) = COND #( WHEN lw_mkal-stlal IS NOT INITIAL THEN  lw_mkal-stlal
                               WHEN lw_plaf-stalt IS NOT INITIAL THEN  lw_plaf-stalt
                             ).
      lv_stlan = COND #( WHEN lw_mkal-stlan IS NOT INITIAL THEN  lw_mkal-stlan
                               WHEN lw_plaf-stlan IS NOT INITIAL THEN  lw_plaf-stlan
                             ).

      REFRESH lt_cstmat.
      CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
        EXPORTING
          capid                 = 'PP01'
          datuv                 = sy-datum
          emeng                 = '' "'1' "p_emeng
          mehrs                 = 'X' "lv_mehrs  "X多层 空单层
          mtnrv                 = lw_plaf-matnr
          stlal                 = lv_stlal
          stlan                 = lv_stlan
          mdmps                 = ''
          stpst                 = 0
          werks                 = lw_plaf-pwwrk
        IMPORTING
          topmat                = cstmat
        TABLES
          stb                   = lt_stpox[]
        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.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ELSE.
        APPEND INITIAL LINE TO lt_cstmat ASSIGNING FIELD-SYMBOL(<fs_cstmat>).
        MOVE-CORRESPONDING cstmat TO <fs_cstmat>.

        lt_stpoxs[] = lt_stpox[].
        SORT lt_stpoxs BY stufe wegxx.

        lv_number = lv_number + 1.
        gt_out-number = lv_number.
        gt_out-number_top = lv_number_top.
        gt_out-pwwrk = lw_plaf-pwwrk.
        gt_out-meins = lw_plaf-meins.
        gt_out-menge = lw_plaf-gsmng.
        gt_out-gsmng = lw_plaf-gsmng.
        gt_out-verid = lw_mkal-verid.
        gt_out-text1 = lw_mkal-text1.
        gt_out-plnum = lw_plaf-plnum.
        gt_out-pertr = lw_plaf-pertr.
        gt_out-psttr = lw_plaf-psttr.
        gt_out-pedtr = lw_plaf-pedtr.
        gt_out-dispo = lw_plaf-dispo.
        gt_out-stufe = '0'.
        gt_out-idnrk = lw_plaf-matnr.  "顶层父项物料编码
        gt_out-matnr1 = lw_plaf-matnr.  "顶层父项物料编码
        gt_out-matnr = lw_plaf-matnr.  "顶层父项物料编码
        APPEND gt_out.
        CLEAR:gt_out.
      ENDIF.


*找上层父项物料编码逻辑:根据该BOM函数返回内表当前条目VWEGX的值和STUFE的值减去1后,
*然后按STUFE = STUFE-1,WEGXX = VWEGX的值获取对应的IDNRK就是该记录的上层父项物料编码
      LOOP AT lt_stpox.
        lv_number = lv_number + 1.
*获取所有物料
        lt_mara-matnr = lt_stpox-idnrk.
        COLLECT lt_mara.
        CLEAR:lt_mara.

*待更改对象内表
        lt_objkt-objkt = lt_stpox-idnrk.
        COLLECT lt_objkt.
        CLEAR:lt_objkt.

        lt_mara-matnr = lw_plaf-matnr.
        COLLECT lt_mara.
        CLEAR:lt_mara.

        gt_out-werks = lw_plaf-pwwrk.  "工厂
        gt_out-matnr = lw_plaf-matnr.  "顶层父项物料编码
        gt_out-emeng = lw_plaf-gsmng.  "父项需求数量

        CLEAR:cstmat_xc.
        REFRESH lt_stpox_xc.
        IF lt_stpox-vwegx = 0.  "上层父项物料编码 = 顶层父项物料编码
          gt_out-matnr1 = lw_plaf-matnr.  "上层父项物料编码

          READ TABLE lt_cstmat INTO DATA(lw_cstmat) WITH KEY matnr = gt_out-matnr1.
          IF sy-subrc NE 0.

            READ TABLE lt_mkal_all INTO DATA(lw_mkal_all) WITH KEY matnr = gt_out-matnr1 werks = gt_out-werks stlan = lv_stlan.
            IF sy-subrc EQ 0.
              lv_stlal = lw_mkal_all-stlal .
            ENDIF.

            CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
              EXPORTING
                capid                 = 'PP01'
                datuv                 = sy-datum
                emeng                 = '' "'1' "p_emeng
                mehrs                 = 'X' "lv_mehrs  "X多层 空单层
                mtnrv                 = gt_out-matnr1
                stlal                 = lv_stlal
                stlan                 = lv_stlan
                mdmps                 = ''
                stpst                 = 0
                werks                 = lw_plaf-pwwrk
              IMPORTING
                topmat                = cstmat_xc
              TABLES
                stb                   = lt_stpox_xc[]
              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.

            MOVE-CORRESPONDING cstmat_xc TO cstmat.

            APPEND INITIAL LINE TO lt_cstmat ASSIGNING <fs_cstmat>.
            MOVE-CORRESPONDING cstmat_xc TO <fs_cstmat>.
          ELSE.
            MOVE-CORRESPONDING lw_cstmat TO cstmat.
          ENDIF.

        ELSE.
          CLEAR:lv_stufe.
          lv_stufe = lt_stpox-stufe - 1.
          READ TABLE lt_stpoxs WITH KEY stufe = lv_stufe
                                        wegxx = lt_stpox-vwegx BINARY SEARCH.
          IF sy-subrc = 0.
            gt_out-matnr1 = lt_stpoxs-idnrk.  "上层父项物料编码

            READ TABLE lt_cstmat INTO lw_cstmat WITH KEY matnr = gt_out-matnr1.
            IF sy-subrc NE 0.

              READ TABLE lt_mkal_all INTO lw_mkal_all WITH KEY matnr = gt_out-matnr1 werks = gt_out-werks stlan = lv_stlan.
              IF sy-subrc EQ 0.
                lv_stlal = lw_mkal_all-stlal .
              ENDIF.

              CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
                EXPORTING
                  capid                 = 'PP01'
                  datuv                 = sy-datum
                  emeng                 = '' "'1' "p_emeng
                  mehrs                 = 'X' "lv_mehrs  "X多层 空单层
                  mtnrv                 = gt_out-matnr1
                  stlal                 = lv_stlal
                  stlan                 = lv_stlan
                  mdmps                 = ''
                  stpst                 = 0
                  werks                 = lw_plaf-pwwrk
                IMPORTING
                  topmat                = cstmat_xc
                TABLES
                  stb                   = lt_stpox_xc[]
                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.

              MOVE-CORRESPONDING cstmat_xc TO cstmat.

              APPEND INITIAL LINE TO lt_cstmat ASSIGNING <fs_cstmat>.
              MOVE-CORRESPONDING cstmat_xc TO <fs_cstmat>.
            ELSE.
              MOVE-CORRESPONDING lw_cstmat TO cstmat.
            ENDIF.
          ENDIF.
        ENDIF.

        gt_out-posnr = lt_stpox-posnr.  "项目编号
        gt_out-postp = lt_stpox-postp.  "项目类别
        gt_out-idnrk = lt_stpox-idnrk.  "组件物料编码
        IF cstmat-bmeng <> 0.
          gt_out-menge = gt_out-emeng * lt_stpox-menge / cstmat-bmeng  .  "组件数量
          gt_out-menge_bc = lt_stpox-menge / cstmat-bmeng .
        ENDIF.
        gt_out-meins = lt_stpox-meins.  "组件计量单位
        gt_out-stufe = lt_stpox-stufe.  "层级
        gt_out-mtart = lt_stpox-mtart.  "物料类型
        gt_out-mmsta = lt_stpox-mmsta.  "工厂特定的物料状态
        gt_out-mmstd = lt_stpox-mmstd.  "工厂特定物料状态有效的起始日期
        gt_out-mstae = lt_stpox-mstae.  "跨工厂物料状态
        gt_out-mstde = lt_stpox-mstde.  "从跨工厂物料状态有效起的日期
        gt_out-sbdkz = lt_stpox-sbdkz.  "独立/集中
        gt_out-dismm = lt_stpox-dismm.  "物料需求计划类型
        gt_out-ausch = lt_stpox-ausch.  "子件损耗率%,(标准用量/实际数量)
        gt_out-matkl = lt_stpox-matkl.  "物料组
        gt_out-lgort = lt_stpox-lgort.  "生产存储地点
        gt_out-verid = lt_stpox-verid.  "生产版本
        gt_out-schgt = lt_stpox-schgt.  "散装物料(组件物料)
        gt_out-aennr = lt_stpox-aennr.  "变更编号
        gt_out-dumps = lt_stpox-dumps.  "虚拟标识
        gt_out-datuv = lt_stpox-datuv.  "有效期自
        gt_out-datub = lt_stpox-datub.  "有效截止日期
        gt_out-sanka = lt_stpox-sanka.  "标识:与成本核算相关的项目
        gt_out-sanfe = lt_stpox-sanfe.  "标识:与生产相关项目
        gt_out-sortf = lt_stpox-sortf.  "
        gt_out-alprf = lt_stpox-alprf.  "
        gt_out-alpgr = lt_stpox-alpgr.  "
        gt_out-itsob = lt_stpox-itsob.  "
        gt_out-ewahr = lt_stpox-ewahr.  "
        gt_out-bmeng = cstmat-bmeng.  "
        gt_out-stlal = cstmat-stlal.  "
        gt_out-zstktx = cstmat-stktx.


        REFRESH lt_tline.
        CLEAR:lv_name,lv_string.

        CONCATENATE sy-mandt lt_stpox-bmtyp  lt_stpox-stlnr INTO lv_name.

        CALL FUNCTION 'READ_TEXT'
          EXPORTING
            id       = 'MZU' "'MKO'
            language = sy-langu
            name     = lv_name
            object   = 'BOM'
          TABLES
            lines    = lt_tline
          EXCEPTIONS
            id       = 1
            object   = 2
            OTHERS   = 3.

        LOOP AT lt_tline INTO DATA(wa_tline).
          lv_string = lv_string && wa_tline-tdline.
        ENDLOOP.

        IF lv_string IS NOT INITIAL.
          gt_out-zstktx = lv_string.
        ENDIF.

        REFRESH lt_tline.
        CLEAR:lv_name,lv_string.

        CONCATENATE sy-mandt lt_stpox-bmtyp  lt_stpox-stlnr lt_stpox-stlkn lt_stpox-stpoz INTO lv_name.

        CALL FUNCTION 'READ_TEXT'
          EXPORTING
            id       = 'BOM'
            language = sy-langu
            name     = lv_name
            object   = 'AUFK'
          TABLES
            lines    = lt_tline
          EXCEPTIONS
            id       = 1
            object   = 2
            OTHERS   = 3.

        LOOP AT lt_tline INTO wa_tline.
          lv_string = lv_string && wa_tline-tdline.
        ENDLOOP.

        IF lv_string IS NOT INITIAL.
          gt_out-zpotx1 = lv_string.
        ENDIF.

        " gt_out-verid = lw_plaf-verid.
        "gt_out-text1 = lw_mkal-text1.
        gt_out-plnum = lw_plaf-plnum.
        gt_out-pwwrk = lw_plaf-pwwrk.
        gt_out-pertr = lw_plaf-pertr.
        gt_out-psttr = lw_plaf-psttr.
        gt_out-pedtr = lw_plaf-pedtr.
        gt_out-prfg_f = lw_mkal-prfg_f.
        gt_out-prfg_s = lw_mkal-prfg_s.
        gt_out-bstma  = lw_mkal-bstma.
        gt_out-matnr_top = lw_plaf-matnr.
        gt_out-gsmng = gt_out-menge.
        "gt_out-meins = gt_out-meins.
        gt_out-dispo = lw_plaf-dispo.
        gt_out-fevor = lw_plaf-plgrp.
        gt_out-number = lv_number.
        gt_out-number_top = lv_number_top.
        APPEND gt_out.

        CLEAR:lt_stpox,gt_out.
      ENDLOOP.
      CLEAR:lt_marc,lw_mkal.
    ENDLOOP.

    IF lt_mara[] IS NOT INITIAL.
*根据工厂输入物料获取内表作为循环
      SELECT matnr werks dispo bstmi bstrf plifz beskz  INTO TABLE lt_marc_all FROM marc
         FOR ALL ENTRIES IN lt_mara
       WHERE matnr = lt_mara-matnr
         AND werks IN s_pwwrk.
      SORT lt_marc_all BY matnr werks.

*获取所有物料描述
      SELECT matnr maktx INTO TABLE lt_makt FROM makt
         FOR ALL ENTRIES IN lt_mara
       WHERE matnr = lt_mara-matnr
         AND spras = sy-langu.
      SORT lt_makt BY matnr.

      SELECT matnr,mstae,mtart,matkl INTO TABLE @DATA(lt_mstae)
        FROM mara
        FOR ALL ENTRIES IN @lt_mara
       WHERE matnr = @lt_mara-matnr.
      SORT lt_mstae BY matnr.
    ENDIF.

    IF gt_out[] IS NOT INITIAL.
      SELECT idnrk,
             alpgr2,
             alpgr
        INTO TABLE @DATA(lt_ztpp0002)
        FROM ztpp0002
        FOR ALL ENTRIES IN @gt_out
       WHERE idnrk  = @gt_out-idnrk.
      SORT lt_ztpp0002 BY idnrk.

      SELECT mkal~matnr,
             mkal~werks,
             mkal~verid,
             mkal~text1,
             mkal~adatu,
             mkal~stlan,"BOM用途
             plko~verwe,"工艺路线用途
             mkal~prfg_f,
             mkal~prfg_s
        INTO TABLE @DATA(lt_mkal_ver)
        FROM mkal INNER JOIN plko ON mkal~plnty = plko~plnty AND
                                     mkal~plnnr = plko~plnnr AND
                                     mkal~alnal = plko~plnal
*                  INNER JOIN plpo ON plko~plnty = plpo~plnty AND
*                                     plko~plnnr = plpo~plnnr AND
*                                     plko~zaehl = plpo~zaehl
        FOR ALL ENTRIES IN @gt_out
        WHERE mkal~matnr = @gt_out-idnrk AND
              mkal~werks = @gt_out-pwwrk AND
              mkal~bdatu >= @sy-datum AND
              mkal~adatu <= @sy-datum AND
              plko~loekz = ''.

      SORT lt_mkal_ver BY matnr werks adatu DESCENDING.
    ENDIF.

*    IF lt_objkt[] IS NOT INITIAL.
*      SELECT a~aennr a~objkt a~revlv b~datuv INTO TABLE lt_aeoi
*        FROM aeoi AS a INNER JOIN aenr AS b ON a~aennr = b~aennr
*         FOR ALL ENTRIES IN lt_objkt
*       WHERE a~objkt = lt_objkt-objkt
*         AND a~aetyp = '41'.
*      SORT lt_aeoi BY objkt datuv DESCENDING.
*    ENDIF.

    LOOP AT gt_out.
*获取对应的物料描述
      READ TABLE lt_makt WITH KEY matnr = gt_out-matnr BINARY SEARCH.
      IF sy-subrc = 0.
        gt_out-maktx = lt_makt-maktx.
      ENDIF.
      READ TABLE lt_makt WITH KEY matnr = gt_out-matnr1 BINARY SEARCH.
      IF sy-subrc = 0.
        gt_out-maktx1 = lt_makt-maktx.
      ENDIF.
      READ TABLE lt_makt WITH KEY matnr = gt_out-idnrk BINARY SEARCH.
      IF sy-subrc = 0.
        gt_out-maktx2 = lt_makt-maktx.
      ENDIF.

      READ TABLE lt_mstae INTO DATA(lw_mstae) WITH KEY  matnr = gt_out-idnrk BINARY SEARCH.
      IF sy-subrc EQ 0.
        gt_out-mstae = lw_mstae-mstae.
        gt_out-mtart = lw_mstae-mtart.
        DATA(lv_matkl) = lw_mstae-matkl.
      ENDIF.

      READ TABLE lt_marc_all WITH KEY matnr = gt_out-matnr1
                                      werks = gt_out-werks BINARY SEARCH.
      IF sy-subrc = 0.
        gt_out-dispo1 = lt_marc_all-dispo. "上层物料MRP控制者
      ENDIF.

      CASE p_auart.
        WHEN 'ZP01'.
          lv_stlan = '1'.
          lv_verwe = '1'.
        WHEN 'ZP02'.
          lv_stlan = '2'.
          lv_verwe = '1'.
        WHEN 'ZP03'.
          lv_stlan = '3'.
          lv_verwe = '1'.
        WHEN 'ZP08'.
          lv_stlan = 'Y'.
          lv_verwe = 'Y'.
        WHEN 'ZP09'.
          lv_stlan = 'Y'.
          lv_verwe = 'Y'.
        WHEN OTHERS.
      ENDCASE.

      READ TABLE lt_mkal_ver INTO DATA(lw_mkal_ver) WITH KEY matnr = gt_out-idnrk werks = gt_out-pwwrk stlan = lv_stlan verwe = lv_verwe ."BINARY SEARCH.
      IF sy-subrc EQ 0.
        gt_out-verid = lw_mkal_ver-verid.
        gt_out-text1 = lw_mkal_ver-text1.
        gt_out-stlan = lw_mkal_ver-stlan.
        gt_out-verwe = lw_mkal_ver-verwe.
        gt_out-prfg_f = lw_mkal_ver-prfg_f.
        gt_out-prfg_s = lw_mkal_ver-prfg_s.
      ENDIF.

*获取MRP控制者
      READ TABLE lt_marc_all WITH KEY matnr = gt_out-matnr
                                      werks = gt_out-werks BINARY SEARCH.
      IF sy-subrc = 0.
        gt_out-dispo = lt_marc_all-dispo.
      ENDIF.


      READ TABLE lt_marc_all WITH KEY matnr = gt_out-idnrk
                                      werks = gt_out-werks BINARY SEARCH.
      IF sy-subrc = 0.
        gt_out-dispo2 = lt_marc_all-dispo. "组件MRP控制者
        gt_out-dispo = lt_marc_all-dispo.
        gt_out-bstmi = lt_marc_all-bstmi.
        gt_out-bstrf = lt_marc_all-bstrf.
        gt_out-plifz = lt_marc_all-plifz.
      ENDIF.

*
*      CLEAR:lv_objkt.
*      lv_objkt = gt_out-idnrk.
*      READ TABLE lt_aeoi WITH KEY objkt = lv_objkt BINARY SEARCH.
*      IF sy-subrc = 0.
*        LOOP AT lt_aeoi FROM sy-tabix WHERE objkt = lv_objkt.
*          IF lt_aeoi-datuv <= sy-datum.
*            gt_out-revlv = lt_aeoi-revlv.
*            EXIT.
*          ENDIF.
*        ENDLOOP.
*      ENDIF.

      CLEAR:lv_alpgr2,lv_alpgr.

      READ TABLE lt_ztpp0002 INTO DATA(lw_ztpp0002) WITH KEY idnrk = gt_out-idnrk BINARY SEARCH.
      IF sy-subrc EQ 0.
        LOOP AT lt_ztpp0002 INTO lw_ztpp0002 FROM sy-tabix.
          IF lw_ztpp0002-idnrk <> gt_out-idnrk.
            EXIT.
          ENDIF.

          lv_alpgr2 = lv_alpgr2 &&  lw_ztpp0002-alpgr2.
          lv_alpgr = lv_alpgr && lw_ztpp0002-alpgr.
        ENDLOOP.
      ENDIF.

      gt_out-alpgr2 = lv_alpgr2.

      IF lv_alpgr IS NOT INITIAL.
        gt_out-alpgr = lv_alpgr.
      ENDIF.

      IF gt_out-stufe = '0'.
        gt_out-stufex = '.' && gt_out-stufex.
      ELSE.
        DO gt_out-stufe TIMES.
          gt_out-stufex = '.' && gt_out-stufex.
        ENDDO.
      ENDIF.

      gt_out-stufex = gt_out-stufex && gt_out-stufe.

      IF gt_out-stufex <> '.0'.
        CLEAR:gt_out-plnum.
      ENDIF.

      MODIFY gt_out.

      IF lv_matkl = 'BC-DZ-SL' OR "烧录芯片:BC-DZ-SL 单独开工单
          lv_matkl = 'BC-XN-A'.
        CLEAR:lv_matkl.
        CONTINUE.
      ENDIF.

      IF gt_out-alpgr IS NOT INITIAL.
        IF gt_out-ewahr EQ '0'.
          CONTINUE.
        ENDIF.
      ENDIF.

      "剔除外购 委外数据
      READ TABLE lt_marc_all WITH KEY matnr = gt_out-idnrk
                                      werks = gt_out-werks BINARY SEARCH.
      IF sy-subrc = 0 AND lt_marc_all-beskz = 'F'.
        CONTINUE.
      ENDIF.

      IF gt_out-dumps = 'X' OR gt_out-dumps = 'x'."剔除虚拟件
        CONTINUE.
      ENDIF.

      IF gt_out-idnrk IS INITIAL.
        CONTINUE.
      ELSEIF gt_out-stufex = '.0'.
      ELSEIF gt_out-mtart = 'Z002' OR gt_out-mtart = 'Z003'.
      ELSE.
        CONTINUE.
      ENDIF.

      IF p_xc = '' AND gt_out-stufex <> '.0'.
        CONTINUE.
      ENDIF.

      gt_alv[] = VALUE #( BASE gt_alv ( status    = ''
                                        stufe     = gt_out-stufex
                                        zzorder   = ''
                                        aufnr     = ''
                                        auart     = p_auart
                                        txt       = lv_txt
                                        zztxt     = ''
                                        matnr     = gt_out-idnrk
                                        maktx     = gt_out-maktx2
                                        matnr1    = gt_out-matnr1
                                        maktx1     = gt_out-maktx1
                                        verid     = gt_out-verid
                                        text1     = gt_out-text1
                                        plnum     = gt_out-plnum
                                        pwwrk     = gt_out-pwwrk
                                        pertr     = gt_out-pertr
                                        psttr     = gt_out-psttr
                                        pedtr     = gt_out-pedtr
                                        gsmng     = gt_out-gsmng
                                        meins     = gt_out-meins
                                        dispo     = gt_out-dispo
                                        fevor     = gt_out-fevor
                                        alpgr     = gt_out-alpgr
                                        menge_bc  = gt_out-menge_bc
                                        prfg_f    = gt_out-prfg_f
                                        prfg_s    = gt_out-prfg_s
                                        mtart     = gt_out-mtart
                                        matnr_top = gt_out-matnr_top
                                        number_top = gt_out-number_top
                                        number    = gt_out-number  ) ).
    ENDLOOP.


    gt_alv_temp[] = gt_alv[].

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
  DATA:g_repid TYPE sy-repid.
  g_repid = sy-repid.
  "g_layout-zebra             = 'X' .
  gs_layout-zebra = 'X'.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-no_rowins = 'X'.
  gs_layout-box_fname = 'SEL'.
  CLEAR  gt_fieldcat[].
  PERFORM frm_generate_field_catalogu.

  gt_event-name = 'CALLER_EXIT'.
  gt_event-form = 'FM_BUTTON'.
  APPEND gt_event .

  gt_event-name = 'CALLER_EXIT'.
  gt_event-form = 'FRM_CALLER_EXIT'.
  APPEND gt_event.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_PF'
      i_callback_user_command  = 'USER_COM'
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      it_events                = gt_event[]
    TABLES
      t_outtab                 = gt_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_PF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_pf USING  extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.                    "SET_PF
*&---------------------------------------------------------------------*
*&      Form  user_com
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM user_com USING r_ucomm LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA: gd_repid LIKE sy-repid,
        ref_grid TYPE REF TO cl_gui_alv_grid.
  DATA:lv_answer.
  DATA:lv_lines TYPE i.
  DATA:lv_type TYPE bapi_mtype,
       lv_msg  TYPE bapi_msg.

  IF ref_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = ref_grid.
  ENDIF.
  IF NOT ref_grid IS INITIAL.
    CALL METHOD ref_grid->check_changed_data.
  ENDIF.

  CASE r_ucomm.
    WHEN '&BACK' OR '&EXIT' OR '&EXIT'.
      LOOP AT gt_plaf INTO DATA(lw_plaf).
        CALL FUNCTION 'DEQUEUE_EZPLNUM'
          EXPORTING
            mode_plaf = 'E'
            mandt     = sy-mandt
            plnum     = lw_plaf-plnum.
      ENDLOOP.
      LEAVE TO SCREEN 0.
    WHEN '&IC1'.
      IF rs_selfield-fieldname = 'AUFNR'.
        READ TABLE gt_alv INTO gw_alv INDEX rs_selfield-tabindex.
        IF sy-subrc EQ 0 AND gw_alv-aufnr IS NOT INITIAL.
          SET PARAMETER ID 'ANR' FIELD gw_alv-aufnr.
          CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
        ENDIF.
      ELSEIF rs_selfield-fieldname = 'ZZORDER'.
        READ TABLE gt_alv INTO gw_alv INDEX rs_selfield-tabindex.
        IF sy-subrc EQ 0 AND gw_alv-zzorder IS NOT INITIAL.
          SET PARAMETER ID 'ANR' FIELD gw_alv-zzorder.
          CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
        ENDIF.
      ELSEIF rs_selfield-fieldname = 'STUFE'.
        READ TABLE gt_alv INTO gw_alv INDEX rs_selfield-tabindex.
        IF sy-subrc EQ 0 AND gw_alv-stufe = '.0'.
          PERFORM frm_collapse_alv .
        ENDIF.
      ENDIF.

    WHEN '&CREATE'.
      CLEAR:lv_type,lv_msg.
      CLEAR:lv_lines,lv_answer.

      READ TABLE gt_alv INTO DATA(lw_alv) WITH KEY sel = 'X' stufe = '.0'.
      IF sy-subrc NE 0.
        MESSAGE '请选择层级0的数据行进行操作' TYPE 'E'.
      ENDIF.

      lv_lines = REDUCE i( INIT x = 0 FOR lsa_alv IN gt_alv WHERE ( sel = 'X' AND  stufe = '.0' ) NEXT x = x + 1 ).
      IF lv_lines >= 2.
        MESSAGE '只能选一行进行操作' TYPE 'E'.
      ENDIF.

      PERFORM frm_check_data CHANGING lv_type lv_msg.
      IF lv_type = 'E'.
        MESSAGE lv_msg TYPE lv_type.
      ENDIF.

      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
        EXPORTING
          textline1      = '确认创建订单'
          titel          = '提示'
          cancel_display = ''
        IMPORTING
          answer         = lv_answer.
      IF lv_answer = 'J'.
        PERFORM frm_save_data.
      ENDIF.

    WHEN '&INSERT'.
      READ TABLE gt_alv INTO lw_alv WITH KEY sel = 'X' stufe = '.0'.
      IF sy-subrc NE 0.
        MESSAGE '请选择层级0的数据行进行操作' TYPE 'E'.
      ENDIF.

      CLEAR:lv_lines,lv_answer.
      lv_lines = REDUCE i( INIT x = 0 FOR ls_alv IN gt_alv WHERE ( sel = 'X' AND  stufe = '.0' ) NEXT x = x + 1 ).
      IF lv_lines >= 2.
        MESSAGE '只能选一行进行操作' TYPE 'E'.
      ENDIF.

      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
        EXPORTING
          textline1      = '确认是否新增计划行'
          titel          = '提示'
          cancel_display = ''
        IMPORTING
          answer         = lv_answer.
      IF lv_answer = 'J'.
        PERFORM frm_insert_data USING lw_alv.
      ENDIF.
    WHEN '&DELETE'.
      READ TABLE gt_alv INTO lw_alv WITH KEY sel = 'X' stufe = '.0'.
      IF sy-subrc NE 0.
        MESSAGE '请选择层级0的数据行进行操作' TYPE 'E'.
      ENDIF.

      CLEAR:lv_lines,lv_answer.
      lv_lines = REDUCE i( INIT x = 0 FOR la_alv IN gt_alv WHERE ( sel = 'X' AND  stufe = '.0' ) NEXT x = x + 1 ).
      IF lv_lines >= 2.
        MESSAGE '只能选一行进行操作' TYPE 'E'.
      ENDIF.

      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
        EXPORTING
          textline1      = '确认删除计划行'
          titel          = '提示'
          cancel_display = ''
        IMPORTING
          answer         = lv_answer.
      IF lv_answer = 'J'.
        PERFORM frm_delete_data USING lw_alv.
      ENDIF.
    WHEN '&PLGX'.
      CLEAR:lv_answer.
      READ TABLE gt_alv INTO lw_alv WITH KEY sel = 'X' .
      IF sy-subrc NE 0.
        MESSAGE '请选择数据行进行操作' TYPE 'E'.
      ENDIF.

      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
        EXPORTING
          textline1      = '确认批量更新行'
          titel          = '提示'
          cancel_display = ''
        IMPORTING
          answer         = lv_answer.
      IF lv_answer = 'J'.
        PERFORM frm_plgx_data .
      ENDIF.


      DATA stbl TYPE lvc_s_stbl.
      DATA(lv_stlan) = VALUE mkal-stlan( ).
      DATA(lv_verwe) = VALUE plko-verwe( ).


*    生产订单ZP01  对应BOM用途1,工艺路线用途1
*    生产订单ZP02  对应BOM用途2,工艺路线用途1
*    生产订单ZP03  对应BOM用途3,工艺路线用途1
*    生产订单ZP08  对应BOM用途Y,工艺路线用途Y
*    生产订单ZP09  对应BOM用途Y,工艺路线用途Y

      IF gt_alv[] IS NOT INITIAL.
        SELECT * INTO TABLE @DATA(lt_ztpp0020)
          FROM ztpp0020
          FOR ALL ENTRIES IN @gt_alv
          WHERE fevor = @gt_alv-fevor.
        SORT lt_ztpp0020 BY fevor.

        LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>).
          READ TABLE lt_ztpp0020 INTO DATA(lw_ztpp0020) WITH KEY fevor = <fs_alv>-fevor BINARY SEARCH.
          IF sy-subrc EQ 0.
            <fs_alv>-arbpl = lw_ztpp0020-arbpl.
          ENDIF.
        ENDLOOP.

        SELECT mkal~matnr,
               mkal~werks,
               mkal~verid,
               mkal~text1,
               mkal~adatu,
               mkal~stlan,"BOM用途
               plko~verwe,"工艺路线用途
               crhd~arbpl,
               mkal~prfg_f,
               mkal~prfg_s
          INTO TABLE @DATA(lt_mkal)
          FROM mkal INNER JOIN plko ON mkal~plnty = plko~plnty AND
                                       mkal~plnnr = plko~plnnr AND
                                       mkal~alnal = plko~plnal
                    INNER JOIN plpo ON plpo~plnty = plko~plnty AND
                                       plpo~plnnr = plko~plnnr AND
                                       plpo~zaehl = plko~zaehl
                    INNER JOIN crhd ON crhd~objid = plpo~arbid AND crhd~objty = 'A'
          FOR ALL ENTRIES IN @gt_alv
          WHERE mkal~matnr = @gt_alv-matnr AND
                mkal~werks = @gt_alv-pwwrk AND
                crhd~arbpl = @gt_alv-arbpl AND
                mkal~bdatu >= @sy-datum AND
                mkal~adatu <= @sy-datum AND
                plko~loekz = ''.

        SORT lt_mkal BY matnr werks arbpl DESCENDING.

        LOOP AT gt_alv ASSIGNING <fs_alv>.

*        IF <fs_alv>-auart <> p_auart.
          CASE <fs_alv>-auart.
            WHEN 'ZP01'.
              lv_stlan = '1'.
              lv_verwe = '1'.
            WHEN 'ZP02'.
              lv_stlan = '2'.
              lv_verwe = '1'.
            WHEN 'ZP03'.
              lv_stlan = '3'.
              lv_verwe = '1'.
            WHEN 'ZP08'.
              lv_stlan = 'Y'.
              lv_verwe = 'Y'.
            WHEN 'ZP09'.
              lv_stlan = 'Y'.
              lv_verwe = 'Y'.
            WHEN OTHERS.
          ENDCASE.
*        ENDIF.

          READ TABLE lt_mkal INTO DATA(lw_mkal) WITH KEY matnr = <fs_alv>-matnr werks = <fs_alv>-pwwrk arbpl = <fs_alv>-arbpl." BINARY SEARCH.
          IF sy-subrc EQ 0.
            <fs_alv>-verid = lw_mkal-verid.
            <fs_alv>-text1 = lw_mkal-text1.
            <fs_alv>-prfg_f = lw_mkal-prfg_f.
            <fs_alv>-prfg_s = lw_mkal-prfg_s.
*            IF lv_stlan <> lw_mkal-stlan OR lv_verwe <> lw_mkal-verwe.
*              CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
*            ENDIF.
          ELSE.
            CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
          ENDIF.

          IF <fs_alv>-aufnr IS NOT INITIAL OR <fs_alv>-zzorder IS NOT INITIAL..
          ELSE.
            IF <fs_alv>-verid IS INITIAL..
              <fs_alv>-bapi_mtype = 'E'.
              <fs_alv>-bapi_msg = '找不到生产版本'.
            ELSE.
              CLEAR:<fs_alv>-bapi_mtype,<fs_alv>-bapi_msg .
            ENDIF.
          ENDIF.
        ENDLOOP.
      ENDIF.

      stbl-row = 'X'." 基于行的稳定刷新
      stbl-col = 'X'." 基于列稳定刷新

      CALL METHOD ref_grid->refresh_table_display
        EXPORTING
          is_stable = stbl.

    WHEN OTHERS.
  ENDCASE.
  rs_selfield-refresh = 'X'.
ENDFORM.                    "USER_COM
*&---------------------------------------------------------------------*
*&      Form  FRM_GENERATE_FIELD_CATALOGU
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_generate_field_catalogu.
  DEFINE def_modify_fieldcat.
    &1-scrtext_l = &2.
    &1-scrtext_m = &2.
    &1-reptext =   &2.
    &1-scrtext_s = &2.
  END-OF-DEFINITION.
  TRY.
      cl_salv_table=>factory( IMPORTING r_salv_table = DATA(salv_table)
                              CHANGING  t_table      = gt_alv ).
      gt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
        r_columns      = salv_table->get_columns( )
        r_aggregations = salv_table->get_aggregations( ) ).
    CATCH cx_root.
  ENDTRY.

  LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_filedcat>).
    CASE <fs_filedcat>-fieldname.
      WHEN 'STATUS'.
        def_modify_fieldcat <fs_filedcat> '状态'.
        <fs_filedcat>-icon = 'X'.
        <fs_filedcat>-no_out = 'X'.
      WHEN 'SEL'OR 'NUMBER' OR 'NUMBER_TOP' OR 'MATNR_TOP' OR 'MTART' OR  'MENGE_BC' OR 'ARBPL'. "'PRFG_F' OR 'PRFG_S' .
        <fs_filedcat>-no_out = 'X'.
      WHEN 'STUFE'.
        <fs_filedcat>-hotspot = 'X'.
        def_modify_fieldcat <fs_filedcat> 'BOM层级'.
      WHEN 'BAPI_MTYPE'.
        def_modify_fieldcat <fs_filedcat> '消息'.
      WHEN 'BAPI_MSG'.
        def_modify_fieldcat <fs_filedcat> '消息文本'.
      WHEN 'STUFE'.
        def_modify_fieldcat <fs_filedcat> '层级'.
      WHEN 'MATNR1'.
        <fs_filedcat>-no_out = 'X'.
        def_modify_fieldcat <fs_filedcat> '上层物料'.
      WHEN 'MAKTX1'.
        <fs_filedcat>-no_out = 'X'.
        def_modify_fieldcat <fs_filedcat> '上层物料描述'.
      WHEN 'MATNR'.
        def_modify_fieldcat <fs_filedcat> '组件物料'.
      WHEN 'MAKTX'.
        def_modify_fieldcat <fs_filedcat> '组件物料描述'.
      WHEN 'GSMNG'.
        <fs_filedcat>-edit = 'X'.
        def_modify_fieldcat <fs_filedcat> '订货数量'.
      WHEN 'DISPO'.
*        <fs_filedcat>-ref_field = 'DISPO'.
*        <fs_filedcat>-ref_table = 'PLAF'.
        <fs_filedcat>-f4availabl = 'X'.
        <fs_filedcat>-edit = 'X'.
      WHEN 'FEVOR'.
        <fs_filedcat>-edit = 'X'.
        <fs_filedcat>-f4availabl = 'X'.
      WHEN 'AUART' .
        <fs_filedcat>-ref_field = 'AUART'.
        <fs_filedcat>-ref_table = 'T003P'.
        <fs_filedcat>-edit = 'X'.
      WHEN 'PSTTR'.
        <fs_filedcat>-ref_field = 'DATUM'.
        <fs_filedcat>-ref_table = 'SYST'.
        <fs_filedcat>-edit = 'X'.
      WHEN 'PEDTR'.
        <fs_filedcat>-ref_field = 'DATUM'.
        <fs_filedcat>-ref_table = 'SYST'.
        <fs_filedcat>-edit = 'X'.
      WHEN 'ZZTXT'.
        <fs_filedcat>-edit = 'X'.
      WHEN 'PRFG_F'.
        def_modify_fieldcat <fs_filedcat> '工艺路线状态'.
      WHEN 'PRFG_S'.
        def_modify_fieldcat <fs_filedcat> 'BOM状态'.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_save_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_save_data .
  DATA:ls_ret          TYPE bapireturn1,
       ls_return       TYPE bapiret2,
       lv_order_number TYPE aufnr.
  DATA:lr_auart TYPE RANGE OF aufk-auart.
  DATA:lt_alv TYPE ty_basic.
  DATA:lv_type TYPE bapi_mtype.
  BREAK yangtao.
  DATA:lv_aufnr  TYPE aufnr.
  DATA:header_in TYPE bapi_pp_order_create.
  DATA:lt_table TYPE TABLE OF zsfmpp_create_order_table .
  DATA:lv_guid TYPE guid_32.
  DATA:lt_ztpp0019 TYPE TABLE OF ztpp0019.

  DEFINE dfe_append_auart.
    APPEND VALUE #( sign = 'I' option = 'EQ' low = &1 ) TO lr_auart.
  END-OF-DEFINITION.

  dfe_append_auart 'ZP04'.
  dfe_append_auart 'ZP05'.
  dfe_append_auart 'ZP06'.
  dfe_append_auart 'ZP07'.
  dfe_append_auart 'ZP10'.

  DATA(gt_temp) = gt_alv[].
  LOOP AT gt_alv INTO gw_alv WHERE sel = 'X' AND aufnr IS INITIAL.
    READ TABLE lt_alv INTO DATA(lw_alv) WITH KEY number_top = gw_alv-number_top.
    IF sy-subrc NE 0.
      LOOP AT gt_temp INTO DATA(lw_temp) WHERE number_top = gw_alv-number_top..
        APPEND INITIAL LINE TO lt_alv ASSIGNING FIELD-SYMBOL(<fs_lv_alv>).
        MOVE-CORRESPONDING lw_temp TO <fs_lv_alv>.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

  DATA:lv_answer,
       lv_ms TYPE ctu_mode.
  "DELETE lt_alv WHERE sel = 'X'.
  LOOP AT lt_alv INTO lw_alv GROUP BY ( number_top = lw_alv-number_top
                                         size = GROUP SIZE
                                         index = GROUP INDEX )
    ASCENDING ASSIGNING FIELD-SYMBOL(<lt_group>).

*    生产订单ZP01  对应BOM用途1,工艺路线用途1
*    生产订单ZP02  对应BOM用途2,工艺路线用途1
*    生产订单ZP03  对应BOM用途3,工艺路线用途1
*    生产订单ZP08  对应BOM用途Y,工艺路线用途Y
*    生产订单ZP09  对应BOM用途Y,工艺路线用途Y
*    生产订单类型ZP04、ZP05、ZP06、ZP07、ZP10不能创建下层生产订单

    REFRESH:lt_table,lt_ztpp0019.
    CLEAR:lv_guid.


    LOOP AT GROUP <lt_group> ASSIGNING FIELD-SYMBOL(<fs_group>) .
      READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WITH KEY number = <fs_group>-number." matnr = <fs_group>-matnr_top.
      IF sy-subrc EQ 0.
        TRY.
            CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
              RECEIVING
                uuid = lv_guid.
          CATCH cx_uuid_error .
        ENDTRY.

        CLEAR:lv_ms,lv_answer.
        IF <fs_group>-stufe = '.0'.
          CALL FUNCTION 'DEQUEUE_EZPLNUM'
            EXPORTING
              mode_plaf = 'E'
              mandt     = sy-mandt
              plnum     = <fs_group>-plnum.
*          ls_input = VALUE #( guid   = lv_guid
*                              number = <fs_group>-number
*                              plnum  = <fs_group>-plnum
*                              gsmng  = <fs_group>-gsmng
*                              verid  = <fs_group>-verid
*                              psttr  = <fs_group>-psttr
*                              pedtr  = <fs_group>-pedtr
*                              auart  = <fs_group>-auart
*                              zztxt  = <fs_group>-zztxt ).



*          CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
*            EXPORTING
*              textline1      = '前台模式创建还是后台模式创建'
*              titel          = '提示'
*              cancel_display = ''
*            IMPORTING
*              answer         = lv_answer.
*          IF lv_answer = 'J'.
*            lv_ms = 'A'.
*          ELSE.
*            lv_ms = 'N'.
*          ENDIF.

          "  PERFORM frm_set_co48 USING lv_ms <fs_group>-plnum <fs_group>-auart <fs_group>-gsmng CHANGING lv_order_number  ls_return.

          DATA:lv_gsmng      TYPE plaf-gsmng,
               lv_gsmng_temp TYPE plaf-gsmng.
          SELECT SINGLE gsmng INTO lv_gsmng FROM plaf WHERE plnum = <fs_group>-plnum.
          IF lv_gsmng - <fs_group>-gsmng EQ 0 .
            CALL FUNCTION 'BAPI_PLANNEDORDER_DELETE'
              EXPORTING
                plannedorder = <fs_group>-plnum
              IMPORTING
                return       = ls_ret.
          ELSE.

            lv_gsmng_temp = lv_gsmng - <fs_group>-gsmng.

            CALL FUNCTION 'BAPI_PLANNEDORDER_CHANGE'
              EXPORTING
                plannedorder = <fs_group>-plnum
                headerdata   = VALUE bapiplaf_i2(
                total_plord_qty  = lv_gsmng_temp
                version          = <fs_group>-verid
                order_start_date = <fs_group>-psttr
                order_fin_date   = <fs_group>-pedtr
                plan_open_date   = <fs_group>-psttr "未清日期
                firming_ind      = 'X'          " 标识必打,不然转单bapi报错
                conversion_ind   = 'X' )    " 标识必打,不然转单bapi报错
                headerdatax  = VALUE bapiplaf_i2x(
                total_plord_qty  = 'X'
                version          = 'X'
                order_start_date = 'X'
                order_fin_date   = 'X'
                plan_open_date   = 'X'
                firming_ind      = 'X'
                conversion_ind   = 'X' )
              IMPORTING
                return       = ls_ret.
          ENDIF.


          IF ls_ret-type CA 'AEX'.
            <fs_alv>-bapi_mtype = ls_ret-type.
            <fs_alv>-bapi_msg   = |计划订单修改报错:{ ls_ret-message }|..

            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

            lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32   = lv_guid
                                                        zzorder = ''
                                                        aufnr   = ''
                                                        znumber = ''
                                                        zztxt   = ''
                                                        bapi_mtype = <fs_alv>-bapi_mtype
                                                        bapi_msg = <fs_alv>-bapi_msg ) ).

            EXIT.
          ELSE.

            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = 'X'.

            <fs_alv>-bapi_mtype =  'S'.
            <fs_alv>-bapi_msg   = |计划订单修改成功:{ ls_ret-message }|.

            lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32   = lv_guid
                                                        zzorder = ''
                                                        aufnr   = ''
                                                        znumber = ''
                                                        zztxt   = ''
                                                        bapi_mtype = <fs_alv>-bapi_mtype
                                                        bapi_msg = <fs_alv>-bapi_msg ) ).


            CLEAR:header_in,lv_order_number,ls_return.

            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
              EXPORTING
                input  = <fs_group>-matnr
              IMPORTING
                output = header_in-material.

            header_in-plant = <fs_group>-pwwrk."工厂
            header_in-order_type = <fs_group>-auart."
            header_in-quantity = <fs_group>-gsmng."订单数量总计
            header_in-basic_start_date = <fs_group>-psttr."基本开始日期
            header_in-basic_end_date = <fs_group>-pedtr."基本完成日期
            header_in-prod_version = <fs_group>-verid."生产版本

            SET UPDATE TASK LOCAL.
            CALL FUNCTION 'BAPI_PRODORD_CREATE'
              EXPORTING
                orderdata    = header_in
              IMPORTING
                order_number = lv_order_number
                return       = ls_return.
          ENDIF.
          " Create BAPI_PRODORD_CREATE

*          CALL FUNCTION 'BAPI_PRODORD_CREATE_FROM_PLORD'
*            EXPORTING
*              planned_order    = <fs_group>-plnum
*              order_type       = <fs_group>-auart
*            IMPORTING
*              production_order = lv_order_number
*              return           = ls_return.

          IF lv_order_number IS INITIAL.

            <fs_alv>-bapi_mtype = ls_return-type.
            <fs_alv>-bapi_msg   = |创建生产订单报错:{ ls_return-message }|.

            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.


            lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
                                                      stufe   = <fs_group>-stufe
                                                      zzorder = <fs_group>-plnum
                                                      aufnr   = lv_order_number
                                                      auart   = <fs_group>-auart
                                                      txt     = <fs_group>-txt
                                                      matnr1  = <fs_group>-matnr1
                                                      maktx1  = <fs_group>-maktx1
                                                      matnr   = <fs_group>-matnr
                                                      maktx   = <fs_group>-maktx
                                                      verid   = <fs_group>-verid
                                                      text1   = <fs_group>-text1
                                                      plnum   = <fs_group>-plnum
                                                      pwwrk   = <fs_group>-pwwrk
                                                      pertr   = <fs_group>-pertr
                                                      psttr   = <fs_group>-psttr
                                                      pedtr   = <fs_group>-pedtr
                                                      gsmng   = <fs_group>-gsmng
                                                      meins   = <fs_group>-meins
                                                      dispo   = <fs_group>-dispo
                                                      fevor     = <fs_group>-fevor
                                                      zztxt     = <fs_group>-zztxt
                                                      mtart     = <fs_group>-mtart
                                                      alpgr  = <fs_group>-alpgr
*                                                      stlan     = <fs_group>-stlan
*                                                      verwe     = <fs_group>-verwe
                                                      prfg_f      = <fs_group>-prfg_f
                                                      prfg_s      = <fs_group>-prfg_s
                                                      menge_bc    = <fs_group>-menge_bc
                                                      matnr_top   = <fs_group>-matnr_top
                                                      number_top  = <fs_group>-number_top
                                                      znumber     = <fs_group>-number
                                                      datum       = sy-datum
                                                      uzeit       = sy-uzeit
                                                      bapi_mtype  = <fs_alv>-bapi_mtype
                                                      bapi_msg    = <fs_alv>-bapi_msg   ) ).

            EXIT.
          ELSE.

            <fs_alv>-bapi_mtype = 'S'.
            <fs_alv>-bapi_msg   = |生产订单创建成功,订单号:{ lv_order_number }|.
            <fs_alv>-zzorder = lv_order_number.

            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = 'X'.

            PERFORM frm_set_order_to_aufnr USING lv_order_number <fs_group>-plnum <fs_group>-fevor <fs_group>-dispo <fs_group>-zztxt.
          ENDIF.


          lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
                                                      stufe   = <fs_group>-stufe
                                                      zzorder = <fs_group>-plnum
                                                      aufnr   = lv_order_number
                                                      auart   = <fs_group>-auart
                                                      txt     = <fs_group>-txt
                                                      matnr1  = <fs_group>-matnr1
                                                      maktx1  = <fs_group>-maktx1
                                                      matnr   = <fs_group>-matnr
                                                      maktx   = <fs_group>-maktx
                                                      verid   = <fs_group>-verid
                                                      text1   = <fs_group>-text1
                                                      plnum   = <fs_group>-plnum
                                                      pwwrk   = <fs_group>-pwwrk
                                                      pertr   = <fs_group>-pertr
                                                      psttr   = <fs_group>-psttr
                                                      pedtr   = <fs_group>-pedtr
                                                      gsmng   = <fs_group>-gsmng
                                                      meins   = <fs_group>-meins
                                                      dispo   = <fs_group>-dispo
                                                      fevor     = <fs_group>-fevor
                                                      zztxt     = <fs_group>-zztxt
                                                      mtart     = <fs_group>-mtart
                                                      alpgr  = <fs_group>-alpgr
*                                                      stlan     = <fs_group>-stlan
*                                                      verwe     = <fs_group>-verwe
                                                      prfg_f      = <fs_group>-prfg_f
                                                      prfg_s      = <fs_group>-prfg_s
                                                      menge_bc    = <fs_group>-menge_bc
                                                      matnr_top   = <fs_group>-matnr_top
                                                      number_top  = <fs_group>-number_top
                                                      znumber     = <fs_group>-number
                                                      datum       = sy-datum
                                                      uzeit       = sy-uzeit
                                                      bapi_mtype  = <fs_alv>-bapi_mtype
                                                      bapi_msg    = <fs_alv>-bapi_msg   ) ).

          CALL FUNCTION 'ENQUEUE_EZPLNUM'
            EXPORTING
              mode_plaf      = 'E'
              mandt          = sy-mandt
              plnum          = <fs_group>-plnum
            EXCEPTIONS
              foreign_lock   = 1
              system_failure = 2
              OTHERS         = 3.
          IF sy-subrc <> 0.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
          ENDIF.
        ENDIF.

        IF "( <fs_group>-mtart = 'Z002' OR <fs_group>-mtart = 'Z003' )
            <fs_group>-stufe <> '.0'
            AND <fs_group>-auart NOT IN lr_auart.
          IF p_xc = 'X' ."AND <fs_alv>-matnr <> <fs_alv>-matnr_top.
*            lt_table[] = VALUE #( BASE lt_table ( guid   = lv_guid
*                                                  number = <fs_group>-number
*                                                  matnr  = <fs_group>-matnr
*                                                  werks  = <fs_group>-pwwrk
*                                                  auart  = <fs_group>-auart
*                                                  gsmng  = <fs_group>-gsmng
*                                                  psttr  = <fs_group>-psttr
*                                                  pedtr  = <fs_group>-pedtr
*                                                  verid  = <fs_group>-verid
*                                                  zztxt  = <fs_group>-zztxt ) ).

            CLEAR:header_in,lv_aufnr,ls_return.

            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
              EXPORTING
                input  = <fs_group>-matnr
              IMPORTING
                output = header_in-material.

            header_in-plant = <fs_group>-pwwrk."工厂
            header_in-order_type = <fs_group>-auart."
            header_in-quantity = <fs_group>-gsmng."订单数量总计
            header_in-basic_start_date = <fs_group>-psttr."基本开始日期
            header_in-basic_end_date = <fs_group>-pedtr."基本完成日期
            header_in-prod_version = <fs_group>-verid."生产版本

            SET UPDATE TASK LOCAL.
            CALL FUNCTION 'BAPI_PRODORD_CREATE'
              EXPORTING
                orderdata    = header_in
              IMPORTING
                order_number = lv_aufnr
                return       = ls_return.

            IF lv_aufnr <> '' AND ls_return IS INITIAL . "订单创建成功
              <fs_alv>-bapi_mtype = 'S'.
              <fs_alv>-bapi_msg   = '订单创建成功 '.

              CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                EXPORTING
                  wait = 'X'.

              lv_aufnr = |{ lv_aufnr ALPHA = IN }|.
              <fs_alv>-aufnr = lv_aufnr.
              <fs_alv>-zzorder = lv_order_number.
              PERFORM frm_set_order_to_aufnr USING lv_aufnr lv_order_number <fs_group>-fevor <fs_group>-dispo <fs_group>-zztxt.
              " PERFORM frm_change_order_arbpl USING lv_aufnr <fs_group>-arbpl CHANGING <fs_alv>-bapi_mtype <fs_alv>-bapi_msg .
            ELSE.
              <fs_alv>-bapi_msg = '订单创建失败。' && ls_return-message.
              <fs_alv>-bapi_mtype = 'E'.

              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

            ENDIF.


            lt_ztpp0019[] = VALUE #( BASE lt_ztpp0019 ( guid_32 = lv_guid
                                                      stufe   = <fs_group>-stufe
                                                      zzorder = lv_order_number
                                                      aufnr   = lv_aufnr
                                                      auart   = <fs_group>-auart
                                                      txt     = <fs_group>-txt
                                                      matnr1  = <fs_group>-matnr1
                                                      maktx1  = <fs_group>-maktx1
                                                      matnr   = <fs_group>-matnr
                                                      maktx   = <fs_group>-maktx
                                                      verid   = <fs_group>-verid
                                                      text1   = <fs_group>-text1
                                                      plnum   = <fs_group>-plnum
                                                      pwwrk   = <fs_group>-pwwrk
                                                      pertr   = <fs_group>-pertr
                                                      psttr   = <fs_group>-psttr
                                                      pedtr   = <fs_group>-pedtr
                                                      gsmng   = <fs_group>-gsmng
                                                      meins   = <fs_group>-meins
                                                      dispo   = <fs_group>-dispo
                                                      fevor     = <fs_group>-fevor
                                                      zztxt     = <fs_group>-zztxt
                                                      mtart     = <fs_group>-mtart
                                                      alpgr  = <fs_group>-alpgr
*                                                      stlan     = <fs_group>-stlan
*                                                      verwe     = <fs_group>-verwe
                                                      prfg_f      = <fs_group>-prfg_f
                                                      prfg_s      = <fs_group>-prfg_s
                                                      menge_bc    = <fs_group>-menge_bc
                                                      matnr_top   = <fs_group>-matnr_top
                                                      number_top  = <fs_group>-number_top
                                                      znumber     = <fs_group>-number
                                                      datum       = sy-datum
                                                      uzeit       = sy-uzeit
                                                      bapi_mtype  = <fs_alv>-bapi_mtype
                                                      bapi_msg    = <fs_alv>-bapi_msg   ) ).

            " PERFORM frm_create_order USING lv_order_number <fs_group>-number CHANGING <fs_alv> lv_type .
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.

*    CALL FUNCTION 'ZFMPP_CREATE_ORDER' "IN UPDATE TASK
*      EXPORTING
*        input = ls_input
*      TABLES
*        t_out = lt_table.
*
*    IF lt_table[] IS NOT INITIAL.
*
*      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*        EXPORTING
*          wait = 'X'.
*
*    ELSE.
*
*    ENDIF.
  ENDLOOP.

  IF lt_ztpp0019[] IS NOT INITIAL.
    MODIFY ztpp0019 FROM TABLE lt_ztpp0019[].
    COMMIT WORK AND WAIT.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_ORDER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_ALV>
*&---------------------------------------------------------------------*
FORM frm_create_order  USING pv_scdd TYPE aufnr
                             pv_number TYPE numc10
                       CHANGING pv_alv LIKE ty_alv
                                pv_type TYPE bapi_mtype.

  DATA:ls_return TYPE bapiret2,
       lv_aufnr  TYPE aufnr.
  DATA:header_in TYPE bapi_pp_order_create.

  CLEAR:header_in,lv_aufnr,ls_return.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = pv_alv-matnr
    IMPORTING
      output = header_in-material.
  header_in-plant = pv_alv-pwwrk."工厂
  header_in-order_type = pv_alv-auart."
  header_in-quantity = pv_alv-gsmng."订单数量总计
  header_in-basic_start_date = pv_alv-psttr."基本开始日期
  header_in-basic_end_date = pv_alv-pedtr." 基本完成日期
  header_in-prod_version = pv_alv-verid."生产版本

  SET UPDATE TASK LOCAL.

  CALL FUNCTION 'BAPI_PRODORD_CREATE'
    EXPORTING
      orderdata    = header_in
    IMPORTING
      order_number = lv_aufnr
      return       = ls_return.

  IF lv_aufnr <> '' AND ls_return IS INITIAL . "订单创建成功
    lv_aufnr = |{ lv_aufnr ALPHA = IN }|.

    gt_aufnr[] = VALUE #( BASE gt_aufnr ( number = pv_number aufnr = lv_aufnr ) ).

    pv_type = 'S'.
    pv_alv-aufnr = lv_aufnr.
    pv_alv-zzorder = pv_scdd.
    pv_alv-bapi_msg = '订单创建成功 '.
    pv_alv-bapi_mtype = 'S '.
  ELSE.
    pv_alv-bapi_msg = '订单创建失败。' && ls_return-message.
    pv_alv-bapi_mtype = 'E '.
    pv_type = 'E'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  fm_button
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*   EXPORTING
*     IR_SALV_FULLSCREEN_ADAPTER       =
    IMPORTING
*     ET_EXCLUDING                     =
*     E_REPID                          =
*     E_CALLBACK_PROGRAM               =
*     E_CALLBACK_ROUTINE               =
      e_grid = ref_grid
*     ET_FIELDCAT_LVC                  =
*     ER_TRACE                         =
*     E_FLG_NO_HTML                    =
*     ES_LAYOUT_KKBLO                  =
*     ES_SEL_HIDE                      =
*     ET_EVENT_EXIT                    =
*     ER_FORM_TOL                      =
*     ER_FORM_EOL                      =
    .

*   CALL METHOD ref_grid->check_changed_data.
* 设置enter事件
  CALL METHOD ref_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  CREATE OBJECT gt_event_receiver.
  SET HANDLER   gt_event_receiver->handle_modify FOR ref_grid.

ENDFORM.                    "FM_BUTTON
*&---------------------------------------------------------------------*
*& Form frm_insert_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_insert_data USING pv_alv LIKE ty_alv.
  PERFORM frm_clear_data.
  gv_matnr = pv_alv-matnr.
  gv_maktx = pv_alv-maktx.
  gv_psttr = pv_alv-psttr.
  gv_pedtr = pv_alv-pedtr.
  gv_gsmng_total = pv_alv-gsmng.
  gv_werks = pv_alv-pwwrk.
  gv_plnum = pv_alv-plnum.
  gv_number = pv_alv-number.
  gv_number_top = pv_alv-number_top.
  gv_gsmng = '0'.

  REFRESH gt_tab.
  gt_tab[] = VALUE #( BASE gt_tab (  plnum   = pv_alv-plnum
                                     pwwrk   = pv_alv-pwwrk
                                     gsmng   =  pv_alv-gsmng
                                   ) ).
  CALL SCREEN 9000 STARTING AT 5 5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_delete_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_delete_data USING pv_alv LIKE ty_alv..
  DELETE gt_alv WHERE number_top = pv_alv-number_top.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_TYPE
*&      <-- LV_MSG
*&---------------------------------------------------------------------*
FORM frm_check_data  CHANGING pv_type TYPE bapi_mtype
                              pv_msg TYPE bapi_msg.

  TYPES:BEGIN OF tys_plaf,
          plnum TYPE plaf-plnum,
        END OF tys_plaf.
  DATA:lwa_alv LIKE LINE OF gt_alv.
  DATA:lt_plaf TYPE TABLE OF tys_plaf.

  lt_plaf[] = VALUE #( FOR lw_alv IN gt_alv WHERE ( sel = 'X' AND plnum IS NOT INITIAL )  ( plnum = lw_alv-plnum ) ).

  DATA:lv_menge TYPE menge_d.

  SORT gt_plaf BY plnum.

  LOOP AT lt_plaf INTO DATA(lw_plaf).
    READ TABLE gt_plaf INTO DATA(gw_plaf) WITH KEY plnum = lw_plaf-plnum BINARY SEARCH.
    IF sy-subrc EQ 0.
      LOOP AT gt_plaf INTO DATA(gs_plaf) FROM sy-tabix.
        IF gs_plaf-plnum <> lw_plaf-plnum.
          EXIT.
        ENDIF.

        lv_menge = REDUCE menge_d( INIT x = 0 FOR ls_alv IN gt_alv WHERE ( matnr1 = gw_plaf-matnr AND  plnum = lw_plaf-plnum ) NEXT x = x + ls_alv-gsmng ).
        IF lv_menge > gw_plaf-gsmng.
          pv_msg = '合计数量超过了计划订单数量'.
          pv_type = 'E'.
          EXIT.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

  lwa_alv = gt_alv[ sel = 'X' ].

  LOOP AT gt_alv INTO DATA(la_alv)
     WHERE number_top = lwa_alv-number_top AND
    ( fevor IS INITIAL OR dispo IS INITIAL OR verid IS INITIAL ).
    IF la_alv-fevor IS INITIAL .
      pv_msg = '车间产线不能为空'.
      pv_type = 'E'.
      EXIT.
    ENDIF.

    IF la_alv-dispo IS INITIAL .
      pv_msg = 'MRP控制者不能为空'.
      pv_type = 'E'.
      EXIT.
    ENDIF.

    IF la_alv-verid IS INITIAL .
      pv_msg = '生产版本不能为空'.
      pv_type = 'E'.
      EXIT.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_ORDER_TO_AUFNR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_AUFNR
*&      --> INPUT_ZZTXT
*&---------------------------------------------------------------------*
FORM frm_set_order_to_aufnr  USING    pv_aufnr TYPE aufnr
                                      pv_plnum
                                      pv_fevor TYPE fevor
                                      pv_dispo TYPE dispo
                                      pv_zztxt TYPE ze_zztxt.

  CHECK pv_aufnr IS NOT INITIAL.

  DO 10 TIMES.
    SELECT COUNT(*) FROM aufk WHERE aufnr = pv_aufnr.
    IF sy-subrc EQ 0.
      DATA(lv_flag) = 'X'.
      EXIT.
    ELSE.
      WAIT UP TO 1 SECONDS.
    ENDIF.
  ENDDO.

  IF lv_flag = 'X'.
    UPDATE aufk SET zzorder = pv_plnum
                    zztxt = pv_zztxt
                    WHERE aufnr = pv_aufnr.
    COMMIT WORK AND WAIT.

    UPDATE afko SET fevor = pv_fevor
                    dispo = pv_dispo
                    WHERE aufnr = pv_aufnr.
    COMMIT WORK AND WAIT.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_f4_help_fevor
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> ET_BAD_CELLS
*&      --> ES_ROW_NO
*&      --> ER_EVENT_DATA
*&      --> E_DISPLAY
*&      --> E_FIELDNAME
*&---------------------------------------------------------------------*
FORM frm_f4_help_fevor USING et_bad_cells  TYPE lvc_t_modi
                          es_row_no     TYPE lvc_s_roid
                          er_event_data TYPE REF TO cl_alv_event_data
                          "e_display     TYPE c
                          e_fieldname   TYPE lvc_fname.

  DATA: lt_return TYPE STANDARD TABLE OF ddshretval,
        ls_return TYPE ddshretval.
  DATA :lv_eqart TYPE eqart.
  FIELD-SYMBOLS: <itab> TYPE lvc_t_modi.
  DATA: ls_modi TYPE lvc_s_modi.
  ASSIGN er_event_data->m_data->* TO <itab>.

  IF e_fieldname = 'FEVOR'.
    READ TABLE gt_alv INTO DATA(gs_alv) INDEX es_row_no-row_id.
    SELECT * FROM t024f INTO TABLE @DATA(lt_fevor).

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'FEVOR'
        dynpprog        = sy-repid
        dynpnr          = sy-dynnr
        dynprofield     = 'GT_ALV-FEVOR'
        value_org       = 'S'
  "     CALLBACK_PROGRAM = SY-REPID
      TABLES
        value_tab       = lt_fevor
        return_tab      = lt_return          "返回值
      EXCEPTIONS
        parameter_error = 1
        no_values_found = 2
        OTHERS          = 3.
    IF sy-subrc = 0.
****将选的值填入ALV字段中
      READ TABLE gt_alv INTO gs_alv INDEX es_row_no-row_id.
      IF sy-subrc = 0.
        READ TABLE lt_return INTO ls_return INDEX 1.
        IF ls_return-fieldval IS NOT INITIAL.
          ls_modi-row_id = es_row_no-row_id.
          ls_modi-fieldname = 'FEVOR'.
          ls_modi-value = ls_return-fieldval.
          APPEND ls_modi TO <itab>.
          CLEAR ls_modi.
        ENDIF.

        er_event_data->m_event_handled = 'X'.
      ENDIF.
    ENDIF.
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_caller_exit
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> ET_BAD_CELLS
*&      --> ES_ROW_NO
*&      --> ER_EVENT_DATA
*&      --> E_DISPLAY
*&      --> E_FIELDNAME
*&---------------------------------------------------------------------*
FORM frm_caller_exit USING ls_data TYPE slis_data_caller_exit.
  DATA : lt_f4 TYPE lvc_t_f4,
         ls_f4 TYPE lvc_s_f4.
  "DATA gt_event_receiver TYPE REF TO lcl_event_receiver.
*获取的全局ALV对象
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = ref_grid.

  ls_f4-fieldname  = 'FEVOR'.   "
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.

*注册拦截的F4
  CALL METHOD ref_grid->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4[].
  IF sy-subrc <> 0.
*   Implement suGT_OUTle error handling here
  ENDIF.
*创建类 类似 new OBJ
*  CREATE OBJECT gt_event_receiver.
*设置拦截
*  SET HANDLER gt_event_receiver->handle_f4 FOR ref_grid.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*   EXPORTING
*     IR_SALV_FULLSCREEN_ADAPTER       =
    IMPORTING
*     ET_EXCLUDING                     =
*     E_REPID                          =
*     E_CALLBACK_PROGRAM               =
*     E_CALLBACK_ROUTINE               =
      e_grid = ref_grid
*     ET_FIELDCAT_LVC                  =
*     ER_TRACE                         =
*     E_FLG_NO_HTML                    =
*     ES_LAYOUT_KKBLO                  =
*     ES_SEL_HIDE                      =
*     ET_EVENT_EXIT                    =
*     ER_FORM_TOL                      =
*     ER_FORM_EOL                      =
    .

*   CALL METHOD ref_grid->check_changed_data.
* 设置enter事件
  CALL METHOD ref_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  CREATE OBJECT gt_event_receiver.
  SET HANDLER gt_event_receiver->handle_f4 FOR ref_grid.
  SET HANDLER gt_event_receiver->handle_modify FOR ref_grid.

ENDFORM.                   "F_CALLER_EXIT
*&---------------------------------------------------------------------*
*& Form FRM_SET_CO48
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_GROUP>_PLNUM
*&      --> <FS_GROUP>_GSMNG
*&---------------------------------------------------------------------*
FORM frm_set_co48  USING   p_ms
                            p_plnum
                            p_zauart
                            p_gsmng
                   CHANGING p_aufnr TYPE aufnr
                            p_msg TYPE bapiret2.
  DATA:lv_num TYPE i.
  " BDC定义
  DATA: messtab    TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
        ex_messtab TYPE TABLE OF bapiret2 WITH HEADER LINE,
        lt_ex      TYPE TABLE OF bapiret2 WITH HEADER LINE.
  DATA: gv_mode   TYPE c1 VALUE 'N',
        gv_updata TYPE c1 VALUE 'S',
        gv_tcode  TYPE char10 VALUE 'CO48'.
  DATA l_opts TYPE ctu_params.
  DATA:lv_gsmng TYPE char17.
  l_opts-nobinpt = 'X'.
  l_opts-dismode = p_ms."gv_mode.
  l_opts-updmode = gv_updata.

  REFRESH: bdcdata, messtab, ex_messtab .

  PERFORM bdc_dynpro      USING 'SAPLCOKO1' '0150'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'AFPOD-PLNUM'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=ENTK'.
  PERFORM bdc_field       USING 'AFPOD-PLNUM'
                                p_plnum.
  PERFORM bdc_field       USING 'AFPOD-TPAUF'
                                'X'.
  PERFORM bdc_field       USING 'AUFPAR-PP_AUFART'
                                p_zauart.
  PERFORM bdc_dynpro      USING 'SAPLCOUP' '1000'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'ABBT-GSMNG(01)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '/00'.
  WRITE:p_gsmng TO lv_gsmng.
  CONDENSE lv_gsmng.
  PERFORM bdc_field       USING 'ABBT-GSMNG(01)'
                                lv_gsmng.
  PERFORM bdc_dynpro      USING 'SAPLCOUP' '1000'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'ABBT-GSMNG(01)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=BU'.
  PERFORM bdc_dynpro      USING 'SAPLCOSD' '5132'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'MDFQ-ADATU(01)'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=AUSW'.

*  PERFORM bdc_dynpro      USING 'SAPLCOKO1' '0150'." 输入界面
*  PERFORM bdc_field       USING 'BDC_OKCODE'
*                                '=ENTK'.
*  PERFORM bdc_field       USING 'AFPOD-PLNUM'
*                                p_plnum.
*  PERFORM bdc_field       USING 'AFPOD-TPAUF'
*                                'X'.
*  PERFORM bdc_field       USING 'AUFPAR-PP_AUFART'
*                                p_zauart.
*  PERFORM bdc_dynpro      USING 'SAPLCOUP' '1000'."
*  PERFORM bdc_field       USING 'BDC_OKCODE'
*                                '=GEN'.
*  PERFORM bdc_field2      USING 'ABBT-GSMNG(01)'
*                                p_gsmng.
*  PERFORM bdc_dynpro      USING 'SAPLCOUP' '1000'.
*  PERFORM bdc_field       USING 'BDC_CURSOR'
*                                'ABBT-GSMNG(01)'.
*  PERFORM bdc_field       USING 'BDC_OKCODE'
*                                '=BU'.
*  PERFORM bdc_dynpro      USING 'SAPLCOSD' '5132'.
*  PERFORM bdc_field       USING 'BDC_CURSOR'
*                                'MDFQ-ADATU(01)'.
*  PERFORM bdc_field       USING 'BDC_OKCODE'
*                                '=AUSW'.
  CLEAR lv_num.
  "lv_num = p_gsmng.
  "DO lv_num TIMES.

  CALL TRANSACTION gv_tcode
    USING bdcdata
    OPTIONS FROM l_opts
    MESSAGES  INTO  messtab .

  CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2' " 将 messtab 转换为消息文本
    TABLES
      imt_bdcmsgcoll = messtab
      ext_return     = ex_messtab.

  LOOP AT ex_messtab WHERE type CA 'AEI'.
    APPEND ex_messtab TO lt_ex.
  ENDLOOP.

*  IF sy-subrc = 0.
*    EXIT.
*  ENDIF.

  READ TABLE ex_messtab INTO DATA(lw_ex_messtab) WITH KEY id  = 'COTU' type = 'S' number = '014'.
  IF sy-subrc EQ 0.
    p_aufnr = lw_ex_messtab-message_v2.
    p_aufnr = |{ p_aufnr ALPHA = IN  }|.
  ENDIF.

  CLEAR: messtab,messtab[],ex_messtab,ex_messtab[].

  " ENDDO.

  SORT lt_ex BY type message.
  DELETE ADJACENT DUPLICATES FROM lt_ex COMPARING type message.

  LOOP AT lt_ex WHERE type CA 'AEI'.
    IF lt_ex-message IS NOT INITIAL.
      p_msg-message = p_msg-message && lt_ex-message .
    ENDIF.
  ENDLOOP.

  IF p_aufnr  IS INITIAL.
    LOOP AT lt_ex .
      IF lt_ex-message IS NOT INITIAL.
        p_msg-message = p_msg-message && lt_ex-message .
      ENDIF.
    ENDLOOP.
*    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    p_msg-type = 'E' .
  ELSE.
*    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*      EXPORTING
*        wait = 'X'.
    p_msg-type = 'S' .
    p_msg-message = '转换成功'.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form bdc_dynpro
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      -->
*&      -->
*&---------------------------------------------------------------------*
FORM bdc_dynpro USING program
                      dynpro.
  CLEAR bdcdata.
  bdcdata-program = program.
  bdcdata-dynpro  = dynpro.
  bdcdata-dynbegin = 'X'.
  APPEND bdcdata.
ENDFORM.                    "bdc_dynpro
*&---------------------------------------------------------------------*
*& Form bdc_field
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      -->
*&      -->
*&---------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  bdcdata-fval = fval.
  APPEND bdcdata.
ENDFORM.                    "bdc_field
*&---------------------------------------------------------------------*
*& Form bdc_field2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      -->
*&      -->
*&---------------------------------------------------------------------*
FORM bdc_field2 USING fnam fval.
  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  bdcdata-fval = fval.
  CONDENSE bdcdata-fval." 删除字符串中的空格
  APPEND bdcdata.
ENDFORM.                    "bdc_field
*&---------------------------------------------------------------------*
*& Form frm_f4_help_dispo
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> ET_BAD_CELLS
*&      --> ES_ROW_NO
*&      --> ER_EVENT_DATA
*&      --> E_FIELDNAME
*&---------------------------------------------------------------------*
FORM frm_f4_help_dispo  USING et_bad_cells  TYPE lvc_t_modi
                          es_row_no     TYPE lvc_s_roid
                          er_event_data TYPE REF TO cl_alv_event_data
                          "e_display     TYPE c
                          e_fieldname   TYPE lvc_fname.

  DATA: lt_return TYPE STANDARD TABLE OF ddshretval,
        ls_return TYPE ddshretval.
  DATA :lv_eqart TYPE eqart.
  FIELD-SYMBOLS: <itab> TYPE lvc_t_modi.
  DATA: ls_modi TYPE lvc_s_modi.
  ASSIGN er_event_data->m_data->* TO <itab>.

  IF e_fieldname = 'DISPO'.
    READ TABLE gt_alv INTO DATA(gs_alv) INDEX es_row_no-row_id.
    SELECT * FROM t024d INTO TABLE @DATA(lt_dispo).

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'DISPO'
        dynpprog        = sy-repid
        dynpnr          = sy-dynnr
        dynprofield     = 'GT_ALV-DISPO'
        value_org       = 'S'
  "     CALLBACK_PROGRAM = SY-REPID
      TABLES
        value_tab       = lt_dispo
        return_tab      = lt_return          "返回值
      EXCEPTIONS
        parameter_error = 1
        no_values_found = 2
        OTHERS          = 3.
    IF sy-subrc = 0.
      READ TABLE gt_alv INTO gs_alv INDEX es_row_no-row_id.
      IF sy-subrc = 0.
        READ TABLE lt_return INTO ls_return INDEX 1.
        IF ls_return-fieldval IS NOT INITIAL.
          ls_modi-row_id = es_row_no-row_id.
          ls_modi-fieldname = 'DISPO'.
          ls_modi-value = ls_return-fieldval.
          APPEND ls_modi TO <itab>.
          CLEAR ls_modi.
        ENDIF.

        er_event_data->m_event_handled = 'X'.
      ENDIF.
    ENDIF.
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
  SET PF-STATUS 'STATUS_9000'.
  SET TITLEBAR 'TITLEBAR_9000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  DATA:ok_key TYPE sy-ucomm.
  DATA:lv_selline TYPE sy-stepl,
       lv_tabix   TYPE sy-tabix.
  DATA:lv_answer.
  DATA:lv_number     TYPE numc10,
       lv_number_top TYPE numc10.
  DATA:lv_lines TYPE numc10.
  DATA:lv_menge TYPE menge_d.
  DATA:lt_alv TYPE ty_basic,
       lw_alv LIKE LINE OF lt_alv.

  ok_key = ok_code.
  CLEAR:ok_code,lv_menge.

  CASE ok_key.
    WHEN '&XINZENG'.
      IF gv_gsmng IS INITIAL.
        MESSAGE '请输入数量' TYPE 'E'.
      ELSE.
        IF gv_gsmng >= gv_gsmng_total.
          MESSAGE '拆分数量不能大于最大可拆分数量' TYPE 'E'.
        ENDIF.
      ENDIF.

      CLEAR:lv_menge,lv_lines.
      gt_tab[] = VALUE #( BASE gt_tab ( plnum     = gv_plnum
                                        pwwrk     = gv_werks
                                        gsmng     = gv_gsmng ) ).

      READ TABLE gt_tab ASSIGNING FIELD-SYMBOL(<fs_tab>) INDEX 1.
      IF sy-subrc EQ 0.
        IF <fs_tab>-gsmng - gv_gsmng > 0.
          <fs_tab>-gsmng = <fs_tab>-gsmng - gv_gsmng.
        ENDIF.
      ENDIF.

      lv_menge  = REDUCE menge_d( INIT sum = 0 FOR ls_tab IN gt_tab NEXT sum = sum + ls_tab-gsmng ).

      IF lv_menge > gv_gsmng_total.
        lv_lines = lines( gt_tab ).
        DELETE gt_tab INDEX lv_lines.
      ENDIF.

    WHEN '&SHANCHU'.
      CLEAR:lv_selline,lv_tabix,lv_answer,lv_menge.
      GET CURSOR LINE lv_selline.
      lv_tabix = tc_tab-top_line + lv_selline - 1.

      CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
        EXPORTING
          textline1      = '确认是否删除第' && lv_tabix && '行'
          titel          = '提示'
          cancel_display = 'X'
        IMPORTING
          answer         = lv_answer.
      IF lv_answer = 'J' AND lv_tabix > 0.
        IF lv_tabix =  1.
          MESSAGE '不能删除第一行' TYPE 'E'.
        ELSE.
          lv_menge = gt_tab[ lv_tabix ]-gsmng.
          DELETE gt_tab INDEX lv_tabix.

          READ TABLE gt_tab ASSIGNING <fs_tab> INDEX 1.
          IF sy-subrc EQ 0 AND <fs_tab>-gsmng + lv_menge =< gv_gsmng_total.
            <fs_tab>-gsmng = <fs_tab>-gsmng + lv_menge.
          ENDIF.
        ENDIF.
      ENDIF.
    WHEN '&CONFIRM'.
      CLEAR:lv_tabix,lv_number,lv_number_top.
      REFRESH lt_alv.
      lv_menge  = REDUCE menge_d( INIT sum = 0 FOR ls_tab IN gt_tab
                                NEXT sum = sum + ls_tab-gsmng ).
      IF lv_menge <> gv_gsmng_total.
        MESSAGE '拆分数量合计不等于可拆分数量' TYPE 'E'.
      ENDIF.

      SORT gt_alv BY number.
      SORT gt_alv_temp BY number.
      lv_tabix = lines( gt_alv ).

      lv_number = gt_alv[ lv_tabix ]-number.
      lv_number_top = gt_alv[ lv_tabix ]-number_top.

      LOOP AT gt_tab INTO gw_tab.
        IF sy-tabix = '1'."修改当前行
          READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WITH KEY number_top = gv_number_top BINARY SEARCH .
          IF sy-subrc EQ 0.
            LOOP AT gt_alv ASSIGNING <fs_alv> WHERE number_top = gv_number_top.
              IF <fs_alv>-number_top <> gv_number_top.
                EXIT.
              ENDIF.

              IF <fs_alv>-stufe = '.0'.
                <fs_alv>-gsmng = gw_tab-gsmng.
              ELSE.
                <fs_alv>-gsmng = gw_tab-gsmng * <fs_alv>-menge_bc.
              ENDIF.

*              READ TABLE gt_alv_temp ASSIGNING FIELD-SYMBOL(<fs_alv_temp>) WITH KEY number = <fs_alv>-number BINARY SEARCH.
*              IF sy-subrc EQ 0.
*                <fs_alv_temp>-gsmng = <fs_alv>-gsmng.
*              ENDIF.
            ENDLOOP.
          ENDIF.
        ELSE."新增行 及其下阶
          lv_number_top = lv_number_top + 1.

          READ TABLE gt_alv_temp INTO DATA(lw_alv_temp) WITH KEY number_top = gv_number_top BINARY SEARCH .
          IF sy-subrc EQ 0.
            LOOP AT gt_alv_temp INTO lw_alv_temp FROM sy-tabix.
              IF lw_alv_temp-number_top <> gv_number_top.
                EXIT.
              ENDIF.

              MOVE-CORRESPONDING lw_alv_temp TO lw_alv.
              IF lw_alv_temp-stufe = '.0'.
                lw_alv-gsmng =  gw_tab-gsmng.
              ELSE.
                lw_alv-gsmng =  gw_tab-gsmng * lw_alv_temp-menge_bc.
              ENDIF.

              lv_number = lv_number + 1.
              lw_alv-number = lv_number.
              lw_alv-number_top = lv_number_top.
              APPEND lw_alv TO lt_alv.
            ENDLOOP.
          ENDIF.
        ENDIF.
      ENDLOOP.

      IF lt_alv[] IS NOT INITIAL.
        LOOP AT gt_alv INTO DATA(ls_alv) WHERE number_top = gv_number_top.
          READ TABLE gt_alv_temp ASSIGNING FIELD-SYMBOL(<fs_alv_temp>) WITH KEY number = ls_alv-number BINARY SEARCH.
          IF sy-subrc EQ 0.
            <fs_alv_temp>-gsmng = <fs_alv>-gsmng.
          ENDIF.
        ENDLOOP.

        APPEND LINES OF lt_alv[] TO gt_alv.
        APPEND LINES OF lt_alv[] TO gt_alv_temp.
      ENDIF.

      LEAVE TO SCREEN 0.
    WHEN '&CANCEL' OR 'F03' OR 'F05' OR 'F12'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_collapse_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_collapse_alv .

  DATA:lt_alv TYPE ty_basic,
       ls_alv LIKE LINE OF lt_alv.

  READ TABLE gt_alv INTO DATA(lw_alv) WITH KEY number_top = gw_alv-number_top stufe = '.1'.
  IF sy-subrc EQ 0.
    LOOP AT gt_alv INTO DATA(gs_alv) WHERE number_top = gw_alv-number_top AND stufe <> '.0'.
      DELETE gt_alv.
    ENDLOOP.
  ELSE.
    LOOP AT gt_alv_temp INTO DATA(lw_alv_temp) WHERE number_top = gw_alv-number_top AND stufe <> '.0'.
      MOVE-CORRESPONDING lw_alv_temp TO ls_alv.
      APPEND ls_alv TO lt_alv.
    ENDLOOP.

    APPEND LINES OF lt_alv[] TO gt_alv[].
    SORT gt_alv BY number.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CLEAR_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_clear_data .
  CLEAR:gv_matnr,
        gv_maktx,
        gv_psttr,
        gv_pedtr,
        gv_gsmng_total,
        gv_gsmng,
        gv_werks,
        gv_plnum,
        gv_number,
        gv_number_top.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_log_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_log_data .
  DATA:lt_temp TYPE TABLE OF ztpp0019.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_ztpp0019
    FROM ztpp0019
    WHERE datum IN s_datum AND
          auart IN s_auart AND
          pwwrk IN s_pwwrk AND
          matnr IN s_matnr AND
          verid IN s_verid AND
          dispo IN s_dispo AND
          "plgrp IN s_plgrp AND
          plnum IN s_plnum AND
          pertr IN s_pertr AND
          psttr IN s_psttr AND
          pedtr IN s_pedtr AND
          datum IN s_datum AND
          aufnr IN s_aufnr AND
          zzorder IN s_zzord.

  IF gt_ztpp0019[] IS NOT INITIAL.
    SELECT * INTO TABLE @DATA(lt_ztpp0019)
      FROM ztpp0019
      FOR ALL ENTRIES IN @gt_ztpp0019
      WHERE zzorder = @gt_ztpp0019-aufnr.
    SORT lt_ztpp0019 BY zzorder.

    LOOP AT gt_ztpp0019 INTO DATA(gw_ztpp0019).
      READ TABLE lt_ztpp0019 INTO DATA(lw_ztpp0019) WITH KEY zzorder = gw_ztpp0019-aufnr BINARY SEARCH TRANSPORTING NO FIELDS.
      IF sy-subrc EQ 0.
        LOOP AT lt_ztpp0019 INTO lw_ztpp0019 FROM sy-tabix.
          APPEND INITIAL LINE TO lt_temp ASSIGNING FIELD-SYMBOL(<fs_out>).
          MOVE-CORRESPONDING lw_ztpp0019 TO <fs_out>.
        ENDLOOP.
      ENDIF.
    ENDLOOP.

    IF lt_temp[] IS NOT INITIAL.
      APPEND LINES OF lt_temp[] TO gt_ztpp0019[].
      SORT gt_ztpp0019 BY guid_32.
      DELETE ADJACENT DUPLICATES FROM gt_ztpp0019 COMPARING ALL FIELDS.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_log_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_log_alv .
  DATA:g_repid TYPE sy-repid.
  CLEAR:gs_layout.
  g_repid = sy-repid.
  "g_layout-zebra             = 'X' .
  gs_layout-zebra = 'X'.
  gs_layout-cwidth_opt = 'X'.
  "  gs_layout-box_fname = 'SEL'.
  CLEAR:gt_fieldcat[],gt_fieldcat[].
  PERFORM frm_generate_fieldcat_log.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      is_layout_lvc      = gs_layout
      it_fieldcat_lvc    = gt_fieldcat
    TABLES
      t_outtab           = gt_ztpp0019
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_generate_fieldcat_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_generate_fieldcat_log .
  DEFINE def_modify_fieldcat.
    &1-scrtext_l = &2.
    &1-scrtext_m = &2.
    &1-reptext =   &2.
    &1-scrtext_s = &2.
  END-OF-DEFINITION.
  TRY.
      cl_salv_table=>factory( IMPORTING r_salv_table = DATA(salv_table)
                              CHANGING  t_table      = gt_ztpp0019 ).
      gt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
        r_columns      = salv_table->get_columns( )
        r_aggregations = salv_table->get_aggregations( ) ).
    CATCH cx_root.
  ENDTRY.

  LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_filedcat>).
    CASE <fs_filedcat>-fieldname.
      WHEN 'STATUS'.
        def_modify_fieldcat <fs_filedcat> '状态'.
        <fs_filedcat>-icon = 'X'.
        <fs_filedcat>-no_out = 'X'.
      WHEN 'SEL'OR 'NUMBER' OR 'NUMBER_TOP' OR 'MATNR_TOP' OR 'MTART' OR  'MENGE_BC' OR 'MANDT' OR 'GUID_32'. "'PRFG_F' OR 'PRFG_S' .
        <fs_filedcat>-no_out = 'X'.
      WHEN 'STUFE'.
        <fs_filedcat>-hotspot = 'X'.
        def_modify_fieldcat <fs_filedcat> 'BOM层级'.
      WHEN 'BAPI_MTYPE'.
        def_modify_fieldcat <fs_filedcat> '消息'.
      WHEN 'BAPI_MSG'.
        def_modify_fieldcat <fs_filedcat> '消息文本'.
      WHEN 'STUFE'.
        def_modify_fieldcat <fs_filedcat> '层级'.
      WHEN 'MATNR1'.
        <fs_filedcat>-no_out = 'X'.
        def_modify_fieldcat <fs_filedcat> '上层物料'.
      WHEN 'MAKTX1'.
        <fs_filedcat>-no_out = 'X'.
        def_modify_fieldcat <fs_filedcat> '上层物料描述'.
      WHEN 'MATNR'.
        def_modify_fieldcat <fs_filedcat> '组件物料'.
      WHEN 'MAKTX'.
        def_modify_fieldcat <fs_filedcat> '组件物料描述'.
      WHEN 'GSMNG'.
        def_modify_fieldcat <fs_filedcat> '订货数量'.
      WHEN 'DATUM'.
        def_modify_fieldcat <fs_filedcat> '创建日期'.
      WHEN 'UZEIT'.
        def_modify_fieldcat <fs_filedcat> '创建时间'.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_plgx_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_plgx_data .
  DATA: lv_bedat TYPE budat,
        lv_endat TYPE budat,
        lv_fevor TYPE fevor,
        lt_field TYPE TABLE OF sval,
        lv_ret   TYPE c.

  lt_field = VALUE #(
    ( tabname = 'ZSPPR0024'  fieldname = 'BEDAT' value = sy-datum     field_obl = 'X' )
    ( tabname = 'ZSPPR0024'  fieldname = 'ENDAT' value = sy-datum     field_obl = 'X' )
    ( tabname = 'ZSPPR0024'  fieldname = 'FEVOR' value = '' field_obl = 'X' )
   ).

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
      popup_title     = '批量更新选择'
      start_column    = '25'
      start_row       = '10'
    IMPORTING
      returncode      = lv_ret
    TABLES
      fields          = lt_field
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.

  IF lv_ret = 'A'.
    RETURN.
  ELSE.
    lv_bedat = VALUE #( lt_field[ 1 ]-value OPTIONAL ).
    lv_endat = VALUE #( lt_field[ 2 ]-value OPTIONAL ).
    lv_fevor = VALUE #( lt_field[ 3 ]-value OPTIONAL ).
  ENDIF.

  IF lv_bedat IS INITIAL OR lv_bedat IS INITIAL OR lv_fevor IS INITIAL.
    RETURN.
  ENDIF.

  LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE sel = 'X'.
    <fs_alv>-psttr = lv_bedat.
    <fs_alv>-pedtr = lv_endat.
    <fs_alv>-fevor = lv_fevor.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_change_order_arbpl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_AUFNR
*&      --> <FS_GROUP>_ARBPL
*&---------------------------------------------------------------------*
FORM frm_change_order_arbpl  USING  pv_aufnr TYPE aufnr
                                    pv_arbpl TYPE arbpl
                             CHANGING pv_mtype TYPE bapi_mtype
                                      pv_msg TYPE bapi_msg.

*  DATA:lt_routing TYPE cose_t_opr_change,
*       ls_routing TYPE cose_s_opr_change,
*       ls_return  TYPE bapiret2.
*
*  lv_aufnr = '000021067183'.
*  ls_routing-vornr = '0030'.
*  ls_routing-arbpl = 'DP2010'.
*  ls_routing-arbpl_x = 'X'.
*  ls_routing-ltxa1 = '壓鑄成形'.
*  ls_routing-ltxa1_x = 'X'.
*  ls_routing-vgw01 = 70.
*  ls_routing-vgw01_x = 'X'.
*  APPEND ls_routing TO lt_routing.
*
*
*  CALL FUNCTION 'CO_SE_PRODORD_OPR_CHANGE'
*    EXPORTING
*      iv_order_number = pv_aufnr
*      it_opr_change   = lt_routing
**     it_user_stat    =
*      iv_refresh      = 'X'
*      iv_order_post   = 'X'
*      iv_commit       = 'X'
*    IMPORTING
*      es_return       = ls_return.

ENDFORM.

INCLUDE :ZPPR0024_CLC

*&---------------------------------------------------------------------*
*& 包含               ZPPR0024_CLC
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&       Class lcl_event_receiver
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.
    METHODS handle_f4  FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname
                e_fieldvalue
                es_row_no
                er_event_data
                et_bad_cells.

    METHODS handle_modify
      FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.

ENDCLASS.
*&---------------------------------------------------------------------*
*&       Class (Implementation)  lcl_event_receiver
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_modify.
*    DATA stbl TYPE lvc_s_stbl.
*    DATA(lv_stlan) = VALUE mkal-stlan( ).
*    DATA(lv_verwe) = VALUE plko-verwe( ).
*
*
**    生产订单ZP01  对应BOM用途1,工艺路线用途1
**    生产订单ZP02  对应BOM用途2,工艺路线用途1
**    生产订单ZP03  对应BOM用途3,工艺路线用途1
**    生产订单ZP08  对应BOM用途Y,工艺路线用途Y
**    生产订单ZP09  对应BOM用途Y,工艺路线用途Y
*
*    IF gt_alv[] IS NOT INITIAL.
*      SELECT * INTO TABLE @DATA(lt_ztpp0020)
*        FROM ztpp0020
*        FOR ALL ENTRIES IN @gt_alv
*        WHERE fevor = @gt_alv-fevor.
*      SORT lt_ztpp0020 BY fevor.
*
*      LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>).
*        READ TABLE lt_ztpp0020 INTO DATA(lw_ztpp0020) WITH KEY fevor = <fs_alv>-fevor BINARY SEARCH.
*        IF sy-subrc EQ 0.
*          <fs_alv>-arbpl = lw_ztpp0020-arbpl.
*        ENDIF.
*      ENDLOOP.
*
*      SELECT mkal~matnr,
*             mkal~werks,
*             mkal~verid,
*             mkal~text1,
*             mkal~adatu,
*             mkal~stlan,"BOM用途
*             plko~verwe,"工艺路线用途
*             crhd~arbpl,
*             mkal~prfg_f,
*             mkal~prfg_s
*        INTO TABLE @DATA(lt_mkal)
*        FROM mkal INNER JOIN plko ON mkal~plnty = plko~plnty AND
*                                     mkal~plnnr = plko~plnnr AND
*                                     mkal~alnal = plko~plnal
*                  INNER JOIN plpo ON plpo~plnty = plko~plnty AND
*                                     plpo~plnnr = plko~plnnr AND
*                                     plpo~zaehl = plko~zaehl
*                  INNER JOIN crhd ON crhd~objid = plpo~arbid AND crhd~objty = 'A'
*        FOR ALL ENTRIES IN @gt_alv
*        WHERE mkal~matnr = @gt_alv-matnr AND
*              mkal~werks = @gt_alv-pwwrk AND
*              crhd~arbpl = @gt_alv-arbpl AND
*              mkal~bdatu >= @sy-datum AND
*              mkal~adatu <= @sy-datum AND
*              plko~loekz = ''.
*
*      SORT lt_mkal BY matnr werks arbpl DESCENDING.
*
*      LOOP AT gt_alv ASSIGNING <fs_alv>.
*
**        IF <fs_alv>-auart <> p_auart.
*          CASE <fs_alv>-auart.
*            WHEN 'ZP01'.
*              lv_stlan = '1'.
*              lv_verwe = '1'.
*            WHEN 'ZP02'.
*              lv_stlan = '2'.
*              lv_verwe = '1'.
*            WHEN 'ZP03'.
*              lv_stlan = '3'.
*              lv_verwe = '1'.
*            WHEN 'ZP08'.
*              lv_stlan = 'Y'.
*              lv_verwe = 'Y'.
*            WHEN 'ZP09'.
*              lv_stlan = 'Y'.
*              lv_verwe = 'Y'.
*            WHEN OTHERS.
*          ENDCASE.
**        ENDIF.
*
*        READ TABLE lt_mkal INTO DATA(lw_mkal) WITH KEY matnr = <fs_alv>-matnr werks = <fs_alv>-pwwrk arbpl = <fs_alv>-arbpl BINARY SEARCH.
*        IF sy-subrc EQ 0.
*          <fs_alv>-verid = lw_mkal-verid.
*          <fs_alv>-text1 = lw_mkal-text1.
*          <fs_alv>-prfg_f = lw_mkal-prfg_f.
*          <fs_alv>-prfg_s = lw_mkal-prfg_s.
*          IF lv_stlan <> lw_mkal-stlan OR lv_verwe <> lw_mkal-verwe.
*            CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
*          ENDIF.
*        ELSE.
*          CLEAR:<fs_alv>-verid,<fs_alv>-text1,<fs_alv>-prfg_f,<fs_alv>-prfg_s.
*        ENDIF.
*
*        IF <fs_alv>-aufnr IS NOT INITIAL OR <fs_alv>-zzorder IS NOT INITIAL..
*        ELSE.
*          IF <fs_alv>-verid IS INITIAL..
*            <fs_alv>-bapi_mtype = 'E'.
*            <fs_alv>-bapi_msg = '找不到生产版本'.
*          ELSE.
*            CLEAR:<fs_alv>-bapi_mtype,<fs_alv>-bapi_msg .
*          ENDIF.
*        ENDIF.
*      ENDLOOP.
*    ENDIF.


*   稳定刷新
*    stbl-row = 'X'." 基于行的稳定刷新
*    stbl-col = 'X'." 基于列稳定刷新
*
*    CALL METHOD ref_grid->refresh_table_display
*      EXPORTING
*        is_stable = stbl.
  ENDMETHOD.                    "HANDLE_MODIFY

  METHOD  handle_f4.
    CASE e_fieldname.
      WHEN 'FEVOR'.   "自定义的字段
        PERFORM frm_f4_help_fevor USING et_bad_cells
                                  es_row_no
                                  er_event_data
                                  "e_display
                                  e_fieldname   .
      WHEN 'DISPO'.
        PERFORM frm_f4_help_dispo USING et_bad_cells
                                   es_row_no
                                   er_event_data
                                   "e_display
                                   e_fieldname   .
    ENDCASE.
  ENDMETHOD.                    "
ENDCLASS.               "lcl_event_receiver

屏幕:9000

PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TC_TAB'
  MODULE tc_tab_change_tc_attr.
*&SPWIZARD: MODULE TC_TAB_CHANGE_COL_ATTR.
  LOOP AT   gt_tab
       INTO gw_tab
       WITH CONTROL tc_tab
       CURSOR tc_tab-current_line.
    MODULE tc_tab_get_lines.
*&SPWIZARD:   MODULE TC_TAB_CHANGE_FIELD_ATTR
  ENDLOOP.

  MODULE status_9000.
*
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TC_TAB'
  LOOP AT gt_tab.
    CHAIN.
      FIELD gw_tab-plnum.
      FIELD gw_tab-pwwrk.
      FIELD gw_tab-gsmng.
    ENDCHAIN.
  ENDLOOP.
  MODULE tc_tab_user_command.
*&SPWIZARD: MODULE TC_TAB_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TC_TAB_CHANGE_COL_ATTR.

  MODULE user_command_9000.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值