SAP OOALV enter回车事件开发

如何实现ooalv回车事件处理

1. 方法类的定义与实现

CLASS cl_event_receiver DEFINITION.
  PUBLIC SECTION.

    METHODS:
      handle_data_changed
        FOR EVENT data_changed OF cl_gui_alv_grid
        IMPORTING er_data_changed.

    METHODS:
      handle_data_changed_finished
        FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING et_good_cells.

    " ENTE时触发
    METHODS handle_enter
      FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.

    METHODS: handle_f4_help  FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname
                es_row_no
                er_event_data
                et_bad_cells
                e_display.


  PRIVATE SECTION.

ENDCLASS.                    "CL_EVENT_RECEIVER DEFINITION

CLASS cl_event_receiver IMPLEMENTATION.
  METHOD handle_data_changed.
    DATA gs_layout TYPE lvc_s_layo.
    DATA: lv_stable TYPE lvc_s_stbl.
*    IF er_data_changed->mt_good_cells IS NOT INITIAL.
*      READ TABLE er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
*      READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
*      IF sy-subrc = 0.
*        <gfs_outtab>-waerk = gs_header-waerk.
*      ENDIF.
*    ENDIF.
*
*    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
*    CALL METHOD cl_gui_cfw=>set_new_ok_code
*      EXPORTING
*        new_code = 'RELOAD'.
*
*    lv_stable-row = '1'.
*    lv_stable-col = '1'.
*
*    gs_layout-cwidth_opt = 'X'.
*
*    CALL METHOD go_grid->set_frontend_layout
*      EXPORTING
*        is_layout = gs_layout.
*
*    CALL METHOD go_grid->refresh_table_display
*      EXPORTING
*        is_stable = lv_stable.
*
*    CALL METHOD cl_gui_control=>set_focus
*      EXPORTING
*        control = go_grid.
*    CALL METHOD cl_gui_cfw=>flush.
  ENDMETHOD.

  METHOD handle_data_changed_finished.
    DATA gs_layout TYPE lvc_s_layo.
    DATA: lv_stable TYPE lvc_s_stbl.

    TYPES: BEGIN OF lty_combine,
             aland TYPE mlan-aland,
             taxkd TYPE knvi-taxkd,
             taxm1 TYPE mlan-taxm1,
           END OF lty_combine.

    DATA: lv_kunnr   TYPE kna1-kunnr,
          ls_knvv    TYPE knvv,
          ls_kna1    TYPE kna1,
          lt_knmt    TYPE TABLE OF knmt,
          ls_knmt    TYPE knmt,
          ls_tcurr   TYPE tcurr,
          lt_mlan    TYPE TABLE OF mlan,
          ls_mlan    TYPE mlan,
          lt_knvi    TYPE TABLE OF knvi,
          ls_knvi    TYPE knvi,
          lt_t007s   TYPE TABLE OF t007s,
          ls_t007s   TYPE t007s,
          lt_a002    TYPE TABLE OF a002,
          ls_a002    TYPE a002,
          lt_konp    TYPE TABLE OF konp,
          ls_konp    TYPE konp,
          lt_combine TYPE TABLE OF lty_combine,
          ls_combine TYPE lty_combine.

    CLEAR: lv_kunnr,
           ls_knvv,
           ls_kna1,
           lt_knmt,
           ls_knmt,
           ls_tcurr,
           lt_mlan,
           ls_mlan,
           lt_knvi,
           ls_knvi,
           lt_t007s,
           ls_t007s,
           lt_a002,
           ls_a002,
           lt_konp,
           ls_konp,
           lt_combine,
           ls_combine.

    lv_kunnr = gs_header-kunnr.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = lv_kunnr
      IMPORTING
        output = lv_kunnr.


    IF et_good_cells IS NOT INITIAL.
      READ TABLE et_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
      READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
      IF sy-subrc = 0.
        <gfs_outtab>-waerk = gs_header-waerk.

        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = <gfs_outtab>-matnr
          IMPORTING
            output       = <gfs_outtab>-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        SELECT * INTO TABLE lt_knmt
        FROM knmt
        WHERE matnr = <gfs_outtab>-matnr
          AND vkorg = gs_header-vkorg
          AND vtweg = gs_header-vtweg
          AND kunnr = lv_kunnr.

        SELECT * INTO TABLE lt_mlan
          FROM mlan
          WHERE matnr = <gfs_outtab>-matnr.

        SELECT * INTO TABLE lt_knvi
          FROM knvi
          WHERE kunnr = lv_kunnr
           AND tatyp = 'MWST'.

        LOOP AT lt_mlan INTO ls_mlan.
          READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
          IF ls_mlan-aland = ls_knvi-aland.
            ls_combine-aland = ls_mlan-aland.
            ls_combine-taxkd = ls_knvi-taxkd.
            ls_combine-taxm1 = ls_mlan-taxm1.
            COLLECT ls_combine INTO lt_combine.
            CLEAR: ls_combine.
          ENDIF.

        ENDLOOP.

        SELECT * INTO TABLE lt_a002
          FROM a002
          FOR ALL ENTRIES IN lt_combine
          WHERE kappl = 'V'
            AND kschl = 'MWST'
            AND aland = lt_combine-aland
            AND taxk1 = lt_combine-taxkd
            AND taxm1 = lt_combine-taxm1
            AND datbi >= sy-datum
            AND datab <= sy-datum.

        IF  lt_a002 IS NOT INITIAL.
          SELECT * INTO TABLE lt_konp
            FROM konp
            FOR ALL ENTRIES IN lt_a002
            WHERE knumh = lt_a002-knumh
              AND kappl = 'V'
              AND kschl = 'MWST'.
        ENDIF.

        SELECT SINGLE * INTO ls_tcurr
        FROM tcurr
        WHERE kurst = 'M'
          AND fcurr = gs_header-waerk
          AND tcurr = 'CNY'.

        <gfs_outtab>-waerk = gs_header-waerk. "货币
        IF <gfs_outtab>-zdyhl IS INITIAL.

          IF <gfs_outtab>-waerk = 'CNY'.
            <gfs_outtab>-zdyhl = '1.00000'. "当月汇率
          ELSE.
            <gfs_outtab>-zdyhl = ls_tcurr-ukurs. "
          ENDIF.
        ENDIF.

        IF <gfs_outtab>-zbjhl IS INITIAL.
          <gfs_outtab>-zbjhl = '1.00000'. "报价汇率
        ENDIF.

        IF <gfs_outtab>-kdmat IS INITIAL.

          READ TABLE lt_knmt INTO ls_knmt WITH KEY matnr = <gfs_outtab>-matnr.
          IF sy-subrc = 0.
            <gfs_outtab>-kdmat = ls_knmt-kdmat. "客户物料
          ENDIF.
        ENDIF.

        IF <gfs_outtab>-zhjsz IS INITIAL.

          READ TABLE lt_mlan INTO ls_mlan WITH KEY matnr = <gfs_outtab>-matnr.
          READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
          IF ls_mlan-aland = ls_knvi-aland.
            READ TABLE lt_a002 INTO ls_a002 WITH KEY aland = ls_mlan-aland
                                                     taxk1 = ls_knvi-taxkd
                                                     taxm1 = ls_mlan-taxm1.
            IF sy-subrc = 0.
              READ TABLE lt_konp INTO ls_konp WITH KEY knumh = ls_a002-knumh.
              IF sy-subrc = 0.
                <gfs_outtab>-zhjsz = ls_konp-mwsk1. "税种
              ENDIF.
            ENDIF.

          ENDIF.
        ENDIF.

        <gfs_outtab>-zxzj = <gfs_outtab>-zxjg + <gfs_outtab>-zxmjjg. "调整后总单价(未税) =  新产品售价(未税)+新模具分摊售价(未税)

        IF <gfs_outtab>-zyzj IS INITIAL.
          <gfs_outtab>-zjgbd = 0.
        ELSE.
          <gfs_outtab>-zjgbd = ( ( <gfs_outtab>-zxzj - <gfs_outtab>-zyzj ) / <gfs_outtab>-zyzj ) * 100. "价格变动比例 = 100* (【调整后总单价(未税)➖调整前总单价(未税)】/调整前总单价(未税) )
        ENDIF.

        IF <gfs_outtab>-zthsx IS INITIAL.
          <gfs_outtab>-zthsx = sy-datum. "调后生效日期
        ENDIF.

      ENDIF.
    ENDIF.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    lv_stable-row = 'X'.
    lv_stable-col = 'X'.

    gs_layout-cwidth_opt = 'X'.

    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.

    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = lv_stable.

    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = go_grid.
    CALL METHOD cl_gui_cfw=>flush.
  ENDMETHOD.

  " 实现ENTER 事件方法
  METHOD handle_enter.
    TYPES: BEGIN OF lty_data,
             zdjba   TYPE zsdt040a-zdjba,
             vkorg   TYPE zsdt040a-vkorg,
             zhjrq   TYPE zsdt040a-zhjrq,
             kunnr   TYPE zsdt040a-kunnr,
             vtweg   TYPE zsdt040a-vtweg,
             posnr   TYPE zsdt040b-posnr,
             matnr   TYPE zsdt040b-matnr,
             zyjg    TYPE zsdt040b-zyjg,
             zyjg1   TYPE zsdt040b-zyjg1,
             zyks    TYPE zsdt040b-zyks,
             zyjs    TYPE zsdt040b-zyjs,
             zyzj    TYPE zsdt040b-zyzj,
             ztqsx   TYPE zsdt040b-ztqsx,
             ztqsxrq TYPE zsdt040b-ztqsxrq,
           END OF lty_data.
    DATA gs_layout TYPE lvc_s_layo.
    DATA: lv_stable TYPE lvc_s_stbl.
    DATA: lt_makt TYPE TABLE OF makt,
          ls_makt TYPE makt,
          lt_mara TYPE TABLE OF mara,
          ls_mara TYPE mara,
          lt_head TYPE TABLE OF zsdt040a,
          ls_head TYPE zsdt040a,
          lt_data TYPE TABLE OF lty_data,
          ls_data TYPE lty_data.
    CLEAR: lv_stable,
           lt_makt,
           ls_makt,
           lt_mara,
           ls_mara,
           lt_head,
           ls_head,
           lt_data,
           ls_data.

    LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          input        = <gfs_outtab>-matnr
        IMPORTING
          output       = <gfs_outtab>-matnr
        EXCEPTIONS
          length_error = 1
          OTHERS       = 2.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

    ENDLOOP.

    IF gt_outtab IS NOT INITIAL.
      SELECT * INTO TABLE lt_makt
        FROM makt
        FOR ALL ENTRIES IN gt_outtab
        WHERE matnr = gt_outtab-matnr
          AND spras = sy-langu.

      SELECT * INTO TABLE lt_mara
        FROM mara
        FOR ALL ENTRIES IN gt_outtab
        WHERE matnr = gt_outtab-matnr.
    ENDIF.

    SELECT zsdt040a~zdjba
           zsdt040a~vkorg
           zsdt040a~zhjrq
           zsdt040a~kunnr
           zsdt040a~vtweg
           zsdt040b~posnr
           zsdt040b~matnr
           zsdt040b~zyjg
           zsdt040b~zyjg1
           zsdt040b~zyks
           zsdt040b~zyjs
           zsdt040b~zyzj
           zsdt040b~ztqsx
           zsdt040b~ztqsxrq
      INTO TABLE lt_data
      FROM zsdt040a INNER JOIN zsdt040b ON zsdt040a~zdjba = zsdt040b~zdjba
      FOR ALL ENTRIES IN gt_outtab
      WHERE vkorg = gs_header-vkorg
        AND kunnr = gs_header-kunnr
        AND vtweg = gs_header-vtweg
        AND matnr = gt_outtab-matnr.
    SORT lt_data BY zhjrq DESCENDING.

    LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
      READ TABLE lt_makt INTO ls_makt WITH KEY matnr = <gfs_outtab>-matnr.
      IF sy-subrc = 0.
        <gfs_outtab>-maktx = ls_makt-maktx. "物料描述
      ENDIF.

      READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <gfs_outtab>-matnr.
      IF sy-subrc = 0.
        <gfs_outtab>-zprodmodel = ls_mara-zprodmodel. "规格型号
        <gfs_outtab>-meins = ls_mara-meins. "单位
      ENDIF.

      IF gs_header-status <> '1' AND gs_header-status <> '2' AND gs_header-status <> '4'.
        READ TABLE lt_data INTO ls_data WITH KEY matnr = <gfs_outtab>-matnr.
        IF sy-subrc = 0.
          <gfs_outtab>-zyjg    = ls_data-zyjg.
          <gfs_outtab>-zyjg1   = ls_data-zyjg1.
          <gfs_outtab>-zyks    = ls_data-zyks.
          <gfs_outtab>-zyjs    = ls_data-zyjs.
          <gfs_outtab>-zyzj    = ls_data-zyzj.
          <gfs_outtab>-ztqsx   = ls_data-ztqsx.
          <gfs_outtab>-ztqsxrq = ls_data-ztqsxrq.
        ENDIF.
      ENDIF.

    ENDLOOP.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    lv_stable-row = 'X'.
    lv_stable-col = 'X'.

    gs_layout-cwidth_opt = 'X'.

    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.

    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = lv_stable.

    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = go_grid.
    CALL METHOD cl_gui_cfw=>flush.

  ENDMETHOD.                    "HANDLE_MODIFY

  METHOD handle_f4_help.
    FIELD-SYMBOLS:<fs_outtab> LIKE LINE OF gt_outtab.
    CASE e_fieldname.
      WHEN 'ZJGLX'.
        READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
        IF sy-subrc = 0.
          PERFORM frm_get_arktx_f4 CHANGING <fs_outtab>-zjglx.
        ENDIF.
      WHEN 'ZHJSZ'.
        READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
        IF sy-subrc = 0.
          PERFORM frm_get_zhjsz_f4 CHANGING <fs_outtab>-zhjsz.
        ENDIF.
      WHEN OTHERS.
    ENDCASE.
    CALL METHOD go_grid->refresh_table_display.
  ENDMETHOD.

ENDCLASS.                    "cl_event_receiver IMPLEMENTATION

DATA: lo_event TYPE REF TO cl_event_receiver.

2. PBO和PAI实现

PROCESS BEFORE OUTPUT.
  MODULE status_9001.
*
PROCESS AFTER INPUT.
  MODULE user_eixt AT EXIT-COMMAND.
  CHAIN.
    FIELD gs_header-kunnr MODULE change_data ON CHAIN-REQUEST.
  ENDCHAIN.
  MODULE user_command_9001.

3. PBO MODULE代码实现

*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
  DATA: rt_extab TYPE slis_t_extab,
        ls_extab TYPE slis_extab.

  IF gs_header-status <> '0'. "修改按钮是否灰掉状态控制
    ls_extab-fcode = '&EDIT'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.
  ENDIF.

  IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
    ls_extab-fcode = '&SAVE'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.

    ls_extab-fcode = '&SUBMIT'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.
  ENDIF.

  IF gs_header-status <> '2'. "反审核按钮是否灰掉状态控制
    ls_extab-fcode = '&RECHECK'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.
  ENDIF.

  ls_extab-fcode = 'SAVE'.
  APPEND ls_extab TO rt_extab.
  CLEAR: ls_extab.

  SET PF-STATUS 'PF-STATUS9001' EXCLUDING rt_extab.
  SET TITLEBAR 'TITLEBAR9001'.

  IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
    LOOP AT SCREEN.
      IF screen-name = 'GS_HEADER-ZKHJL' OR screen-name = 'GS_HEADER-VKORG'
        OR screen-name = 'GS_HEADER-ZHJRQ' OR screen-name = 'GS_HEADER-KUNNR'
        OR screen-name = 'GS_HEADER-WAERK' OR screen-name = 'GS_HEADER-VTWEG'
        OR screen-name = 'GS_HEADER-ZGCML' OR screen-name = 'GS_HEADER-ZSJML'
        OR screen-name = 'GS_HEADER-ZSFMJ'.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

*  明细行展示
* 初始化
  PERFORM frm_instantiation.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_instantiation
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_instantiation .
  DATA: ls_stbl   TYPE lvc_s_stbl,
        ls_layout TYPE lvc_s_layo.

*  PERFORM frm_set_fieldcat_9001.

  IF go_container IS INITIAL.
    CREATE OBJECT go_container
      EXPORTING
        container_name = 'CONT'.

    CREATE OBJECT go_grid
      EXPORTING
        i_parent = go_container.

* ALV展示
*
*    CALL METHOD cl_gui_cfw=>set_new_ok_code
*      EXPORTING
*        new_code = '&REFRESH'.
    PERFORM frm_display.
  ELSE.
*    IF go_container IS NOT INITIAL.

*      CREATE OBJECT go_grid
*      EXPORTING
*        i_parent = go_container.
    IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
      CALL METHOD go_grid->set_ready_for_input
        EXPORTING
          i_ready_for_input = 0.
    ENDIF.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    ls_layout-cwidth_opt = 'X'.
    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = ls_layout.
    ls_stbl-row = 'X'." 基于行的稳定刷新
    ls_stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl
      EXCEPTIONS
        finished  = 1
        OTHERS    = 2.
    CALL METHOD cl_gui_cfw=>flush.

*    ENDIF.
  ENDIF.

ENDFORM.

4. 注册事件实现

DATA: g_tool_data TYPE scc_wb_tool_data.
  DATA: ls_layout   TYPE lvc_s_layo,
        lt_fieldcat TYPE TABLE OF lvc_s_fcat,
        ls_fieldcat TYPE lvc_s_fcat,
        ls_stbl     TYPE lvc_s_stbl.
  DATA:lt_f4 TYPE lvc_t_f4,
       ls_f4 TYPE lvc_s_f4.
  FIELD-SYMBOLS: <lfs_fieldcat> TYPE lvc_s_fcat.


DEFINE d1.
    ls_fieldcat-fieldname = &1.
    ls_fieldcat-scrtext_l = &2.
    ls_fieldcat-edit = &3.
    ls_fieldcat-intlen = &4.
    ls_fieldcat-outputlen = &5.
    APPEND ls_fieldcat TO lt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

    d1: 'POSNR' '序号' '' 10 10.
    d1:'MATNR' '物料编码' '' 40 40.
    d1:'MAKTX' '物料名称' '' 40 40.
    d1:'ZPRODMODEL' '产品型号' '' 50 50.
    d1:'MEINS' '单位' '' 10 10.
    d1: 'ZJGLX' '价格类型' '' 10 10.
    d1: 'ZHJSZ' '税种' '' 2 2.

LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'MATNR'.
    <lfs_fieldcat>-ref_table = 'MARA'.
    <lfs_fieldcat>-ref_field = 'MATNR'.
    <lfs_fieldcat>-dd_outlen = 40.
    IF sy-langu = '1'.
      <lfs_fieldcat>-coltext = '物料编码'.
    ELSE.
      <lfs_fieldcat>-coltext = 'Material No'.
    ENDIF.
  ENDLOOP.

LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZJGLX' OR fieldname = 'ZHJSZ'. "价格类型搜索帮助
    <lfs_fieldcat>-f4availabl = 'X'.
  ENDLOOP.

CREATE OBJECT lo_event.
*   注册事件handler方法
  SET HANDLER lo_event->handle_enter FOR go_grid.
  SET HANDLER lo_event->handle_data_changed FOR go_grid.
  SET HANDLER lo_event->handle_data_changed_finished FOR go_grid.

  CALL METHOD go_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  CALL METHOD go_grid->register_edit_event "为ALV_GRID设置enter事件
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      is_layout       = ls_layout
    CHANGING
      it_fieldcatalog = lt_fieldcat
      it_outtab       = gt_outtab[].

* Set editable cells to ready for input initially
  CALL METHOD go_grid->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

CLEAR:ls_f4.
  ls_f4-fieldname  = 'ZJGLX'. "价格类型搜索帮助
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = ''.
  ls_f4-internal   = ''.
  INSERT ls_f4 INTO TABLE lt_f4.

  CLEAR:ls_f4.
  ls_f4-fieldname  = 'ZHJSZ'. "价格类型搜索帮助
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = ''.
  ls_f4-internal   = ''.
  INSERT ls_f4 INTO TABLE lt_f4.
  CALL METHOD go_grid->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4.

  SET HANDLER lo_event->handle_f4_help FOR go_grid .

IF go_container IS NOT INITIAL.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    ls_layout-cwidth_opt = 'X'.
    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = ls_layout.
    ls_stbl-row = 'X'." 基于行的稳定刷新
    ls_stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl
      EXCEPTIONS
        finished  = 1
        OTHERS    = 2.
    CALL METHOD cl_gui_cfw=>flush.

  ENDIF.

完整代码实现如下:

*&---------------------------------------------------------------------*
*& Report ZSD040
*&---------------------------------------------------------------------*
*&销售核价平台
*&---------------------------------------------------------------------*
REPORT zsd040.
*--------------------------------------------------------------------*
*变量定义
*--------------------------------------------------------------------*
TYPE-POOLS:icon.
TABLES: vbak, zsdt040a, zsdt040b.
DATA: ok_code   TYPE sy-ucomm,
      gt_header TYPE TABLE OF zsdt040a,
      gs_header TYPE zsdt040a,
      gt_item   TYPE TABLE OF zsdt040b,
      gs_item   TYPE zsdt040b,
      gv_vtext  TYPE tvkot-vtext. "销售组织名称
DATA: gv_vtext_jt TYPE tvk6t-vtext, "集团
      gv_vtext_hy TYPE tbrct-vtext. "行业

DATA: go_grid      TYPE REF TO cl_gui_alv_grid,
      go_container TYPE REF TO cl_gui_custom_container.
CLASS cl_event_receiver DEFINITION DEFERRED.
DATA: g_verifier TYPE REF TO cl_event_receiver.

DATA: gt_outtab TYPE TABLE OF zsdt040b.
DATA: gs_outtab TYPE zsdt040b.
DATA: initial_table TYPE c.
DATA: error_in_data TYPE c.

*DATA: lt_fieldcat TYPE TABLE OF lvc_s_fcat,
*      ls_fieldcat TYPE lvc_s_fcat.

TYPES: BEGIN OF gty_alv,
         sel         TYPE c LENGTH 1, "选择
         msg_type    TYPE c, "消息类型
         msg_status  TYPE c LENGTH 4, "消息状态
         message     TYPE bapi_msg,  "消息
         knumv       TYPE knumv, "定价记录号
         kschl       TYPE kscha, "条件类型
         zdjba       TYPE zdjba, "单据编号
         posnr       TYPE posnr, "行项目编号
         kunnr       TYPE kna1-kunnr, "客户
         name1       TYPE c LENGTH 70, "客户名称
         vkorg       TYPE vbak-vkorg, "销售组织
         vtext       TYPE tvkot-vtext, "销售组织描述
         status      TYPE zsdt040a-status, "单据状态
         status_text TYPE c LENGTH 10, "单据状态描述
         vtweg       TYPE vbak-vtweg, "分销渠道
         matnr       TYPE mara-matnr, "物料
         meins       TYPE mara-meins, "单位
         zyjg        TYPE zsdt040b-zyjg, "原商品售价(未税)
         zysl        TYPE zsdt040b-zysl, "原分摊数量
         zyks        TYPE zsdt040b-zyks, "原模具分摊日期起始日期
         zyjs        TYPE zsdt040b-zyjs, "原分摊日期截止日期
         zthsxrq     TYPE zsdt040b-zthsxrq, "调后失效日期
         zthsx       TYPE zsdt040b-zthsx, "调后生效日期
         waerk       TYPE zsdt040b-waerk, "币别
         zxzj        TYPE zsdt040b-zxzj, "调整后总单价(未税)
       END OF gty_alv.

DATA: gt_structure TYPE lvc_t_fcat,
      gs_structure TYPE lvc_s_fcat,
      gs_layout    TYPE lvc_s_layo,
      gt_alv       TYPE TABLE OF gty_alv,
      gs_alv       TYPE gty_alv,
      gv_upd       TYPE c.

CONSTANTS: gc_red TYPE char04 VALUE '@0A@'. "红色
CONSTANTS: gc_green TYPE char04 VALUE '@08@'. "绿色
CONSTANTS: gc_yellow TYPE char04 VALUE '@09@'. "黄色
CONSTANTS: gc_grey TYPE char04 VALUE '@EB@'. "灰色

FIELD-SYMBOLS: <gfs_outtab> TYPE zsdt040b.

CLASS cl_event_receiver DEFINITION.
  PUBLIC SECTION.

    METHODS:
      handle_data_changed
        FOR EVENT data_changed OF cl_gui_alv_grid
        IMPORTING er_data_changed.

    METHODS:
      handle_data_changed_finished
        FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING et_good_cells.

    " ENTE时触发
    METHODS handle_enter
      FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.

    METHODS: handle_f4_help  FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname
                es_row_no
                er_event_data
                et_bad_cells
                e_display.


  PRIVATE SECTION.

ENDCLASS.                    "CL_EVENT_RECEIVER DEFINITION

CLASS cl_event_receiver IMPLEMENTATION.
  METHOD handle_data_changed.
    DATA gs_layout TYPE lvc_s_layo.
    DATA: lv_stable TYPE lvc_s_stbl.
*    IF er_data_changed->mt_good_cells IS NOT INITIAL.
*      READ TABLE er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
*      READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
*      IF sy-subrc = 0.
*        <gfs_outtab>-waerk = gs_header-waerk.
*      ENDIF.
*    ENDIF.
*
*    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
*    CALL METHOD cl_gui_cfw=>set_new_ok_code
*      EXPORTING
*        new_code = 'RELOAD'.
*
*    lv_stable-row = '1'.
*    lv_stable-col = '1'.
*
*    gs_layout-cwidth_opt = 'X'.
*
*    CALL METHOD go_grid->set_frontend_layout
*      EXPORTING
*        is_layout = gs_layout.
*
*    CALL METHOD go_grid->refresh_table_display
*      EXPORTING
*        is_stable = lv_stable.
*
*    CALL METHOD cl_gui_control=>set_focus
*      EXPORTING
*        control = go_grid.
*    CALL METHOD cl_gui_cfw=>flush.
  ENDMETHOD.

  METHOD handle_data_changed_finished.
    DATA gs_layout TYPE lvc_s_layo.
    DATA: lv_stable TYPE lvc_s_stbl.

    TYPES: BEGIN OF lty_combine,
             aland TYPE mlan-aland,
             taxkd TYPE knvi-taxkd,
             taxm1 TYPE mlan-taxm1,
           END OF lty_combine.

    DATA: lv_kunnr   TYPE kna1-kunnr,
          ls_knvv    TYPE knvv,
          ls_kna1    TYPE kna1,
          lt_knmt    TYPE TABLE OF knmt,
          ls_knmt    TYPE knmt,
          ls_tcurr   TYPE tcurr,
          lt_mlan    TYPE TABLE OF mlan,
          ls_mlan    TYPE mlan,
          lt_knvi    TYPE TABLE OF knvi,
          ls_knvi    TYPE knvi,
          lt_t007s   TYPE TABLE OF t007s,
          ls_t007s   TYPE t007s,
          lt_a002    TYPE TABLE OF a002,
          ls_a002    TYPE a002,
          lt_konp    TYPE TABLE OF konp,
          ls_konp    TYPE konp,
          lt_combine TYPE TABLE OF lty_combine,
          ls_combine TYPE lty_combine.

    CLEAR: lv_kunnr,
           ls_knvv,
           ls_kna1,
           lt_knmt,
           ls_knmt,
           ls_tcurr,
           lt_mlan,
           ls_mlan,
           lt_knvi,
           ls_knvi,
           lt_t007s,
           ls_t007s,
           lt_a002,
           ls_a002,
           lt_konp,
           ls_konp,
           lt_combine,
           ls_combine.

    lv_kunnr = gs_header-kunnr.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = lv_kunnr
      IMPORTING
        output = lv_kunnr.


    IF et_good_cells IS NOT INITIAL.
      READ TABLE et_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
      READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
      IF sy-subrc = 0.
        <gfs_outtab>-waerk = gs_header-waerk.

        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = <gfs_outtab>-matnr
          IMPORTING
            output       = <gfs_outtab>-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        SELECT * INTO TABLE lt_knmt
        FROM knmt
        WHERE matnr = <gfs_outtab>-matnr
          AND vkorg = gs_header-vkorg
          AND vtweg = gs_header-vtweg
          AND kunnr = lv_kunnr.

        SELECT * INTO TABLE lt_mlan
          FROM mlan
          WHERE matnr = <gfs_outtab>-matnr.

        SELECT * INTO TABLE lt_knvi
          FROM knvi
          WHERE kunnr = lv_kunnr
           AND tatyp = 'MWST'.

        LOOP AT lt_mlan INTO ls_mlan.
          READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
          IF ls_mlan-aland = ls_knvi-aland.
            ls_combine-aland = ls_mlan-aland.
            ls_combine-taxkd = ls_knvi-taxkd.
            ls_combine-taxm1 = ls_mlan-taxm1.
            COLLECT ls_combine INTO lt_combine.
            CLEAR: ls_combine.
          ENDIF.

        ENDLOOP.

        SELECT * INTO TABLE lt_a002
          FROM a002
          FOR ALL ENTRIES IN lt_combine
          WHERE kappl = 'V'
            AND kschl = 'MWST'
            AND aland = lt_combine-aland
            AND taxk1 = lt_combine-taxkd
            AND taxm1 = lt_combine-taxm1
            AND datbi >= sy-datum
            AND datab <= sy-datum.

        IF  lt_a002 IS NOT INITIAL.
          SELECT * INTO TABLE lt_konp
            FROM konp
            FOR ALL ENTRIES IN lt_a002
            WHERE knumh = lt_a002-knumh
              AND kappl = 'V'
              AND kschl = 'MWST'.
        ENDIF.

        SELECT SINGLE * INTO ls_tcurr
        FROM tcurr
        WHERE kurst = 'M'
          AND fcurr = gs_header-waerk
          AND tcurr = 'CNY'.

        <gfs_outtab>-waerk = gs_header-waerk. "货币
        IF <gfs_outtab>-zdyhl IS INITIAL.

          IF <gfs_outtab>-waerk = 'CNY'.
            <gfs_outtab>-zdyhl = '1.00000'. "当月汇率
          ELSE.
            <gfs_outtab>-zdyhl = ls_tcurr-ukurs. "
          ENDIF.
        ENDIF.

        IF <gfs_outtab>-zbjhl IS INITIAL.
          <gfs_outtab>-zbjhl = '1.00000'. "报价汇率
        ENDIF.

        IF <gfs_outtab>-kdmat IS INITIAL.

          READ TABLE lt_knmt INTO ls_knmt WITH KEY matnr = <gfs_outtab>-matnr.
          IF sy-subrc = 0.
            <gfs_outtab>-kdmat = ls_knmt-kdmat. "客户物料
          ENDIF.
        ENDIF.

        IF <gfs_outtab>-zhjsz IS INITIAL.

          READ TABLE lt_mlan INTO ls_mlan WITH KEY matnr = <gfs_outtab>-matnr.
          READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
          IF ls_mlan-aland = ls_knvi-aland.
            READ TABLE lt_a002 INTO ls_a002 WITH KEY aland = ls_mlan-aland
                                                     taxk1 = ls_knvi-taxkd
                                                     taxm1 = ls_mlan-taxm1.
            IF sy-subrc = 0.
              READ TABLE lt_konp INTO ls_konp WITH KEY knumh = ls_a002-knumh.
              IF sy-subrc = 0.
                <gfs_outtab>-zhjsz = ls_konp-mwsk1. "税种
              ENDIF.
            ENDIF.

          ENDIF.
        ENDIF.

        <gfs_outtab>-zxzj = <gfs_outtab>-zxjg + <gfs_outtab>-zxmjjg. "调整后总单价(未税) =  新产品售价(未税)+新模具分摊售价(未税)

        IF <gfs_outtab>-zyzj IS INITIAL.
          <gfs_outtab>-zjgbd = 0.
        ELSE.
          <gfs_outtab>-zjgbd = ( ( <gfs_outtab>-zxzj - <gfs_outtab>-zyzj ) / <gfs_outtab>-zyzj ) * 100. "价格变动比例 = 100* (【调整后总单价(未税)➖调整前总单价(未税)】/调整前总单价(未税) )
        ENDIF.

        IF <gfs_outtab>-zthsx IS INITIAL.
          <gfs_outtab>-zthsx = sy-datum. "调后生效日期
        ENDIF.

      ENDIF.
    ENDIF.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    lv_stable-row = 'X'.
    lv_stable-col = 'X'.

    gs_layout-cwidth_opt = 'X'.

    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.

    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = lv_stable.

    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = go_grid.
    CALL METHOD cl_gui_cfw=>flush.
  ENDMETHOD.

  " 实现ENTER 事件方法
  METHOD handle_enter.
    TYPES: BEGIN OF lty_data,
             zdjba   TYPE zsdt040a-zdjba,
             vkorg   TYPE zsdt040a-vkorg,
             zhjrq   TYPE zsdt040a-zhjrq,
             kunnr   TYPE zsdt040a-kunnr,
             vtweg   TYPE zsdt040a-vtweg,
             posnr   TYPE zsdt040b-posnr,
             matnr   TYPE zsdt040b-matnr,
             zyjg    TYPE zsdt040b-zyjg,
             zyjg1   TYPE zsdt040b-zyjg1,
             zyks    TYPE zsdt040b-zyks,
             zyjs    TYPE zsdt040b-zyjs,
             zyzj    TYPE zsdt040b-zyzj,
             ztqsx   TYPE zsdt040b-ztqsx,
             ztqsxrq TYPE zsdt040b-ztqsxrq,
           END OF lty_data.
    DATA gs_layout TYPE lvc_s_layo.
    DATA: lv_stable TYPE lvc_s_stbl.
    DATA: lt_makt TYPE TABLE OF makt,
          ls_makt TYPE makt,
          lt_mara TYPE TABLE OF mara,
          ls_mara TYPE mara,
          lt_head TYPE TABLE OF zsdt040a,
          ls_head TYPE zsdt040a,
          lt_data TYPE TABLE OF lty_data,
          ls_data TYPE lty_data.
    CLEAR: lv_stable,
           lt_makt,
           ls_makt,
           lt_mara,
           ls_mara,
           lt_head,
           ls_head,
           lt_data,
           ls_data.

    LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          input        = <gfs_outtab>-matnr
        IMPORTING
          output       = <gfs_outtab>-matnr
        EXCEPTIONS
          length_error = 1
          OTHERS       = 2.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

    ENDLOOP.

    IF gt_outtab IS NOT INITIAL.
      SELECT * INTO TABLE lt_makt
        FROM makt
        FOR ALL ENTRIES IN gt_outtab
        WHERE matnr = gt_outtab-matnr
          AND spras = sy-langu.

      SELECT * INTO TABLE lt_mara
        FROM mara
        FOR ALL ENTRIES IN gt_outtab
        WHERE matnr = gt_outtab-matnr.
    ENDIF.

    SELECT zsdt040a~zdjba
           zsdt040a~vkorg
           zsdt040a~zhjrq
           zsdt040a~kunnr
           zsdt040a~vtweg
           zsdt040b~posnr
           zsdt040b~matnr
           zsdt040b~zyjg
           zsdt040b~zyjg1
           zsdt040b~zyks
           zsdt040b~zyjs
           zsdt040b~zyzj
           zsdt040b~ztqsx
           zsdt040b~ztqsxrq
      INTO TABLE lt_data
      FROM zsdt040a INNER JOIN zsdt040b ON zsdt040a~zdjba = zsdt040b~zdjba
      FOR ALL ENTRIES IN gt_outtab
      WHERE vkorg = gs_header-vkorg
        AND kunnr = gs_header-kunnr
        AND vtweg = gs_header-vtweg
        AND matnr = gt_outtab-matnr.
    SORT lt_data BY zhjrq DESCENDING.

    LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
      READ TABLE lt_makt INTO ls_makt WITH KEY matnr = <gfs_outtab>-matnr.
      IF sy-subrc = 0.
        <gfs_outtab>-maktx = ls_makt-maktx. "物料描述
      ENDIF.

      READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <gfs_outtab>-matnr.
      IF sy-subrc = 0.
        <gfs_outtab>-zprodmodel = ls_mara-zprodmodel. "规格型号
        <gfs_outtab>-meins = ls_mara-meins. "单位
      ENDIF.

      IF gs_header-status <> '1' AND gs_header-status <> '2' AND gs_header-status <> '4'.
        READ TABLE lt_data INTO ls_data WITH KEY matnr = <gfs_outtab>-matnr.
        IF sy-subrc = 0.
          <gfs_outtab>-zyjg    = ls_data-zyjg.
          <gfs_outtab>-zyjg1   = ls_data-zyjg1.
          <gfs_outtab>-zyks    = ls_data-zyks.
          <gfs_outtab>-zyjs    = ls_data-zyjs.
          <gfs_outtab>-zyzj    = ls_data-zyzj.
          <gfs_outtab>-ztqsx   = ls_data-ztqsx.
          <gfs_outtab>-ztqsxrq = ls_data-ztqsxrq.
        ENDIF.
      ENDIF.

    ENDLOOP.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    lv_stable-row = 'X'.
    lv_stable-col = 'X'.

    gs_layout-cwidth_opt = 'X'.

    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.

    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = lv_stable.

    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = go_grid.
    CALL METHOD cl_gui_cfw=>flush.

  ENDMETHOD.                    "HANDLE_MODIFY

  METHOD handle_f4_help.
    FIELD-SYMBOLS:<fs_outtab> LIKE LINE OF gt_outtab.
    CASE e_fieldname.
      WHEN 'ZJGLX'.
        READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
        IF sy-subrc = 0.
          PERFORM frm_get_arktx_f4 CHANGING <fs_outtab>-zjglx.
        ENDIF.
      WHEN 'ZHJSZ'.
        READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
        IF sy-subrc = 0.
          PERFORM frm_get_zhjsz_f4 CHANGING <fs_outtab>-zhjsz.
        ENDIF.
      WHEN OTHERS.
    ENDCASE.
    CALL METHOD go_grid->refresh_table_display.
  ENDMETHOD.

