销售清单报表(含打印,审批)

*&---------------------------------------------------------------------*
*& Report ZCOR005
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsdr010.

TABLES:sscrfields, vbak,vbap,vbkd.


DATA: gt_fieldcat  TYPE lvc_t_fcat,
      gt_fieldcat2 TYPE lvc_t_fcat,
      gs_fieldcat  TYPE lvc_s_fcat.
DATA: gs_layout   TYPE lvc_s_layo,
      gs_variant  LIKE disvariant,
      gs_stbl     TYPE lvc_s_stbl,
      gs_variant2 LIKE disvariant.
DATA: g_grid1     TYPE REF TO cl_gui_alv_grid."GUI控制


DATA:gs_events TYPE slis_alv_event,
     gt_events TYPE slis_t_event.
DATA: grid_title TYPE lvc_title.
TYPES:BEGIN OF out_ty,
        vkorg        TYPE vbak-vkorg,
        vtext_1      TYPE tvkot-vtext,
        vtweg        TYPE vbak-vtweg,
        vtext_2      TYPE tvtwt-vtext,
        spart        TYPE vbak-spart,
        kunnr        TYPE vbak-kunnr,
        name1_1      TYPE kna1-name1,
        vtext_3      TYPE tvk2t-vtext,
        name1_2      TYPE lfa1-name1,
        bstkd        TYPE vbkd-bstkd,
        auart        TYPE vbak-auart,
        bezei        TYPE tvakt-bezei,
        zshzt        TYPE char3,
        vbeln        TYPE vbap-vbeln,

        posnr        TYPE vbap-posnr,
        pstyv        TYPE vbap-pstyv,
        vtext_4      TYPE t179t-vtext,
        werks        TYPE vbap-werks,
        zggxh        TYPE mara-zggxh,
        matnr        TYPE vbap-matnr,
        maktx        TYPE makt-maktx,
        kdmat        TYPE vbap-kdmat,
        arktx        TYPE vbap-arktx,
        matkl        TYPE vbap-matkl,
        wgbez        TYPE t023t-wgbez,
        kwmeng       TYPE vbap-kwmeng,
        zwcjjhsl     TYPE vbap-kwmeng,
        dlvqty_bu    TYPE vbep-dlvqty_bu,
        meins        TYPE vbap-meins,

        netwr        TYPE vbap-netwr,
        kpein        TYPE vbap-kpein,
        zhsdj        TYPE vbap-netwr,
        zhszje       TYPE vbap-netwr,
        zhswjzje     TYPE vbap-netwr,
        zwswjzje     TYPE vbap-netwr,
*        netwr        TYPE char30,
*        zhsdj        TYPE char30,
*        zhszje       TYPE char30,
        waerk        TYPE vbak-waerk,
        stcur        TYPE vbkd-stcur,
        kursk        TYPE vbkd-kursk,  "ADD BY 2023/6/6
        zterm        TYPE vbkd-zterm,
        vtext_5      TYPE tvzbt-vtext,
        req_dlvdate  TYPE vbep-req_dlvdate,
        zjhzt        TYPE char10,
        ettyp        TYPE vbep-ettyp,
        zsczlwb      TYPE char200,
        zhbz         TYPE char200,
        abgru        TYPE vbap-abgru,
        vgbel        TYPE vbap-vgbel,
        vgpos        TYPE vbap-vgpos,
        erdat        TYPE vbap-erdat,
        erzet        TYPE vbap-erzet,
        ernam        TYPE vbap-ernam,

        zdbkc        TYPE t001l-lgort,  "仓库
        zdbkc2       TYPE t001l-lgobe,  "仓库
        zcgddsl      TYPE ekpo-menge,   "采购订单数量
        zycjdbdsl    TYPE ekpo-menge,   "采购订单数量

        sel          TYPE char1,
        icon(04),
        message(200),

        lgort        TYPE vbap-lgort,
        adrnr        TYPE lfa1-adrnr,
        remark       TYPE adrt-remark,
        vrkme        TYPE vbap-vrkme,
        lgobe        TYPE t001l-lgobe,

        lfimg        TYPE lips-lfimg,

        zdybs        TYPE   char6, "打印标识
        clr          TYPE   char4, "可以控制行颜色

    
        bedae        TYPE vbap-bedae, "需求类型
        edatu        TYPE vbep-edatu, "首个日期
        zdh          TYPE char10,
        prodh        TYPE vbap-prodh, "商显事业部
        zbcdbsl      TYPE vbap-kwmeng, "本次调拨数量

       
        objnr        TYPE jcds-objnr,
        usnam        TYPE jcds-usnam,

        bwbdj        TYPE vbap-netwr,  "本位币单价
        bwbzje       TYPE vbap-netwr,  "本位币总金额
        vbtyp        TYPE tvak-vbtyp,  "

        znetwr       TYPE c LENGTH  12,
        zzhsdj       TYPE c LENGTH  12,
        zzhszje      TYPE c LENGTH  12,
        zzhswjzje    TYPE c LENGTH  12,
        zzwswjzje    TYPE c LENGTH  12,
        zbwbdj       TYPE c LENGTH  12,
        zbwbzje      TYPE c LENGTH  12,

*--------------------------------------------------------------------* ADD BY 2023/6/16
        bwbbhszje    TYPE vbap-netwr,  "本位币不含税总金额

        VKBUR        TYPE VBAK-VKBUR, "销售办公室

        "End insert.
      END OF out_ty.
DATA g_function_key TYPE smp_dyntxt.

DATA:gt_out TYPE TABLE OF out_ty WITH HEADER LINE.
DATA gs_out LIKE LINE OF gt_out.
DATA:gt_out_xh TYPE TABLE OF out_ty .
DATA:gt_out_s TYPE TABLE OF out_ty .
DATA:BEGIN OF gt_out_fz OCCURS 0,
       objek TYPE ausp-objek,
     END OF gt_out_fz.

DATA:BEGIN OF gs_agr_users,
       uname TYPE agr_users-uname,
     END OF gs_agr_users.
DATA: gt_agr_users  LIKE TABLE OF gs_agr_users.

DATA:gv_msg TYPE bapi_msg.
DATA:gr_grid TYPE REF TO cl_gui_alv_grid.

DATA:gt_ztsd004 TYPE TABLE OF ztsd004,
     gs_ztsd004 LIKE LINE OF gt_ztsd004.
CONSTANTS:c_green  LIKE dv70a-statusicon VALUE '@08@',
          c_yellow LIKE dv70a-statusicon VALUE '@09@',
          c_red    LIKE dv70a-statusicon VALUE '@0A@'.
*BDC定义
DATA bdcdata TYPE STANDARD TABLE OF bdcdata WITH HEADER LINE.
DATA messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA bdc_mode TYPE c LENGTH 1 VALUE 'N'.
DATA nodata TYPE c LENGTH 1 VALUE ''.


DEFINE app_fieldcat.
  gs_fieldcat-fieldname = &1.
  gs_fieldcat-coltext = &2.
  gs_fieldcat-edit_mask = &3.
  gs_fieldcat-no_zero = &4.
  gs_fieldcat-ref_table = &5.
  gs_fieldcat-ref_field = &6.
  gs_fieldcat-outputlen = &7.

*负号前置
  IF  gs_fieldcat-fieldname = 'NETWR' OR gs_fieldcat-fieldname = 'ZHSDJ' OR  gs_fieldcat-fieldname = 'ZHSZJE' OR  gs_fieldcat-fieldname = 'ZHSWJZJE' OR  gs_fieldcat-fieldname = 'ZWSWJZJE' .
gs_fieldcat-edit_mask = '==SIGN'.
    ELSEIF gs_fieldcat-fieldname = 'ZCGDDSL'.
       gs_fieldcat-edit     = 'X'."可编辑
       gs_fieldcat-ref_field   = 'ZCGDDSL'.
       gs_fieldcat-ref_table   = 'ZSSD010A'.
    ELSEIF gs_fieldcat-fieldname = 'ZDBKC'.
       gs_fieldcat-edit     = 'X'."可编辑
       gs_fieldcat-f4availabl = 'X'.
    ELSEIF gs_fieldcat-fieldname = 'SEL'.
       gs_fieldcat-checkbox = 'X'."复选框
       gs_fieldcat-edit     = 'X'."可编辑
  ENDIF.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR:gs_fieldcat.

END-OF-DEFINITION.

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*       lcl_event_receiver的类定义:
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.

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

ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD  handle_f4.
*   供应商供货信息基础表的情况
    IF e_fieldname = 'ZDBKC'.
*     窗口时间参数的自定义f4检索帮助
      PERFORM f4_help_lgort USING e_fieldname
                                  es_row_no.
*    ELSEIF e_fieldname = 'LIFNR'.
**     窗口时间参数的自定义f4检索帮助
*      PERFORM f4_help_LIFNR USING e_fieldname
*                                  es_row_no.
    ENDIF.
*     设置后,alv稳定刷新
    PERFORM refresh_table_alv.



  ENDMETHOD.                    "HANDLE_F4

ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION

SELECTION-SCREEN BEGIN OF BLOCK blk02 WITH FRAME TITLE TEXT-005.
  SELECT-OPTIONS s_vkorg FOR vbak-vkorg OBLIGATORY.
  SELECT-OPTIONS s_vtweg FOR vbak-vtweg DEFAULT  '10' TO  '20'.
  SELECT-OPTIONS s_spart FOR vbak-spart DEFAULT '00'.
  SELECT-OPTIONS s_prodh FOR vbap-prodh.
  SELECT-OPTIONS s_werks FOR vbap-werks.
  SELECT-OPTIONS s_kunnr FOR vbak-kunnr.
  SELECT-OPTIONS s_matnr FOR vbap-matnr.
  SELECT-OPTIONS s_kdmat FOR vbap-kdmat.
  SELECT-OPTIONS s_bstkd FOR vbkd-bstkd.
  SELECT-OPTIONS s_auart FOR vbak-auart.
  SELECT-OPTIONS s_vbeln FOR vbak-vbeln.
  SELECT-OPTIONS s_lfgsa FOR vbap-lfgsa.
  SELECT-OPTIONS s_ernam FOR vbak-ernam.
  SELECT-OPTIONS s_erdat FOR vbap-erdat.
  PARAMETERS p_spzt  TYPE char3 AS LISTBOX VISIBLE LENGTH 8.

*  PARAMETERS p_1 TYPE c AS CHECKBOX  DEFAULT ''.

SELECTION-SCREEN END OF BLOCK blk02.

DATA:p_1 TYPE c VALUE 'X'.

INITIALIZATION.
  DATA: lv_firstday TYPE sy-datum.
  DATA: lv_lastday TYPE sy-datum.
  lv_firstday = sy-datum.
  lv_firstday+6(2) = '01'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = lv_firstday
    IMPORTING
      last_day_of_month = lv_lastday
    EXCEPTIONS
      day_in_no_date    = 1
      OTHERS            = 2.
  s_erdat-low = lv_firstday.
  s_erdat-high = lv_lastday.
  s_erdat-sign = 'I'.
  s_erdat-option = 'BT'.
  APPEND s_erdat.

AT SELECTION-SCREEN OUTPUT.

  DATA:lt_list TYPE vrm_values.
  lt_list = VALUE #(  ( key = '已审批' text = '已审批'  )
   ( key = '未审批' text = '未审批' )
   ( key = '' text = '' ) ).

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'P_SPZT'  "屏幕上绑定的下拉框
      values = lt_list.

START-OF-SELECTION.

  PERFORM frm_check_object."权限

  PERFORM frm_authority_check.
  PERFORM frm_get_data.
  PERFORM frm_get_alv.

*&---------------------------------------------------------------------*
*& Form frm_get_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_alv .
  DATA:lv_monat TYPE bkpf-monat.
  DATA:lv_feild TYPE char5.
  DATA:lv_text TYPE char3.
*  GS_LAYOUT-ZEBRA      = 'X'.
*  gs_layout-box_fname  = 'SEL'.
  gs_layout-cwidth_opt = 'X'.
  gs_layout-no_toolbar = 'X'."标准按钮隐藏
  gs_layout-info_fname = 'CLR'.  "行颜色代码的字段

  PERFORM get_fieldcat .

  DATA: gs_grid_set TYPE lvc_s_glay."网格设置
  CLEAR: gs_events,gt_events." lt_event_exit[].

  gs_grid_set-edt_cll_cb = 'X'."网格设置:退出可编辑单元格时回调,可以做的一个比较即时的回调,之前在按钮FORM中用屏刷内进行回调需要先触发刷新动作

  gs_events-name = 'CALLER_EXIT'.
  gs_events-form = 'FM_BUTTON'.
  APPEND gs_events TO gt_events.CLEAR gs_events.

  gs_events-name = slis_ev_data_changed.
  gs_events-form = 'USER_DATA_CHANGED'."同步更新
  APPEND gs_events TO gt_events.CLEAR gs_events.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'STATUS_SET'
      i_callback_user_command  = 'USER_COMMAND'
*     i_callback_top_of_page   = 'TOP_OF_PAGE'
      i_grid_title             = grid_title
*     I_GRID_SETTINGS          = GS_SETTING
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fieldcat
      i_save                   = 'A'