ENDCLASS.                    "cl_event_receiver IMPLEMENTATION

DATA: lo_event TYPE REF TO cl_event_receiver.

*--------------------------------------------------------------------*
*选择屏幕
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS: p_r1 TYPE c RADIOBUTTON GROUP grp USER-COMMAND uc DEFAULT 'X'. "核价申请
    SELECTION-SCREEN COMMENT 2(23) TEXT-002 FOR FIELD p_r1.
    PARAMETERS: p_r2 TYPE c RADIOBUTTON GROUP grp. "核价清单
    SELECTION-SCREEN COMMENT 27(23) TEXT-003 FOR FIELD p_r2.
  SELECTION-SCREEN END OF LINE.

  PARAMETERS: p_vkorg TYPE vbak-vkorg MODIF ID md1.

  SELECT-OPTIONS: s_zdjba FOR zsdt040a-zdjba MODIF ID md2 MATCHCODE OBJECT zdjba_esh, "核价单号
                  s_zhjrq FOR zsdt040a-zhjrq MODIF ID md2, "核价日期
                  s_kunnr FOR zsdt040a-kunnr MODIF ID md2, "客户
                  s_vkorg FOR zsdt040a-vkorg MODIF ID md2, "销售组织
                  s_status FOR zsdt040a-status MODIF ID md2. "审批状态

SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  PERFORM frm_init.

AT SELECTION-SCREEN OUTPUT.
  PERFORM frm_set_attribute.

AT SELECTION-SCREEN.
  PERFORM frm_check_input.

START-OF-SELECTION.
  IF p_r1 IS NOT INITIAL. "核价申请
    PERFORM frm_get_data.
    CALL SCREEN 9001.
  ELSE. "核价清单
*    PERFORM frm_set_fieldcat.
*
*    PERFORM frm_set_layout.
*
*    PERFORM frm_get_data_list.
*
*    PERFORM frm_display_alv_list.
    SUBMIT zsd040a USING SELECTION-SCREEN '1000'
                    WITH s_zdjba IN s_zdjba
                    WITH s_zhjrq IN s_zhjrq
                    WITH s_kunnr IN s_kunnr
                    WITH s_vkorg IN s_vkorg
                    WITH s_status IN s_status
                    AND RETURN.
  ENDIF.

*&---------------------------------------------------------------------*
*& Form frm_init
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init .
  DATA: ls_header TYPE zsdt040a,
        lt_outtab TYPE TABLE OF zsdt040b,
        lv_upd    TYPE c.

  CLEAR: gt_header,
         gs_header,
         gt_item,
         gs_item,
         gt_structure,
         gs_structure,
         gs_layout,
         gt_alv,
         gs_alv,
         ls_header,
         lt_outtab,
         gv_upd,
         lv_upd.

  IMPORT ls_header FROM MEMORY ID 'ZSD040A-1'.
  IMPORT lt_outtab FROM MEMORY ID 'ZSD040A-2'.
  IMPORT lv_upd FROM MEMORY ID 'ZSD040A-3'.

  gs_header = ls_header.
  gt_outtab = lt_outtab.
  gv_upd = lv_upd.

  FREE MEMORY ID  'ZSD040A-1'.
  FREE MEMORY ID  'ZSD040A-2'.
  FREE MEMORY ID  'ZSD040A-3'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_attribute
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_attribute .
  LOOP AT SCREEN.
    IF p_r1 IS NOT INITIAL.
      IF screen-group1 = 'MD2'.
        screen-invisible = 1.
        screen-active = 0.
        screen-required = 0.
      ELSE.
        screen-invisible = 0.
        screen-active = 1.
        screen-required = 2.
      ENDIF.
    ELSE.
      IF screen-group1 = 'MD1'.
        screen-invisible = 1.
        screen-active = 0.
      ELSE.
        screen-invisible = 0.
        screen-active = 1.
        IF screen-name = 'S_ZHJRQ-LOW'.
          screen-required = 2.
        ENDIF.
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_input
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_input .
  IF sy-ucomm <> 'UC' AND
     sy-ucomm <> '%011'.
    IF p_r1 IS NOT INITIAL.
      IF p_vkorg IS INITIAL.
        IF sy-langu = '1'.
          MESSAGE '在必填字段 "销售组织" 中进行输入' TYPE 'E'.
        ELSE.
          MESSAGE 'Make an entry in mandatory field "Sales Organization"' TYPE 'E'.
        ENDIF.

      ENDIF.
    ELSE.
      IF s_zhjrq[] IS INITIAL.
        IF sy-langu = '1'.
          MESSAGE '在必填字段 "核价日期" 中进行输入' TYPE 'E'.
        ELSE.
          MESSAGE 'Make an entry in mandatory field "Valuation date"' TYPE 'E'.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.

*  权限检查
  IF p_r1 IS NOT INITIAL.
    AUTHORITY-CHECK OBJECT 'V_VBRK_VKO'
    ID 'VKORG' FIELD p_vkorg
    ID 'ACTVT' FIELD '03'.
    IF sy-subrc <> 0.
      IF sy-langu = '1'.
        MESSAGE '您没有权限,请联系管理员' TYPE 'E'.
      ELSE.
        MESSAGE 'You do not have permission, please contact the administrator' TYPE 'E'.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
  DATA: rt_extab TYPE slis_t_extab,
        ls_extab TYPE slis_extab.

  IF gs_header-status <> '0'. "修改按钮是否灰掉状态控制
    ls_extab-fcode = '&EDIT'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.
  ENDIF.

  IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
    ls_extab-fcode = '&SAVE'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.

    ls_extab-fcode = '&SUBMIT'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.
  ENDIF.

  IF gs_header-status <> '2'. "反审核按钮是否灰掉状态控制
    ls_extab-fcode = '&RECHECK'.
    APPEND ls_extab TO rt_extab.
    CLEAR: ls_extab.
  ENDIF.

  ls_extab-fcode = 'SAVE'.
  APPEND ls_extab TO rt_extab.
  CLEAR: ls_extab.

  SET PF-STATUS 'PF-STATUS9001' EXCLUDING rt_extab.
  SET TITLEBAR 'TITLEBAR9001'.

  IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
    LOOP AT SCREEN.
      IF screen-name = 'GS_HEADER-ZKHJL' OR screen-name = 'GS_HEADER-VKORG'
        OR screen-name = 'GS_HEADER-ZHJRQ' OR screen-name = 'GS_HEADER-KUNNR'
        OR screen-name = 'GS_HEADER-WAERK' OR screen-name = 'GS_HEADER-VTWEG'
        OR screen-name = 'GS_HEADER-ZGCML' OR screen-name = 'GS_HEADER-ZSJML'
        OR screen-name = 'GS_HEADER-ZSFMJ'.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

*  明细行展示
* 初始化
  PERFORM frm_instantiation.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_EIXT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_eixt INPUT.
  CLEAR: ok_code.
  ok_code = sy-ucomm.
  CASE ok_code.
    WHEN 'EXIT' OR 'BACK' OR 'CANCEL'.
      CLEAR: gs_header,
             gt_outtab,
             gs_outtab,
             go_grid,
             go_container.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
  TYPES: BEGIN OF lty_combine,
           aland TYPE mlan-aland,
           taxkd TYPE knvi-taxkd,
           taxm1 TYPE mlan-taxm1,
         END OF lty_combine.

  DATA: lv_kunnr       TYPE kna1-kunnr,
        ls_knvv        TYPE knvv,
        ls_kna1        TYPE kna1,
        lt_knmt        TYPE TABLE OF knmt,
        ls_knmt        TYPE knmt,
        ls_tcurr       TYPE tcurr,
        lt_mlan        TYPE TABLE OF mlan,
        ls_mlan        TYPE mlan,
        lt_knvi        TYPE TABLE OF knvi,
        ls_knvi        TYPE knvi,
        lt_t007s       TYPE TABLE OF t007s,
        ls_t007s       TYPE t007s,
        lt_a002        TYPE TABLE OF a002,
        ls_a002        TYPE a002,
        lt_konp        TYPE TABLE OF konp,
        ls_konp        TYPE konp,
        lt_combine     TYPE TABLE OF lty_combine,
        ls_combine     TYPE lty_combine,
        nr             TYPE inri-nrrangenr,
        object         TYPE inri-object,
        lv_zdjba       TYPE zdjba,
        lv_error       TYPE c,
        lt_header_data TYPE TABLE OF zsdt040a,
        ls_header_data TYPE zsdt040a,
        lt_item_data   TYPE TABLE OF zsdt040b,
        ls_item_data   TYPE zsdt040b,
        lv_msg         TYPE string,
        es_return      TYPE zxxs_005.
*        lv_lifnr       TYPE knvp-lifnr.

  CLEAR: lv_kunnr,
         ls_knvv,
         ls_kna1,
         lt_knmt,
         ls_knmt,
         ls_tcurr,
         lt_mlan,
         ls_mlan,
         lt_knvi,
         ls_knvi,
         lt_t007s,
         ls_t007s,
         lt_a002,
         ls_a002,
         lt_konp,
         ls_konp,
         lt_combine,
         ls_combine,
         lv_zdjba,
         lv_error,
         lt_header_data,
         ls_header_data,
         lt_item_data,
         ls_item_data,
         lv_msg,
*         lv_lifnr,
         es_return.

  nr = '01'.  "间隔编辑里面起始编号前面的:号"
  object = 'ZSD040'.  " 'ZSD040 SNRO创建的对象名称"

  CLEAR: ok_code.
  ok_code = sy-ucomm.

  lv_kunnr = gs_header-kunnr.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = lv_kunnr
    IMPORTING
      output = lv_kunnr.

  LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = <gfs_outtab>-matnr
      IMPORTING
        output       = <gfs_outtab>-matnr
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

  ENDLOOP.

  IF gt_outtab IS NOT INITIAL.
    SELECT * INTO TABLE lt_knmt
      FROM knmt
      FOR ALL ENTRIES IN gt_outtab
      WHERE matnr = gt_outtab-matnr
        AND vkorg = gs_header-vkorg
        AND vtweg = '00'
        AND kunnr = lv_kunnr.

    SELECT * INTO TABLE lt_mlan
      FROM mlan
      FOR ALL ENTRIES IN gt_outtab
      WHERE matnr = gt_outtab-matnr.

    SELECT * INTO TABLE lt_knvi
      FROM knvi
      WHERE kunnr = lv_kunnr
       AND tatyp = 'MWST'.

    LOOP AT lt_mlan INTO ls_mlan.
      READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
      IF ls_mlan-aland = ls_knvi-aland.
        ls_combine-aland = ls_mlan-aland.
        ls_combine-taxkd = ls_knvi-taxkd.
        ls_combine-taxm1 = ls_mlan-taxm1.
        COLLECT ls_combine INTO lt_combine.
        CLEAR: ls_combine.
      ENDIF.

    ENDLOOP.

    SELECT * INTO TABLE lt_a002
      FROM a002
      FOR ALL ENTRIES IN lt_combine
      WHERE kappl = 'V'
        AND kschl = 'MWST'
        AND aland = lt_combine-aland
        AND taxk1 = lt_combine-taxkd
        AND taxm1 = lt_combine-taxm1
        AND datbi >= sy-datum
        AND datab <= sy-datum.

    IF  lt_a002 IS NOT INITIAL.
      SELECT * INTO TABLE lt_konp
        FROM konp
        FOR ALL ENTRIES IN lt_a002
        WHERE knumh = lt_a002-knumh
          AND kappl = 'V'
          AND kschl = 'MWST'.
    ENDIF.
  ENDIF.

  SELECT SINGLE * INTO ls_tcurr
    FROM tcurr
    WHERE kurst = 'M'
      AND fcurr = gs_header-waerk
      AND tcurr = 'CNY'.

  LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
    <gfs_outtab>-waerk = gs_header-waerk. "货币
    IF <gfs_outtab>-zdyhl IS INITIAL.

      IF <gfs_outtab>-waerk = 'CNY'.
        <gfs_outtab>-zdyhl = '1.00000'. "当月汇率
      ELSE.
        <gfs_outtab>-zdyhl = ls_tcurr-ukurs. "
      ENDIF.
    ENDIF.

    IF <gfs_outtab>-zbjhl IS INITIAL.
      <gfs_outtab>-zbjhl = '1.00000'. "报价汇率
    ENDIF.

    IF <gfs_outtab>-kdmat IS INITIAL.
      READ TABLE lt_knmt INTO ls_knmt WITH KEY matnr = <gfs_outtab>-matnr.
      IF sy-subrc = 0.
        <gfs_outtab>-kdmat = ls_knmt-kdmat. "客户物料
      ENDIF.
    ENDIF.

    IF <gfs_outtab>-zhjsz IS INITIAL.

      READ TABLE lt_mlan INTO ls_mlan WITH KEY matnr = <gfs_outtab>-matnr.
      READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
      IF ls_mlan-aland = ls_knvi-aland.
        READ TABLE lt_a002 INTO ls_a002 WITH KEY aland = ls_mlan-aland
                                                 taxk1 = ls_knvi-taxkd
                                                 taxm1 = ls_mlan-taxm1.
        IF sy-subrc = 0.
          READ TABLE lt_konp INTO ls_konp WITH KEY knumh = ls_a002-knumh.
          IF sy-subrc = 0.
            <gfs_outtab>-zhjsz = ls_konp-mwsk1. "税种
          ENDIF.
        ENDIF.

      ENDIF.
    ENDIF.

    <gfs_outtab>-zxzj = <gfs_outtab>-zxjg + <gfs_outtab>-zxmjjg. "调整后总单价(未税) =  新产品售价(未税)+新模具分摊售价(未税)

    IF <gfs_outtab>-zyzj IS INITIAL.
      <gfs_outtab>-zjgbd = 0.
    ELSE.
      <gfs_outtab>-zjgbd = ( ( <gfs_outtab>-zxzj - <gfs_outtab>-zyzj ) / <gfs_outtab>-zyzj ) * 100. "价格变动比例 = 100* (【调整后总单价(未税)➖调整前总单价(未税)】/调整前总单价(未税) )
    ENDIF.

    IF <gfs_outtab>-zthsx IS INITIAL.
      <gfs_outtab>-zthsx = sy-datum. "调后生效日期
    ENDIF.

  ENDLOOP.

  CASE ok_code.
    WHEN 'ENTER'. "回车
      SELECT SINGLE * INTO ls_knvv
        FROM knvv
        WHERE kunnr = lv_kunnr
          AND vkorg = gs_header-vkorg.
      IF sy-subrc <> 0.
        IF sy-langu = '1'.
          MESSAGE '请维护当前销售组织下的客户信息' TYPE 'E'.
        ELSE.
          MESSAGE 'Please maintain customer information under the current sales organization' TYPE 'E'.
        ENDIF.

      ELSE.
        IF ls_knvv-vtweg = gs_header-vtweg AND ls_knvv-spart = '00'.
          gs_header-waerk = ls_knvv-waers. "币别
        ENDIF.
      ENDIF.

*      CLEAR: lv_lifnr.
*      IF gs_header-zkhjl IS INITIAL.
*        SELECT SINGLE lifnr INTO lv_lifnr "客户经理
*        FROM knvp
*        WHERE kunnr = lv_kunnr
*          AND vkorg = gs_header-vkorg
*          AND vtweg = '00'
*          AND spart = '00'
*          AND parvw = 'V1'.
*        IF lv_lifnr IS NOT INITIAL.
*          gs_header-zkhjl = lv_lifnr.
*        ENDIF.
*
*      ELSE.
*        SELECT SINGLE lifnr INTO lv_lifnr "客户经理
*        FROM knvp
*        WHERE kunnr = lv_kunnr
*          AND vkorg = gs_header-vkorg
*          AND vtweg = '00'
*          AND spart = '00'
*          AND parvw = 'V1'.
*        IF lv_lifnr IS NOT INITIAL.
*          gs_header-zkhjl = lv_lifnr.
*        ENDIF.
*      ENDIF.

      SELECT SINGLE * INTO ls_kna1
        FROM kna1
        WHERE kunnr = lv_kunnr.
      IF sy-subrc = 0.
        CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_header-name1. "客户名称

        gs_header-katr6 = ls_kna1-katr6.

        CLEAR: gv_vtext_jt.
        SELECT SINGLE vtext INTO gv_vtext_jt "集团
          FROM tvk6t
          WHERE spras = sy-langu
            AND katr6 = ls_kna1-katr6.

        CLEAR: gv_vtext_hy.
        gs_header-bran1 = ls_kna1-bran1.
        SELECT SINGLE  vtext INTO gv_vtext_hy "行业
          FROM tbrct
          WHERE spras = sy-langu
            AND braco = ls_kna1-bran1.
      ENDIF.


    WHEN '&SAVE'. "保存
      CLEAR: lv_error,
             lv_zdjba.

      PERFORM frm_check_data CHANGING lv_error. "检查数据

      IF lv_error IS INITIAL.
        IF gs_header-zdjba IS INITIAL.
          PERFORM  frm_get_number  USING nr object CHANGING lv_zdjba. "生成核价单号内部流水
          gs_header-zdjba = lv_zdjba.
          gs_header-status = '0'. "审批状态 :设为保存
        ELSE.
          gs_header-aedat = sy-datum.
          gs_header-aezet = sy-uzeit.
          gs_header-aenam = sy-uname.
        ENDIF.

        MOVE-CORRESPONDING gs_header TO ls_header_data.
        APPEND ls_header_data TO lt_header_data.
        CLEAR: ls_header_data.

        LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
          <gfs_outtab>-zdjba = gs_header-zdjba.

          "反审之后,进行单据修改,自动将之前的调整后总单价(未税)写入到调整前总单价(未税)&新产品售价(未税)写入原产品售价(未税)中
          IF gs_header-status = '0' AND gv_upd = 'X'.
            <gfs_outtab>-zyzj = <gfs_outtab>-zxzj.
            <gfs_outtab>-zyjg = <gfs_outtab>-zxjg.
            <gfs_outtab>-zyjg1 = <gfs_outtab>-zxmjjg.
            <gfs_outtab>-zyks = <gfs_outtab>-zxks.
            <gfs_outtab>-zyjs = <gfs_outtab>-zxjs.
            <gfs_outtab>-ztqsx = <gfs_outtab>-zthsx.
            <gfs_outtab>-ztqsxrq = <gfs_outtab>-zthsxrq.
          ENDIF.

        ENDLOOP.

        lt_item_data[] = gt_outtab[].

        IF lt_header_data IS NOT INITIAL.
          MODIFY zsdt040a FROM TABLE lt_header_data. "抬头数据
          IF sy-subrc = 0.
            COMMIT WORK AND WAIT.
          ELSE.
            ROLLBACK WORK.
          ENDIF.
        ENDIF.

        IF lt_item_data IS NOT INITIAL.
          MODIFY zsdt040b FROM TABLE lt_item_data. "明细行数据
          IF sy-subrc = 0.
            COMMIT WORK AND WAIT.
          ELSE.
            ROLLBACK WORK.
          ENDIF.
        ENDIF.

        CLEAR: lv_msg.
        IF sy-langu = '1'.
          CONCATENATE '核价单号' gs_header-zdjba '已保存.' INTO lv_msg SEPARATED BY space.
        ELSE.
          CONCATENATE 'Pricing number' gs_header-zdjba 'has been saved.' INTO lv_msg SEPARATED BY space.
        ENDIF.

        MESSAGE lv_msg TYPE 'S'.
      ELSE.

      ENDIF.

    WHEN '&SUBMIT'. "提交
      CLEAR: lv_error,
             lv_zdjba.

      PERFORM frm_check_data CHANGING lv_error. "检查数据

      IF lv_error IS INITIAL.
        IF gs_header-zdjba IS INITIAL.
          PERFORM  frm_get_number  USING nr object CHANGING lv_zdjba. "生成核价单号内部流水
          gs_header-zdjba = lv_zdjba.
          gs_header-status = '1'. "审批状态 :设为审批中
        ENDIF.

        MOVE-CORRESPONDING gs_header TO ls_header_data.
        APPEND ls_header_data TO lt_header_data.
        CLEAR: ls_header_data.

        LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
          <gfs_outtab>-zdjba = gs_header-zdjba.
        ENDLOOP.

        lt_item_data[] = gt_outtab[].

        IF lt_header_data IS NOT INITIAL.
          MODIFY zsdt040a FROM TABLE lt_header_data. "抬头数据
          IF sy-subrc = 0.
            COMMIT WORK AND WAIT.
          ELSE.
            ROLLBACK WORK.
          ENDIF.
        ENDIF.

        IF lt_item_data IS NOT INITIAL.
          MODIFY zsdt040b FROM TABLE lt_item_data. "明细行数据
          IF sy-subrc = 0.
            COMMIT WORK AND WAIT.
          ELSE.
            ROLLBACK WORK.
          ENDIF.
        ENDIF.

        CLEAR: lv_msg.
        IF sy-langu = '1'.
          CONCATENATE '核价单号' gs_header-zdjba '已保存.' INTO lv_msg SEPARATED BY space.
        ELSE.
          CONCATENATE 'Pricing number' gs_header-zdjba 'has been saved.' INTO lv_msg SEPARATED BY space.
        ENDIF.

        MESSAGE lv_msg TYPE 'S'.

        CALL FUNCTION 'ZFM_SD_041_POST_TO_0A' "推送到OA
          IMPORTING
            es_return = es_return
          TABLES
            it_head   = lt_header_data
            it_item   = lt_item_data.
        IF es_return-type = 'S'.
          MESSAGE s019(zpp001) WITH es_return-fkey_value01.
        ELSE.
          MESSAGE e020(zpp001) .
        ENDIF.

      ENDIF.

    WHEN '&EDIT'. "修改
      MOVE-CORRESPONDING gs_header TO ls_header_data.
      APPEND ls_header_data TO lt_header_data.
      CLEAR: ls_header_data.

      LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
        <gfs_outtab>-zdjba = gs_header-zdjba.
      ENDLOOP.

      lt_item_data[] = gt_outtab[].

      IF lt_header_data IS NOT INITIAL.
        MODIFY zsdt040a FROM TABLE lt_header_data. "抬头数据
        IF sy-subrc = 0.
          COMMIT WORK AND WAIT.
        ELSE.
          ROLLBACK WORK.
        ENDIF.
      ENDIF.

      IF lt_item_data IS NOT INITIAL.
        MODIFY zsdt040b FROM TABLE lt_item_data. "明细行数据
        IF sy-subrc = 0.
          COMMIT WORK AND WAIT.
        ELSE.
          ROLLBACK WORK.
        ENDIF.
      ENDIF.

      CLEAR: lv_msg.
      IF sy-langu = '1'.
        CONCATENATE '核价单号' gs_header-zdjba '已保存.' INTO lv_msg SEPARATED BY space.
      ELSE.
        CONCATENATE 'Pricing number' gs_header-zdjba 'has been saved.' INTO lv_msg SEPARATED BY space.
      ENDIF.

      MESSAGE lv_msg TYPE 'S'.
    WHEN '&RECHECK'. "反审
      DATA ls_003c TYPE zxxt_003.
      DATA: lr_zdjba TYPE RANGE OF zsdt040a-zdjba,
            ls_zdjba LIKE LINE OF lr_zdjba,
            lr_zhjrq TYPE RANGE OF zsdt040a-zhjrq,
            ls_zhjrq LIKE LINE OF lr_zhjrq,
            lv_fs    TYPE c.

      CLEAR: lr_zdjba,
             ls_zdjba,
             lr_zhjrq,
             ls_zhjrq,
             lv_fs.
      ls_zdjba-sign = 'I'.
      ls_zdjba-option = 'EQ'.
      ls_zdjba-low = gs_header-zdjba.
      APPEND ls_zdjba TO lr_zdjba.
      CLEAR: ls_zdjba.

      ls_zhjrq-sign = 'I'.
      ls_zhjrq-option = 'EQ'.
      ls_zhjrq-low = gs_header-zhjrq.
      APPEND ls_zhjrq TO lr_zhjrq.
      CLEAR: ls_zhjrq.

      SELECT SINGLE * INTO ls_003c
         FROM zxxt_003
         WHERE zmk = 'SD'
           AND key1 = 'ZSD040'
           AND key2 = 'FANSHEN'
           AND key3 = gs_header-vkorg
           AND value1 = sy-uname.
      IF sy-subrc <> 0.
        MESSAGE '您没有操作反审的权限' TYPE 'E'.

      ELSE.
        gs_header-status = '0'.
        UPDATE zsdt040a SET status = '0'
        WHERE zdjba = gs_header-zdjba.
        IF sy-subrc = 0.
          COMMIT WORK AND WAIT.
        ELSE.
          ROLLBACK WORK.
        ENDIF.

        lv_fs = 'X'.
        EXPORT lv_fs TO MEMORY ID 'ZSD040-M1'.
        SUBMIT zsd040A USING SELECTION-SCREEN '1000'
              WITH s_zdjba IN lr_zdjba
              WITH s_zhjrq IN lr_zhjrq
              WITH s_kunnr IN s_kunnr
              WITH s_vkorg IN s_vkorg
              WITH s_status IN s_status
              AND RETURN.
      ENDIF.
    WHEN '&QUERY'. "关联查询

    WHEN OTHERS.
  ENDCASE.

ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_instantiation
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_instantiation .
  DATA: ls_stbl   TYPE lvc_s_stbl,
        ls_layout TYPE lvc_s_layo.

*  PERFORM frm_set_fieldcat_9001.

  IF go_container IS INITIAL.
    CREATE OBJECT go_container
      EXPORTING
        container_name = 'CONT'.

    CREATE OBJECT go_grid
      EXPORTING
        i_parent = go_container.

* ALV展示
*
*    CALL METHOD cl_gui_cfw=>set_new_ok_code
*      EXPORTING
*        new_code = '&REFRESH'.
    PERFORM frm_display.
  ELSE.
*    IF go_container IS NOT INITIAL.

*      CREATE OBJECT go_grid
*      EXPORTING
*        i_parent = go_container.
    IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
      CALL METHOD go_grid->set_ready_for_input
        EXPORTING
          i_ready_for_input = 0.
    ENDIF.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    ls_layout-cwidth_opt = 'X'.
    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = ls_layout.
    ls_stbl-row = 'X'." 基于行的稳定刷新
    ls_stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl
      EXCEPTIONS
        finished  = 1
        OTHERS    = 2.
    CALL METHOD cl_gui_cfw=>flush.

*    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display .
  DATA: g_tool_data TYPE scc_wb_tool_data.
  DATA: ls_layout   TYPE lvc_s_layo,
        lt_fieldcat TYPE TABLE OF lvc_s_fcat,
        ls_fieldcat TYPE lvc_s_fcat,
        ls_stbl     TYPE lvc_s_stbl.
  DATA:lt_f4 TYPE lvc_t_f4,
       ls_f4 TYPE lvc_s_f4.
  FIELD-SYMBOLS: <lfs_fieldcat> TYPE lvc_s_fcat.

  DEFINE d1.
    ls_fieldcat-fieldname = &1.
    ls_fieldcat-scrtext_l = &2.
    ls_fieldcat-edit = &3.
    ls_fieldcat-intlen = &4.
    ls_fieldcat-outputlen = &5.
    APPEND ls_fieldcat TO lt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

  IF sy-langu = '1'.
    IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
      d1: 'POSNR' '序号' '' 10 10.
      d1:'ZBJDH' '报价单号' '' 10 10.
      d1:'ZBJDH1' '报价单项次' '' 10 10.
      d1:'MATNR' '物料编码' '' 40 40.
      d1:'MAKTX' '物料名称' '' 40 40.
      d1:'ZPRODMODEL' '产品型号' '' 50 50.
      d1:'MEINS' '单位' '' 10 10.
      d1: 'KDMAT' '客户物料编码' '' 35 35.
      d1: 'ZJGLX' '价格类型' '' 10 10.
      d1:'ZBGYY' '变更原因' '' 60 60.
      d1:'WAERK' '币别' '' 5 5.
      d1: 'ZDYHL' '当月汇率' '' 15 15.
      d1: 'ZBJHL' '报价汇率' '' 15 15.
      d1: 'ZHJSZ' '税种' '' 2 2.
      d1:'ZYJG' '原商品售价(未税)' '' 14 14.
      d1:'ZYSL' '原分摊数量' '' 17 17.
      d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
      d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
      d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
      d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
      d1:'ZXJG' '新产品售价(未税)' '' 14 14.
      d1:'ZXSJ' '新模具分摊数量' '' 17 17.
      d1:'ZXMJJG' '新模具分摊售价(未税)' '' 14 14.
      d1:'ZXKS' '模具分摊起始日期' '' 10 10.
      d1:'ZXJS' '模具分摊截止日期' '' 10 10.
      d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
      d1:'ZJGBD' '价格变动比例%' '' 14 14.
      d1:'ZTQSX' '调前生效日期' '' 10 10.
      d1:'ZTHSX' '调后生效日期' '' 10 10.
      d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
      d1:'ZTHSXRQ' '调后失效日期' '' 10 10.
      d1:'ZHGBM' '海关编码' '' 20 20.
      d1:'ZZTCY' '征退差异%' '' 14 14.
      d1:'ZCKTS' '出口退税率%' '' 14 14.
      d1:'ZEXYF' '额外出口运费' '' 14 14.
      d1:'ZGCCB' '工程成本' '' 14 14.
      d1:'ZSHCB' '实际成本单价' '' 14 14.
      d1:'ZGCML' '工程毛利率' '' 14 14.
      d1:'ZSJML' '实际毛利率' '' 14 14.
    ELSE.
      d1: 'POSNR' '序号' 'X' 10 10.
      d1:'ZBJDH' '报价单号' 'X' 10 10.
      d1:'ZBJDH1' '报价单项次' 'X' 10 10.
      d1:'MATNR' '物料编码' 'X' 40 40.
      d1:'MAKTX' '物料名称' '' 40 40.
      d1:'ZPRODMODEL' '产品型号' '' 50 50.
      d1:'MEINS' '单位' '' 10 10.
      d1: 'KDMAT' '客户物料编码' 'X' 35 35.
      d1: 'ZJGLX' '价格类型' 'X' 10 10.
      d1:'ZBGYY' '变更原因' 'X' 60 60.
      d1:'WAERK' '币别' '' 5 5.
      d1: 'ZDYHL' '当月汇率' 'X' 15 15.
      d1: 'ZBJHL' '报价汇率' 'X' 15 15.
      d1: 'ZHJSZ' '税种' 'X' 2 2.
      d1:'ZYJG' '原商品售价(未税)' '' 14 14.
      d1:'ZYSL' '原分摊数量' '' 17 17.
      d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
      d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
      d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
      d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
      d1:'ZXJG' '新产品售价(未税)' 'X' 14 14.
      d1:'ZXSJ' '新模具分摊数量' 'X' 17 17.
      d1:'ZXMJJG' '新模具分摊售价(未税)' 'X' 14 14.
      d1:'ZXKS' '模具分摊起始日期' 'X' 10 10.
      d1:'ZXJS' '模具分摊截止日期' 'X' 10 10.
      d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
      d1:'ZJGBD' '价格变动比例%' '' 14 14.
      d1:'ZTQSX' '调前生效日期' '' 10 10.
      d1:'ZTHSX' '调后生效日期' 'X' 10 10.
      d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
      d1:'ZTHSXRQ' '调后失效日期' 'X' 10 10.
      d1:'ZHGBM' '海关编码' 'X' 20 20.
      d1:'ZZTCY' '征退差异%' 'X' 14 14.
      d1:'ZCKTS' '出口退税率%' 'X' 14 14.
      d1:'ZEXYF' '额外出口运费' 'X' 14 14.
      d1:'ZGCCB' '工程成本' 'X' 14 14.
      d1:'ZSHCB' '实际成本单价' 'X' 14 14.
      d1:'ZGCML' '工程毛利率' 'X' 14 14.
      d1:'ZSJML' '实际毛利率' 'X' 14 14.
    ENDIF.

  ELSE.
    IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
      d1: 'POSNR' 'Item No' '' 10 10.
      d1:'ZBJDH' 'Quotation no' '' 10 10.
      d1:'ZBJDH1' 'Quotation item number' '' 10 10.
      d1:'MATNR' 'Material No' '' 40 40.
      d1:'MAKTX' 'Material Name' '' 40 40.
      d1:'ZPRODMODEL' 'Product Model' '' 50 50.
      d1:'MEINS' 'Base Unit of Measure' '' 10 10.
      d1: 'KDMAT' 'Customer Material No' '' 35 35.
      d1: 'ZJGLX' 'Price Type' '' 10 10.
      d1:'ZBGYY' 'Reason for Change' '' 60 60.
      d1:'WAERK' 'Currency' '' 5 5.
      d1: 'ZDYHL' 'Current month exchange rate' '' 15 15.
      d1: 'ZBJHL' 'Quotation exchange rate' '' 15 15.
      d1: 'ZHJSZ' 'Categories of taxes' '' 2 2.
      d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
      d1:'ZYSL' 'Original allocation quantity' '' 17 17.
      d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
      d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
      d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
      d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
      d1:'ZXJG' 'New product selling price (before tax)' '' 14 14.
      d1:'ZXSJ' 'New mold allocation quantity' '' 17 17.
      d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' '' 14 14.
      d1:'ZXKS' 'Starting date of mold allocation' '' 10 10.
      d1:'ZXJS' 'Mold allocation deadline' '' 10 10.
      d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
      d1:'ZJGBD' 'Price change ratio%' '' 14 14.
      d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
      d1:'ZTHSX' 'Effective date after adjustment' '' 10 10.
      d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
      d1:'ZTHSXRQ' 'Expiration date after adjustment' '' 10 10.
      d1:'ZHGBM' 'Customs code' '' 20 20.
      d1:'ZZTCY' 'Tax refund difference%' '' 14 14.
      d1:'ZCKTS' 'Export tax refund rate%' '' 14 14.
      d1:'ZEXYF' 'Additional export shipping costs' '' 14 14.
      d1:'ZGCCB' 'Project cost' '' 14 14.
      d1:'ZSHCB' 'Actual cost unit price' '' 14 14.
      d1:'ZGCML' 'Engineering gross profit margin' '' 14 14.
      d1:'ZSJML' 'Actual gross profit margin' '' 14 14.
    ELSE.
      d1: 'POSNR' 'Item No' 'X' 10 10.
      d1:'ZBJDH' 'Quotation no' 'X' 10 10.
      d1:'ZBJDH1' 'Quotation item number' 'X' 10 10.
      d1:'MATNR' 'Material No' 'X' 40 40.
      d1:'MAKTX' 'Material Name' '' 40 40.
      d1:'ZPRODMODEL' 'Product Model' '' 50 50.
      d1:'MEINS' 'Base Unit of Measure' '' 10 10.
      d1: 'KDMAT' 'Customer Material No' 'X' 35 35.
      d1: 'ZJGLX' 'Price Type' 'X' 10 10.
      d1:'ZBGYY' 'Reason for Change' 'X' 60 60.
      d1:'WAERK' 'Currency' '' 5 5.
      d1: 'ZDYHL' 'Current month exchange rate' 'X' 15 15.
      d1: 'ZBJHL' 'Quotation exchange rate' 'X' 15 15.
      d1: 'ZHJSZ' 'Categories of taxes' 'X' 2 2.
      d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
      d1:'ZYSL' 'Original allocation quantity' '' 17 17.
      d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
      d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
      d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
      d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
      d1:'ZXJG' 'New product selling price (before tax)' 'X' 14 14.
      d1:'ZXSJ' 'New mold allocation quantity' 'X' 17 17.
      d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' 'X' 14 14.
      d1:'ZXKS' 'Starting date of mold allocation' 'X' 10 10.
      d1:'ZXJS' 'Mold allocation deadline' 'X' 10 10.
      d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
      d1:'ZJGBD' 'Price change ratio%' '' 14 14.
      d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
      d1:'ZTHSX' 'Effective date after adjustment' 'X' 10 10.
      d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
      d1:'ZTHSXRQ' 'Expiration date after adjustment' 'X' 10 10.
      d1:'ZHGBM' 'Customs code' 'X' 20 20.
      d1:'ZZTCY' 'Tax refund difference%' 'X' 14 14.
      d1:'ZCKTS' 'Export tax refund rate%' 'X' 14 14.
      d1:'ZEXYF' 'Additional export shipping costs' 'X' 14 14.
      d1:'ZGCCB' 'Project cost' 'X' 14 14.
      d1:'ZSHCB' 'Actual cost unit price' 'X' 14 14.
      d1:'ZGCML' 'Engineering gross profit margin' 'X' 14 14.
      d1:'ZSJML' 'Actual gross profit margin' 'X' 14 14.
    ENDIF.
  ENDIF.

  LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'MATNR'.
    <lfs_fieldcat>-ref_table = 'MARA'.
    <lfs_fieldcat>-ref_field = 'MATNR'.
    <lfs_fieldcat>-dd_outlen = 40.
    IF sy-langu = '1'.
      <lfs_fieldcat>-coltext = '物料编码'.
    ELSE.
      <lfs_fieldcat>-coltext = 'Material No'.
    ENDIF.
  ENDLOOP.

  LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZHJSZ'.