*     I_DEFAULT                = 'X'
*     IS_VARIANT               = GS_VARIANT
      it_events                = gt_events
      i_grid_settings          = gs_grid_set
    TABLES
      t_outtab                 = gt_out[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

ENDFORM.

FORM status_set USING rt_extab TYPE slis_t_extab.

  "设置ALV状态栏按钮的隐藏与显示
  DATA: lt_extab TYPE TABLE OF sy-ucomm WITH HEADER LINE.
*  在报表输出的ALV工具栏,如果t-code是ZSD002,显示“审批”按钮,具有价格审批权限;
  IF sy-tcode <> 'ZSD011' . "
    REFRESH: lt_extab.
    APPEND 'APPRO' TO lt_extab.
    CLEAR: lt_extab.
    APPEND 'DELE' TO lt_extab.
    CLEAR: lt_extab.
  ELSEIF sy-tcode <> 'ZSD010' .
    APPEND 'ZME21N' TO lt_extab.
    CLEAR: lt_extab.
  ENDIF.
  "设置ALV状态栏
  SET PF-STATUS 'STATUS_1000' EXCLUDING lt_extab. "排除掉内表的按钮
ENDFORM.
FORM user_command USING e_ucomm TYPE sy-ucomm
                        re_selfield TYPE slis_selfield.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = gr_grid.

  CALL METHOD gr_grid->check_changed_data.

  CASE e_ucomm.

    WHEN  '&IC1'.
      PERFORM save_data USING e_ucomm re_selfield.
    WHEN 'PRINT'.
      PERFORM frm_print_data.
    WHEN 'PRINT2'.
      PERFORM frm_print_data2.
    WHEN 'APPRO'."审批通过
      PERFORM frm_appro_zt.
    WHEN 'DELE'."审批撤销
      PERFORM frm_cancel_zt.
    WHEN 'ZME21N'.
      PERFORM get_po_create1 .
*全选
    WHEN 'ZALL'.
      LOOP AT gt_out INTO gs_out.
        gs_out-sel = 'X'.
        MODIFY gt_out FROM gs_out.
      ENDLOOP.
      re_selfield-refresh = 'X'.
*取消选择
    WHEN 'ZSAL'.
      LOOP AT gt_out INTO gs_out.
        gs_out-sel = ''.
        MODIFY gt_out FROM gs_out.
      ENDLOOP.
      re_selfield-refresh = 'X'.
  ENDCASE.

ENDFORM.


FORM  save_data USING e_ucomm TYPE sy-ucomm
                        re_selfield TYPE slis_selfield..
  IF re_selfield-fieldname = 'VBELN'.
    READ TABLE gt_out ASSIGNING FIELD-SYMBOL(<gs_out_t>) INDEX re_selfield-tabindex.
    SET PARAMETER ID: 'AUN' FIELD <gs_out_t>-vbeln.
    CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
  ENDIF.

ENDFORM.
*** INCLUDE ZMMP014_F01
*** INCLUDE ZMMP014_F01
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  "查询基本数据
  DATA: lv_tdid     TYPE  thead-tdid,
        lv_tdname   TYPE  thead-tdname,
        lv_tdobject TYPE  thead-tdobject.

  DATA :lt_line TYPE TABLE OF tline.

  DATA lv_flag TYPE c.
  DATA:gv_where TYPE string.

  CALL FUNCTION 'ZFM_CHECK_ENH'
    EXPORTING
      zenh_name = 'ZSD010_PRODH'
    IMPORTING
      flag      = lv_flag.

  CLEAR gv_where.
  IF lv_flag = 'X'.
    gv_where = | EXISTS ( SELECT vtext,prodh FROM ztsd010 WHERE vtext = t179t~vtext AND prodh = t179t~prodh AND bname = @sy-uname )  |.
  ENDIF.




  SELECT
    vbak~vkorg,
    tvkot~vtext AS vtext_1,
    vbak~vtweg,
    tvtwt~vtext AS vtext_2,
    vbak~spart,
    vbak~kunnr,
    kna1~name1 AS name1_1,
*    TVK2T~VTEXT AS VTEXT_3,
    lfa1~name1 AS name1_2,
    vbkd~bstkd,
    vbak~auart,
    tvakt~bezei,
    vbap~vbeln,
    vbap~posnr,
    vbap~pstyv,
    t179t~vtext AS vtext_4,
    vbap~werks,
    mara~zggxh,
    vbap~matnr,
    makt~maktx,
    vbap~kdmat,
    vbap~arktx,
    vbap~matkl,
    t023t~wgbez,
    vbap~kwmeng,
*    vbep~dlvqty_bu AS dlvqty_bu2,
    vbap~meins,
    vbap~netwr,
    vbap~kpein,
    vbap~mwsbp,
    vbak~waerk,
    vbkd~stcur,
    vbkd~zterm,
    tvzbt~vtext AS vtext_5,
*    VBEP~REQ_DLVDATE,
*    VBEP~ETTYP,
    vbap~abgru,
    vbap~vgbel,
    vbap~vgpos,
    vbap~erdat,
    vbap~erzet,
    vbap~ernam,
    vbap~lgort,
    vbap~vrkme,
    lfa1~adrnr,
    adrt~remark,
    t001l~lgobe,
    vbap~lfgsa,
    vbak~knumv,
    vbap~bedae,
    VBAK~VKBUR, " ADD BY 2023/10/19
    tvak~vbtyp,  "ADD BY 2023/6/7
*    vbap~cmtd_deliv_date
    vbap~prodh
    INTO  TABLE @DATA(lt_vbak)
   FROM vbak LEFT JOIN vbap ON vbap~vbeln = vbak~vbeln
    LEFT JOIN tvkot ON tvkot~vkorg = vbak~vkorg AND tvkot~spras = 1
    LEFT JOIN tvtwt ON tvtwt~vtweg = vbak~vtweg AND tvtwt~spras = 1
    LEFT JOIN kna1 ON kna1~kunnr = vbak~kunnr
    LEFT JOIN vbpa ON vbpa~vbeln = vbak~vbeln AND vbpa~posnr = '' AND vbpa~parvw = 'ZP'
    LEFT JOIN vbkd ON vbkd~vbeln = vbak~vbeln AND vbkd~posnr = ''
    LEFT JOIN lfa1 ON lfa1~lifnr = vbpa~lifnr
    LEFT JOIN tvakt ON tvakt~auart = vbak~auart AND tvakt~spras = 1
    LEFT JOIN t179t ON  t179t~prodh = vbap~prodh AND t179t~spras = 1
    LEFT JOIN mara ON mara~matnr = vbap~matnr
    LEFT JOIN makt ON makt~matnr = vbap~matnr AND makt~spras = 1
    LEFT JOIN t023t ON t023t~matkl = vbap~matkl AND t023t~spras = 1
    LEFT JOIN tvzbt ON tvzbt~zterm = vbkd~zterm AND tvzbt~spras = 1
    LEFT JOIN adrt ON adrt~addrnumber = kna1~adrnr AND adrt~persnumber = ''
    LEFT JOIN t001l ON t001l~lgort = vbap~lgort
    LEFT JOIN tvak ON vbak~auart = tvak~auart
    WHERE vbak~vkorg IN  @s_vkorg
    AND  vbak~vtweg  IN  @s_vtweg
    AND  vbak~spart  IN  @s_spart
    AND  vbap~prodh  IN  @s_prodh
    AND  vbap~werks  IN  @s_werks
    AND  vbak~kunnr  IN  @s_kunnr
    AND  vbap~matnr  IN  @s_matnr
    AND  vbap~kdmat  IN  @s_kdmat
    AND  vbkd~bstkd  IN  @s_bstkd
    AND  vbak~auart  IN  @s_auart
    AND  vbak~vbeln  IN  @s_vbeln
    AND  vbap~lfgsa  IN  @s_lfgsa
    AND  vbak~ernam  IN  @s_ernam
    AND  vbap~erdat  IN  @s_erdat
    AND  (gv_where) 
  .

  LOOP AT LT_VBAK[] INTO DATA(LS_VKBUR).
    AUTHORITY-CHECK OBJECT 'ZVKBUR'
     ID 'ACTVT' FIELD '03'
     ID 'ZVKBUR' FIELD LS_VKBUR-VKBUR.
    IF sy-subrc <> 0.
      DELETE LT_VBAK.
    ENDIF.
  ENDLOOP.


  IF lt_vbak[] IS NOT INITIAL .
    DATA(lt_vbakb) = lt_vbak[].
    SORT lt_vbakb BY vbeln posnr.

    "汇率
    SELECT
      kursk    ,
      vbeln    ,
      posnr
      FROM vbkd
      INTO  TABLE @DATA(lt_vbkd)
      FOR ALL ENTRIES IN @lt_vbak
      WHERE posnr = @lt_vbak-posnr
        AND vbeln = @lt_vbak-vbeln.
*    IF lt_vbkd[] IS INITIAL.
      SELECT
      kursk   ,
      vbeln   ,
      posnr
      FROM vbkd
      INTO  TABLE @DATA(lt_vbkd2)
      FOR ALL ENTRIES IN @lt_vbak
      WHERE posnr = ''
       AND vbeln = @lt_vbak-vbeln.
*    ENDIF.
    SORT lt_vbkd  BY vbeln posnr.
    SORT lt_vbkd2 BY vbeln posnr.




    "查询计划数据
    SELECT
      vbeln,
      posnr,
      dlvqty_bu,
      etenr,
      ettyp,
      req_dlvdate,
      edatu
      INTO TABLE @DATA(lt_vbep)
      FROM vbep
      FOR ALL ENTRIES IN @lt_vbakb
      WHERE vbeln = @lt_vbakb-vbeln
      AND posnr = @lt_vbakb-posnr
    .
    "客户集团
    SELECT
      kunnr,
      vtext
      INTO TABLE @DATA(lt_tvk2t)
      FROM kna1 LEFT JOIN tvk2t ON  tvk2t~katr2 = kna1~katr2 AND tvk2t~spras = 1
      FOR ALL ENTRIES IN @lt_vbak
      WHERE kunnr = @lt_vbak-kunnr
    AND kna1~katr2 <> 'G0'.


    SELECT knumv,kbetr,kpein,prcd_elements~kposn
      INTO TABLE @DATA(lt_prcd_elements)
      FROM prcd_elements
      FOR ALL ENTRIES IN @lt_vbak
      WHERE kposn = @lt_vbak-posnr
      AND  knumv = @lt_vbak-knumv
       AND kschl = 'ZPRA'.

    LOOP AT lt_vbak ASSIGNING FIELD-SYMBOL(<ls_vbak>).
      AUTHORITY-CHECK OBJECT 'ZSD_MATKL'
       ID 'ACTVT' FIELD '03'
       ID 'MATKL' FIELD <ls_vbak>-matkl.
      IF sy-subrc <> 0.
        CONTINUE.
      ENDIF.


      MOVE-CORRESPONDING <ls_vbak> TO gt_out.
*--------------------------------------------------------------------* ADD BY 2023/6/6 汇率
      READ TABLE lt_vbkd INTO DATA(ls_vbkd) WITH KEY vbeln = <ls_vbak>-vbeln
                                  posnr = <ls_vbak>-posnr
                                  BINARY SEARCH.
      IF sy-subrc = 0.
        gt_out-kursk = ls_vbkd-kursk.
      ENDIF.
      IF gt_out-kursk IS INITIAL.
        READ TABLE lt_vbkd2 INTO DATA(ls_vbkd2) WITH KEY vbeln = <ls_vbak>-vbeln
                                  posnr = ''
                                  BINARY SEARCH.
        IF sy-subrc = 0.
          gt_out-kursk = ls_vbkd2-kursk.
        ENDIF.
      ENDIF.
*--------------------------------------------------------------------*

      "读取销售订单状态
      SELECT SINGLE stat INTO @DATA(lv_stat) FROM vbak LEFT JOIN jest ON jest~objnr = vbak~objnr WHERE vbeln = @gt_out-vbeln  AND jest~inact = '' AND jest~stat = 'E0002'.
      IF sy-subrc = 0.
        gt_out-zshzt = '已审批'.
      ELSE.
        gt_out-zshzt = '未审批'.
      ENDIF.
      SELECT SINGLE stsma INTO @DATA(lv_stsma) FROM tvak WHERE auart = @gt_out-auart.
      IF lv_stsma IS INITIAL.
        gt_out-zshzt = ''.
      ENDIF.
      IF p_spzt IS NOT INITIAL AND gt_out-zshzt <> p_spzt.
        CONTINUE.
      ENDIF.
      READ TABLE lt_tvk2t ASSIGNING FIELD-SYMBOL(<ls_tvk2t>)  WITH KEY kunnr = <ls_vbak>-kunnr.
      IF sy-subrc = 0.
        gt_out-vtext_3 = <ls_tvk2t>-vtext.
      ENDIF.
      gt_out-dlvqty_bu = REDUCE dlvqty( INIT sum TYPE dlvqty"定义求和的字段SUM类型QUAN,名字随便
                       FOR ls_vbep IN lt_vbep "创建一个工作区ls_wa对应内表
                       WHERE ( vbeln = <ls_vbak>-vbeln AND posnr = <ls_vbak>-posnr ) "汇总如果有条件,可以添加汇总条件
                       NEXT sum = sum + ls_vbep-dlvqty_bu )."把值和工作区wa取的值相加
      gt_out-zwcjjhsl = gt_out-kwmeng - gt_out-dlvqty_bu.
*      GT_OUT-DLVQTY_BU = LV_DLVQTY_BU.
      IF <ls_vbak>-kwmeng IS NOT INITIAL .
        gt_out-zhsdj = ( <ls_vbak>-netwr + <ls_vbak>-mwsbp ) / <ls_vbak>-kwmeng.
        gt_out-bwbdj = gt_out-zhsdj * gt_out-kursk.  "ADD BY 2023/6/6 本位币单价
*        gt_out-netwr = <ls_vbak>-netwr / <ls_vbak>-kwmeng.
      ELSE.
*        gt_out-netwr = 0.
      ENDIF.
      READ TABLE  lt_prcd_elements ASSIGNING FIELD-SYMBOL(<ls_prcd_elements>) WITH KEY kposn = <ls_vbak>-posnr knumv = <ls_vbak>-knumv.
      IF sy-subrc = 0.
        IF <ls_prcd_elements>-kpein IS NOT INITIAL.
          gt_out-netwr = <ls_prcd_elements>-kbetr / <ls_prcd_elements>-kpein.
        ENDIF.

      ENDIF.
      gt_out-zhszje = <ls_vbak>-netwr + <ls_vbak>-mwsbp.
      gt_out-bwbzje = gt_out-zhszje * gt_out-kursk. "ADD BY 2023/6/6  本位币总金额
      READ TABLE lt_vbep ASSIGNING FIELD-SYMBOL(<ls_vbep>) WITH KEY vbeln = <ls_vbak>-vbeln posnr = <ls_vbak>-posnr.
      IF sy-subrc = 0.
        gt_out-req_dlvdate = <ls_vbep>-req_dlvdate.
        gt_out-edatu = <ls_vbep>-edatu.
      ENDIF.
      CASE <ls_vbak>-lfgsa.
        WHEN ''.
          gt_out-zjhzt = '无关'.
        WHEN 'A'.
          gt_out-zjhzt = '尚未处理'.
        WHEN 'B'.
          gt_out-zjhzt = '部分处理'.
        WHEN 'C'.
          gt_out-zjhzt = '已完全处理'.
      ENDCASE.
      DATA(lt_vbep_sort) =  lt_vbep[].
      DELETE lt_vbep_sort WHERE vbeln <> <ls_vbak>-vbeln  .
      DELETE lt_vbep_sort WHERE posnr <> <ls_vbak>-posnr  .
      SORT lt_vbep_sort BY etenr DESCENDING.
      READ TABLE lt_vbep_sort ASSIGNING FIELD-SYMBOL(<ls_vbep_sort>) INDEX 1.
      IF sy-subrc = 0.
        gt_out-ettyp = <ls_vbep_sort>-ettyp.
      ENDIF.
      lv_tdid   = 'ZI01'.
      lv_tdname  = <ls_vbak>-vbeln && <ls_vbak>-posnr.
      lv_tdobject = 'VBBP'.
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          client          = sy-mandt
          id              = lv_tdid
          language        = sy-langu
          name            = lv_tdname
          object          = lv_tdobject
        TABLES
          lines           = lt_line
        EXCEPTIONS
          id              = 1
          language        = 2
          name            = 3
          not_found       = 4
          object          = 5
          reference_check = 6.
      READ TABLE lt_line ASSIGNING FIELD-SYMBOL(<ls_line>) INDEX 1.
      IF sy-subrc = 0.
        gt_out-zsczlwb = <ls_line>-tdline.
      ENDIF.
      CLEAR:lt_line[].
      lv_tdid   = 'ZI02'.
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          client          = sy-mandt
          id              = lv_tdid
          language        = sy-langu
          name            = lv_tdname
          object          = lv_tdobject
        TABLES
          lines           = lt_line
        EXCEPTIONS
          id              = 1
          language        = 2
          name            = 3
          not_found       = 4
          object          = 5
          reference_check = 6.
      READ TABLE lt_line ASSIGNING FIELD-SYMBOL(<ls_line_1>) INDEX 1.
      IF sy-subrc = 0.
        gt_out-zhbz = <ls_line_1>-tdline.
      ENDIF.
      gt_out-zhswjzje = gt_out-zwcjjhsl * ( gt_out-zhsdj / gt_out-kpein ).
      gt_out-zwswjzje = gt_out-zwcjjhsl * ( gt_out-netwr / gt_out-kpein ).

      gt_out-znetwr    = gt_out-netwr   .
      gt_out-zzhsdj    = gt_out-zhsdj   .
      gt_out-zzhszje   = gt_out-zhszje  .
      gt_out-zzhswjzje = gt_out-zhswjzje.
      gt_out-zzwswjzje = gt_out-zwswjzje.
      gt_out-zbwbdj    = gt_out-bwbdj   .
      gt_out-zbwbzje   = gt_out-bwbzje  .
      gt_out-bwbbhszje = gt_out-kwmeng * gt_out-netwr * gt_out-kursk.

      CLEAR:lt_line[].
      APPEND gt_out.
      CLEAR gt_out.
    ENDLOOP.
    SORT gt_out BY vbeln ASCENDING posnr ASCENDING.

    
*    退货订单的金额加个负号显示
*    DATA:lv_netwr    TYPE  c LENGTH 12,
*         lv_zhsdj    TYPE  c LENGTH 12,
*         lv_zhszje   TYPE  c LENGTH 12,
*         lv_zhswjzje TYPE  c LENGTH 12,
*         lv_zwswjzje TYPE  c LENGTH 12,
*         lv_bwbdj    TYPE  c LENGTH 12,
*         lv_bwbzje   TYPE  c LENGTH 12.

    LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs1>) WHERE vbtyp  = 'H'.
      <fs1>-znetwr    =  0  - <fs1>-netwr .
      <fs1>-zzhsdj    =  0  - <fs1>-zhsdj .
      <fs1>-zzhszje   =  0  - <fs1>-zhszje .
      <fs1>-zzhswjzje  =  0  - <fs1>-zhswjzje .
      <fs1>-zzwswjzje  =  0  - <fs1>-zwswjzje .
*--------------------------------------------------------------------* ADD BY 2023/6/6
      <fs1>-zbwbdj  = 0 - <fs1>-bwbdj.
      <fs1>-zbwbzje = 0 - <fs1>-bwbzje.
*--------------------------------------------------------------------*
*      lv_netwr      =  <fs1>-netwr    .
*      lv_zhsdj      =  <fs1>-zhsdj    .
*      lv_zhszje     =  <fs1>-zhszje   .
*      lv_zhswjzje   =  <fs1>-zhswjzje .
*      lv_zwswjzje   =  <fs1>-zwswjzje .
*      lv_bwbdj      =  <fs1>-bwbdj    .
*      lv_bwbzje     =  <fs1>-bwbzje   .

*      "将负号前置 函数
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = <fs1>-znetwr.
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = <fs1>-zzhsdj.
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = <fs1>-zzhszje.
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = <fs1>-zzhswjzje.
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = <fs1>-zzwswjzje.
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = <fs1>-zbwbdj.
      CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
        CHANGING
          value = <fs1>-zbwbzje.

*      <fs1>-znetwr    = lv_netwr    .
*      <fs1>-zzhsdj    = lv_zhsdj    .
*      <fs1>-zzhszje   = lv_zhszje   .
*      <fs1>-zzhswjzje = lv_zhswjzje .
*      <fs1>-zzwswjzje = lv_zwswjzje .
*      <fs1>-zbwbdj    = lv_bwbdj    .
*      <fs1>-zbwbzje   = lv_bwbzje   .

    ENDLOOP.
  ENDIF.

  IF gt_out[] IS NOT INITIAL.
    DATA(lt_sort) = gt_out[].

    DATA:BEGIN OF ls_ekkn,
           vbeln  LIKE  vbap-vbeln,
           posnr  LIKE  vbap-posnr,
           ebeln  LIKE  ekkn-ebeln,
           ebelp  LIKE  ekkn-ebelp,
           zebelp LIKE  lips-vgpos,
         END OF ls_ekkn.
    DATA: lt_ekkn  LIKE TABLE OF ls_ekkn.

    SORT lt_sort BY vbeln posnr.
    SELECT
      b~vbeln,
      b~posnr,

      a~ebeln,
      a~ebelp
      FROM ekkn AS a
      INNER JOIN @lt_sort AS b
      ON a~vbeln = b~vbeln
      AND a~vbelp = b~posnr
      LEFT JOIN ekko AS c
      ON a~ebeln = c~ebeln
      WHERE c~bsart = 'Z015'
            INTO TABLE @lt_ekkn.

    LOOP AT lt_ekkn INTO ls_ekkn.

      ls_ekkn-zebelp = ls_ekkn-ebelp.                  "扩充ebelp到6位
      ls_ekkn-zebelp = |{ ls_ekkn-zebelp ALPHA = IN }|.
      MODIFY lt_ekkn FROM ls_ekkn.
      CLEAR ls_ekkn.

    ENDLOOP.


*    SORT lt_ekkn BY ebeln zebelp.
*    SELECT
*      b~vbeln,
*      b~posnr,
*
*      a~lfimg
*      FROM lips AS a
*      INNER JOIN @lt_ekkn AS b
*      ON a~vgbel = b~ebeln
*      AND a~vgpos = b~zebelp
*      LEFT JOIN likp AS c
*      ON a~vbeln = c~vbeln
*      WHERE c~wbstk = 'C'
*            INTO TABLE @DATA(lt_lips).
    SORT lt_sort BY vbeln posnr.
    SELECT
      b~vbeln,
      b~posnr,
      a~wbsta,

      a~lfimg
      FROM lips AS a
      INNER JOIN @lt_sort AS b
      ON a~kdauf = b~vbeln AND a~kdpos = b~posnr AND a~matnr = b~matnr
      WHERE a~pstyv = 'ZNLN'
*      AND   a~wbsta = 'C'
      INTO TABLE @DATA(lt_lips)
      .
    SORT lt_lips BY vbeln posnr.

    SORT lt_sort BY vbeln posnr.
    SELECT
      b~vbeln,
      b~posnr,
      a~menge
      FROM ekpo AS a
      INNER JOIN @lt_sort AS b
      ON a~zkdauf = b~vbeln AND a~zkdpos = b~posnr
      INTO TABLE @DATA(lt_ekpo)
      .
    SORT lt_ekpo BY vbeln posnr.

    LOOP AT gt_out.
      LOOP AT lt_lips INTO DATA(ls_lips) WHERE vbeln = gt_out-vbeln AND posnr = gt_out-posnr AND wbsta = 'C'.
        gt_out-lfimg = gt_out-lfimg + ls_lips-lfimg.
      ENDLOOP.
      LOOP AT lt_ekpo INTO DATA(ls_ekpo) WHERE vbeln = gt_out-vbeln AND posnr = gt_out-posnr.
        gt_out-zycjdbdsl = gt_out-zycjdbdsl + ls_ekpo-menge.
      ENDLOOP.
      gt_out-zdybs = '未打印'.
      LOOP AT lt_lips INTO ls_lips WHERE vbeln = gt_out-vbeln AND posnr = gt_out-posnr.
        gt_out-zcgddsl = gt_out-zcgddsl + ls_lips-lfimg.
      ENDLOOP.
      gt_out-zcgddsl = gt_out-kwmeng - gt_out-zcgddsl.
      IF gt_out-zcgddsl < 0.
        gt_out-zcgddsl = 0.
      ENDIF.
      MODIFY gt_out.
    ENDLOOP.

    
    IF  p_1  = 'X'.

      LOOP AT  gt_out ASSIGNING FIELD-SYMBOL(<fs>).
        DATA:lv_vbeln TYPE char8.
        DATA:lv_dh TYPE vbeln.
        DATA:lv_dh1 TYPE vbeln.
        CLEAR lv_vbeln.
        lv_vbeln  = |{ <fs>-vbeln  ALPHA = OUT WIDTH = 8  }|.
        CLEAR :lv_dh,lv_dh1.
        lv_dh = 'RQ' && lv_vbeln .

        SELECT SINGLE vbeln  FROM vbak INTO lv_dh1  WHERE vbeln =  lv_dh.
        IF  sy-subrc = 0.
          <fs>-zdh  = lv_dh1.
        ENDIF.
      ENDLOOP.

    ENDIF.

    "单号转换
    LOOP AT gt_out INTO gs_out.
      gs_out-objnr = 'VB' && gs_out-vbeln && '000000'.
      MODIFY gt_out FROM gs_out.
    ENDLOOP.
    "取审批人
    SELECT chind,
           objnr,
           udate,
           utime,
           usnam
      FROM jcds
      INTO TABLE @DATA(lt_jcds)
      FOR ALL ENTRIES IN @gt_out
      WHERE objnr = @gt_out-objnr.

    "ALV内表审批人字段赋值
    SORT lt_jcds BY objnr
                    chind
                    utime DESCENDING
                    udate DESCENDING.
    LOOP AT gt_out INTO gs_out.
      READ TABLE lt_jcds INTO DATA(ls_jcds)
        WITH KEY objnr = gs_out-objnr chind = 'U' BINARY SEARCH.
      IF sy-subrc = 0.
        gs_out-usnam = ls_jcds-usnam.
        MODIFY gt_out FROM gs_out.
      ENDIF.
    ENDLOOP.
    "End insert.

    FREE:lt_lips,lt_sort,ls_lips,lt_ekpo,ls_ekpo.

  ENDIF.

  IF  sy-tcode  = 'ZSD011'.

    IF  gt_out[] IS NOT INITIAL.