*    <lfs_fieldcat>-ref_table = 'T007S'.
*    <lfs_fieldcat>-ref_field = 'MWSKZ'.
    <lfs_fieldcat>-dd_outlen = 2.
    IF sy-langu = '1'.
      <lfs_fieldcat>-coltext = '税种'.
    ELSE.
      <lfs_fieldcat>-coltext = 'Categories of taxes'.
    ENDIF.
  ENDLOOP.

  LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZJGLX' OR fieldname = 'ZHJSZ'. "价格类型搜索帮助
    <lfs_fieldcat>-f4availabl = 'X'.
  ENDLOOP.

  LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZTHSX' OR fieldname = 'ZXKS'
                                                  OR fieldname = 'ZXJS' OR fieldname = 'ZTQSX'
                                                  OR fieldname = 'ZTQSXRQ' OR fieldname = 'ZTHSXRQ'
                                                  OR fieldname = 'ZYKS' OR fieldname = 'ZYJS'.
    IF sy-langu = '1'.
      IF <lfs_fieldcat>-fieldname = 'ZTHSX'.
        <lfs_fieldcat>-coltext = '调后生效日期'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZXKS'.
        <lfs_fieldcat>-coltext = '模具分摊起始日期'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZXJS'.
        <lfs_fieldcat>-coltext = '模具分摊截止日期'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZTQSX'.
        <lfs_fieldcat>-coltext = '调前生效日期'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZTQSXRQ'.
        <lfs_fieldcat>-coltext = '调前失效日期'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZTHSXRQ'.
        <lfs_fieldcat>-coltext = '调后失效日期'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZYKS'.
        <lfs_fieldcat>-coltext = '原模具分摊日期起始日期'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZYJS'.
        <lfs_fieldcat>-coltext = '原分摊日期截止日期'.
      ENDIF.
    ELSE.
      IF <lfs_fieldcat>-fieldname = 'ZTHSX'.
        <lfs_fieldcat>-coltext = 'Effective date after adjustment'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZXKS'.
        <lfs_fieldcat>-coltext = 'Starting date of mold allocation'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZXJS'.
        <lfs_fieldcat>-coltext = 'Mold allocation deadline'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZTQSX'.
        <lfs_fieldcat>-coltext = 'Effective date before adjustment'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZTQSXRQ'.
        <lfs_fieldcat>-coltext = 'Pre adjustment expiration date'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZTHSXRQ'.
        <lfs_fieldcat>-coltext = 'Expiration date after adjustment'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZYKS'.
        <lfs_fieldcat>-coltext = 'Starting date of original mold allocation'.
      ENDIF.
      IF <lfs_fieldcat>-fieldname = 'ZYJS'.
        <lfs_fieldcat>-coltext = 'Original allocation date deadline'.
      ENDIF.
    ENDIF.

    <lfs_fieldcat>-ref_table = 'VBAK'.
    <lfs_fieldcat>-ref_field = 'ERDAT'.
  ENDLOOP.

  LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZYJG' OR fieldname = 'ZYJG1'
                                                  OR fieldname = 'ZYZJ' OR fieldname = 'ZXJG'
                                                  OR fieldname = 'ZXMJJG' OR fieldname = 'ZXZJ'
                                                  OR fieldname = 'ZJGBD' OR fieldname = 'ZZTCY'
                                                  OR fieldname = 'ZCKTS' OR fieldname = 'ZEXYF'
                                                  OR fieldname = 'ZGCCB' OR fieldname = 'ZSHCB'
                                                  OR fieldname = 'ZGCML' OR fieldname = 'ZSJML'
                                                  OR fieldname = 'ZDYHL' OR fieldname = 'ZBJHL'.
    IF <lfs_fieldcat>-fieldname = 'ZDYHL' OR <lfs_fieldcat>-fieldname = 'ZBJHL'.
      <lfs_fieldcat>-decimals = 5.
    ELSEIF <lfs_fieldcat>-fieldname = 'ZJGBD' OR <lfs_fieldcat>-fieldname = 'ZZTCY'
          OR <lfs_fieldcat>-fieldname = 'ZCKTS' OR <lfs_fieldcat>-fieldname = 'ZEXYF'
          OR <lfs_fieldcat>-fieldname = 'ZGCML' OR <lfs_fieldcat>-fieldname = 'ZSJML' .
      <lfs_fieldcat>-decimals = 3.
    ELSE.
      <lfs_fieldcat>-datatype = 'CURR'.
    ENDIF.

  ENDLOOP.

  LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZYSL' OR fieldname = 'ZXSJ'.
    <lfs_fieldcat>-decimals = 3.
  ENDLOOP.

  ls_layout-sel_mode = 'D'.
  ls_layout-cwidth_opt = 'X'.
  ls_layout-zebra = 'X'.
  IF sy-langu = '1'.
    ls_layout-grid_title = '项目概览'.
  ELSE.
    ls_layout-grid_title = 'Item Overview'.
  ENDIF.

  CREATE OBJECT lo_event.
*   注册事件handler方法
  SET HANDLER lo_event->handle_enter FOR go_grid.
  SET HANDLER lo_event->handle_data_changed FOR go_grid.
  SET HANDLER lo_event->handle_data_changed_finished FOR go_grid.

  CALL METHOD go_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  CALL METHOD go_grid->register_edit_event "为ALV_GRID设置enter事件
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      is_layout       = ls_layout
    CHANGING
      it_fieldcatalog = lt_fieldcat
      it_outtab       = gt_outtab[].

* Set editable cells to ready for input initially
  CALL METHOD go_grid->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

*  CALL METHOD cl_gui_cfw=>set_new_ok_code
*      EXPORTING
*        new_code = '&REFRESH'.


  CLEAR:ls_f4.
  ls_f4-fieldname  = 'ZJGLX'. "价格类型搜索帮助
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = ''.
  ls_f4-internal   = ''.
  INSERT ls_f4 INTO TABLE lt_f4.

  CLEAR:ls_f4.
  ls_f4-fieldname  = 'ZHJSZ'. "价格类型搜索帮助
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = ''.
  ls_f4-internal   = ''.
  INSERT ls_f4 INTO TABLE lt_f4.
  CALL METHOD go_grid->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4.

  SET HANDLER lo_event->handle_f4_help FOR go_grid .

  IF go_container IS NOT INITIAL.

    "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'RELOAD'.

    ls_layout-cwidth_opt = 'X'.
    CALL METHOD go_grid->set_frontend_layout
      EXPORTING
        is_layout = ls_layout.
    ls_stbl-row = 'X'." 基于行的稳定刷新
    ls_stbl-col = 'X'." 基于列稳定刷新
    CALL METHOD go_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl
      EXCEPTIONS
        finished  = 1
        OTHERS    = 2.
    CALL METHOD cl_gui_cfw=>flush.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_arktx_f4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- <FS_OUTTAB>_ZJGLX
*&---------------------------------------------------------------------*
FORM frm_get_arktx_f4  CHANGING zjglx TYPE zsdt040c-zjglx.
  DATA: value_tab     TYPE TABLE OF dfies,
        ls_value_tab  TYPE dfies,
        return_tab    TYPE TABLE OF ddshretval,
        ls_return_tab TYPE ddshretval,
        lt_zsdt040c   TYPE TABLE OF zsdt040c,
        ls_zsdt040c   TYPE zsdt040c.

  SELECT * INTO TABLE lt_zsdt040c
    FROM zsdt040c.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE  = ' '
      retfield        = 'ZJGLX'
*     PVALKEY         = ' '
*     DYNPPROG        = ' '
*     DYNPNR          = ' '
*     DYNPROFIELD     = ' '
*     STEPL           = 0
*     WINDOW_TITLE    =
*     VALUE           = ' '
      value_org       = 'S'
*     MULTIPLE_CHOICE = ' '
*     DISPLAY         = ' '
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM   = ' '
*     CALLBACK_METHOD =
*     MARK_TAB        =
*   IMPORTING
*     USER_RESET      =
    TABLES
      value_tab       = lt_zsdt040c
*     FIELD_TAB       =
      return_tab      = return_tab
*     DYNPFLD_MAPPING =
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ELSE.
    READ TABLE return_tab INTO ls_return_tab INDEX 1.
    IF sy-subrc = 0  AND ls_return_tab-fieldval IS NOT INITIAL.
      zjglx = ls_return_tab-fieldval.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  gs_header-vkorg = p_vkorg.
  SELECT SINGLE vtext INTO gv_vtext "获取销售组织描述
    FROM tvkot
    WHERE spras = sy-langu
      AND vkorg = gs_header-vkorg.

  IF gs_header-katr6 IS NOT INITIAL.
    SELECT SINGLE vtext INTO gv_vtext_jt "集团
    FROM tvk6t
    WHERE spras = sy-langu
      AND katr6 = gs_header-katr6.
  ENDIF.

  IF gs_header-bran1 IS NOT INITIAL.
    SELECT SINGLE  vtext INTO gv_vtext_hy "行业
    FROM tbrct
    WHERE spras = sy-langu
      AND braco = gs_header-bran1.
  ENDIF.

  gs_header-ernam = sy-uname.
  gs_header-erdat = sy-datum.
  gs_header-erzet = sy-uzeit.

ENDFORM.

FORM frm_get_number  USING    p_nr      LIKE inri-nrrangenr
                              p_object  LIKE inri-object   "编号范围对象名称  Add By Code_Tool"
                     CHANGING p_number TYPE zdjba.
  "调用函数:  Number range: Lock object Add By Code_Tool"
  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
    EXPORTING
      object           = p_object
    EXCEPTIONS
      foreign_lock     = 1
      object_not_found = 2
      system_failure   = 3
      OTHERS           = 4.
  IF sy-subrc = 0.
    "调用函数:  NUmber range: Assigns next free number Add By Code_Tool"
    CALL FUNCTION 'NUMBER_GET_NEXT'
      EXPORTING
        nr_range_nr             = p_nr
        object                  = p_object
        quantity                = '1'
      IMPORTING
        number                  = p_number
      EXCEPTIONS
        interval_not_found      = 1
        number_range_not_intern = 2
        object_not_found        = 3
        quantity_is_0           = 4
        quantity_is_not_1       = 5
        interval_overflow       = 6
        buffer_overflow         = 7
        OTHERS                  = 8.
    IF sy-subrc <> 0.
      MESSAGE e001(00) WITH '无法获取新的号码: ' p_object.
    ENDIF.

    "调用函数:  Number range: Unlock object Add By Code_Tool
    CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
      EXPORTING
        object           = p_object
      EXCEPTIONS
        object_not_found = 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.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_ERROR
*&---------------------------------------------------------------------*
FORM frm_check_data  CHANGING p_error TYPE c.
  DATA: lt_mara  TYPE TABLE OF mara,
        ls_mara  TYPE mara,
        lt_t007s TYPE TABLE OF t007s,
        ls_t007s TYPE t007s,
        lv_msg   TYPE string,
        lt_a305  TYPE TABLE OF a305,
        ls_a305  TYPE a305,
        lv_kunnr TYPE kna1-kunnr.

  CLEAR: lt_mara,
         ls_mara,
         lt_t007s,
         ls_t007s,
         lv_msg,
         lt_a305,
         ls_a305,
         lv_kunnr.

  IF gt_outtab IS NOT INITIAL.
    SELECT * INTO TABLE lt_mara
      FROM mara
      FOR ALL ENTRIES IN gt_outtab
      WHERE matnr = gt_outtab-matnr.

    SELECT * INTO TABLE lt_t007s
      FROM t007s
      FOR ALL ENTRIES IN gt_outtab
      WHERE mwskz = gt_outtab-zhjsz.

    lv_kunnr = gs_header-kunnr.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = lv_kunnr
      IMPORTING
        output = lv_kunnr.


    SELECT * INTO TABLE lt_a305
      FROM a305
      FOR ALL ENTRIES IN gt_outtab
      WHERE kappl = 'V'
        AND vkorg = gs_header-vkorg
        AND vtweg = gs_header-vtweg
        AND kunnr = lv_kunnr
        AND matnr = gt_outtab-matnr.

    LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
      "检查行项目编号是否为空
      IF <gfs_outtab>-posnr IS INITIAL.
        p_error = 'X'.
        lv_msg = '行项目不能为空!'.
        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-matnr IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '物料编码不能为空!' INTO lv_msg SEPARATED BY space.
        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-kdmat IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '客户部物料编码不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-zjglx IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '价格类型不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-zbgyy IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '变更原因不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-zbjhl IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '报价汇率不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-zxjg IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '新产品售价(未税)不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-zxzj IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '调整后总单价(未税)不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-zthsx IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '调后生效日期不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      IF <gfs_outtab>-zthsxrq IS INITIAL.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '调后失效日期不能为空!' INTO lv_msg SEPARATED BY space.

        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      "检查物料是否存在
      READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <gfs_outtab>-matnr.
      IF sy-subrc <> 0.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '物料' <gfs_outtab>-matnr '不存在,请维护!' INTO lv_msg SEPARATED BY space.
        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      "检查税种是否存在
      READ TABLE lt_t007s INTO ls_t007s WITH KEY mwskz = <gfs_outtab>-zhjsz.
      IF sy-subrc <> 0.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '税种' <gfs_outtab>-zhjsz '不存在,请重新选择!' INTO lv_msg SEPARATED BY space.
        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

      "检查调后失效日期:调后失效日期必须大于调后生效日期
      IF <gfs_outtab>-zthsxrq < <gfs_outtab>-zthsx.
        p_error = 'X'.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '调后失效日期小于调后生效日期,请检查!' INTO lv_msg SEPARATED BY space.
        MESSAGE lv_msg TYPE 'E'.
      ENDIF.