*根据销售订单(VBAK-VBELN)的项目类别(VBAP-PSTYV)找到配置表的审批通过计划行;
      SELECT pstyv,
             zettyp_t,
             zettyp_c
        FROM ztsd004
        INTO CORRESPONDING FIELDS OF TABLE @gt_ztsd004
        FOR ALL ENTRIES IN @gt_out
        WHERE  pstyv  = @gt_out-pstyv.
      SORT gt_ztsd004 BY pstyv .
    ENDIF.

  ENDIF.

  SELECT uname
  FROM agr_users
  INTO TABLE gt_agr_users
  WHERE agr_name = 'ZSD_1000_901'
  OR    agr_name = 'ZSD_2000_901'
  OR    agr_name = 'ZSD_3000_901'
  OR    agr_name = 'ZSD_4000_901'
  OR    agr_name = 'ZSD_6000_901'
  OR    agr_name = 'ZSD_5000_901'.

  DELETE ADJACENT DUPLICATES FROM gt_agr_users COMPARING ALL FIELDS.


ENDFORM.



*&---------------------------------------------------------------------*
*& Form GET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_fieldcat .
  CLEAR:gt_fieldcat[].
  app_fieldcat: 'SEL       ' '选择框'  '' '' '' '' '' .
  app_fieldcat: 'ZDYBS     ' '打印标识'  '' '' '' '' '' .
*  IF  sy-tcode  = 'ZSD011'.
  app_fieldcat:'ICON       ' '状态' '' '' '' '' '' .
  app_fieldcat:'MESSAGE    ' '消息' '' '' '' '' '' .
*  ENDIF.
  IF  p_1  = 'X'.
    app_fieldcat:'ZDH      ' '客户需求号' '' '' '' '' '' .
  ENDIF.
  app_fieldcat:'VKORG      ' '销售组织' '' '' '' '' '' .
  app_fieldcat:'VKBUR      ' '销售办公室' '' '' '' '' '' .
  app_fieldcat:'VTEXT_1    ' '销售组织名称' '' '' '' '' '' .
  app_fieldcat:'VTWEG      ' '分销渠道' '' '' '' '' '' .
  app_fieldcat:'VTEXT_2    ' '分销渠道名称' '' '' '' '' '' .
  app_fieldcat:'SPART      ' '产品组' '' '' '' '' '' .
  app_fieldcat:'KUNNR      ' '客户编码' '' 'X' '' '' '' .
  app_fieldcat:'NAME1_1    ' '客户名称' '' '' '' '' '' .
  app_fieldcat:'VTEXT_3    ' '客户集团' '' '' '' '' '' .
  app_fieldcat:'NAME1_2    ' '业务员' '' '' '' '' '' .
  app_fieldcat:'BSTKD      ' '客户PO号' '' '' '' '' '' .
  app_fieldcat:'AUART      ' '订单类型' '' '' '' '' '' .
  app_fieldcat:'BEZEI      ' '订单类型描述' '' '' '' '' '' .
  app_fieldcat:'ZSHZT      ' '审核状态' '' '' '' '' '' .
  app_fieldcat:'USNAM      ' '审批人' '' '' '' '' '' .
  app_fieldcat:'VBELN      ' '销售订单' '' 'X' '' '' '' .
  app_fieldcat:'POSNR      ' '行项目' '' '' '' '' '' .
  app_fieldcat:'PSTYV      ' '行项目类别' '' '' '' '' '' .
  app_fieldcat:'VTEXT_4    ' '事业部' '' '' '' '' '' .
  app_fieldcat:'WERKS      ' '交货工厂' '' '' '' '' '' .
  app_fieldcat:'ZGGXH      ' '规格型号' '' '' '' '' '' .
  app_fieldcat:'MATNR      ' '物料编码' '' '' '' '' '' .
  app_fieldcat:'MAKTX      ' '物料描述' '' '' '' '' '' .
  app_fieldcat:'KDMAT      ' '客户物料编码' '' '' '' '' '' .
  app_fieldcat:'ARKTX      ' '客户物料描述' '' '' '' '' '' .
  app_fieldcat:'MATKL      ' '物料组' '' '' '' '' '' .
  app_fieldcat:'WGBEZ      ' '物料组描述' '' '' '' '' '' .
  app_fieldcat:'KWMENG     ' '订单数量' '' '' '' '' '' .
  app_fieldcat:'ZWCJJHSL   ' '未创建交货数量' '' '' '' '' '' .
  app_fieldcat:'DLVQTY_BU  ' '交货单数量' '' '' '' '' '' .
  app_fieldcat:'LFIMG      ' '已调拨过账数量' '' '' '' '' '' .
  app_fieldcat:'MEINS      ' '计量单位' '' '' '' '' '' .
  READ TABLE gt_agr_users INTO gs_agr_users WITH KEY uname = sy-uname.
  IF sy-subrc NE 0 OR sy-tcode  = 'ZSD011'.
    app_fieldcat:'NETWR      ' '不含税单价' '' '' '' '' '' .
*    app_fieldcat:'KPEIN     ' '定价单位' '' '' '' '' '' .
    app_fieldcat:'ZZHSDJ      ' '含税单价' '' '' '' '' '' .
    app_fieldcat:'ZZHSZJE     ' '含税总金额' '' '' '' '' '' .
*    app_fieldcat:'ZZHSWJZJE   ' '含税未交总金额' '' '' '' '' '' .
*    app_fieldcat:'ZZWSWJZJE   ' '未税未交总金额' '' '' '' '' '' .

    app_fieldcat:'ZBWBDJ      ' '本位币单价' '' '' '' '' '' .
    app_fieldcat:'ZBWBZJE     ' '本位币总金额' '' '' '' '' '' .
    app_fieldcat:'WAERK      ' '货币' '' '' '' '' '' .
    app_fieldcat:'KURSK      ' '汇率' '' '' '' '' '' .
  ENDIF.
  app_fieldcat:'ZTERM      ' '付款条件' '' '' '' '' '' .
  app_fieldcat:'VTEXT_5    ' '付款条件描述' '' '' '' '' '' .
  app_fieldcat:'REQ_DLVDATE' '计划交货日期' '' '' '' '' '' .
  app_fieldcat:'ZJHZT      ' '交货状态' '' '' '' '' '' .
  app_fieldcat:'ETTYP      ' '计划行' '' '' '' '' '' .
  app_fieldcat:'ZSCZLWB    ' '生产指令文本' '' '' '' '' '' .
  app_fieldcat:'ZHBZ       ' '行备注' '' '' '' '' '' .
  app_fieldcat:'ABGRU      ' '拒绝原因' '' '' '' '' '' .
  app_fieldcat:'VGBEL      ' '参考凭证' '' '' '' '' '' .
  app_fieldcat:'VGPOS      ' '参考项目' '' '' '' '' '' .
  app_fieldcat:'ERDAT      ' '创建日期' '' '' '' '' '' .
  app_fieldcat:'ERZET      ' '创建时间' '' '' '' '' '' .
  app_fieldcat:'ERNAM      ' '创建者' '' '' '' '' '' .
  app_fieldcat:'BWBBHSZJE  ' '本位币不含税总金额' '' '' '' '' '' .

  IF sy-tcode  = 'ZSD010'.
    app_fieldcat:'ZDBKC      ' '调拨库位' '' '' '' '' '' .
    app_fieldcat:'ZDBKC2     ' '调拨库位描述' '' '' '' '' '' .
    app_fieldcat:'ZCGDDSL    ' '本次调拨数量' '' '' '' '' '' .
    app_fieldcat:'ZYCJDBDSL  ' '已创建调拨单数量' '' '' '' '' '' .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_authority_check .
  SELECT
    *
  INTO TABLE @DATA(lt_tvkot) FROM tvkot WHERE vkorg IN @s_vkorg AND spras = 1.
  LOOP AT lt_tvkot ASSIGNING FIELD-SYMBOL(<ls_tvk0t>).
    AUTHORITY-CHECK OBJECT 'V_VBAK_VKO' ID 'VKORG' FIELD <ls_tvk0t>-vkorg ID  'ACTVT'  FIELD  '03' .
    IF sy-subrc <> 0.
      DATA(lv_test) = '没有销售组织' && <ls_tvk0t>-vkorg && '的权限!!!'.
      MESSAGE lv_test TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PRINT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_print_data .
  DATA: lw_control     TYPE ssfctrlop.
  DATA: lw_options     TYPE ssfcompop.
  DATA: cn_locn(4) TYPE c VALUE 'LOCN',
        cn_lojp(4) TYPE c VALUE 'LOJP',
        cn_lohk(4) TYPE c VALUE 'LOHK',
        cn_flagx   TYPE c VALUE 'X'.
  DATA: lv_fmnam TYPE rs38l_fnam,
        lv_sfnam TYPE tdsfname.
  DATA : lw_option  TYPE ssfcresop.
  DATA: lv_tdid     TYPE  thead-tdid,
        lv_tdname   TYPE  thead-tdname,
        lv_tdobject TYPE  thead-tdobject.

  DATA :lt_line TYPE TABLE OF tline.
  DATA lv_kwmeng TYPE  string.
  DATA ls_head TYPE zssd010.
  DATA ls_user_addr TYPE user_addr.
  DATA lt_item TYPE TABLE OF zssd010a WITH HEADER LINE.
  DATA: job_output_options TYPE ssfcrescl. "打印结束时返回值
  AUTHORITY-CHECK OBJECT 'V_VBAK_AAT'
*  ID 'AUART' FIELD
  ID 'ACTVT' FIELD '04'.
  IF sy-subrc <> 0.
    MESSAGE '无生产指令单打印权限!!!' TYPE 'E'.
  ENDIF.
  IF NOT line_exists( gt_out[ sel = 'X' ] ).
    MESSAGE '没有选择可用于打印的数据!!!' TYPE 'E'.
  ENDIF.
*  LW_CONTROL-NO_DIALOG = CN_FLAGX.
*  LW_CONTROL-PREVIEW   = CN_FLAGX.
  lw_control-langu     = sy-langu .
  lw_control-no_open   = cn_flagx.
  lw_control-no_close  = cn_flagx.
*  IF SY-LANGU = '1'.
*    LW_OPTIONS-TDDEST    = CN_LOCN.
*  ELSEIF SY-LANGU = 'J'.
*    LW_OPTIONS-TDDEST    = CN_LOJP.
*  ELSEIF SY-LANGU = 'E'.
*    LW_OPTIONS-TDDEST    = CN_LOHK.
*  ENDIF.
  lv_sfnam = 'ZSF_SD010'.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = lv_sfnam
    IMPORTING
      fm_name            = lv_fmnam
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  CALL FUNCTION 'SSF_OPEN'    "打开打印窗口
    EXPORTING
      control_parameters = lw_control
      output_options     = lw_options
*     user_settings      = cn_flagx
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
  LOOP AT gt_out INTO DATA(ls_out) WHERE sel = 'X' GROUP BY ( vbeln = ls_out-vbeln )
                                              ASCENDING
                                          ASSIGNING FIELD-SYMBOL(<group>).
    CLEAR:ls_head,lt_item[],lt_line[].
    "抬头数据赋值
    READ TABLE gt_out ASSIGNING FIELD-SYMBOL(<ls_out_a>) WITH  KEY vbeln = <group>-vbeln.
    IF sy-subrc = 0.
      SELECT SINGLE vbeln,erdat,erzet INTO @DATA(ls_vbak) FROM vbak WHERE vbeln = @<group>-vbeln. 
      ls_head-name1 = <ls_out_a>-name1_1.
      ls_head-datum = ls_vbak-erdat+0(4) && '-' && ls_vbak-erdat+4(2) && '-' && ls_vbak-erdat+6(2) && ' ' && ls_vbak-erzet+0(2) && ':' && ls_vbak-erzet+2(2) && ':' && ls_vbak-erzet+4(2) .
      lv_tdid   = 'ZH03'.
      lv_tdname  = <group>-vbeln.
      lv_tdobject = 'VBBK'.
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          client          = sy-mandt
          id              = lv_tdid
          language        = sy-langu
          name            = lv_tdname
          object          = lv_tdobject
        TABLES
          lines           = lt_line
        EXCEPTIONS
          id              = 1
          language        = 2
          name            = 3
          not_found       = 4
          object          = 5
          reference_check = 6.
      READ TABLE lt_line ASSIGNING FIELD-SYMBOL(<ls_line>) INDEX 1.
      IF sy-subrc = 0.
        ls_head-zbm = <ls_line>-tdline.
      ENDIF.
      IF ls_head-zbm IS INITIAL.
        ls_head-zbm = '市场部'.
      ENDIF.
      lv_tdid   = 'ZH02'.
      lv_tdname  = <group>-vbeln.
      lv_tdobject = 'VBBK'.
      CLEAR lt_line[].
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          client          = sy-mandt
          id              = lv_tdid
          language        = sy-langu
          name            = lv_tdname
          object          = lv_tdobject
        TABLES
          lines           = lt_line
        EXCEPTIONS
          id              = 1
          language        = 2
          name            = 3
          not_found       = 4
          object          = 5
          reference_check = 6.
      READ TABLE lt_line ASSIGNING FIELD-SYMBOL(<ls_line_a>) INDEX 1.
      IF sy-subrc = 0.
        ls_head-zzd = <ls_line_a>-tdline.
      ENDIF.
      IF ls_head-zzd IS INITIAL.
        SELECT SINGLE name_last name_first INTO ( ls_user_addr-name_last,ls_user_addr-name_first )  FROM vbak LEFT JOIN user_addr ON vbak~ernam = user_addr~bname WHERE vbeln = <group>-vbeln.
        ls_head-zzd = ls_user_addr-name_last && ls_user_addr-name_first.
      ENDIF.

    ENDIF.
    "项目赋值
    LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<ls_out>) WHERE vbeln = <group>-vbeln.
      MOVE-CORRESPONDING <ls_out> TO lt_item.
      lt_item-zbz = <ls_out>-zhbz.
      lv_kwmeng = <ls_out>-kwmeng.
      CONDENSE lv_kwmeng NO-GAPS.
      SHIFT lv_kwmeng RIGHT DELETING TRAILING '0'.     "除右边无意义0
      SHIFT lv_kwmeng RIGHT DELETING TRAILING '.'.     "除右边无意义小数点
      SHIFT lv_kwmeng LEFT DELETING LEADING space.     "去左边空
      lt_item-zzldh = |{ <ls_out>-vbeln ALPHA = OUT  }| && |{ <ls_out>-posnr ALPHA = OUT  }| &&  <ls_out>-matnr && ' ' && lv_kwmeng && <ls_out>-meins && <ls_out>-zsczlwb .
      lt_item-kwmeng = lv_kwmeng.
      APPEND lt_item.
      CLEAR lt_item.
    ENDLOOP.
    CALL FUNCTION lv_fmnam
      EXPORTING
        control_parameters = lw_control
        output_options     = lw_options
        gw_head            = ls_head       "结构存放表头信息
      IMPORTING
        job_output_options = lw_option
      TABLES
        gt_item            = lt_item
      EXCEPTIONS
        formatting_error   = 1
        internal_error     = 2
        send_error         = 3
        user_canceled      = 4
        OTHERS             = 5.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDLOOP.
*ssf_close               "关闭打印窗口,如点打印预览会关闭此窗口
  CALL FUNCTION 'SSF_CLOSE'
    IMPORTING
      job_output_info  = job_output_options
    EXCEPTIONS
      formatting_error = 1
      internal_error   = 2
      send_error       = 3
      OTHERS           = 4.

  IF job_output_options-outputdone = 'X'."点击打印

    LOOP AT  gt_out ASSIGNING FIELD-SYMBOL(<out>) WHERE sel = 'X'.
      <out>-zdybs = '已打印'.
      <out>-clr = 'C300'.
    ENDLOOP.

*    LOOP AT gt_out INTO ls_out WHERE sel = 'X' GROUP BY ( vbeln = ls_out-vbeln )
*                                                ASCENDING
*                                            ASSIGNING FIELD-SYMBOL(<group2>).
*
*      LOOP AT gt_out WHERE vbeln = <group2>-vbeln.
*        gt_out-zdybs = '已打印'.
*        gt_out-clr = 'C300'.
*
*        MODIFY gt_out.
*      ENDLOOP.
*    ENDLOOP.

    PERFORM refresh_table_alv.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_APPRO_ZT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_appro_zt .

  DATA: lv_flag_0 .
  IF NOT line_exists( gt_out[ sel = 'X' ] ).
    MESSAGE '没有选择可用于处理的数据!!!' TYPE 'E'.
  ENDIF.

*整单审批
  DATA(lt_out1)  = gt_out[].
  DELETE lt_out1 WHERE sel  <> 'X'.
  SORT lt_out1 BY vbeln.
  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<out>) .
    READ TABLE lt_out1 INTO DATA(ls_out1) WITH KEY vbeln  = <out>-vbeln BINARY SEARCH.
    IF  sy-subrc  = 0.
      <out>-sel  = 'X'.
    ENDIF.
  ENDLOOP.


 
  IF  p_1  = 'X'.
    DATA(lt_out_c)  = gt_out[].
    DELETE lt_out_c WHERE sel <> 'X'.
*  DELETE lt_out_c WHERE  zshzt <> '已审批'.
    DELETE lt_out_c WHERE  zdh <> ''.
*  、排除订单类型为ZORC与ZORG其余订单类型在ZSD011点击“审批通过“时,
    DELETE lt_out_c WHERE auart = 'ZORG'OR  auart = 'ZRET' OR  auart = 'ZYCR' OR  auart = 'ZYDR'.

    SORT lt_out_c BY vbeln .
    DELETE ADJACENT DUPLICATES FROM lt_out_c COMPARING vbeln.

    DATA:gv_num TYPE vbeln.
    DATA:gv_msg TYPE char200.
    CLEAR gv_num.
    CLEAR gv_msg.

    LOOP AT lt_out_c INTO DATA(ls_out_c) WHERE prodh <>  '00005' .

      PERFORM frm_md81_bdc USING  ls_out_c CHANGING  gv_num  gv_msg.

      IF  gv_msg IS INITIAL .
        LOOP AT  gt_out ASSIGNING FIELD-SYMBOL(<out1>) WHERE vbeln =  ls_out_c-vbeln .
          <out1>-zdh = gv_num.
          <out1>-icon  = c_green.
          <out1>-message  =   '创建客户需求成功'.
        ENDLOOP.
      ELSE.
        LOOP AT  gt_out ASSIGNING <out1> WHERE vbeln =  ls_out_c-vbeln .
          <out1>-icon  = c_red.
          <out1>-message  =   '创建客户需求失败' && gv_msg.
        ENDLOOP.
      ENDIF.

    ENDLOOP.
  ENDIF.


  LOOP AT  gt_out WHERE sel  = 'X' AND icon <>  c_red.
    CLEAR lv_flag_0.
    IF gt_out-zshzt = '未审批'.

*   2.1更新销售订单行项目的计划行类别,根据配置表项目类别计划行审批对应表(字段:审批通过计划行)
*    ,更新订单行项目类别的计划行(VBEP-ETTYP);
      READ TABLE  gt_ztsd004 INTO gs_ztsd004 WITH KEY pstyv  = gt_out-pstyv  BINARY SEARCH.
      IF  sy-subrc  = 0.
        IF   gt_out-prodh =  '00005'   AND gt_out-auart NE 'ZORD' .
          PERFORM change_so USING 'CP'.
        ELSEIF gt_out-prodh =  '00005'   AND gt_out-auart = 'ZORD' .
          PERFORM change_so USING 'ZN'.
        ELSE.
          PERFORM change_so USING gs_ztsd004-zettyp_t.
        ENDIF.

        IF    gt_out-icon  = c_red.
          lv_flag_0 = 'X'.
        ENDIF.
      ELSE.
        gt_out-icon  = c_red.
        gt_out-message  =   '无计划行修改权限'.
        lv_flag_0 = 'X'.
      ENDIF.
      CLEAR gs_ztsd004.

*2.2)更新销售订单抬头的对象状态,审批状态更新为已审批(状态HD20);
      DATA : lv_objnr        TYPE j_objnr.
      IF  lv_flag_0 <>  'X'.
        CLEAR lv_objnr.
        lv_objnr = 'VB' && gt_out-vbeln && '000000'.

        CALL FUNCTION 'I_CHANGE_STATUS'
          EXPORTING
            objnr          = lv_objnr
            estat_inactive = 'E0001'
            estat_active   = 'E0002'
            stsma          = 'ZSDHDR'
          EXCEPTIONS
            cannot_update  = 1
            OTHERS         = 2.

        IF  sy-subrc  <>  0.

          gt_out-icon  = c_red.
          gt_out-message  =    gt_out-message &&   'cannot_update'.

        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          gt_out-zshzt = '已审批'.
          gt_out-icon  = c_green.
          gt_out-message  =   '审批成功'.
        ENDIF.
      ENDIF.
    ELSE.
      gt_out-icon  = c_red.
      gt_out-message  =   '不能重复审批'.

    ENDIF.
    MODIFY gt_out TRANSPORTING zshzt  icon message.
    CLEAR gt_out.
  ENDLOOP.

  PERFORM refresh_table_alv.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHANGE_SO
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM change_so  USING p_ettyp.

  DATA:is_order_header_inx TYPE bapisdh1x,

       it_return           TYPE TABLE OF bapiret2 WITH HEADER LINE,

       it_schedule_lines   TYPE TABLE OF bapischdl WITH HEADER LINE,

       it_schedule_linesx  TYPE TABLE OF bapischdlx WITH HEADER LINE.

  CLEAR:it_return[], it_schedule_lines[],it_schedule_linesx[].

  is_order_header_inx-updateflag = 'U'.         "UPDATE

  it_schedule_lines-itm_number = gt_out-posnr.

  it_schedule_lines-sched_line = 1.

  it_schedule_lines-sched_type = p_ettyp.

  APPEND it_schedule_lines.
  CLEAR it_schedule_lines.

  it_schedule_linesx-updateflag = 'U'.

  it_schedule_linesx-itm_number = gt_out-posnr.

  it_schedule_linesx-sched_line = 1.

  it_schedule_linesx-sched_type = 'X'.

  APPEND it_schedule_linesx.
  CLEAR it_schedule_linesx.

  CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
    EXPORTING
      salesdocument    = gt_out-vbeln
      order_header_inx = is_order_header_inx
    TABLES
      return           = it_return
      schedule_lines   = it_schedule_lines
      schedule_linesx  = it_schedule_linesx.


  DATA:l_message TYPE string.
  LOOP AT it_return WHERE type = 'E' OR type = 'A'.
    l_message = l_message && it_return-message.
    CLEAR it_return.
  ENDLOOP.

  IF l_message IS INITIAL.    " SUCCESS

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    gt_out-icon  = c_green.
    gt_out-message  =   '处理成功'.

  ELSE.

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    gt_out-icon  = c_red.
    gt_out-message  = l_message.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_CANCEL_zt
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_cancel_zt .

  IF NOT line_exists( gt_out[ sel = 'X' ] ).
    MESSAGE '没有选择可用于处理的数据!!!' TYPE 'E'.
  ENDIF.

*整单审批
  DATA(lt_out1)  = gt_out[].
  DELETE lt_out1 WHERE sel  <> 'X'.
  SORT lt_out1 BY vbeln.
  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<out>) .
    READ TABLE lt_out1 INTO DATA(ls_out1) WITH KEY vbeln  = <out>-vbeln BINARY SEARCH.
    IF  sy-subrc  = 0.
      <out>-sel  = 'X'.
    ENDIF.
  ENDLOOP.

  DATA:lv_flag1.
  LOOP AT  gt_out WHERE sel = 'X'.
    CLEAR lv_flag1.
    IF gt_out-zshzt = '已审批'.
*    选择ALV订单行,点击“审批撤销”,根据选择行的销售订单,判断是否满足撤销审批的条件:
*根据PLAF-KDAUF = VBAK-VBELN,在表PLAF是否有条目数;
      SELECT COUNT(*) FROM plaf WHERE kdauf  = gt_out-vbeln.
      IF  sy-subrc  = 0.
        lv_flag1 = 'X'.
        gt_out-icon  = c_red.
        gt_out-message  =   '销售订单已执行计划需求,不能撤销审批'.
      ENDIF.
*根据AFPO-KDAUF = VBAK-VBELN,在表AFPO是否有条目数;
      SELECT COUNT(*) FROM afpo WHERE kdauf  = gt_out-vbeln.
      IF  sy-subrc  = 0.
        lv_flag1 = 'X'.
        gt_out-icon  = c_red.
        gt_out-message  =   '销售订单已执行计划需求,不能撤销审批'.
      ENDIF.
*根据LIPS-VGBEL = VBAK-VBELN,在表LIPS是否有条目数;
      SELECT COUNT(*) FROM lips WHERE vgbel  = gt_out-vbeln.
      IF  sy-subrc  = 0.
        lv_flag1 = 'X'.
        gt_out-icon  = c_red.
        gt_out-message  =   '销售订单已执行计划需求,不能撤销审批'.
      ENDIF.

      IF   lv_flag1 <>  'X'.

*3.1)更新销售订单抬头的对象状态,审批状态更新为待审批(状态HD10);
        DATA : lv_objnr        TYPE j_objnr.
        CLEAR lv_objnr.
        lv_objnr = 'VB' && gt_out-vbeln && '000000'.
*    lv_objnr = 'TM0000000001VB'.
        CALL FUNCTION 'I_CHANGE_STATUS'
          EXPORTING
            objnr          = lv_objnr
            estat_inactive = 'E0002'
            estat_active   = 'E0001'
            stsma          = 'ZSDHDR'
          EXCEPTIONS
            cannot_update  = 1
            OTHERS         = 2.
        IF  sy-subrc  <>  0.
          lv_flag1 = 'X'.
          gt_out-icon  = c_red.
          gt_out-message  =    gt_out-message &&   'cannot_update'.

        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          gt_out-zshzt = '未审批'.
        ENDIF.