*     "检查是否有价格信息记录
      READ TABLE lt_a305 INTO ls_a305 WITH KEY matnr = <gfs_outtab>-matnr.
      IF sy-subrc = 0.
        CONCATENATE '当前行项目' <gfs_outtab>-posnr '已经存在价格信息记录,请检查!' INTO lv_msg SEPARATED BY space.
        MESSAGE lv_msg TYPE 'I'.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
  FIELD-SYMBOLS: <lfs_structure> TYPE lvc_s_fcat.

  DEFINE d1.
    gs_structure-fieldname = &1.
    gs_structure-scrtext_l = &2.
    gs_structure-edit = &3.
    gs_structure-intlen = &4.
    gs_structure-outputlen = &5.
    gs_structure-no_zero = abap_true.
    APPEND gs_structure TO gt_structure.
    CLEAR gs_structure.
  END-OF-DEFINITION.

  IF sy-langu = '1'.
    d1: 'MSG_STATUS' '消息状态' '' 4 4,
        'MESSAGE' '消息' '' 220 75,
        'KNUMV' '定价记录号' '' 10 10,
        'KSCHL' '条件类型' '' 4 4,
        'ZDJBA' '单据编号' '' 10 10,
        'POSNR' '行项目编号' '' 6 6,
        'KUNNR' '客户编号' '' 10 10,
        'NAME1' '客户名称' '' 70 70,
        'VKORG' '销售组织' '' 4 4,
        'VTEXT' '销售组织描述' '' 30 30,
        'STATUS_TEXT' '单据状态' '' 10 10,
        'VTWEG' '分销渠道' '' 2 4,
        'MATNR' '物料编码' '' 40 40,
        'ZYJG' '原商品售价(未税)' '' 13 13,
        'ZYSL' '原分摊数量' '' 14 14,
        'ZYKS' '原模具分摊日期起始日期' '' 10 20,
        'ZYJS' '原分摊日期截止日期' '' 10 20.
  ELSE.
    d1: 'MSG_STATUS' 'Message Status' '' 4 4,
        'MESSAGE' 'Message Text' '' 220 75,
        'KNUMV' 'Pricing record number' '' 10 10,
        'KSCHL' 'Condition type' '' 4 4,
        'ZDJBA' 'Document number' '' 10 10,
        'POSNR' 'Item number' '' 6 6,
        'KUNNR' 'Customer No' '' 10 10,
        'NAME1' 'Customer name' '' 70 70,
        'VKORG' 'Sales Organization' '' 4 4,
        'VTEXT' 'Sales Organization Description' '' 30 30,
        'STATUS_TEXT' 'Document Status' '' 10 10,
        'VTWEG' 'Distribution channel' '' 2 4,
        'MATNR' 'Material No' '' 40 40,
        'ZYJG' 'Original product selling price (before tax)' '' 13 13,
        'ZYSL' 'Original allocation quantity' '' 14 14,
        'ZYKS' 'Starting date of original mold allocation' '' 10 20,
        'ZYJS' 'Original allocation date deadline' '' 10 20.
  ENDIF.

  LOOP AT gt_structure ASSIGNING <lfs_structure> WHERE fieldname = 'MSG_STATUS'.
    <lfs_structure>-icon = 'X'.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
  gs_layout-zebra = 'X'.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-box_fname = 'SEL'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data_list
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data_list .
  TYPES: BEGIN OF lty_data,
           vkorg TYPE a305-vkorg,
           vtweg TYPE a305-vtweg,
           kunnr TYPE a305-kunnr,
           matnr TYPE a305-matnr,
           datab TYPE a305-datab,
           datbi TYPE a305-datbi,
         END OF lty_data.

  DATA: lt_head   TYPE TABLE OF zsdt040a,
        ls_head   TYPE zsdt040a,
        lt_item   TYPE TABLE OF zsdt040b,
        ls_item   TYPE zsdt040b,
        lt_tvkot  TYPE TABLE OF tvkot,
        ls_tvkot  TYPE tvkot,
        lt_kna1   TYPE TABLE OF kna1,
        ls_kna1   TYPE kna1,
        lt_a305   TYPE TABLE OF a305,
        ls_a305   TYPE a305,
        lt_Data   TYPE TABLE OF lty_Data,
        ls_Data   TYPE lty_Data,
        lv_create TYPE c,
        lv_update TYPE c,
        lv_date_s TYPE datum,
        lv_date_e TYPE datum,
        lv_flag.

  FIELD-SYMBOLS: <lfs_alv> TYPE gty_alv.

  DATA: ti_bapicondct     TYPE TABLE OF bapicondct,
        ls_ti_bapicondct  TYPE bapicondct,
        ti_bapicondhd     TYPE TABLE OF bapicondhd,
        ls_ti_bapicondhd  TYPE  bapicondhd,
        ti_bapicondit     TYPE TABLE OF bapicondit,
        ls_ti_bapicondit  TYPE bapicondit,
        ti_bapicondqs     TYPE TABLE OF bapicondqs,
        ls_ti_bapicondqs  TYPE bapicondqs,
        ti_bapicondvs     TYPE TABLE OF bapicondvs,
        ls_ti_bapicondvs  TYPE bapicondvs,
        to_bapiret2       TYPE TABLE OF bapiret2,
        ls_to_bapiret2    TYPE  bapiret2,
        to_bapiknumhs     TYPE TABLE OF bapiknumhs,
        ls_to_bapiknumhs  TYPE bapiknumhs,
        to_mem_initial    TYPE TABLE OF cnd_mem_initial,
        ls_to_mem_initial TYPE cnd_mem_initial,
        h_varkey(100).

  CLEAR: ti_bapicondct,
         ls_ti_bapicondct,
         ti_bapicondhd,
         ls_ti_bapicondhd,
         ti_bapicondit,
         ls_ti_bapicondit,
         ti_bapicondqs,
         ls_ti_bapicondqs,
         ti_bapicondvs,
         ls_ti_bapicondvs,
         to_bapiret2,
         ls_to_bapiret2,
         to_bapiknumhs,
         ls_to_bapiknumhs,
         to_mem_initial,
         ls_to_mem_initial,
         h_varkey.

  CLEAR: lt_head,
         ls_head,
         lt_item,
         ls_item,
         lt_tvkot,
         ls_tvkot,
         lt_kna1,
         ls_kna1,
         lt_a305,
         ls_a305,
         lt_Data,
         ls_Data,
         lv_create,
         lv_update,
         lv_date_s,
         lv_date_e,
         lv_flag.

  DATA: lr_zdjba  TYPE RANGE OF zsdt040a-zdjba,
        lrs_zdjba LIKE LINE OF lr_zdjba.

  IF s_zdjba[] IS NOT INITIAL.
    LOOP AT s_zdjba.
      lrs_zdjba-sign = s_zdjba-sign.
      lrs_zdjba-option = s_zdjba-option.
      CLEAR: lv_zdjba.
      IF s_zdjba-low IS NOT INITIAL.
        lv_zdjba = s_zdjba-low.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = lv_zdjba
          IMPORTING
            output = lv_zdjba.

      ENDIF.
      lrs_zdjba-low = lv_zdjba.
      CLEAR: lv_zdjba.
      IF s_zdjba-high IS NOT INITIAL.
        lv_zdjba = s_zdjba-high.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = lv_zdjba
          IMPORTING
            output = lv_zdjba.
      ENDIF.
      lrs_zdjba-high = lv_zdjba.
      APPEND lrs_zdjba TO lr_zdjba.
      CLEAR: lrs_zdjba, s_zdjba.
    ENDLOOP.
  ENDIF.

  SELECT * INTO TABLE lt_head "核价申请抬头信息
    FROM zsdt040a
    WHERE zdjba IN lr_zdjba
      AND zhjrq IN s_zhjrq
      AND kunnr IN s_kunnr
      AND vkorg IN s_vkorg
      AND status IN s_status.
  IF lt_head IS NOT INITIAL.
    SELECT * INTO TABLE lt_item "核价申请明细数据
      FROM zsdt040b
      FOR ALL ENTRIES IN lt_head
      WHERE zdjba = lt_head-zdjba.

    SELECT * INTO TABLE lt_tvkot "销售组织描述
      FROM tvkot
      FOR ALL ENTRIES IN lt_head
      WHERE spras = sy-langu
        AND vkorg = lt_head-vkorg.

    SELECT * INTO TABLE lt_kna1
      FROM kna1
      FOR ALL ENTRIES IN lt_head
      WHERE kunnr = lt_head-kunnr.
  ENDIF.

  LOOP AT lt_head INTO ls_head.
    LOOP AT lt_item INTO ls_item WHERE zdjba = ls_head-zdjba.
      ls_data-vkorg = ls_head-vkorg.
      ls_data-vtweg = ls_head-vtweg.
      ls_data-kunnr = ls_head-kunnr.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = ls_data-kunnr
        IMPORTING
          output = ls_data-kunnr.

      ls_data-matnr = ls_item-matnr.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          input        = ls_data-matnr
        IMPORTING
          output       = ls_data-matnr
        EXCEPTIONS
          length_error = 1
          OTHERS       = 2.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

      ls_data-datab = ls_item-zthsx. "
      ls_data-datbi = ls_item-zthsxrq.
      COLLECT ls_data INTO lt_data.
      CLEAR: ls_data.
    ENDLOOP.

  ENDLOOP.

  IF lt_data IS NOT INITIAL.
    SELECT * INTO TABLE lt_a305
      FROM a305
      FOR ALL ENTRIES IN lt_data
      WHERE kappl = 'V'
        AND vkorg = lt_data-vkorg
        AND vtweg = lt_data-vtweg
        AND kunnr = lt_data-kunnr
        AND matnr = lt_data-matnr.
  ENDIF.

  LOOP AT lt_head INTO ls_head.
    LOOP AT lt_item INTO ls_item WHERE zdjba = ls_head-zdjba.
      CLEAR: lv_create,
             lv_update.
      gs_alv-msg_status = gc_grey. "初始状态
      gs_alv-zdjba = ls_head-zdjba. "单据编号
      gs_alv-kunnr = ls_head-kunnr."客户编号
      READ TABLE lt_kna1 INTO ls_kna1 WITH KEY kunnr = ls_head-kunnr.
      IF sy-subrc = 0.
        CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_alv-name1. "客户名称
      ENDIF.

      gs_alv-vtweg = ls_head-vtweg. "分销渠道
      gs_alv-vkorg = ls_head-vkorg. "销售组织
      READ TABLE lt_tvkot INTO ls_tvkot WITH KEY vkorg = ls_head-vkorg.
      IF sy-subrc = 0.
        gs_alv-vtext = ls_tvkot-vtext. "销售组织描述
      ENDIF.
      gs_alv-status = ls_head-status.
      IF ls_head-status = '0'.
        gs_alv-status_text = '保存'.
      ELSEIF ls_head-status = '1'.
        gs_alv-status_text = '审批中'.
      ELSEIF ls_head-status = '2'.
        CLEAR: lv_create,
               lv_update.

        gs_alv-status_text = '已审批'.

        "检查是否已经创建价格条件记录
        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = ls_item-matnr
          IMPORTING
            output       = ls_item-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = ls_head-kunnr
          IMPORTING
            output = ls_head-kunnr.

        READ TABLE lt_a305 INTO ls_a305 WITH KEY vkorg = ls_head-vkorg
                                                 vtweg = ls_head-vtweg
                                                 kunnr = ls_head-kunnr
                                                 matnr = ls_item-matnr
                                                 datab = ls_item-zthsx
                                                 datbi = ls_item-zthsxrq.
        IF sy-subrc <> 0.
          LOOP AT lt_a305 INTO ls_a305 WHERE vkorg = ls_head-vkorg
                                          AND vtweg = ls_head-vtweg
                                          AND kunnr = ls_head-kunnr
                                          AND matnr = ls_item-matnr .
            IF ls_item-zthsx <= ls_a305-datab AND ls_item-zthsxrq >=  ls_a305-datbi. "如果新建的日期区间包含历史的日期区间,则报错E,MESSAGE‘存在包含的价格数据,请手工执行’。
              gs_alv-msg_type = 'E'.
              gs_alv-msg_status = gc_red.
              gs_alv-message = '存在包含的价格数据,请手工执行'.
              EXIT.
            ENDIF.
          ENDLOOP.

          IF gs_alv-msg_type <> 'E'.
            lv_create = 'X'.
          ENDIF.
        ELSE.
          lv_update = 'X'.
        ENDIF.

      ENDIF.
      gs_alv-posnr = ls_item-posnr. "行项目编号
      gs_alv-matnr = ls_item-matnr. "物料
      gs_alv-meins = ls_item-meins. "单位
      gs_alv-zyjg = ls_item-zyjg."原商品售价(未税)
      gs_alv-zysl = ls_item-zysl."原分摊数量
      gs_alv-zyks = ls_item-zyks."原模具分摊日期起始日期
      gs_alv-zyjs = ls_item-zyjs."原分摊日期截止日期
      gs_alv-zthsxrq = ls_item-zthsxrq."调后失效日期
      gs_alv-zthsx = ls_item-zthsx."调后生效日期
      gs_alv-waerk = ls_item-waerk."币别
      gs_alv-zxzj  = ls_item-zxzj."调整后总单价(未税)

      IF lv_create = 'X'. "创建
        LOOP AT lt_a305 INTO ls_a305 WHERE vkorg = ls_head-vkorg
                                          AND vtweg = ls_head-vtweg
                                          AND kunnr = ls_head-kunnr
                                          AND matnr = ls_item-matnr .
*          系统里存在价格记录A305 : 开始日期: 2023.09.22 截止日期:2023.09.30
*          1. 调后生效日期: 2023.09.19    调后失效日期: 2023.09.23
*          2. 调后生效日期: 2023.09.23    调后失效日期: 2023.10.09
*          3. 调后生效日期: 2023.09.23    调后失效日期: 2023.09.27
*          4. 调后生效日期: 2023.10.10    调后失效日期: 2023.11.01
*          5. 调后生效日期:  2023.09.19   调后失效日期: 2023.09.21

          "1. 调后生效日期: 2023.09.19    调后失效日期: 2023.09.23
          IF ls_item-zthsx <= ls_a305-datab AND ls_item-zthsxrq >=  ls_a305-datab AND ls_item-zthsxrq <= ls_a305-datbi.
            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_item-zthsx.
            lv_date_e = ls_item-zthsxrq.
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.

            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_item-zthsxrq + 1.
            lv_date_e = ls_a305-datbi.
            lv_flag = 'X'. "保持a305的价格
            PERFORM frm_change_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.

            "2. 调后生效日期: 2023.09.23    调后失效日期: 2023.10.09
          ELSEIF ls_item-zthsx >= ls_a305-datab AND ls_item-zthsx <= ls_a305-datbi AND ls_item-zthsxrq >=  ls_a305-datbi.
            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_a305-datab.
            lv_date_e = ls_item-zthsx - 1.
            lv_flag = 'X'. "保持a305的价格
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.

            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_item-zthsx.
            lv_date_e = ls_item-zthsxrq.
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.

            "3. 调后生效日期: 2023.09.23    调后失效日期: 2023.09.27
          ELSEIF ls_item-zthsx >= ls_a305-datab AND ls_item-zthsxrq <= ls_a305-datbi.
            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_a305-datab.
            lv_date_e = ls_item-zthsx - 1.
            lv_flag = 'X'. "保持a305的价格
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.

            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_item-zthsx.
            lv_date_e = ls_item-zthsxrq.
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.

            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_item-zthsxrq + 1.
            lv_date_e = ls_a305-datbi.
            lv_flag = 'X'. "保持a305的价格
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
*
            "4. 调后生效日期: 2023.10.10    调后失效日期: 2023.11.01
          ELSEIF ls_item-zthsx >= ls_a305-datbi.
            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_item-zthsx.
            lv_date_e = ls_item-zthsxrq.
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.

            "5. 调后生效日期:  2023.09.19   调后失效日期: 2023.09.21
          ELSEIF ls_item-zthsxrq <= ls_a305-datab.
            CLEAR: lv_date_s, lv_date_e, lv_flag.
            lv_date_s = ls_item-zthsx.
            lv_date_e = ls_item-zthsxrq.
            PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
          ENDIF.

        ENDLOOP.

      ENDIF.

      IF lv_update = 'X'. "修改
        CLEAR: lv_date_s, lv_date_e, lv_flag.
        lv_date_s = ls_item-zthsx.
        lv_date_e = ls_item-zthsxrq.
        PERFORM frm_change_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
      ENDIF.

      APPEND gs_alv TO gt_alv.
      CLEAR: gs_alv, ls_item.
    ENDLOOP.
    CLEAR: ls_head.
  ENDLOOP.

  SORT gt_alv BY zdjba.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv_list
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv_list .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
*     I_INTERFACE_CHECK        = ' '
*     I_BYPASSING_BUFFER       =
*     I_BUFFER_ACTIVE          =
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_SET_PFSTATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE   = ' '
*     i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
*     I_CALLBACK_HTML_END_OF_LIST = ' '
*     I_STRUCTURE_NAME         =
*     I_BACKGROUND_ID          = ' '
*     I_GRID_TITLE             =
*     I_GRID_SETTINGS          =
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_structure
*     IT_EXCLUDING             =
*     IT_SPECIAL_GROUPS_LVC    =
*     IT_SORT_LVC              =
*     IT_FILTER_LVC            =
*     IT_HYPERLINK             =
*     IS_SEL_HIDE              =
      i_default                = 'X'
      i_save                   = 'A'
*     IS_VARIANT               =
*     IT_EVENTS                =
*     IT_EVENT_EXIT            =
*     IS_PRINT_LVC             =
*     IS_REPREP_ID_LVC         =
*     I_SCREEN_START_COLUMN    = 0
*     I_SCREEN_START_LINE      = 0
*     I_SCREEN_END_COLUMN      = 0
*     I_SCREEN_END_LINE        = 0
*     I_HTML_HEIGHT_TOP        =
*     I_HTML_HEIGHT_END        =
*     IT_ALV_GRAPHICS          =
*     IT_EXCEPT_QINFO_LVC      =
*     IR_SALV_FULLSCREEN_ADAPTER  =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER  =
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      t_outtab                 = gt_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

FORM frm_set_pfstatus USING p_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM. "FRM_SET_STATUS

FORM frm_user_command USING p_ucomm  TYPE sy-ucomm
                            rs_selfield  TYPE slis_selfield.
  TYPES: BEGIN OF lty_zdjba,
           zdjba TYPE zdjba,
         END OF lty_zdjba,

         BEGIN OF lty_temp,
           vkorg TYPE a305-vkorg,
           vtweg TYPE a305-vtweg,
           kunnr TYPE a305-kunnr,
           matnr TYPE a305-matnr,
         END OF lty_temp.
  DATA: lo_grid     TYPE REF TO cl_gui_alv_grid,
        lv_valid    TYPE c,
        ls_stbl     TYPE lvc_s_stbl,
        lt_zdjba    TYPE TABLE OF lty_zdjba,
        ls_zdjba    TYPE lty_zdjba,
        lt_zsdt040a TYPE TABLE OF zsdt040a,
        lt_zsdt040b TYPE TABLE OF zsdt040b,
        es_return   TYPE zxxs_005,
        answer      TYPE c,
        lt_temp     TYPE TABLE OF lty_temp,
        ls_temp     TYPE lty_temp,
        lt_a305     TYPE TABLE OF a305,
        ls_a305     TYPE a305.

  DATA: ti_bapicondct     TYPE TABLE OF bapicondct,
        ls_ti_bapicondct  TYPE bapicondct,
        ti_bapicondhd     TYPE TABLE OF bapicondhd,
        ls_ti_bapicondhd  TYPE  bapicondhd,
        ti_bapicondit     TYPE TABLE OF bapicondit,
        ls_ti_bapicondit  TYPE bapicondit,
        ti_bapicondqs     TYPE TABLE OF bapicondqs,
        ls_ti_bapicondqs  TYPE bapicondqs,
        ti_bapicondvs     TYPE TABLE OF bapicondvs,
        ls_ti_bapicondvs  TYPE bapicondvs,
        to_bapiret2       TYPE TABLE OF bapiret2,
        ls_to_bapiret2    TYPE  bapiret2,
        to_bapiknumhs     TYPE TABLE OF bapiknumhs,
        ls_to_bapiknumhs  TYPE bapiknumhs,
        to_mem_initial    TYPE TABLE OF cnd_mem_initial,
        ls_to_mem_initial TYPE cnd_mem_initial,
        h_varkey(100).

  CLEAR: ti_bapicondct,
         ls_ti_bapicondct,
         ti_bapicondhd,
         ls_ti_bapicondhd,
         ti_bapicondit,
         ls_ti_bapicondit,
         ti_bapicondqs,
         ls_ti_bapicondqs,
         ti_bapicondvs,
         ls_ti_bapicondvs,
         to_bapiret2,
         ls_to_bapiret2,
         to_bapiknumhs,
         ls_to_bapiknumhs,
         to_mem_initial,
         ls_to_mem_initial,
         h_varkey.

  FIELD-SYMBOLS: <lfs_alv> TYPE gty_alv.

  CLEAR: lo_grid,
         lv_valid,
         ls_stbl,
         lt_zdjba,
         ls_zdjba,
         lt_zsdt040a,
         lt_zsdt040b,
         es_return,
         answer.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  CALL METHOD lo_grid->check_changed_data
    IMPORTING
      e_valid = lv_valid.

  CASE p_ucomm.
    WHEN '&IC1'. "双击
      CLEAR: gs_header,
             gt_outtab,
             gs_outtab.
*             go_grid,
*             go_container.


      CALL METHOD cl_gui_cfw=>flush.

      IF rs_selfield-fieldname = 'ZDJBA'.
        lv_zdjba = rs_selfield-value.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = lv_zdjba
          IMPORTING
            output = lv_zdjba.
        SELECT SINGLE * INTO gs_header
          FROM zsdt040a
          WHERE zdjba = lv_zdjba.

        SELECT * INTO TABLE gt_outtab
          FROM zsdt040b
          WHERE zdjba = lv_zdjba.

        CALL METHOD cl_gui_cfw=>dispatch.

        CALL SCREEN 9001.
      ENDIF.


    WHEN '&SUBMIT'. "提交
      READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'.
      IF sy-subrc <> 0.
        MESSAGE '请至少选择一条数据!' TYPE 'E'.
      ENDIF.

      LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'
                                    AND status = '0'.
        ls_zdjba-zdjba = gs_alv-zdjba.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = ls_zdjba-zdjba
          IMPORTING
            output = ls_zdjba-zdjba.

        COLLECT ls_zdjba INTO lt_zdjba.
        CLEAR: ls_zdjba.

        ls_temp-vkorg = gs_alv-vkorg.
        ls_temp-vtweg = gs_alv-vtweg.
        ls_temp-kunnr = gs_alv-kunnr.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = ls_temp-kunnr
          IMPORTING
            output = ls_temp-kunnr.

        ls_temp-matnr = gs_alv-matnr.
        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = ls_temp-matnr
          IMPORTING
            output       = ls_temp-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.
        COLLECT ls_temp INTO lt_temp.
        CLEAR: ls_temp.

      ENDLOOP.

      IF lt_zdjba IS NOT INITIAL.
        SELECT * INTO TABLE lt_zsdt040a
          FROM zsdt040a
          FOR ALL ENTRIES IN lt_zdjba
          WHERE zdjba = lt_zdjba-zdjba.

        SELECT * INTO TABLE lt_zsdt040b
          FROM zsdt040b
          FOR ALL ENTRIES IN lt_zdjba
          WHERE zdjba = lt_zdjba-zdjba.

        SELECT * INTO TABLE lt_a305
        FROM a305
        FOR ALL ENTRIES IN lt_temp
        WHERE kappl = 'V'
          AND vkorg = lt_temp-vkorg
          AND vtweg = lt_temp-vtweg
          AND kunnr = lt_temp-kunnr
          AND matnr = lt_temp-matnr.
      ENDIF.

      LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X'
                                            AND status = '0'.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = <lfs_alv>-kunnr
          IMPORTING
            output = <lfs_alv>-kunnr.

        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = <lfs_alv>-matnr
          IMPORTING
            output       = <lfs_alv>-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        READ TABLE lt_a305 INTO ls_a305 WITH KEY vkorg = <lfs_alv>-vkorg
                                                 vtweg = <lfs_alv>-vtweg
                                                 kunnr = <lfs_alv>-kunnr
                                                 matnr = <lfs_alv>-matnr.
        IF sy-subrc = 0.
          <lfs_alv>-msg_type = 'I'.
          <lfs_alv>-msg_status = gc_yellow.
          <lfs_alv>-message = '当前已存在相关价格信息记录,请检查'.
        ENDIF.

      ENDLOOP.

      READ TABLE gt_Alv INTO <lfs_alv> WITH KEY msg_type = 'I'.
      IF sy-subrc = 0.
        MESSAGE  '当前已存在相关价格信息记录,请确认是否继续提交OA' TYPE 'I'.
      ENDIF.

      LOOP AT lt_zdjba INTO ls_zdjba. "点击提交按钮可以对‘保存’状态的单据进行推送至OA,
        CALL FUNCTION 'ZFM_SD_041_POST_TO_0A'
          IMPORTING
            es_return = es_return
          TABLES
            it_head   = lt_zsdt040a
            it_item   = lt_zsdt040b.

        IF es_return-type = 'S'."发送OA成功,流程单号是&1
          LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE zdjba = ls_zdjba-zdjba.
            <lfs_alv>-msg_type = 'S'.
            <lfs_alv>-msg_status = gc_green.
            CONCATENATE '发送OA成功,流程单号是' es_return-fkey_value01 INTO <lfs_alv>-message.
          ENDLOOP.
        ELSE. "发送OA失败
          <lfs_alv>-msg_type = 'E'.
          <lfs_alv>-msg_status = gc_red.
          <lfs_alv>-message = '发送OA失败'.
        ENDIF.

      ENDLOOP.

      LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X' "‘审批中’或‘已审批’的单据则报错E,MESSAGE'审批中或已审批的单据不可提交'
                                           AND status <> '0'.
        <lfs_alv>-msg_type = 'E'.
        <lfs_alv>-msg_status = gc_red.
        <lfs_alv>-message = '审批中或已审批的单据不可提交'.
      ENDLOOP.
    WHEN '&EXECUTE'. "手动执行
      READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'.
      IF sy-subrc <> 0.
        MESSAGE '请至少选择一条数据!' TYPE 'E'.
      ENDIF.

      LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X' "对于已审批的价格创建价格数据报错,MESSAGE'存在包含的价格数据,请手动执行'
                                           AND status = '2'.
        <lfs_alv>-msg_type = 'E'.
        <lfs_alv>-msg_status = gc_red.
        <lfs_alv>-message = '存在包含的价格数据,请手动执行'.
      ENDLOOP.

      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