*更新销售订单行项目的计划行类别,根据配置表项目类别计划行审批对应表(字段:审批撤销计划行),
*更新订单行项目类别的计划行(VBEP-ETTYP);
        IF  lv_flag1  <>  'X'.
          READ TABLE  gt_ztsd004 INTO gs_ztsd004 WITH KEY pstyv  = gt_out-pstyv BINARY SEARCH.
          IF  sy-subrc  = 0.
            PERFORM change_so USING gs_ztsd004-zettyp_c.
            IF   gt_out-icon  = c_green.
              gt_out-message  =   '审批撤销成功'.
            ENDIF.
          ELSE.
            gt_out-icon  = c_red.
            gt_out-message  =   '无计划行修改权限'.
          ENDIF.
          CLEAR gs_ztsd004.
        ENDIF.
      ENDIF.
    ELSE.
      gt_out-icon  = c_red.
      gt_out-message  =   '该销售订单未审批,不能执行撤销操作'.
    ENDIF.

    MODIFY gt_out TRANSPORTING zshzt icon message.
    CLEAR gt_out.
  ENDLOOP.

  PERFORM refresh_table_alv.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_object
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_object .

  SELECT vkorg
    FROM tvko
    INTO TABLE @DATA(lt_1)
    WHERE vkorg IN @s_vkorg
    .
  LOOP AT lt_1 ASSIGNING FIELD-SYMBOL(<1>).
    AUTHORITY-CHECK OBJECT 'V_VBAK_VKO'
  ID 'ACTVT' FIELD '03'
  ID 'VKORG' FIELD <1>-vkorg.
    IF sy-subrc <> 0.
      MESSAGE s001(00) WITH TEXT-e01 DISPLAY LIKE 'W'.LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_PRINT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_print_data2 .
  DATA: lw_control     TYPE ssfctrlop.
  DATA: lw_options     TYPE ssfcompop.
  DATA: cn_locn(4) TYPE c VALUE 'LOCN',
        cn_lojp(4) TYPE c VALUE 'LOJP',
        cn_lohk(4) TYPE c VALUE 'LOHK',
        cn_flagx   TYPE c VALUE 'X'.
  DATA: lv_fmnam TYPE rs38l_fnam,
        lv_sfnam TYPE tdsfname.
  DATA : lw_option  TYPE ssfcresop.
  DATA: lv_tdid     TYPE  thead-tdid,
        lv_tdname   TYPE  thead-tdname,
        lv_tdobject TYPE  thead-tdobject.

  DATA :lt_line TYPE TABLE OF tline.
  DATA lv_kwmeng TYPE  string.
  DATA ls_head TYPE zssd010.
  DATA ls_item TYPE zssd010a.
  DATA ls_user_addr TYPE user_addr.
  DATA lt_item TYPE TABLE OF zssd010a WITH HEADER LINE.
  DATA: job_output_options TYPE ssfcrescl. "打印结束时返回值
  AUTHORITY-CHECK OBJECT 'V_VBAK_AAT'
*  ID 'AUART' FIELD
  ID 'ACTVT' FIELD '04'.
  IF sy-subrc <> 0.
    MESSAGE '无打印退货单打印权限!!!' TYPE 'E'.
  ENDIF.
  IF NOT line_exists( gt_out[ sel = 'X' ] ).
    MESSAGE '没有选择可用于打印的数据!!!' TYPE 'E'.
  ENDIF.
*  LW_CONTROL-NO_DIALOG = CN_FLAGX.
*  LW_CONTROL-PREVIEW   = CN_FLAGX.
  lw_control-langu     = sy-langu .
  lw_control-no_open   = cn_flagx.
  lw_control-no_close  = cn_flagx.
*  IF SY-LANGU = '1'.
*    LW_OPTIONS-TDDEST    = CN_LOCN.
*  ELSEIF SY-LANGU = 'J'.
*    LW_OPTIONS-TDDEST    = CN_LOJP.
*  ELSEIF SY-LANGU = 'E'.
*    LW_OPTIONS-TDDEST    = CN_LOHK.
*  ENDIF.
  lv_sfnam = 'ZSF_SD010A'.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = lv_sfnam
    IMPORTING
      fm_name            = lv_fmnam
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  CALL FUNCTION 'SSF_OPEN'    "打开打印窗口
    EXPORTING
      control_parameters = lw_control
      output_options     = lw_options
*     user_settings      = cn_flagx
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
  LOOP AT gt_out INTO DATA(ls_out) WHERE sel = 'X' GROUP BY ( vbeln = ls_out-vbeln )
                                              ASCENDING
                                          ASSIGNING FIELD-SYMBOL(<group>).
    CLEAR:ls_head,lt_item[],lt_line[].
    "抬头数据赋值
    READ TABLE gt_out ASSIGNING FIELD-SYMBOL(<ls_out_a>) WITH  KEY vbeln = <group>-vbeln.
    IF sy-subrc = 0.
      SELECT SINGLE vbeln,erdat,erzet INTO @DATA(ls_vbak) FROM vbak WHERE vbeln = @<group>-vbeln. 
*<=>所需字段
      MOVE-CORRESPONDING <ls_out_a> TO ls_head.
      ls_head-name1 = <ls_out_a>-name1_1.
      ls_head-datum = ls_vbak-erdat+0(4) && '-' && ls_vbak-erdat+4(2) && '-' && ls_vbak-erdat+6(2) && ' ' && ls_vbak-erzet+0(2) && ':' && ls_vbak-erzet+2(2) && ':' && ls_vbak-erzet+4(2) .

      SELECT SINGLE butxt,street,tel_number,fax_number  INTO ( @ls_head-butxt,@ls_head-street,@ls_head-tel_number,@ls_head-fax_number  ) FROM ztsd020b
           WHERE ztsd020b~vkorg = @<ls_out_a>-vkorg
           .

      lv_tdid   = 'ZH03'.
      lv_tdname  = <group>-vbeln.
      lv_tdobject = 'VBBK'.
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          client          = sy-mandt
          id              = lv_tdid
          language        = sy-langu
          name            = lv_tdname
          object          = lv_tdobject
        TABLES
          lines           = lt_line
        EXCEPTIONS
          id              = 1
          language        = 2
          name            = 3
          not_found       = 4
          object          = 5
          reference_check = 6.
      READ TABLE lt_line ASSIGNING FIELD-SYMBOL(<ls_line>) INDEX 1.
      IF sy-subrc = 0.
        ls_head-zbm = <ls_line>-tdline.
      ENDIF.
      IF ls_head-zbm IS INITIAL.
        ls_head-zbm = '市场部'.
      ENDIF.
      lv_tdid   = 'ZH02'.
      lv_tdname  = <group>-vbeln.
      lv_tdobject = 'VBBK'.
      CLEAR lt_line[].
      CALL FUNCTION 'READ_TEXT'
        EXPORTING
          client          = sy-mandt
          id              = lv_tdid
          language        = sy-langu
          name            = lv_tdname
          object          = lv_tdobject
        TABLES
          lines           = lt_line
        EXCEPTIONS
          id              = 1
          language        = 2
          name            = 3
          not_found       = 4
          object          = 5
          reference_check = 6.
      READ TABLE lt_line ASSIGNING FIELD-SYMBOL(<ls_line_a>) INDEX 1.
      IF sy-subrc = 0.
        ls_head-zzd = <ls_line_a>-tdline.
      ENDIF.
      IF ls_head-zzd IS INITIAL.
        SELECT SINGLE name_last name_first INTO ( ls_user_addr-name_last,ls_user_addr-name_first )  FROM vbak LEFT JOIN user_addr ON vbak~ernam = user_addr~bname WHERE vbeln = <group>-vbeln.
        ls_head-zzd = ls_user_addr-name_last && ls_user_addr-name_first.
      ENDIF.

    ENDIF.
    "项目赋值
    LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<ls_out>) WHERE vbeln = <group>-vbeln.
      MOVE-CORRESPONDING <ls_out> TO lt_item.
      IF ls_head-zxh IS INITIAL.
        ls_head-zxh = 1.
      ELSEIF ls_head-zxh IS NOT INITIAL.
        ls_head-zxh = ls_head-zxh + 1.
      ENDIF.
      lt_item-zxh = ls_head-zxh.

      lt_item-zbz = <ls_out>-zhbz.
      lv_kwmeng = <ls_out>-kwmeng.
      CONDENSE lv_kwmeng NO-GAPS.
      SHIFT lv_kwmeng RIGHT DELETING TRAILING '0'.     "除右边无意义0
      SHIFT lv_kwmeng RIGHT DELETING TRAILING '.'.     "除右边无意义小数点
      SHIFT lv_kwmeng LEFT DELETING LEADING space.     "去左边空
      lt_item-zzldh = |{ <ls_out>-vbeln ALPHA = OUT  }| && |{ <ls_out>-posnr ALPHA = OUT  }| && <ls_out>-matnr && lv_kwmeng && <ls_out>-meins && <ls_out>-zsczlwb .
      lt_item-kwmeng = lv_kwmeng.
      APPEND lt_item.
      CLEAR lt_item.
    ENDLOOP.
    CALL FUNCTION lv_fmnam
      EXPORTING
        control_parameters = lw_control
        output_options     = lw_options
        gw_head            = ls_head       "结构存放表头信息
      IMPORTING
        job_output_options = lw_option
      TABLES
        t_item             = lt_item
      EXCEPTIONS
        formatting_error   = 1
        internal_error     = 2
        send_error         = 3
        user_canceled      = 4
        OTHERS             = 5.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDLOOP.
*ssf_close               "关闭打印窗口,如点打印预览会关闭此窗口
  CALL FUNCTION 'SSF_CLOSE'
    IMPORTING
      job_output_info  = job_output_options
    EXCEPTIONS
      formatting_error = 1
      internal_error   = 2
      send_error       = 3
      OTHERS           = 4.

  IF job_output_options-outputdone = 'X'."点击打印
    LOOP AT gt_out INTO ls_out WHERE sel = 'X' GROUP BY ( vbeln = ls_out-vbeln )
                                                ASCENDING
                                            ASSIGNING FIELD-SYMBOL(<group2>).

      LOOP AT gt_out WHERE vbeln = <group2>-vbeln.
        gt_out-zdybs = '已打印'.
        gt_out-clr = 'C300'.

        MODIFY gt_out.
      ENDLOOP.
    ENDLOOP.
    PERFORM refresh_table_alv.
  ENDIF.
ENDFORM.

FORM refresh_table_alv .
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = gr_grid.
  "更新列宽
  gs_layout-cwidth_opt = 'X'.
  CALL METHOD gr_grid->set_frontend_layout
    EXPORTING
      is_layout = gs_layout.

  "内刷屏
  gs_stbl-row = 'X'." 基于行的稳定刷新
  gs_stbl-col = 'X'." 基于列稳定刷新
  CALL METHOD gr_grid->refresh_table_display
    EXPORTING
      is_stable = gs_stbl.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MD81_BDC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_md81_bdc  USING ls_data TYPE out_ty CHANGING p_dh  p_mess.

  CLEAR:bdcdata[].
  CLEAR:messtab[].

  DATA: lv_n TYPE  n LENGTH 2.
  lv_n  = 1.

  PERFORM bdc_dynpro      USING 'SAPMV45A' '0105'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'RV45A-DWERK'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '/00'.
  PERFORM bdc_field       USING 'RV45A-KPRGBZ'
                                'D'.
*  请求交货日期:默认当前日期
  PERFORM bdc_field       USING 'RV45A-KETDAT'
                                sy-datum.
*  需求类型=默认KEV
  PERFORM bdc_field       USING 'RV45A-BEDAE'
                                'KEV'.
*  交货工厂=VBAP-WERKS
  PERFORM bdc_field       USING 'RV45A-DWERK'
                                ls_data-werks.
  PERFORM bdc_dynpro      USING 'SAPMV45A' '0421'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '/00'. "'=SICH'.  

*  客户独立需求:默认规则RQ+销售订单号(VBAK-VBELN) 例如:RQ31000001
  DATA:lv_vbeln TYPE char8.
  CLEAR lv_vbeln.
  lv_vbeln  = |{ ls_data-vbeln  ALPHA = OUT WIDTH = 8  }|.
  DATA(lv_dh) = 'RQ' && lv_vbeln .

  PERFORM bdc_field       USING 'VBAK-VBELN'
                                 lv_dh.
  CLEAR lv_dh.
  PERFORM bdc_field       USING 'RV45A-BEDAE'
                                'KEV'.
  PERFORM bdc_field       USING 'RV45A-KPRGBZ'
                                'D'.
  PERFORM bdc_field       USING 'RV45A-KETDAT'
                                sy-datum.
  PERFORM bdc_field       USING 'RV45A-DWERK'
                                '2000'.

 
  DATA:lv_field1 TYPE char20.
  DATA:lv_men TYPE char20 .
  DATA(lt_out) = gt_out[].
  DELETE lt_out WHERE vbeln  <> ls_data-vbeln.
  READ TABLE lt_out INTO DATA(lw_out) INDEX 1.
  CLEAR lv_field1.
  lv_field1  = 'VBAP-WERKS(01)'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                   lv_field1.
  lv_field1  = 'RV45A-MABNR(01)'.
*    物料:取销售订单行项目物料VBAP-VBELN+POSNR得VBAP-MATNR
  PERFORM bdc_field       USING lv_field1
                                lw_out-matnr.
*    项目:取销售订单行项目VBAP-POSNR
  lv_field1  = 'VBAP-POSNR(01)'.
  PERFORM bdc_field       USING lv_field1
                                lw_out-posnr.
*    需求类型:VBAP-VBELN+POSNR得VBAP-BEDAE
  lv_field1  = 'VBAP-BEDAE(01)'.
  PERFORM bdc_field       USING lv_field1
                                  'KEV'.
*    订单数量:VBAP-VBELN+POSNR得VBAP-KWMENG
  lv_field1  = 'RV45A-KWMENG(01)'.

  CLEAR lv_men.
  lv_men = lw_out-kwmeng.
  CONDENSE lv_men.

  PERFORM bdc_field       USING lv_field1
                               lv_men.
*    工厂:VBAP-VBELN+POSNR得VBAP-WERKS
  lv_field1  = 'VBAP-WERKS(01)'.
  PERFORM bdc_field       USING lv_field1
                                  lw_out-werks .
*    库存地点:VBAP-VBELN+POSNR得VBAP-LGORT
  lv_field1  = 'VBAP-LGORT(01)'.
  PERFORM bdc_field       USING lv_field1
                                  lw_out-lgort .
*    首个日期:VBAP-VBELN+POSNR得VBAP-CMTD_DELIV_DATE
  lv_field1  = 'RV45A-ETDAT(01)'.
  PERFORM bdc_field       USING lv_field1
                                lw_out-edatu.

  "删除第一行 后面从第二行开始每次加入一行用插入的方式录入
  DELETE lt_out INDEX 1.
  LOOP AT lt_out INTO lw_out.
    PERFORM bdc_dynpro      USING 'SAPMV45A' '0421'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '/00'.
    CLEAR lv_field1.
    lv_field1  = 'VBAP-WERKS(02)'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                     lv_field1.
    lv_field1  = 'RV45A-MABNR(02)'.
*      物料:取销售订单行项目物料VBAP-VBELN+POSNR得VBAP-MATNR
    PERFORM bdc_field       USING lv_field1
                                  lw_out-matnr.
*      项目:取销售订单行项目VBAP-POSNR
    lv_field1  = 'VBAP-POSNR(02)'.
    PERFORM bdc_field       USING lv_field1
                                  lw_out-posnr.
*      需求类型:VBAP-VBELN+POSNR得VBAP-BEDAE
    lv_field1  = 'VBAP-BEDAE(02)'.
    PERFORM bdc_field       USING lv_field1
                                    'KEV'.
*      订单数量:VBAP-VBELN+POSNR得VBAP-KWMENG
    lv_field1  = 'RV45A-KWMENG(02)'.

    CLEAR lv_men.
    lv_men = lw_out-kwmeng.
    CONDENSE lv_men.

    PERFORM bdc_field       USING lv_field1
                                 lv_men.
*      工厂:VBAP-VBELN+POSNR得VBAP-WERKS
    lv_field1  = 'VBAP-WERKS(02)'.
    PERFORM bdc_field       USING lv_field1
                                    lw_out-werks .
*      库存地点:VBAP-VBELN+POSNR得VBAP-LGORT
    lv_field1  = 'VBAP-LGORT(02)'.
    PERFORM bdc_field       USING lv_field1
                                    lw_out-lgort .
*      首个日期:VBAP-VBELN+POSNR得VBAP-CMTD_DELIV_DATE
    lv_field1  = 'RV45A-ETDAT(02)'.
    PERFORM bdc_field       USING lv_field1
                                  lw_out-edatu.
    "选择第一行 点击插入
    PERFORM bdc_dynpro      USING 'SAPMV45A' '0421'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
                                  '=POAN'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'VBAP-POSNR(01)'.
    PERFORM bdc_field       USING 'RV45A-VBAP_SELKZ(01)'
                                  'X'.
  ENDLOOP.
  "保存
  PERFORM bdc_dynpro      USING 'SAPMV45A' '0421'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=SICH'.
*  LOOP AT  gt_out WHERE vbeln  = ls_data-vbeln.
*
*    DATA:lv_field1 TYPE char20.
*    CLEAR lv_field1.
*    lv_field1  = 'VBAP-WERKS('  && lv_n &&  ')'.
*    PERFORM bdc_field       USING 'BDC_CURSOR'
*                                     lv_field1.
*    lv_field1  = 'RV45A-MABNR('  && lv_n &&  ')'.
**    物料:取销售订单行项目物料VBAP-VBELN+POSNR得VBAP-MATNR
*    PERFORM bdc_field       USING lv_field1
*                                  gt_out-matnr.
**    项目:取销售订单行项目VBAP-POSNR
*    lv_field1  = 'VBAP-POSNR('  && lv_n &&  ')'.
*    PERFORM bdc_field       USING lv_field1
*                                  gt_out-posnr.
**    需求类型:VBAP-VBELN+POSNR得VBAP-BEDAE
*    lv_field1  = 'VBAP-BEDAE('  && lv_n &&  ')'.
*    PERFORM bdc_field       USING lv_field1
**                                  gt_out-bedae.
*                                    'KEV'.
**    订单数量:VBAP-VBELN+POSNR得VBAP-KWMENG
*    lv_field1  = 'RV45A-KWMENG('  && lv_n &&  ')'.
*
*    DATA:lv_men TYPE char20 .
*    CLEAR lv_men.
*    lv_men = gt_out-kwmeng.
*    CONDENSE lv_men.
*
*    PERFORM bdc_field       USING lv_field1
*                                 lv_men.
**    工厂:VBAP-VBELN+POSNR得VBAP-WERKS
*    lv_field1  = 'VBAP-WERKS('  && lv_n &&  ')'.
*    PERFORM bdc_field       USING lv_field1
*                                    gt_out-werks .
**    库存地点:VBAP-VBELN+POSNR得VBAP-LGORT
*    lv_field1  = 'VBAP-LGORT('  && lv_n &&  ')'.
*    PERFORM bdc_field       USING lv_field1
*                                    gt_out-lgort .
**    首个日期:VBAP-VBELN+POSNR得VBAP-CMTD_DELIV_DATE
*    lv_field1  = 'RV45A-ETDAT('  && lv_n &&  ')'.
*    PERFORM bdc_field       USING lv_field1
*                                  gt_out-edatu.
*
*    lv_n  = lv_n + 1.
*
*  ENDLOOP.
*        endloop.
  CALL TRANSACTION  'MD81' USING bdcdata[] MODE bdc_mode UPDATE 'S' MESSAGES INTO messtab[].

  READ TABLE  messtab WITH KEY msgtyp = 'S'   msgid  = 'V1'  msgnr  = '311'.
  IF  sy-subrc  = 0.
    p_dh  = messtab-msgv2.
  ENDIF.

  LOOP AT  messtab WHERE msgtyp = 'E' OR  msgtyp = 'A' .
    p_mess  =  p_mess && messtab-msgv1.
  ENDLOOP.


ENDFORM.

*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
  CLEAR bdcdata.
  bdcdata-program  = program.
  bdcdata-dynpro   = dynpro.
  bdcdata-dynbegin = 'X'.
  APPEND bdcdata.
ENDFORM.

*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
  IF fval <> nodata.
    CLEAR bdcdata.
    bdcdata-fnam = fnam.
    bdcdata-fval = fval.
    APPEND bdcdata.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_po_create1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_po_create1 .

  READ TABLE gt_out INTO gs_out WITH KEY sel = 'X'.
  IF sy-subrc NE 0.
    MESSAGE e208(00) WITH '请选择需要创建的数据'.
  ENDIF.
  DATA: lv_message TYPE char50,
        lv_zcgddsl TYPE ekpo-menge.   "采购订单数量
  CLEAR lv_message.
  LOOP AT gt_out INTO gs_out WHERE sel = 'X'.
    CLEAR:gs_out-icon,gs_out-message.
    lv_zcgddsl = gs_out-kwmeng - gs_out-lfimg.
    IF gs_out-zcgddsl > gs_out-kwmeng - gs_out-lfimg.
      gs_out-icon = c_red.
      gs_out-message = '本次调拨数量不能大于' && lv_zcgddsl && '!'.
      lv_message = gs_out-message.
    ENDIF.
    MODIFY gt_out FROM gs_out.
    CLEAR gs_out.
  ENDLOOP.
  IF lv_message IS INITIAL.

    DATA: lv_po_item      TYPE bapimepoitem-po_item. "项目
    DATA: lv_ebeln        TYPE ekko-ebeln.

    DATA: lv_message2      TYPE char200.
*  DATA: ls_extension    TYPE bapi_te_mepoheader.
*  DATA: ls_extensionx   TYPE bapi_te_mepoheaderx.
    DATA: ls_extension_i  TYPE bapi_te_mepoitem.
    DATA: ls_extension_ix TYPE bapi_te_mepoitemx.


    DATA: ls_poheader          TYPE bapimepoheader,
          ls_poheaderx         TYPE bapimepoheaderx,
          ls_expheader         TYPE bapimepoheader,
          ls_exppoexpimpheader TYPE bapieikp,
          ls_return            TYPE bapiret2,
          ls_poitem            TYPE bapimepoitem,
          ls_poitemx           TYPE bapimepoitemx,
          ls_poschedule        TYPE bapimeposchedule,
          ls_poschedulex       TYPE bapimeposchedulx,
*        ls_poaccount         TYPE bapimepoaccount,
*        ls_poaccountx        TYPE bapimepoaccountx,
          ls_pocond            TYPE bapimepocond,
          ls_pocondx           TYPE bapimepocondx,
          ls_potextitem        TYPE bapimepotext,
          ls_extensionin       TYPE bapiparex,
          ls_schedule          TYPE bapimeposchedule,
          ls_schedulex         TYPE bapimeposchedulx.

    DATA: lt_return      LIKE TABLE OF ls_return,
          lt_poitem      LIKE TABLE OF ls_poitem,
          lt_poitemx     LIKE TABLE OF ls_poitemx,
          lt_poschedule  LIKE TABLE OF ls_poschedule,
          lt_poschedulex LIKE TABLE OF ls_poschedulex,
*        lt_poaccount   LIKE TABLE OF ls_poaccount,
*        lt_poaccountx  LIKE TABLE OF ls_poaccountx,
          lt_pocond      LIKE TABLE OF ls_pocond,
          lt_pocondx     LIKE TABLE OF ls_pocondx,
          lt_potextitem  LIKE TABLE OF bapimepotext,
          lt_extensionin LIKE TABLE OF ls_extensionin,
*      lt_extensioninx LIKE TABLE OF ls_extensionin,
          lt_schedule    LIKE TABLE OF bapimeposchedule,
          lt_schedulex   LIKE TABLE OF  bapimeposchedulx.
    CLEAR : ls_poheader,ls_poheaderx,lv_po_item,lt_extensionin,lt_schedule,lt_schedulex.
    "抬头信息
    ls_poheader-doc_type  = 'Z015'. "采购订单类型
*        ls_poheader-vendor    = gs_excel-vendor.   "供应商编码
    ls_poheader-suppl_plnt  = '2000'. "Z015的供应工厂
    ls_poheader-doc_date  = sy-datum. "凭证日期
    ls_poheader-purch_org = '2000'."采购组织
    ls_poheader-pur_group = 'B03'."采购组
    ls_poheader-comp_code = '2000'."公司代码
    "ls_poheader-currency  = gs_excel-currency. "货币码

    "抬头信息
    ls_poheaderx-doc_type  = 'X'."采购订单类型
*        ls_poheaderx-vendor    = 'X'."供应商编码
    ls_poheaderx-suppl_plnt  = 'X'."Z015的供应工厂
    ls_poheaderx-doc_date  = 'X'."凭证日期
    ls_poheaderx-purch_org = 'X'."采购组织
    ls_poheaderx-pur_group = 'X'."采购组
    ls_poheaderx-comp_code = 'X'."公司代码
    "ls_poheaderx-currency  = 'X'."货币码

*        DATA : lv_bapi_te_mepoheaer(960) TYPE c.
*
*        "抬头增强
*        ls_extensionin-structure = 'BAPI_TE_MEPOHEADER'."采购订单屏幕增强自定义(抬头)
*        CLEAR lv_bapi_te_mepoheaer.
*        CALL METHOD cl_abap_container_utilities=>fill_container_c
*          EXPORTING
*            im_value               = ls_extension
*          IMPORTING
*            ex_container           = lv_bapi_te_mepoheaer
*          EXCEPTIONS
*            illegal_parameter_type = 1
*            OTHERS                 = 2.
*
*        ls_extensionin-valuepart1 = lv_bapi_te_mepoheaer(240).
*        APPEND ls_extensionin TO lt_extensionin.
*
*        "抬头增强
*        ls_extensionin-structure = 'BAPI_TE_MEPOHEADERX'."采购订单屏幕增强自定义(抬头)
*        ls_extensionx-zhtbh = 'X'.
*        ls_extensionin-valuepart1 = ls_extensionx.
*        APPEND ls_extensionin TO lt_extensionin.
*      ENDIF.
    LOOP AT gt_out INTO DATA(gs_out) WHERE sel = 'X'.
      lv_po_item = lv_po_item + 10.
      ls_poitem-po_item       = lv_po_item.             "项目号
*      ls_poitem-acctasscat    = gs_excel-acctasscat.    "科目分配类别
*ls_poitem-item_cat      = 'U'.      "采购凭证中的项目类别
      ls_poitem-material_long = gs_out-matnr. "物料号
*      ls_poitem-short_text    = gs_excel-short_text.    "物料描述
*ls_poitem-po_unit       = 'PCS'.     "单位
*      ls_poitem-net_price     = gs_excel-cond_value.     "价格
*      ls_poitem-price_unit    = gs_excel-cond_p_unt.  "价格单位
*ls_poitem-quantity      = '1'.      "采购订单数量
      ls_poitem-plant         = gs_out-werks.         "工厂
*      ls_poitem-free_item     = gs_excel-free_item.     "免费交货标识
*      ls_poitem-ret_item      = gs_excel-ret_item.      "退货标识
*      ls_poitem-tax_code      = gs_excel-tax_code.      "税码
      ls_poitem-stge_loc = gs_out-zdbkc."库存地点
      ls_poitemx-po_item       = lv_po_item.  "项目号