*         TITLEBAR       = ' '
*         DIAGNOSE_OBJECT             = ' '
          text_question  = '需替代原来的价格吗?'
          text_button_1  = 'Yes'
          icon_button_1  = 'icon_checked'
          text_button_2  = 'No'
          icon_button_2  = 'icon_incomplete'
*         DEFAULT_BUTTON = '1'
*         DISPLAY_CANCEL_BUTTON       = 'X'
*         USERDEFINED_F1_HELP         = ' '
*         START_COLUMN   = 25
*         START_ROW      = 6
*         POPUP_TYPE     =
*         IV_QUICKINFO_BUTTON_1       = ' '
*         IV_QUICKINFO_BUTTON_2       = ' '
        IMPORTING
          answer         = answer "1-YES; 2-NO; A-CANCEL
*       TABLES
*         PARAMETER      =
        EXCEPTIONS
          text_not_found = 1
          OTHERS         = 2.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

      IF answer = '1'. "替代原来的条件记录生成新的条件记录
        LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X'
                                             AND status = '2'.

          CLEAR: ti_bapicondct,
                 ls_ti_bapicondct,
                 ti_bapicondhd,
                 ls_ti_bapicondhd,
                 ti_bapicondit,
                 ls_ti_bapicondit,
                 ti_bapicondqs,
                 ls_ti_bapicondqs,
                 ti_bapicondvs,
                 ls_ti_bapicondvs,
                 to_bapiret2,
                 ls_to_bapiret2,
                 to_bapiknumhs,
                 ls_to_bapiknumhs,
                 to_mem_initial,
                 ls_to_mem_initial,
                 h_varkey.

          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = <lfs_alv>-kunnr
            IMPORTING
              output = <lfs_alv>-kunnr.

          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input        = <lfs_alv>-matnr
            IMPORTING
              output       = <lfs_alv>-matnr
            EXCEPTIONS
              length_error = 1
              OTHERS       = 2.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.

          CONCATENATE <lfs_alv>-vkorg <lfs_alv>-vtweg <lfs_alv>-kunnr <lfs_alv>-matnr INTO h_varkey.
          "condition table 条件表A305
          ls_ti_bapicondct-table_no = '305'.
          ls_ti_bapicondct-applicatio = 'V'.
          ls_ti_bapicondct-cond_usage = 'A'.      "条件表用途 ‘A' 定价
          ls_ti_bapicondct-cond_type = 'ZPR1'.    "定价条件
*wa_bapicondct-operation = '009'.     "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
          ls_ti_bapicondct-operation = '009'.         "更改
          ls_ti_bapicondct-varkey = h_varkey.
          ls_ti_bapicondct-valid_to = <lfs_alv>-zthsxrq. "调后失效日期
          ls_ti_bapicondct-valid_from = <lfs_alv>-zthsx. "调后生效日期
          ls_ti_bapicondct-cond_no = '$000000001'.   "创建
          APPEND ls_ti_bapicondct TO ti_bapicondct.
          CLEAR: ls_ti_bapicondct.

          "*KONH
          ls_ti_bapicondhd-operation = '009'.
*          wa_bapicondhd-operation = '004'.
          ls_ti_bapicondhd-cond_no = '$000000001'.
*          wa_bapicondhd-cond_no = '0000015528'.
          ls_ti_bapicondhd-created_by = sy-uname.
          ls_ti_bapicondhd-creat_date = sy-datum.
          ls_ti_bapicondhd-cond_usage = 'A'.
          ls_ti_bapicondhd-table_no = '305'.
          ls_ti_bapicondhd-applicatio = 'V'.
          ls_ti_bapicondhd-cond_type =  'ZPR1'.
          ls_ti_bapicondhd-varkey = h_varkey.
          ls_ti_bapicondhd-valid_from = <lfs_alv>-zthsx. "调后生效日期
          ls_ti_bapicondhd-valid_to = <lfs_alv>-zthsxrq. "调后失效日期
          APPEND ls_ti_bapicondhd TO  ti_bapicondhd .
          CLEAR: ls_ti_bapicondhd.

          "KONP
*          wa_bapicondit-operation = '004'.   ”修改
          ls_ti_bapicondit-operation = '009'. "创建
          ls_ti_bapicondit-cond_no = '$000000001'.
*          ls_ti_bapicondit-cond_no = '0000015528'.
          ls_ti_bapicondit-cond_count = '01'.     "条件序列号
          ls_ti_bapicondit-applicatio = 'V'.
          ls_ti_bapicondit-cond_type =  'ZPR1'.       "条件类型
          ls_ti_bapicondit-scaletype = 'A'.       "STFKZ Staffelsoort
          ls_ti_bapicondit-scalebasin = ''.      "KZBZG Teken:rekeneenheid "  wa_bapicondit-scalebasin = 'C'. 存在数量等级
          ls_ti_bapicondit-scale_qty = '1'.       "KSTBM Conditiestaffelbasis hoeveelheid
          ls_ti_bapicondit-cond_p_unt = '1'.      "KPEIN prijseenheid
          ls_ti_bapicondit-cond_unit = <lfs_alv>-meins.      "KMEIN Conditie-hoeveelheidseenheid
          ls_ti_bapicondit-calctypcon = 'C'.      "KRECH Conditie-rekenregel
          ls_ti_bapicondit-cond_value = <lfs_alv>-zxzj. "调整后总单价(未税)
          ls_ti_bapicondit-condcurr = <lfs_alv>-waerk."货币
          APPEND ls_ti_bapicondit TO ti_bapicondit  .
          CLEAR: ls_ti_bapicondit.

          CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
*         EXPORTING
*           PI_INITIALMODE             = ' '
*           PI_BLOCKNUMBER             =
*           PI_PHYSICAL_DELETION       =
            TABLES
              ti_bapicondct  = ti_bapicondct
              ti_bapicondhd  = ti_bapicondhd
              ti_bapicondit  = ti_bapicondit
              ti_bapicondqs  = ti_bapicondqs
              ti_bapicondvs  = ti_bapicondvs
              to_bapiret2    = to_bapiret2
              to_bapiknumhs  = to_bapiknumhs
              to_mem_initial = to_mem_initial
            EXCEPTIONS
              update_error   = 1
              OTHERS         = 2.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.

          LOOP AT to_bapiret2 INTO ls_to_bapiret2 WHERE type = 'A' OR type = 'E'.
            lv_error = 'X'.
            EXIT.
          ENDLOOP.
          IF lv_error = 'X'.
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*           IMPORTING
*             RETURN        =
              .

            <lfs_alv>-msg_type = 'E'.
            <lfs_alv>-msg_status = gc_red.
            READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'E'.
            IF sy-subrc = 0.
              <lfs_alv>-message = ls_to_bapiret2-message.
            ENDIF.

          ELSE.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = 'X'
*           IMPORTING
*               RETURN        =
              .
            <lfs_alv>-msg_type = 'S'.
            <lfs_alv>-msg_status = gc_green.
            READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'S'
                                                                id = 'CND_EXCHANGE'
                                                                number = '003'.
            IF sy-subrc = 0.
              <lfs_alv>-message = ls_to_bapiret2-message.
              <lfs_alv>-knumv = ls_to_bapiret2-message_v1.
            ENDIF.
          ENDIF.

        ENDLOOP.

      ENDIF.

    WHEN OTHERS.
  ENDCASE.

  gs_layout-cwidth_opt = 'X'.
  CALL METHOD lo_grid->set_frontend_layout
    EXPORTING
      is_layout = gs_layout.
  ls_stbl-row = 'X'." 基于行的稳定刷新
  ls_stbl-col = 'X'." 基于列稳定刷新
  CALL METHOD lo_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stbl
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_create_price_record
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_DATE_S
*&      --> LV_DATE_E
*&      --> GS_ALV
*&---------------------------------------------------------------------*
FORM frm_create_price_record  USING  pdate_s TYPE datum
                                     pdate_e TYPE datum
                                     p_knumh TYPE a305-knumh
                                     p_flag TYPE c
                              CHANGING  p_alv TYPE gty_alv.
  DATA: ti_bapicondct     TYPE TABLE OF bapicondct,
        ls_ti_bapicondct  TYPE bapicondct,
        ti_bapicondhd     TYPE TABLE OF bapicondhd,
        ls_ti_bapicondhd  TYPE  bapicondhd,
        ti_bapicondit     TYPE TABLE OF bapicondit,
        ls_ti_bapicondit  TYPE bapicondit,
        ti_bapicondqs     TYPE TABLE OF bapicondqs,
        ls_ti_bapicondqs  TYPE bapicondqs,
        ti_bapicondvs     TYPE TABLE OF bapicondvs,
        ls_ti_bapicondvs  TYPE bapicondvs,
        to_bapiret2       TYPE TABLE OF bapiret2,
        ls_to_bapiret2    TYPE  bapiret2,
        to_bapiknumhs     TYPE TABLE OF bapiknumhs,
        ls_to_bapiknumhs  TYPE bapiknumhs,
        to_mem_initial    TYPE TABLE OF cnd_mem_initial,
        ls_to_mem_initial TYPE cnd_mem_initial,
        h_varkey(100).

  DATA: ls_konp TYPE konp.
  CLEAR: ls_konp.

  CLEAR:  ti_bapicondct,
          ls_ti_bapicondct,
          ti_bapicondhd,
          ls_ti_bapicondhd,
          ti_bapicondit,
          ls_ti_bapicondit,
          ti_bapicondqs,
          ls_ti_bapicondqs,
          ti_bapicondvs,
          ls_ti_bapicondvs,
          to_bapiret2,
          ls_to_bapiret2,
          to_bapiknumhs,
          ls_to_bapiknumhs,
          to_mem_initial,
          ls_to_mem_initial,
          h_varkey.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_alv-kunnr
    IMPORTING
      output = p_alv-kunnr.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      input        = p_alv-matnr
    IMPORTING
      output       = p_alv-matnr
    EXCEPTIONS
      length_error = 1
      OTHERS       = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  IF p_flag = 'X'.
    SELECT SINGLE * INTO ls_konp
    FROM konp
    WHERE knumh = p_knumh
      AND kappl = 'V'
      AND kschl = 'ZPR1'.
  ENDIF.

  CONCATENATE p_alv-vkorg p_alv-vtweg p_alv-kunnr p_alv-matnr INTO h_varkey.
  "condition table 条件表A305
  ls_ti_bapicondct-table_no = '305'.
  ls_ti_bapicondct-applicatio = 'V'.
  ls_ti_bapicondct-cond_usage = 'A'.      "条件表用途 ‘A' 定价
  ls_ti_bapicondct-cond_type = 'ZPR1'.    "定价条件
*wa_bapicondct-operation = '009'.     "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
  ls_ti_bapicondct-operation = '009'.         "创建
  ls_ti_bapicondct-varkey = h_varkey.
  ls_ti_bapicondct-valid_to = pdate_e. "调后失效日期
  ls_ti_bapicondct-valid_from = pdate_s. "调后生效日期
  ls_ti_bapicondct-cond_no = '$000000001'.   "创建
  APPEND ls_ti_bapicondct TO ti_bapicondct.
  CLEAR: ls_ti_bapicondct.

  "*KONH
  ls_ti_bapicondhd-operation = '009'.
*          wa_bapicondhd-operation = '004'.
  ls_ti_bapicondhd-cond_no = '$000000001'.
*          wa_bapicondhd-cond_no = '0000015528'.
  ls_ti_bapicondhd-created_by = sy-uname.
  ls_ti_bapicondhd-creat_date = sy-datum.
  ls_ti_bapicondhd-cond_usage = 'A'.
  ls_ti_bapicondhd-table_no = '305'.
  ls_ti_bapicondhd-applicatio = 'V'.
  ls_ti_bapicondhd-cond_type =  'ZPR1'.
  ls_ti_bapicondhd-varkey = h_varkey.
  ls_ti_bapicondhd-valid_from = pdate_s. "生效日期
  ls_ti_bapicondhd-valid_to = pdate_e. "失效日期
  APPEND ls_ti_bapicondhd TO  ti_bapicondhd .
  CLEAR: ls_ti_bapicondhd.

  "KONP
*          wa_bapicondit-operation = '004'.   ”修改
  ls_ti_bapicondit-operation = '009'. "创建
  ls_ti_bapicondit-cond_no = '$000000001'.
*          ls_ti_bapicondit-cond_no = '0000015528'.
  ls_ti_bapicondit-cond_count = '01'.     "条件序列号
  ls_ti_bapicondit-applicatio = 'V'.
  ls_ti_bapicondit-cond_type =  'ZPR1'.       "条件类型
  ls_ti_bapicondit-scaletype = 'A'.       "STFKZ Staffelsoort
  ls_ti_bapicondit-scalebasin = ''.      "KZBZG Teken:rekeneenheid "  wa_bapicondit-scalebasin = 'C'. 存在数量等级
  ls_ti_bapicondit-scale_qty = '1'.       "KSTBM Conditiestaffelbasis hoeveelheid
  ls_ti_bapicondit-cond_p_unt = '1'.      "KPEIN prijseenheid
  ls_ti_bapicondit-cond_unit = p_alv-meins.      "KMEIN Conditie-hoeveelheidseenheid
  ls_ti_bapicondit-calctypcon = 'C'.      "KRECH Conditie-rekenregel
  IF p_flag = 'X'.
    ls_ti_bapicondit-cond_value = ls_konp-kbetr. "
  ELSE.
    ls_ti_bapicondit-cond_value = p_alv-zxzj. "调整后总单价(未税)
  ENDIF.
*  ls_ti_bapicondit-cond_value = p_alv-zxzj. "调整后总单价(未税)
  ls_ti_bapicondit-condcurr = p_alv-waerk."货币
  APPEND ls_ti_bapicondit TO ti_bapicondit  .
  CLEAR: ls_ti_bapicondit.

  CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
*         EXPORTING
*           PI_INITIALMODE             = ' '
*           PI_BLOCKNUMBER             =
*           PI_PHYSICAL_DELETION       =
    TABLES
      ti_bapicondct  = ti_bapicondct
      ti_bapicondhd  = ti_bapicondhd
      ti_bapicondit  = ti_bapicondit
      ti_bapicondqs  = ti_bapicondqs
      ti_bapicondvs  = ti_bapicondvs
      to_bapiret2    = to_bapiret2
      to_bapiknumhs  = to_bapiknumhs
      to_mem_initial = to_mem_initial
    EXCEPTIONS
      update_error   = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  LOOP AT to_bapiret2 INTO ls_to_bapiret2 WHERE type = 'A' OR type = 'E'.
    lv_error = 'X'.
    EXIT.
  ENDLOOP.
  IF lv_error = 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*           IMPORTING
*             RETURN        =
      .

    p_alv-msg_type = 'E'.
    p_alv-msg_status = gc_red.
    READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'E'.
    IF sy-subrc = 0.
      p_alv-message = ls_to_bapiret2-message.
    ENDIF.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'
*           IMPORTING
*       RETURN        =
      .
    p_alv-msg_type = 'S'.
    p_alv-msg_status = gc_green.
    READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'S'
                                                        id = 'CND_EXCHANGE'
                                                        number = '003'.
    IF sy-subrc = 0.
      p_alv-message = ls_to_bapiret2-message.
      p_alv-knumv = ls_to_bapiret2-message_v1.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_change_price_record
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_DATE_S
*&      --> LV_DATE_E
*&      --> GS_ALV
*&---------------------------------------------------------------------*
FORM frm_change_price_record  USING pdate_s TYPE datum
                                    pdate_e TYPE datum
                                    p_knumh TYPE a305-knumh
                                    p_flag TYPE c
                              CHANGING p_alv TYPE gty_alv.
  DATA: ti_bapicondct     TYPE TABLE OF bapicondct,
        ls_ti_bapicondct  TYPE bapicondct,
        ti_bapicondhd     TYPE TABLE OF bapicondhd,
        ls_ti_bapicondhd  TYPE  bapicondhd,
        ti_bapicondit     TYPE TABLE OF bapicondit,
        ls_ti_bapicondit  TYPE bapicondit,
        ti_bapicondqs     TYPE TABLE OF bapicondqs,
        ls_ti_bapicondqs  TYPE bapicondqs,
        ti_bapicondvs     TYPE TABLE OF bapicondvs,
        ls_ti_bapicondvs  TYPE bapicondvs,
        to_bapiret2       TYPE TABLE OF bapiret2,
        ls_to_bapiret2    TYPE  bapiret2,
        to_bapiknumhs     TYPE TABLE OF bapiknumhs,
        ls_to_bapiknumhs  TYPE bapiknumhs,
        to_mem_initial    TYPE TABLE OF cnd_mem_initial,
        ls_to_mem_initial TYPE cnd_mem_initial,
        h_varkey(100).

  DATA: ls_a305 TYPE a305,
        ls_konp TYPE konp.
  CLEAR: ls_a305,
         ls_konp.

  CLEAR:  ti_bapicondct,
          ls_ti_bapicondct,
          ti_bapicondhd,
          ls_ti_bapicondhd,
          ti_bapicondit,
          ls_ti_bapicondit,
          ti_bapicondqs,
          ls_ti_bapicondqs,
          ti_bapicondvs,
          ls_ti_bapicondvs,
          to_bapiret2,
          ls_to_bapiret2,
          to_bapiknumhs,
          ls_to_bapiknumhs,
          to_mem_initial,
          ls_to_mem_initial,
          h_varkey.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_alv-kunnr
    IMPORTING
      output = p_alv-kunnr.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      input        = p_alv-matnr
    IMPORTING
      output       = p_alv-matnr
    EXCEPTIONS
      length_error = 1
      OTHERS       = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  IF p_flag = 'X'.
    SELECT SINGLE * INTO ls_konp
    FROM konp
    WHERE knumh = p_knumh
      AND kappl = 'V'
      AND kschl = 'ZPR1'.
  ENDIF.

  CONCATENATE p_alv-vkorg p_alv-vtweg p_alv-kunnr p_alv-matnr INTO h_varkey.
  "condition table 条件表A305
  ls_ti_bapicondct-table_no = '305'.
  ls_ti_bapicondct-applicatio = 'V'.
  ls_ti_bapicondct-cond_usage = 'A'.      "条件表用途 ‘A' 定价
  ls_ti_bapicondct-cond_type = 'ZPR1'.    "定价条件