*      ls_poitemx-acctasscat    = 'X'.         "科目分配类别
*ls_poitemx-item_cat      = 'X'.      "采购凭证中的项目类别
      ls_poitemx-material_long = 'X'.         "物料号
*      ls_poitemx-short_text    = 'X'.         "物料描述
*ls_poitemx-po_unit       = 'X'.     "单位
*      ls_poitemx-net_price     = 'X'.     "价格
*      ls_poitemx-price_unit    = 'X'.  "价格单位
*ls_poitemx-quantity      = 'X'.         "采购订单数量
      ls_poitemx-plant         = 'X'.         "工厂
*      ls_poitemx-free_item     = 'X'.         "免费交货标识
*      ls_poitemx-ret_item      = 'X'.         "退货标识
*      ls_poitemx-tax_code      = 'X'.         "税码
      ls_poitemx-stge_loc = 'X'."库存地点
      APPEND ls_poitem TO lt_poitem.
      CLEAR ls_poitem.
      APPEND ls_poitemx TO lt_poitemx.
      CLEAR ls_poitemx.
*      "采购订单的帐户分配字段
*      ls_poaccount-po_item     = lv_po_item. "项目号
*      ls_poaccount-gl_account  = gs_excel-gl_account . "总账科目
*      ls_poaccount-costcenter  = gs_excel-costcenter . "成本中心
*      ls_poaccount-asset_no    = gs_excel-asset_no .   "资产编码
*      ls_poaccount-sd_doc      = gs_excel-sd_doc .     "销售和分销凭证号
*      ls_poaccount-itm_number  = gs_excel-itm_number . "销售凭证项目
*
*      ls_poaccountx-po_item     = lv_po_item.    "项目号
*      ls_poaccountx-gl_account  = 'X'.    "总账科目
*      ls_poaccountx-costcenter  = 'X'.    "成本中心
*      ls_poaccountx-asset_no    = 'X'.    "资产编码
*      ls_poaccountx-sd_doc      = 'X'.    "销售和分销凭证号
*      ls_poaccountx-itm_number  = 'X'.    "销售凭证项目
*
*      APPEND ls_poaccount  TO lt_poaccount.
*      CLEAR  ls_poaccount.
*      APPEND ls_poaccountx TO lt_poaccountx.
*      CLEAR  ls_poaccountx.


*      "采购订单中的条件
*      ls_pocond-itm_number  = lv_po_item.          "项目号
**      ls_pocond-cond_st_no  = '001'.               "步骤编号
*      ls_pocond-cond_type   = 'PBXX'.              "条件类型
*      ls_pocond-cond_value  = gs_excel-cond_value. "条件金额(价格)
*      ls_pocond-cond_unit   = gs_excel-cond_unit. "条件金额(价格)
*      ls_pocond-cond_p_unt  = gs_excel-cond_p_unt.  "价格单位
*      ls_pocond-currency    = gs_excel-currency.   "货币码
*      ls_pocond-change_id   = 'I'.                 "更改类型
**      ls_pocond-cond_updat   = 'X'.                 "条件更新
**      ls_pocond-condchaman   = 'X'.                 "已手动更改条件
*
*      "采购订单项目数据(更改参数)
*      ls_pocondx-itm_number = lv_po_item.
**      ls_pocondx-cond_st_no  = '001'. "步骤编号
*      ls_pocondx-cond_type  = 'X'.
*      ls_pocondx-cond_value = 'X'.
*      ls_pocondx-cond_unit = 'X'.
*      ls_pocondx-cond_p_unt = 'X'.
*      ls_pocondx-currency   = 'X'.
*      ls_pocondx-change_id  = 'X'.
**      ls_pocondx-cond_updat   = 'X'.                 "条件更新
**      ls_pocondx-condchaman   = 'X'.                 "已手动更改条件
*
*      APPEND ls_pocond TO lt_pocond.
*      CLEAR: ls_pocond.
*      APPEND ls_pocondx TO lt_pocondx.
*      CLEAR: ls_pocondx.

      "项目号  交货日期  采购订单数量
      CLEAR: ls_schedule, ls_schedulex.
*      ls_schedule  = VALUE #( po_item = lv_po_item delivery_date = gs_excel-delivery_date quantity = gs_excel-quantity ).
*      ls_schedulex = VALUE #( po_item = lv_po_item delivery_date = 'X' quantity = 'X' ).
      ls_schedule-po_item = lv_po_item.
      ls_schedule-delivery_date = sy-datum.
      ls_schedule-quantity = gs_out-zcgddsl.
      ls_schedulex-po_item = lv_po_item.
      ls_schedulex-delivery_date = 'X'.
      ls_schedulex-quantity = 'X'.
      APPEND:  ls_schedule TO lt_schedule, ls_schedulex TO lt_schedulex.

      "行项目增强
*  MOVE-CORRESPONDING gs_excel TO ls_extension_i.
      ls_extension_i-po_item  = lv_po_item.
      ls_extension_i-zkdauf  = gs_out-vbeln.
      ls_extension_i-zkdpos  = gs_out-posnr.

      ls_extensionin-structure = 'BAPI_TE_MEPOITEM'."采购订单屏幕增强
      ls_extensionin-valuepart1 = ls_extension_i.
      APPEND ls_extensionin TO lt_extensionin.

      ls_extension_ix-po_item = lv_po_item.
      ls_extension_ix-zkdauf  = 'X'.
      ls_extension_ix-zkdpos  = 'X'.

      ls_extensionin-structure = 'BAPI_TE_MEPOITEMX'."采购订单屏幕增强
      ls_extensionin-valuepart1 = ls_extension_ix.
      APPEND ls_extensionin TO lt_extensionin.

      CLEAR:gs_out.
    ENDLOOP.

    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        poheader         = ls_poheader
        poheaderx        = ls_poheaderx
      IMPORTING
        exppurchaseorder = lv_ebeln
      TABLES
        return           = lt_return
        poitem           = lt_poitem
        poitemx          = lt_poitemx
*       poaccount        = lt_poaccount
*       poaccountx       = lt_poaccountx
        poschedule       = lt_schedule
        poschedulex      = lt_schedulex
        pocond           = lt_pocond
        pocondx          = lt_pocondx
        extensionin      = lt_extensionin.

    CLEAR lv_message.
    LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A' .
      CALL FUNCTION 'ZFM_YH_SE91'
        EXPORTING
          is_message_bapi = ls_return
        IMPORTING
          message         = lv_message.
      IF lv_message2 IS NOT INITIAL.
        lv_message2 = lv_message && '/' && lv_message2.
      ELSE.
        lv_message2 = lv_message.
      ENDIF.
    ENDLOOP.

    IF sy-subrc <> 0 ."LOOP执行失败sy-subrc <> 0
      LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_excel>) WHERE sel = 'X'.
        <fs_excel>-icon = c_green.
        <fs_excel>-message = '调拨单' && lv_ebeln && '创建成功!'.
*    <fs_excel>-ebeln = lv_ebeln.
      ENDLOOP.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "提交
        EXPORTING
          wait = 'X'.
    ELSE.
      LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_excel2>) WHERE sel = 'X'.
        <fs_excel2>-icon = c_red.
        <fs_excel2>-message = lv_message2.
*    <fs_excel>-ebeln = lv_ebeln.
      ENDLOOP.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'."回滚
    ENDIF.

  ENDIF.

  PERFORM refresh_table_alv.

ENDFORM.
FORM user_data_changed USING p_data TYPE REF TO cl_alv_changed_data_protocol.
  DATA: ls_good TYPE lvc_s_modi."抓修改的单元格
*  DATA: l_sel(01),"同步的字段
*        l_aufnr TYPE aufnr."同步的关联字段
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid1.

  LOOP AT p_data->mt_good_cells INTO ls_good.
*    CLEAR: l_sel, l_aufnr.
*    CASE ls_good-fieldname.
*      WHEN 'SEL'.
*        CALL METHOD p_data->get_cell_value
*          EXPORTING
*            i_row_id    = ls_good-row_id
**           I_TABIX     =
*            i_fieldname = 'SEL'
*          IMPORTING
*            e_value     = l_sel.
*        CALL METHOD p_data->get_cell_value
*          EXPORTING
*            i_row_id    = ls_good-row_id
**           I_TABIX     =
*            i_fieldname = 'AUFNR'
*          IMPORTING
*            e_value     = l_aufnr.
*        LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<wa>) WHERE aufnr = l_aufnr .
*          <wa>-sel = l_sel.
*        ENDLOOP.
*    ENDCASE.
  ENDLOOP.
*手工输入时更新仓库名
  IF ls_good-fieldname NE 'SEL'.
    IF ls_good-fieldname = 'ZDBKC'.
      READ TABLE gt_out INTO gs_out INDEX ls_good-row_id.
      IF sy-subrc = 0.
        gs_out-lgort = ls_good-value.
        SELECT SINGLE lgobe
          INTO gs_out-zdbkc2
          FROM t001l
         WHERE werks = gs_out-werks
          AND  lgort = gs_out-zdbkc.
        MODIFY gt_out FROM gs_out INDEX ls_good-row_id."必须指定位置

        CLEAR: gs_out.

      ENDIF.
      PERFORM refresh_table_alv."内刷屏,不重置位置
*  ELSEIF ls_good-fieldname = 'LIFNR'.
*    READ TABLE gt_out INTO gs_out INDEX ls_good-row_id.
*    IF sy-subrc = 0.
*      gs_out-LIFNR = ls_good-value.
*      SELECT SINGLE name1
*        INTO gs_out-name1
*        FROM lfa1
*       WHERE LIFNR = gs_out-LIFNR
*        AND  SPRAS = '1'.
*
*    SHIFT gs_out-LIFNR LEFT DELETING LEADING '0'.
*    MODIFY gt_out FROM gs_out INDEX ls_good-row_id."必须指定位置
*    CLEAR: gs_out.
*    ENDIF.

      PERFORM refresh_table_alv."内刷屏,不重置位置
    ENDIF.

  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FM_BUTTON
*&---------------------------------------------------------------------*
*       设置enter事件
*----------------------------------------------------------------------*
*      -->E_GRID     text
*----------------------------------------------------------------------*
FORM fm_button USING e_grid TYPE slis_data_caller_exit.
  DATA: lv_event_receiver TYPE REF TO lcl_event_receiver,
        lt_f4             TYPE lvc_t_f4,
        ls_f4             TYPE lvc_s_f4.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid1.

  ls_f4-fieldname  = 'ZDBKC'.   "窗口时间参数(需要定义F4帮助按钮的字段)
  ls_f4-register   = 'X'.
  ls_f4-getbefore  = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.

*  ls_f4-fieldname  = 'LIFNR'.   "窗口时间参数(需要定义F4帮助按钮的字段)
*  ls_f4-register   = 'X'.
*  ls_f4-getbefore  = 'X'.
*  ls_f4-chngeafter = 'X'.
*  INSERT ls_f4 INTO TABLE lt_f4.

  CREATE OBJECT lv_event_receiver.
  SET HANDLER lv_event_receiver->handle_f4 FOR g_grid1.

  CALL METHOD g_grid1->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4[].

ENDFORM.                    "FM_BUTTON

" REFRESH_TABLE_ALV
*&---------------------------------------------------------------------*
*&      Form  F4_HELP_LGORT
*&---------------------------------------------------------------------*
*       窗口时间参数的自定义f4检索帮助
*----------------------------------------------------------------------*
FORM f4_help_lgort USING p_fieldname  TYPE lvc_fname
                         p_row_no     TYPE lvc_s_roid.
  DATA: BEGIN OF gs_lgort,
          werks LIKE   aufk-werks,   "工厂
          lgort LIKE   resb-lgort,   "仓库代码
          lgobe LIKE   t001l-lgobe,
        END OF gs_lgort.
  DATA: gt_lgort  LIKE TABLE OF gs_lgort.


  DATA: lt_return   TYPE STANDARD TABLE OF ddshretval.
  DATA: ls_return   TYPE ddshretval.

  CLEAR gs_out.
  READ TABLE gt_out INTO gs_out INDEX p_row_no-row_id.

  IF p_fieldname = 'ZDBKC'.

    SELECT werks lgort lgobe
      INTO TABLE gt_lgort
      FROM t001l
     WHERE werks = gs_out-werks.

    SORT gt_lgort BY werks lgort.
    DELETE ADJACENT DUPLICATES FROM gt_lgort
                          COMPARING werks lgort.

  ENDIF.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield         = 'LGORT'            "lt内表里面的字段
      dynpprog         = sy-repid
      dynpnr           = sy-dynnr
      dynprofield      = 'ZDBKC'            "画面上绑定字段
      value_org        = 'S'
      callback_program = sy-repid
    TABLES
      value_tab        = gt_lgort        "需要显示帮助的值内表
      return_tab       = lt_return          "返回值
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.


  IF sy-subrc = 0.
    READ TABLE lt_return INTO ls_return INDEX 1.
    gs_out-zdbkc = ls_return-fieldval.
    READ TABLE gt_lgort INTO gs_lgort WITH KEY lgort = ls_return-fieldval.
    gs_out-zdbkc2 = gs_lgort-lgobe.
    MODIFY gt_out FROM gs_out INDEX p_row_no-row_id
                       TRANSPORTING zdbkc zdbkc2.
    CLEAR: gs_out.

  ENDIF.

ENDFORM.                    " F4_HELP_LGORT

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值