*wa_bapicondct-operation = '009'.     "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
  ls_ti_bapicondct-operation = '004'.         "更改
  ls_ti_bapicondct-varkey = h_varkey.
  ls_ti_bapicondct-valid_to = pdate_e. "失效日期
  ls_ti_bapicondct-valid_from = pdate_s. "生效日期
*        ls_ti_bapicondct-cond_no = '$000000001'.   "创建
  ls_ti_bapicondct-cond_no = p_knumh.   "修改
  APPEND ls_ti_bapicondct TO ti_bapicondct.
  CLEAR: ls_ti_bapicondct.

  "*KONH
*        ls_ti_bapicondhd-operation = '009'.
  ls_ti_bapicondhd-operation = '004'.
*        ls_ti_bapicondhd-cond_no = '$000000001'.
  ls_ti_bapicondhd-cond_no = p_knumh.
  ls_ti_bapicondhd-created_by = sy-uname.
  ls_ti_bapicondhd-creat_date = sy-datum.
  ls_ti_bapicondhd-cond_usage = 'A'.
  ls_ti_bapicondhd-table_no = '305'.
  ls_ti_bapicondhd-applicatio = 'V'.
  ls_ti_bapicondhd-cond_type =  'ZPR1'.
  ls_ti_bapicondhd-varkey = h_varkey.
  ls_ti_bapicondhd-valid_from = pdate_s. "调后生效日期
  ls_ti_bapicondhd-valid_to = pdate_e. "调后失效日期
  APPEND ls_ti_bapicondhd TO  ti_bapicondhd .
  CLEAR: ls_ti_bapicondhd.

  "KONP
  ls_ti_bapicondit-operation = '004'.   "修改
*        ls_ti_bapicondit-operation = '009'. "创建
*        ls_ti_bapicondit-cond_no = '$000000001'.
  ls_ti_bapicondit-cond_no = p_knumh.
  ls_ti_bapicondit-cond_count = '01'.     "条件序列号
  ls_ti_bapicondit-applicatio = 'V'.
  ls_ti_bapicondit-cond_type =  'ZPR1'.       "条件类型
  ls_ti_bapicondit-scaletype = 'A'.       "STFKZ Staffelsoort
  ls_ti_bapicondit-scalebasin = ''.      "KZBZG Teken:rekeneenheid "  wa_bapicondit-scalebasin = 'C'. 存在数量等级
  ls_ti_bapicondit-scale_qty = '1'.       "KSTBM Conditiestaffelbasis hoeveelheid
  ls_ti_bapicondit-cond_p_unt = '1'.      "KPEIN prijseenheid
  ls_ti_bapicondit-cond_unit = p_alv-meins.      "KMEIN Conditie-hoeveelheidseenheid
  ls_ti_bapicondit-calctypcon = 'C'.      "KRECH Conditie-rekenregel
  IF p_flag = 'X'.
    ls_ti_bapicondit-cond_value = ls_konp-kbetr. "
  ELSE.
    ls_ti_bapicondit-cond_value = p_alv-zxzj. "调整后总单价(未税)
  ENDIF.
*  ls_ti_bapicondit-cond_value = ls_konp-kbetr. "调整后总单价(未税)
  ls_ti_bapicondit-condcurr = p_alv-waerk."货币
  APPEND ls_ti_bapicondit TO ti_bapicondit  .
  CLEAR: ls_ti_bapicondit.

  CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
*         EXPORTING
*           PI_INITIALMODE             = ' '
*           PI_BLOCKNUMBER             =
*           PI_PHYSICAL_DELETION       =
    TABLES
      ti_bapicondct  = ti_bapicondct
      ti_bapicondhd  = ti_bapicondhd
      ti_bapicondit  = ti_bapicondit
      ti_bapicondqs  = ti_bapicondqs
      ti_bapicondvs  = ti_bapicondvs
      to_bapiret2    = to_bapiret2
      to_bapiknumhs  = to_bapiknumhs
      to_mem_initial = to_mem_initial
    EXCEPTIONS
      update_error   = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  LOOP AT to_bapiret2 INTO ls_to_bapiret2 WHERE type = 'A' OR type = 'E'.
    lv_error = 'X'.
    EXIT.
  ENDLOOP.
  IF lv_error = 'X'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*           IMPORTING
*             RETURN        =
      .

    p_alv-msg_type = 'E'.
    p_alv-msg_status = gc_red.
    READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'E'.
    IF sy-subrc = 0.
      p_alv-message = ls_to_bapiret2-message.
    ENDIF.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'
*           IMPORTING
*       RETURN        =
      .
    p_alv-msg_type = 'S'.
    p_alv-msg_status = gc_green.
    READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'S'
                                                        id = 'CND_EXCHANGE'
                                                        number = '003'.
    IF sy-subrc = 0.
      p_alv-message = ls_to_bapiret2-message.
      p_alv-knumv = ls_to_bapiret2-message_v1.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat_9001
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat_9001 .
*  CLEAR: lt_fieldcat,
*         ls_fieldcat.
*  DEFINE d1.
*    ls_fieldcat-fieldname = &1.
*    ls_fieldcat-scrtext_l = &2.
*    ls_fieldcat-edit = &3.
*    ls_fieldcat-intlen = &4.
*    ls_fieldcat-outputlen = &5.
*    APPEND ls_fieldcat TO lt_fieldcat.
*    CLEAR ls_fieldcat.
*  END-OF-DEFINITION.
*
*  IF sy-langu = '1'.
*    IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
*      d1: 'POSNR' '序号' '' 10 10.
*      d1:'ZBJDH' '报价单号' '' 10 10.
*      d1:'ZBJDH1' '报价单项次' '' 10 10.
*      d1:'MATNR' '物料编码' '' 40 40.
*      d1:'MAKTX' '物料名称' '' 40 40.
*      d1:'ZPRODMODEL' '产品型号' '' 50 50.
*      d1:'MEINS' '单位' '' 10 10.
*      d1: 'KDMAT' '客户物料编码' '' 35 35.
*      d1: 'ZJGLX' '价格类型' '' 10 10.
*      d1:'ZBGYY' '变更原因' '' 60 60.
*      d1:'WAERK' '币别' '' 5 5.
*      d1: 'ZDYHL' '当月汇率' '' 15 15.
*      d1: 'ZBJHL' '报价汇率' '' 15 15.
*      d1: 'ZHJSZ' '税种' '' 2 2.
*      d1:'ZYJG' '原商品售价(未税)' '' 14 14.
*      d1:'ZYSL' '原分摊数量' '' 17 17.
*      d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
*      d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
*      d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
*      d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
*      d1:'ZXJG' '新产品售价(未税)' '' 14 14.
*      d1:'ZXSJ' '新模具分摊数量' '' 17 17.
*      d1:'ZXMJJG' '新模具分摊售价(未税)' '' 14 14.
*      d1:'ZXKS' '模具分摊起始日期' '' 10 10.
*      d1:'ZXJS' '模具分摊截止日期' '' 10 10.
*      d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
*      d1:'ZJGBD' '价格变动比例%' '' 14 14.
*      d1:'ZTQSX' '调前生效日期' '' 10 10.
*      d1:'ZTHSX' '调后生效日期' '' 10 10.
*      d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
*      d1:'ZTHSXRQ' '调后失效日期' '' 10 10.
*      d1:'ZHGBM' '海关编码' '' 20 20.
*      d1:'ZZTCY' '征退差异%' '' 14 14.
*      d1:'ZCKTS' '出口退税率%' '' 14 14.
*      d1:'ZEXYF' '额外出口运费' '' 14 14.
*      d1:'ZGCCB' '工程成本' '' 14 14.
*      d1:'ZSHCB' '实际成本单价' '' 14 14.
*      d1:'ZGCML' '工程毛利率' '' 14 14.
*      d1:'ZSJML' '实际毛利率' '' 14 14.
*    ELSE.
*      d1: 'POSNR' '序号' 'X' 10 10.
*      d1:'ZBJDH' '报价单号' 'X' 10 10.
*      d1:'ZBJDH1' '报价单项次' 'X' 10 10.
*      d1:'MATNR' '物料编码' 'X' 40 40.
*      d1:'MAKTX' '物料名称' '' 40 40.
*      d1:'ZPRODMODEL' '产品型号' '' 50 50.
*      d1:'MEINS' '单位' '' 10 10.
*      d1: 'KDMAT' '客户物料编码' 'X' 35 35.
*      d1: 'ZJGLX' '价格类型' 'X' 10 10.
*      d1:'ZBGYY' '变更原因' 'X' 60 60.
*      d1:'WAERK' '币别' '' 5 5.
*      d1: 'ZDYHL' '当月汇率' 'X' 15 15.
*      d1: 'ZBJHL' '报价汇率' 'X' 15 15.
*      d1: 'ZHJSZ' '税种' 'X' 2 2.
*      d1:'ZYJG' '原商品售价(未税)' '' 14 14.
*      d1:'ZYSL' '原分摊数量' '' 17 17.
*      d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
*      d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
*      d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
*      d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
*      d1:'ZXJG' '新产品售价(未税)' 'X' 14 14.
*      d1:'ZXSJ' '新模具分摊数量' 'X' 17 17.
*      d1:'ZXMJJG' '新模具分摊售价(未税)' 'X' 14 14.
*      d1:'ZXKS' '模具分摊起始日期' 'X' 10 10.
*      d1:'ZXJS' '模具分摊截止日期' 'X' 10 10.
*      d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
*      d1:'ZJGBD' '价格变动比例%' '' 14 14.
*      d1:'ZTQSX' '调前生效日期' '' 10 10.
*      d1:'ZTHSX' '调后生效日期' 'X' 10 10.
*      d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
*      d1:'ZTHSXRQ' '调后失效日期' 'X' 10 10.
*      d1:'ZHGBM' '海关编码' 'X' 20 20.
*      d1:'ZZTCY' '征退差异%' 'X' 14 14.
*      d1:'ZCKTS' '出口退税率%' 'X' 14 14.
*      d1:'ZEXYF' '额外出口运费' 'X' 14 14.
*      d1:'ZGCCB' '工程成本' 'X' 14 14.
*      d1:'ZSHCB' '实际成本单价' 'X' 14 14.
*      d1:'ZGCML' '工程毛利率' 'X' 14 14.
*      d1:'ZSJML' '实际毛利率' 'X' 14 14.
*    ENDIF.
*
*  ELSE.
*    IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
*      d1: 'POSNR' 'Item No' '' 10 10.
*      d1:'ZBJDH' 'Quotation no' '' 10 10.
*      d1:'ZBJDH1' 'Quotation item number' '' 10 10.
*      d1:'MATNR' 'Material No' '' 40 40.
*      d1:'MAKTX' 'Material Name' '' 40 40.
*      d1:'ZPRODMODEL' 'Product Model' '' 50 50.
*      d1:'MEINS' 'Base Unit of Measure' '' 10 10.
*      d1: 'KDMAT' 'Customer Material No' '' 35 35.
*      d1: 'ZJGLX' 'Price Type' '' 10 10.
*      d1:'ZBGYY' 'Reason for Change' '' 60 60.
*      d1:'WAERK' 'Currency' '' 5 5.
*      d1: 'ZDYHL' 'Current month exchange rate' '' 15 15.
*      d1: 'ZBJHL' 'Quotation exchange rate' '' 15 15.
*      d1: 'ZHJSZ' 'Categories of taxes' '' 2 2.
*      d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
*      d1:'ZYSL' 'Original allocation quantity' '' 17 17.
*      d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
*      d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
*      d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
*      d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
*      d1:'ZXJG' 'New product selling price (before tax)' '' 14 14.
*      d1:'ZXSJ' 'New mold allocation quantity' '' 17 17.
*      d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' '' 14 14.
*      d1:'ZXKS' 'Starting date of mold allocation' '' 10 10.
*      d1:'ZXJS' 'Mold allocation deadline' '' 10 10.
*      d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
*      d1:'ZJGBD' 'Price change ratio%' '' 14 14.
*      d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
*      d1:'ZTHSX' 'Effective date after adjustment' '' 10 10.
*      d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
*      d1:'ZTHSXRQ' 'Expiration date after adjustment' '' 10 10.
*      d1:'ZHGBM' 'Customs code' '' 20 20.
*      d1:'ZZTCY' 'Tax refund difference%' '' 14 14.
*      d1:'ZCKTS' 'Export tax refund rate%' '' 14 14.
*      d1:'ZEXYF' 'Additional export shipping costs' '' 14 14.
*      d1:'ZGCCB' 'Project cost' '' 14 14.
*      d1:'ZSHCB' 'Actual cost unit price' '' 14 14.
*      d1:'ZGCML' 'Engineering gross profit margin' '' 14 14.
*      d1:'ZSJML' 'Actual gross profit margin' '' 14 14.
*    ELSE.
*      d1: 'POSNR' 'Item No' 'X' 10 10.
*      d1:'ZBJDH' 'Quotation no' 'X' 10 10.
*      d1:'ZBJDH1' 'Quotation item number' 'X' 10 10.
*      d1:'MATNR' 'Material No' 'X' 40 40.
*      d1:'MAKTX' 'Material Name' '' 40 40.
*      d1:'ZPRODMODEL' 'Product Model' '' 50 50.
*      d1:'MEINS' 'Base Unit of Measure' '' 10 10.
*      d1: 'KDMAT' 'Customer Material No' 'X' 35 35.
*      d1: 'ZJGLX' 'Price Type' 'X' 10 10.
*      d1:'ZBGYY' 'Reason for Change' 'X' 60 60.
*      d1:'WAERK' 'Currency' '' 5 5.
*      d1: 'ZDYHL' 'Current month exchange rate' 'X' 15 15.
*      d1: 'ZBJHL' 'Quotation exchange rate' 'X' 15 15.
*      d1: 'ZHJSZ' 'Categories of taxes' 'X' 2 2.
*      d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
*      d1:'ZYSL' 'Original allocation quantity' '' 17 17.
*      d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
*      d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
*      d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
*      d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
*      d1:'ZXJG' 'New product selling price (before tax)' 'X' 14 14.
*      d1:'ZXSJ' 'New mold allocation quantity' 'X' 17 17.
*      d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' 'X' 14 14.
*      d1:'ZXKS' 'Starting date of mold allocation' 'X' 10 10.
*      d1:'ZXJS' 'Mold allocation deadline' 'X' 10 10.
*      d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
*      d1:'ZJGBD' 'Price change ratio%' '' 14 14.
*      d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
*      d1:'ZTHSX' 'Effective date after adjustment' 'X' 10 10.
*      d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
*      d1:'ZTHSXRQ' 'Expiration date after adjustment' 'X' 10 10.
*      d1:'ZHGBM' 'Customs code' 'X' 20 20.
*      d1:'ZZTCY' 'Tax refund difference%' 'X' 14 14.
*      d1:'ZCKTS' 'Export tax refund rate%' 'X' 14 14.
*      d1:'ZEXYF' 'Additional export shipping costs' 'X' 14 14.
*      d1:'ZGCCB' 'Project cost' 'X' 14 14.
*      d1:'ZSHCB' 'Actual cost unit price' 'X' 14 14.
*      d1:'ZGCML' 'Engineering gross profit margin' 'X' 14 14.
*      d1:'ZSJML' 'Actual gross profit margin' 'X' 14 14.
*    ENDIF.
*  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  CHANGE_DATA  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE change_data INPUT.
  DATA: lv_lifnr   TYPE knvp-lifnr,
        lv_kunnr_c TYPE kna1-kunnr..
  CLEAR: lv_lifnr,
         lv_kunnr_c.

  lv_kunnr_c = gs_header-kunnr.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = lv_kunnr_c
    IMPORTING
      output = lv_kunnr_c.

  CLEAR: gs_header-zkhjl.
  SELECT SINGLE lifnr INTO lv_lifnr "客户经理
        FROM knvp
        WHERE kunnr = lv_kunnr_c
          AND vkorg = gs_header-vkorg
          AND vtweg = '00'
          AND spart = '00'
          AND parvw = 'V1'.
  IF lv_lifnr IS NOT INITIAL.
    gs_header-zkhjl = lv_lifnr.
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_get_zhjsz_f4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- <FS_OUTTAB>_ZHJSZ
*&---------------------------------------------------------------------*
FORM frm_get_zhjsz_f4  CHANGING zhjsz TYPE zsdt040b-zhjsz.
  DATA: value_tab     TYPE TABLE OF dfies,
        ls_value_tab  TYPE dfies,
        return_tab    TYPE TABLE OF ddshretval,
        ls_return_tab TYPE ddshretval,
        lt_zsdt040d   TYPE TABLE OF zsdt040d,
        ls_zsdt040d   TYPE zsdt040d.

  SELECT * INTO TABLE lt_zsdt040d
    FROM zsdt040d.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE  = ' '
      retfield        = 'ZHJSZ'
*     PVALKEY         = ' '
*     DYNPPROG        = ' '
*     DYNPNR          = ' '
*     DYNPROFIELD     = ' '
*     STEPL           = 0
*     WINDOW_TITLE    =
*     VALUE           = ' '
      value_org       = 'S'
*     MULTIPLE_CHOICE = ' '
*     DISPLAY         = ' '
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM   = ' '
*     CALLBACK_METHOD =
*     MARK_TAB        =
*   IMPORTING
*     USER_RESET      =
    TABLES
      value_tab       = lt_zsdt040d
*     FIELD_TAB       =
      return_tab      = return_tab
*     DYNPFLD_MAPPING =
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ELSE.
    READ TABLE return_tab INTO ls_return_tab INDEX 1.
    IF sy-subrc = 0  AND ls_return_tab-fieldval IS NOT INITIAL.
      zhjsz = ls_return_tab-fieldval.
    ENDIF.
  ENDIF.
ENDFORM.

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信博6主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值