ZFI144新增发出商品计提收入报表

*&---------------------------------------------------------------------*
*&程序名称                    :ZFI144
*&程序描述                    : 发出商品计提收入报表   (批量操作 F.02 / 查询 FB03)
*&申请单位                    :
*&申请人                      :
*&申请日期                    :2024年08月09日
*&作者                        :
*&---------------------------------------------------------------------*
REPORT zfi144.

TABLES: faglflext,sscrfields, acdoca.
CONSTANTS: gc_icon_green TYPE icon-id VALUE '@08@',
           gc_icon_red   TYPE icon-id VALUE '@0A@'.
CONSTANTS: gc_saknr2221010600 TYPE saknr VALUE '5001040101',
*           gc_saknr2221010500 TYPE saknr VALUE '2221010500',
*           gc_saknr2221020100 TYPE saknr VALUE '2221020100',
           gc_saknr2221000000 TYPE saknr VALUE '8021000000'.
*&---------------------------------------------------------------------*
*&  数据类型
*&---------------------------------------------------------------------*
TYPES: BEGIN OF s_head,
         bukrs TYPE bkpf-bukrs,
         belnr TYPE bkpf-belnr,
         gjahr TYPE bkpf-gjahr,
         blart TYPE bkpf-blart,
         bldat TYPE bkpf-bldat,
         budat TYPE bkpf-budat,
         monat TYPE bkpf-monat,
         waers TYPE bkpf-waers,
       END OF s_head.
TYPES: t_head TYPE TABLE OF s_head.

TYPES: BEGIN OF s_item,
         sel     TYPE char1,
         belnr   TYPE acdoca-belnr,           "分录
         docln   TYPE numc06,                 "凭证行
         saknr   TYPE ska1-saknr,
         txt50   TYPE skat-txt50,
         bschl   TYPE acdoca-bschl,
         hsl     TYPE acdoca-hsl,
         rhcur   TYPE acdoca-rhcur,
         drcrk   TYPE acdoca-drcrk,
         bukrs   TYPE acdoca-rbukrs,
         gjahr   TYPE acdoca-gjahr,
         monat   TYPE bkpf-monat,
         blart   TYPE bkpf-blart,
         sgtxt   TYPE bseg-sgtxt,              "文本
         fkber   TYPE bseg-fkber,              "功能范围
         kostl   TYPE bseg-kostl,              "成本中心
         gsber   TYPE bseg-gsber,              "业务范围
         prctr   TYPE bseg-prctr,              "利润中心
         werks   TYPE bseg-werks,              "工厂
         matnr   TYPE lips-matnr,
         kunag   TYPE likp-kunag, "售达方
         vbeln   TYPE lips-vbeln, "销售出库单号-----链接
         posnr   TYPE lips-posnr, "销售出库单行号
         lgmngs  TYPE lips-lgmng, "未开票数量
         kmein   TYPE lips-kmein,
         zuonr   TYPE bseg-zuonr,
         mwskz   TYPE ekpo-mwskz,  "税码
*         zterm   TYPE zterm,      "付款条件
         koart   TYPE koart,
         type    TYPE bapiret2-type,
         message TYPE bapiret2-message,
         icon    TYPE icon-id,
       END OF s_item.
TYPES: t_item TYPE TABLE OF s_item.

"参考ZFI021_NA
TYPES : BEGIN OF ty_alv,

          kdmat     TYPE lips-kdmat, "客户料号
          matnr     TYPE lips-matnr, "领胜集团内部料号
          arktx     TYPE lips-arktx, "物料描述
          vgbel     TYPE lips-vgbel, "我司订单号 "参考凭证
          vbeln     TYPE lips-vbeln, "销售出库单号-----链接
          posnr     TYPE lips-posnr, "销售出库单行号
          lgort     TYPE lips-lgort, "仓库
*        GEWEI     TYPE LIPS-GEWEI, "单位
          wadat_ist TYPE likp-wadat_ist, "销售出库(退货)日期
          zbgno     TYPE likp-zbgno, "国内报关发票号
          werks     TYPE lips-werks, "工厂
          kunnr     TYPE likp-kunnr, "送达方
          kunag     TYPE likp-kunag, "售达方
          vgpos     TYPE lips-vgpos, "参考项目
*        LGMNG     TYPE LIPS-LGMNG, "数量(库存单位)
          wbstk     TYPE likp-wbstk, "出发货状态
          pstyv     TYPE lips-pstyv, "交易类型
          erdat1    TYPE lips-erdat, "日期
          erdat2    TYPE likp-erdat, "日期
          lfimg_s   TYPE lips-lfimg, "参考数量
          uecha     TYPE lips-uecha, "上层项目批
          charg     TYPE lips-charg,  "批次
          meins     TYPE lips-meins,  "基本单位
          vrkme     TYPE lips-vrkme,  "销售单位
          umvkz     TYPE lips-umvkz,  "分子
          umvkn     TYPE lips-umvkn,  "分母
          shkzg     TYPE mseg-shkzg,  "正反方向
          gsber     TYPE lips-gsber,
          bklas     TYPE mbew-bklas,
          bukrs     TYPE bukrs,
          gtext     TYPE ztsd001-gtext,

*        AUART TYPE  VBAK-AUART,"交易类型值
          bezei     TYPE tvakt-bezei, "交易类型值
*        AUART     TYPE VBAK-AUART, "交易类型值
          audat     TYPE vbak-audat, "销售订单日期
          waerk     TYPE vbak-waerk, "币别
          bukrs_vf  TYPE tvko-bukrs, "法人公司编码
          name1     TYPE lfa1-name1, "对应客服
          name2     TYPE lfa1-name1, "对应销售
          bstkd     TYPE vbkd-bstkd, "客户订单号
          name_org1 TYPE but000-name_org1, "客户名称
          bu_name   TYPE t001w-name1, "BU
          netprs    TYPE p DECIMALS 5, "销售未税单价
          mwsbps    TYPE vbap-mwsbp, "税率
          cmpre     TYPE p DECIMALS 5, "销售含税单价
          lfimg     TYPE lips-lfimg, "出货数量
          kzwi3     TYPE vbrp-fkimg, "已开票数量
          stprs     TYPE ddddlcurrtypes-curr17_8, "P DECIMALS 8, "成本单价
          mwsbpss   TYPE p DECIMALS 5, "出货含税金额
          mwsbpsss  TYPE p DECIMALS 5, "出货未税金额
          mwsbp_a   TYPE p DECIMALS 5, "发出商品金额(实际)
          mwsbp_as  TYPE p DECIMALS 5, "发出商品金额(标准)
          lgobe     TYPE t001l-lgobe, "若为VMI,标识code号
          lgmngs    TYPE lips-lgmng, "未开票数量
          mwsbp_1   TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额1
          mwsbp_2   TYPE ddddlcurrtypes-curr17_5,  "P DECIMALS 5, "发出商品金额2
          mwsbp_3   TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额3
          mwsbps_a  TYPE vbap-mwsbp, "发出商品毛利率
          name1_a   TYPE t001-butxt, "法人公司名称
          erdat     TYPE vbrp-erdat, "发出商品报表查询截止时日

          gjahr     TYPE gjahr,
          monat     TYPE bseg-h_monat,
          kmein     TYPE lips-kmein,

          hkont     TYPE t030-konts,
          txt50     TYPE skat-txt50,

          zbg       TYPE ztmm010-zbgmc,     " BG
          zbg_xg    TYPE ztmm010-zbgmc,     " 信管专用BG
          zdcbu     TYPE char40,            " 生产地BU
          zjxqj     TYPE ztmm010-zjxqj,     " 仙剑区间

          gewei     TYPE lips-gewei, "单位
          ntgew     TYPE mara-ntgew,
          inum      TYPE i, "序号
          sel       TYPE c,           "选择
        END OF ty_alv.

TYPES : BEGIN OF ty_output,


          bukrs     TYPE bukrs,
*          gtext     TYPE ztsd001-gtext,
          gjahr     TYPE gjahr,
          monat     TYPE bseg-h_monat,
          vbeln     TYPE lips-vbeln, "销售出库单号-----链接
          posnr     TYPE lips-posnr, "销售出库单行号
          pstyv     TYPE lips-pstyv, "交易类型
          werks     TYPE lips-werks, "工厂
          bukrs_vf  TYPE tvko-bukrs, "法人公司编码
          name1_a   TYPE t001-butxt, "法人公司名称
*          kdmat     TYPE lips-kdmat, "客户料号
          matnr     TYPE lips-matnr, "领胜集团内部料号
          arktx     TYPE lips-arktx, "物料描述
          audat     TYPE vbak-audat, "销售订单日期
          waerk     TYPE vbak-waerk, "币别
          vgbel     TYPE lips-vgbel, "我司订单号 "参考凭证
*          vgpos     TYPE lips-vgpos, "参考项目
*          lgort     TYPE lips-lgort, "仓库
**        GEWEI     TYPE LIPS-GEWEI, "单位
          bstkd     TYPE vbkd-bstkd, "客户订单号
          wadat_ist TYPE likp-wadat_ist, "销售出库(退货)日期
          netprs    TYPE p DECIMALS 5, "销售未税单价
          mwsbps    TYPE vbap-mwsbp, "税率
          cmpre     TYPE p DECIMALS 5, "销售含税单价
          mwsbps_a  TYPE vbap-mwsbp, "发出商品毛利率
          mwsbp_1   TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额1
          mwsbp_2   TYPE ddddlcurrtypes-curr17_5,  "P DECIMALS 5, "发出商品金额2
          mwsbp_3   TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额3
*          lfimg     TYPE lips-lfimg, "出货数量
*          zbgno     TYPE likp-zbgno, "国内报关发票号
*          kunnr     TYPE likp-kunnr, "送达方
          kunag     TYPE likp-kunag, "售达方
**        LGMNG     TYPE LIPS-LGMNG, "数量(库存单位)
*          wbstk     TYPE likp-wbstk, "出发货状态
*          erdat1    TYPE lips-erdat, "日期
*          erdat2    TYPE likp-erdat, "日期
*          lfimg_s   TYPE lips-lfimg, "参考数量
*          uecha     TYPE lips-uecha, "上层项目批
*          charg     TYPE lips-charg,  "批次
*          meins     TYPE lips-meins,  "基本单位
*          vrkme     TYPE lips-vrkme,  "销售单位
*          umvkz     TYPE lips-umvkz,  "分子
*          umvkn     TYPE lips-umvkn,  "分母
*          shkzg     TYPE mseg-shkzg,  "正反方向
          gsber     TYPE lips-gsber,
*          bklas     TYPE mbew-bklas,
*
**        AUART TYPE  VBAK-AUART,"交易类型值
*          bezei     TYPE tvakt-bezei, "交易类型值
**        AUART     TYPE VBAK-AUART, "交易类型值
*          name1     TYPE lfa1-name1, "对应客服
*          name2     TYPE lfa1-name1, "对应销售
          name_org1 TYPE but000-name_org1, "客户名称
*          bu_name   TYPE t001w-name1, "BU
*          kzwi3     TYPE vbrp-fkimg, "已开票数量
*          stprs     TYPE ddddlcurrtypes-curr17_8, "P DECIMALS 8, "成本单价
*          mwsbpss   TYPE p DECIMALS 5, "出货含税金额
*          mwsbpsss  TYPE p DECIMALS 5, "出货未税金额
*          mwsbp_a   TYPE p DECIMALS 5, "发出商品金额(实际)
*          mwsbp_as  TYPE p DECIMALS 5, "发出商品金额(标准)
*          lgobe     TYPE t001l-lgobe, "若为VMI,标识code号
          lgmngs    TYPE lips-lgmng, "未开票数量
          kmein     TYPE lips-kmein,

*          erdat     TYPE vbrp-erdat, "发出商品报表查询截止时日
*
          hsly1     TYPE zsf_zfi040a-hsly1,          "本年累计借方(本币)
          hsly2     TYPE zsf_zfi040a-hsly2,          "本年累计贷方(本币)
          hkont     TYPE t030-konts,
*          txt50     TYPE skat-txt50,
*
*          zbg       TYPE ztmm010-zbgmc,     " BG
*          zbg_xg    TYPE ztmm010-zbgmc,     " 信管专用BG
*          zdcbu     TYPE char40,            " 生产地BU
*          zjxqj     TYPE ztmm010-zjxqj,     " 仙剑区间
*
*          gewei     TYPE lips-gewei, "单位
*          ntgew     TYPE mara-ntgew,
*          inum      TYPE i, "序号
*          sel       TYPE c,           "选择
        END OF ty_output,

        BEGIN OF ty_dncoll,
          vbeln TYPE lips-vbeln,
          hsly1 TYPE zsf_zfi040a-hsly1,
          hsly2 TYPE zsf_zfi040a-hsly2,
        END OF ty_dncoll,

        BEGIN OF ty_zrate,
          waerk TYPE vbak-waerk, "币别
          zrate TYPE ukursp,
        END OF ty_zrate  .

*&---------------------------------------------------------------------*
*&  结构
*&---------------------------------------------------------------------*
DATA: BEGIN OF gs_hide_code,
        code TYPE sy-ucomm,
      END OF gs_hide_code.
*&---------------------------------------------------------------------*
*&  内表
*&---------------------------------------------------------------------*

DATA: gt_alv TYPE TABLE OF ty_alv, "参考ZFI058
      gs_alv TYPE ty_alv,
      gt_dn  TYPE TABLE OF ty_dncoll,
      gs_dn  TYPE ty_dncoll.

DATA: gt_head      TYPE t_head,
      gt_item      TYPE t_item,
      gs_zdate     TYPE zsdate_time,
      gt_ztfi144   TYPE TABLE OF ztfi144,
      gs_ztfi144   TYPE ztfi144,
      gt_hide_code LIKE TABLE OF gs_hide_code.
*&---------------------------------------------------------------------*
*&  对象
*&---------------------------------------------------------------------*
CLASS lcl_alv_event_0100 DEFINITION DEFERRED.
DATA: go_dock_100      TYPE REF TO cl_gui_docking_container,
      go_dock_200      TYPE REF TO cl_gui_docking_container,
      go_grid_100      TYPE REF TO cl_gui_alv_grid,
      go_grid_200      TYPE REF TO cl_gui_alv_grid,
      go_alv_event_100 TYPE REF TO lcl_alv_event_0100.   "类接收器
*&---------------------------------------------------------------------*
*&  变量
*&---------------------------------------------------------------------*
DATA: ok_code      TYPE sy-ucomm,
      gv_code      TYPE sy-ucomm,
      gv_title     TYPE repti,
      gv_lines     TYPE i,
      gv_saknr     TYPE ska1-saknr,
      gv_bukrs     TYPE bkpf-bukrs,
      gv_post      TYPE char1,
      gv_last_date TYPE sy-datum.
*
DATA:gt_output0 TYPE TABLE OF ty_output."zsf_zfi040a.
DATA:gt_output TYPE TABLE OF ty_output."zsf_zfi040a.
DATA:gs_output TYPE ty_output."zsf_zfi040a.
DATA:itab TYPE TABLE OF zsfi009.

TYPES: BEGIN OF ty_data,
         sel       TYPE char1,
         belnr1    TYPE acdoca-belnr,               "分录
         ryear     TYPE zsf_zfi040a-ryear,
         rpmax     TYPE zsf_zfi040a-rpmax,
         bukrs     TYPE acdoca-rbukrs,
         butxt     TYPE t001-butxt,
         racct     TYPE zsf_zfi040a-racct,          "库存科目
         txt50     TYPE zsf_zfi040a-txt50,

         werks     TYPE werks_d,
         bukrs_vf  TYPE tvko-bukrs, "法人公司编码
         name1_a   TYPE t001-butxt, "法人公司名称
         matnr     TYPE matnr,
         arktx     TYPE lips-arktx, "物料描述
         waerk     TYPE vbak-waerk, "币别
         bstkd     TYPE vbkd-bstkd, "客户订单号
         wadat_ist TYPE likp-wadat_ist, "销售出库(退货)日期
         kunag     TYPE likp-kunag, "售达方
         name_org1 TYPE but000-name_org1, "客户名称
         vbeln     TYPE lips-vbeln, "销售出库单号-----链接
         posnr     TYPE lips-posnr, "销售出库单行号
         netprs    TYPE p DECIMALS 5, "销售未税单价
         mwsbps    TYPE vbap-mwsbp, "税率
         cmpre     TYPE p DECIMALS 5, "销售含税单价
         mwsbps_a  TYPE vbap-mwsbp, "发出商品毛利率
         mwsbp_1   TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额1
         mwsbp_2   TYPE ddddlcurrtypes-curr17_5,  "P DECIMALS 5, "发出商品金额2
         mwsbp_3   TYPE ddddlcurrtypes-curr17_5, "P DECIMALS 5, "发出商品金额3
         lgmngs    TYPE lips-lgmng, "未开票数量
         kmein     TYPE lips-kmein,


         rcntr     TYPE zsf_zfi040a-rcntr,          "成本中心
         ktext     TYPE zsf_zfi040a-ktext,
         rbusa     TYPE zsf_zfi040a-rbusa,          "业务范围
         gtext     TYPE zsf_zfi040a-gtext,

         rfarea    TYPE zsf_zfi040a-rfarea,         "功能范围
         fkbtx     TYPE zsf_zfi040a-fkbtx,
         prctr     TYPE zsf_zfi040a-prctr,          "利润中心
         rtcur     TYPE zsf_zfi040a-rtcur,
         hsly1     TYPE zsf_zfi040a-hsly1,          "收入
         hsly2     TYPE zsf_zfi040a-hsly2,          "应收(汇总)
         hsly3     TYPE zsf_zfi040a-hsly2,          "税额(汇总)
         hslz1     TYPE zsf_zfi040a-hslz1,          "成本,库存

         zrate     TYPE ukursp,
         belnr     TYPE acdoca-belnr,               "会计凭证
         saknr1    TYPE ska1-saknr,                 "应收科目
         saknr2    TYPE ska1-saknr,                 "收入科目
         saknr3    TYPE ska1-saknr,                 "税金科目
         saknr     TYPE ska1-saknr,                 "成本科目
         txt50s    TYPE skat-txt50,
         type      TYPE bapiret2-type,
         message   TYPE bapiret2-message,
         icon      TYPE icon-id,
         flag      TYPE char1,
         edit      TYPE lvc_t_styl,
       END OF ty_data.
DATA: lt_data  TYPE TABLE OF ty_data,
      ls_data  TYPE ty_data,
      ls_data1 TYPE ty_data,
      lv_waers TYPE bkpf-waers,
      lt_vf01  TYPE TABLE OF ty_data,
      gt_zrate TYPE TABLE OF ty_zrate,
      gs_zrate TYPE ty_zrate,
      gr_saknr TYPE RANGE OF ska1-saknr, "Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑
      num      TYPE i.

*&---------------------------------------------------------------------*
*&  选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-t01.

SELECT-OPTIONS: s_bukrs FOR acdoca-rbukrs  NO-EXTENSION NO INTERVALS,
                s_gjahr FOR acdoca-gjahr   NO-EXTENSION NO INTERVALS
                        DEFAULT sy-datum(4),
                s_poper FOR acdoca-poper NO-EXTENSION NO INTERVALS
                        DEFAULT sy-datum+4(2).
SELECT-OPTIONS:                                                       "S_POPER  FOR VBRK-POPER OBLIGATORY,
                s_racct FOR faglflext-racct NO-DISPLAY.       " 5 与 8 开头的 总帐科目
SELECTION-SCREEN END OF BLOCK bl01.

SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.

DATA: restrict TYPE sscr_restrict,
      optlist  TYPE sscr_opt_list,
      ass      TYPE sscr_ass.

INITIALIZATION.
  optlist-name = 'OBJECTKEY1'.
  optlist-options-eq = 'X'.
  optlist-options-bt = ''.
  APPEND optlist TO restrict-opt_list_tab.
  ass-kind = 'S'.
  ass-name = 'S_GJAHR'.
  ass-sg_main = 'I'.
  ass-sg_addy = space.
  ass-op_main = 'OBJECTKEY1'.
  APPEND ass TO restrict-ass_tab.

  CLEAR optlist.
  CLEAR ass.
  optlist-name = 'OBJECTKEY2'.
  optlist-options-cp = 'X'.
  optlist-options-ge = 'X'.
  optlist-options-lt = 'X'.
  optlist-options-ne = 'X'.
  optlist-options-eq = 'X'.
  optlist-options-bt = 'X'.
  APPEND optlist TO restrict-opt_list_tab.
  ass-kind = 'S'.
  ass-name = 'S_POPER'.
  ass-sg_main = 'I'.
  ass-sg_addy = space.
  ass-op_main = 'OBJECTKEY2'.
  APPEND ass TO restrict-ass_tab.

  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction            = restrict
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


*  PERFORM set_button_text.

AT SELECTION-SCREEN OUTPUT.
  PERFORM init_screen_1000.

AT SELECTION-SCREEN.
  PERFORM ucomm_screen_1000.

START-OF-SELECTION.
  PERFORM program_main.

*----------------------------------------------------------------------*
*       CLASS LCL_ALV_EVENT_0100 DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_0100 DEFINITION.
  PUBLIC SECTION.
    " Toolbar事件
    METHODS handle_toolbar
                  FOR EVENT toolbar OF cl_gui_alv_grid
      IMPORTING e_object e_interactive.
    " USER-COMMAND 事件
    METHODS handle_user_command
                  FOR EVENT user_command OF cl_gui_alv_grid
      IMPORTING e_ucomm.

    " 双击事件
    METHODS header_double_click FOR EVENT double_click OF cl_gui_alv_grid
      IMPORTING e_row e_column.

    "数据修改
    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 e_modified et_good_cells.

    METHODS handle_onf4_help FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data e_display.

ENDCLASS. "LCL_ALV_EVENT_0100 DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_ALV_EVENT_0100 IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_alv_event_0100 IMPLEMENTATION.
  " Toolbar事件
  METHOD handle_toolbar.
    PERFORM alv_toolbar CHANGING e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar

  " USER_COMMAND 事件
  METHOD handle_user_command.
    PERFORM alv_user_command USING e_ucomm.
  ENDMETHOD.                    "HANDLE_USER_COMMAND

  " 双击事件
  METHOD header_double_click.
    PERFORM frm_double_click USING e_row e_column.
  ENDMETHOD.

  METHOD handle_data_changed.
    PERFORM frm_changed_data USING er_data_changed.
  ENDMETHOD.

  METHOD handle_data_changed_finished.
    PERFORM frm_data_changed_finished USING et_good_cells.
  ENDMETHOD.

  METHOD handle_onf4_help.
    PERFORM frm_onf4_help USING  e_fieldname e_fieldvalue es_row_no er_event_data e_display.
    er_event_data->m_event_handled = abap_true.
  ENDMETHOD.
ENDCLASS. "LCL_ALV_EVENT_0100 IMPLEMENTATION

*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  gv_title = TEXT-t02.
  CLEAR gt_hide_code[].
  gs_hide_code-code = '&ZAFFIRM'.
  APPEND gs_hide_code TO gt_hide_code.
  gs_hide_code-code = '&ZCANCEL'.
  APPEND gs_hide_code TO gt_hide_code.
  SET PF-STATUS 'STATUS_BAR' EXCLUDING gt_hide_code.
  SET TITLEBAR 'TITLE_BAR' WITH gv_title gv_lines.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
  gv_title = TEXT-t04.

  CLEAR gt_hide_code[].
  IF gv_post IS INITIAL.
    gs_hide_code-code = '&ZAFFIRM'.
    APPEND gs_hide_code TO gt_hide_code.
  ENDIF.

  SET PF-STATUS 'STATUS_BAR' EXCLUDING gt_hide_code.
  SET TITLEBAR 'TITLE_BAR' WITH gv_title ''.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_SCREEN_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_screen_0100 OUTPUT.
  PERFORM init_alv_100.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_SCREEN_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_screen_0200 OUTPUT.
  PERFORM init_alv_200.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  gv_code = ok_code.
  CLEAR ok_code.
  CASE gv_code.
    WHEN '&BACK'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.

  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
  gv_code = ok_code.
  CLEAR ok_code.
  CASE gv_code.
    WHEN '&BACK'.
      LEAVE TO SCREEN 0.
    WHEN '&ZAFFIRM'.
      PERFORM call_bapi_import USING gv_post.
      LEAVE TO SCREEN 0.
    WHEN '&ZCANCEL'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.

  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Form  PROGRAM_MAIN
*&---------------------------------------------------------------------*
*       text  程序入口
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM program_main.
  DATA: lv_subrc TYPE sy-subrc.

  PERFORM check_screen_1000.

  PERFORM get_data_head CHANGING gt_head.

  PERFORM frm_getdata .            "获得数据

  IF lt_data[] IS INITIAL.
    MESSAGE TEXT-m01 TYPE 'S' DISPLAY LIKE 'E'.  " 无符合条件的数据!
    EXIT.
  ENDIF.

  PERFORM check_data CHANGING lv_subrc.

  DESCRIBE TABLE lt_data LINES gv_lines.     " 统计内表行数

  CALL SCREEN 100.

ENDFORM. " PROGRAM_MAIN
*&---------------------------------------------------------------------*
*&      Form  SET_BUTTON_TEXT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM set_button_text .
  DATA: ls_smp_dyntxt TYPE smp_dyntxt.

  ls_smp_dyntxt-icon_id = '@U3@'.
  ls_smp_dyntxt-icon_text = TEXT-t03.  " 科目维护
  ls_smp_dyntxt-quickinfo = TEXT-t03.  " 科目维护
  sscrfields-functxt_01   = ls_smp_dyntxt.

  CLEAR ls_smp_dyntxt.
  ls_smp_dyntxt-icon_id = icon_list.
  ls_smp_dyntxt-icon_text = TEXT-t06.  " 成本中心维护
  ls_smp_dyntxt-quickinfo = TEXT-t06.  " 成本中心维护
  sscrfields-functxt_02   = ls_smp_dyntxt.

ENDFORM. "SET_BUTTON_TEXT
*&---------------------------------------------------------------------*
*&      Form  INIT_SCREEN_1000
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_screen_1000 .

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  UCOMM_SCREEN_1000
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM ucomm_screen_1000 .
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM call_view_edit.
    WHEN 'FC02'.
      PERFORM call_view_edit2.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_VIEW_EDIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM call_view_edit .

  CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
    EXPORTING
      action                       = 'S'
      view_name                    = 'ZTFI104'
    EXCEPTIONS
      client_reference             = 1
      foreign_lock                 = 2
      invalid_action               = 3
      no_clientindependent_auth    = 4
      no_database_function         = 5
      no_editor_function           = 6
      no_show_auth                 = 7
      no_tvdir_entry               = 8
      no_upd_auth                  = 9
      only_show_allowed            = 10
      system_failure               = 11
      unknown_field_in_dba_sellist = 12
      view_not_found               = 13
      maintenance_prohibited       = 14
      OTHERS                       = 15.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_VIEW_EDIT2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM call_view_edit2 .

  CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
    EXPORTING
      action                       = 'S'
      view_name                    = 'ZTFI107'
    EXCEPTIONS
      client_reference             = 1
      foreign_lock                 = 2
      invalid_action               = 3
      no_clientindependent_auth    = 4
      no_database_function         = 5
      no_editor_function           = 6
      no_show_auth                 = 7
      no_tvdir_entry               = 8
      no_upd_auth                  = 9
      only_show_allowed            = 10
      system_failure               = 11
      unknown_field_in_dba_sellist = 12
      view_not_found               = 13
      maintenance_prohibited       = 14
      OTHERS                       = 15.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_SCREEN_1000
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM check_screen_1000 .
  DATA: lv_message TYPE bapiret2-message.
  DATA: str1 TYPE char6,
        str2 TYPE char6.

  IF s_bukrs[] IS INITIAL.
    " 请输入公司代码!
    MESSAGE TEXT-m03 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
  IF s_gjahr[] IS INITIAL.
    " 请输入年度!
    MESSAGE TEXT-m04 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
  IF s_poper[] IS INITIAL.
    " 请输入期间!
    MESSAGE TEXT-m05 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  str1 = s_gjahr-low && s_poper-low+1(2).
  str2 = sy-datum+(6).
  "检则输入的年月
*  IF STR1 <> STR2.
*     MESSAGE TEXT-M12 TYPE 'S' DISPLAY LIKE 'E'.
*     LEAVE LIST-PROCESSING.
*  ENDIF.

  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
   ID 'BUKRS' FIELD s_bukrs-low
   ID 'ACTVT' FIELD '03'.
  IF sy-subrc <> 0.
    lv_message = TEXT-m06. " 没有公司代码&1的权限!
    REPLACE '&1' IN lv_message WITH s_bukrs-low.
    MESSAGE s001(00) DISPLAY LIKE 'E' WITH lv_message.
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DATA_HEAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- ct_head
*&---------------------------------------------------------------------*
FORM get_data_head CHANGING ct_head TYPE t_head.
  DATA: ls_head TYPE s_head.

  DATA: lv_first_date TYPE sy-datum,
        lv_monat      TYPE bkpf-monat,
*        LV_WAERS      TYPE BKPF-WAERS,
        lv_index      TYPE sy-index.

  CLEAR: lv_waers, ct_head[].

  gv_bukrs = s_bukrs-low.

  lv_monat = s_poper-low.

  lv_first_date = s_gjahr-low && lv_monat && '01'.

  CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
    EXPORTING
      i_date = lv_first_date
    IMPORTING
      e_date = gv_last_date.

  SELECT SINGLE waers INTO lv_waers
    FROM t001
    WHERE bukrs = gv_bukrs
  %_HINTS HDB 'RESULT_LAG(''hana_sr'')'.

  DO 2 TIMES.
    lv_index = sy-index.
    ls_head-belnr = lv_index.
    ls_head-bukrs = gv_bukrs.
    ls_head-gjahr = gv_last_date(4).
    ls_head-bldat = gv_last_date.
    ls_head-budat = gv_last_date.
    ls_head-monat = gv_last_date+4(2).
    ls_head-blart = 'SS'.
    ls_head-waers = lv_waers.
    APPEND ls_head TO ct_head.
  ENDDO.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  init_alv_100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM init_alv_100.
  DATA: ls_layout  TYPE lvc_s_layo,
        ls_variant TYPE disvariant.

  DATA: lw_lvc_t_f4 TYPE lvc_t_f4,
        ls_lvc_t_f4 TYPE LINE OF lvc_t_f4.

  DATA: lt_fieldcatalog TYPE lvc_t_fcat,
        lt_exclude      TYPE ui_functions.

  IF go_dock_100 IS INITIAL.
    " 容器
    CREATE OBJECT go_dock_100
      EXPORTING
        repid                       = sy-repid  " 程序名
        dynnr                       = sy-dynnr  " 屏幕号
*       SIDE                        = DOCK_AT_LEFT
        extension                   = 1500      " ALV宽度
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    " ALV
    CREATE OBJECT go_grid_100
      EXPORTING
        i_parent          = go_dock_100
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 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.

    ls_variant-report = sy-repid.
    " ALV字段
    PERFORM set_fieldcatalog USING    '100'
                             CHANGING lt_fieldcatalog.
    " ALV布局
    PERFORM set_layout USING    '100' CHANGING ls_layout  .
    " 隐藏工具条按钮
    PERFORM set_toolbar_excluding CHANGING lt_exclude.

    " 显示ALV
    CALL METHOD go_grid_100->set_table_for_first_display
      EXPORTING
        i_bypassing_buffer            = 'X'
        is_variant                    = ls_variant
        i_save                        = 'A'
        i_default                     = 'X'
        is_layout                     = ls_layout
        it_toolbar_excluding          = lt_exclude
      CHANGING
        it_outtab                     = lt_data[]
        it_fieldcatalog               = lt_fieldcatalog[]
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.

    CLEAR: ls_lvc_t_f4,lw_lvc_t_f4[].
    ls_lvc_t_f4-fieldname  = 'SAKNR'.
    ls_lvc_t_f4-register   = 'X'.
    ls_lvc_t_f4-chngeafter = 'X'.
    INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
    CLEAR ls_lvc_t_f4.
    ls_lvc_t_f4-fieldname  = 'SAKNR1'.
    ls_lvc_t_f4-register   = 'X'.
    ls_lvc_t_f4-chngeafter = 'X'.
    INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
    CLEAR ls_lvc_t_f4.
    ls_lvc_t_f4-fieldname  = 'SAKNR2'.
    ls_lvc_t_f4-register   = 'X'.
    ls_lvc_t_f4-chngeafter = 'X'.
    INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
    CLEAR ls_lvc_t_f4.
    ls_lvc_t_f4-fieldname  = 'SAKNR3'.
    ls_lvc_t_f4-register   = 'X'.
    ls_lvc_t_f4-chngeafter = 'X'.
    INSERT ls_lvc_t_f4 INTO TABLE lw_lvc_t_f4.
    CALL METHOD go_grid_100->register_f4_for_fields EXPORTING it_f4 = lw_lvc_t_f4.
    CALL METHOD go_grid_100->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.
    CALL METHOD go_grid_100->set_ready_for_input EXPORTING i_ready_for_input = 1.
    CALL METHOD go_grid_100->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified.

    " ALV  "注册事件
    CREATE OBJECT go_alv_event_100.
    SET HANDLER go_alv_event_100->handle_toolbar       FOR go_grid_100.
    SET HANDLER go_alv_event_100->handle_user_command  FOR go_grid_100.
    SET HANDLER go_alv_event_100->header_double_click  FOR go_grid_100.
    SET HANDLER go_alv_event_100->handle_onf4_help     FOR go_grid_100.
    SET HANDLER go_alv_event_100->handle_data_changed  FOR go_grid_100.
    SET HANDLER go_alv_event_100->handle_data_changed_finished  FOR go_grid_100.
    CALL METHOD go_grid_100->set_toolbar_interactive.

  ELSE.
    PERFORM refresh_alv USING go_grid_100.
  ENDIF.
ENDFORM. "init_alv_100
*&---------------------------------------------------------------------*
*&      Form  init_alv_200
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM init_alv_200.
  DATA: ls_layout  TYPE lvc_s_layo,
        ls_variant TYPE disvariant.

  DATA: lt_fieldcatalog TYPE lvc_t_fcat,
        lt_exclude      TYPE ui_functions.

  IF go_dock_200 IS INITIAL.
    " 容器
    CREATE OBJECT go_dock_200
      EXPORTING
        repid                       = sy-repid  " 程序名
        dynnr                       = sy-dynnr  " 屏幕号
        extension                   = 1500      " ALV宽度
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    " ALV
    CREATE OBJECT go_grid_200
      EXPORTING
        i_parent          = go_dock_200
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 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.

    " ALV字段
    PERFORM set_fieldcatalog USING    '200'
                             CHANGING lt_fieldcatalog.
    " ALV布局
    PERFORM set_layout USING    '200' CHANGING ls_layout .
    " 隐藏工具条按钮
    PERFORM set_toolbar_excluding CHANGING lt_exclude.

    " 显示ALV
    CALL METHOD go_grid_200->set_table_for_first_display
      EXPORTING
        i_bypassing_buffer            = 'X'
        is_layout                     = ls_layout
        it_toolbar_excluding          = lt_exclude
      CHANGING
        it_outtab                     = gt_item[]
        it_fieldcatalog               = lt_fieldcatalog[]
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.

  ELSE.
    PERFORM refresh_alv USING go_grid_200.
  ENDIF.
ENDFORM. "init_alv_200
*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->pv_screen    text
*      <--ct_fcat      text
*----------------------------------------------------------------------*
FORM set_fieldcatalog USING pv_screen  TYPE scradnum
                      CHANGING ct_fcat TYPE lvc_t_fcat.
  DEFINE lm_add_fcat.
    CLEAR ls_fcat.
    ls_fcat-fieldname       = &1.  " 字段名
    ls_fcat-coltext         = &2.  " 显示字段文本
    ls_fcat-scrtext_l       = &2.  " 显示字段文本
    ls_fcat-scrtext_m       = &2.  " 显示字段文本
*   ls_fcat-scrtext_s       = &2.  " 显示字段文本
    ls_fcat-col_pos         = &3.  " 列顺序
    ls_fcat-checkbox        = &4.  " 复选框
    ls_fcat-edit            = &5.  " 可修改
    ls_fcat-no_zero         = &6.  " 隐藏前导零
    ls_fcat-outputlen       = &7.  " 输出长度
    ls_fcat-ref_table       = &8.  " 参考表
    ls_fcat-ref_field       = &9.  " 参考字段
    IF &3 < 7.
      ls_fcat-fix_column = 'X'.    " 固定列
    ENDIF.
    IF ls_fcat-fieldname+0(5) EQ 'SAKNR'.
      ls_fcat-f4availabl = 'X'.
    ENDIF.
    APPEND ls_fcat TO ct_fcat.
  END-OF-DEFINITION.

  DATA: ls_fcat TYPE lvc_s_fcat.

  CLEAR: ct_fcat[].
  IF pv_screen = '100'.
    lm_add_fcat 'ICON'    TEXT-f17   '0'  ''  ''  ''  ''  ''  ''.    " 状态
    lm_add_fcat 'MESSAGE' TEXT-f18   '0'  ''  ''  ''  '90'  ''  ''.  " 提示信息
    lm_add_fcat 'BELNR1'  TEXT-f00   '1'  ''  ''  ''  ''  ''  ''.    " 分录
    lm_add_fcat 'RYEAR'   TEXT-f01   '1'  ''  ''  ''  ''  ''  ''.    " 年度
    lm_add_fcat 'RPMAX'   TEXT-f02   '2'  ''  ''  ''  ''  ''  ''.    " 期间
    lm_add_fcat 'BUKRS'   TEXT-f03   '3'  ''  ''  ''  ''  ''  ''.    " 公司编码
    lm_add_fcat 'BUTXT'   TEXT-f04   '4'  ''  ''  ''  ''  ''  ''.    " 公司名称

    lm_add_fcat 'WERKS'   TEXT-f28   '5'  ''  ''  ''  ''  ''  ''.    " 工厂
    lm_add_fcat 'BUKRS_VF' TEXT-f29   '6'  ''  ''  ''  ''  ''  ''.    " 法人公司编码
    lm_add_fcat 'NAME1_A'   TEXT-f30   '7'  ''  ''  ''  ''  ''  ''.    " 法人公司
    lm_add_fcat 'MATNR'   TEXT-f34   '8'  ''  ''  ''  ''  ''  ''.    " 料号
    lm_add_fcat 'ARKTX'   TEXT-f31   '9'  ''  ''  ''  ''  ''  ''.    " 料号描述

    lm_add_fcat 'RACCT'   TEXT-f05   '10'  ''  ''  ''  ''  ''  ''.    " 科目编号
    lm_add_fcat 'TXT50'   TEXT-f06   '11'  ''  ''  ''  ''  ''  ''.    " 科目名称
*    lm_add_fcat 'RCNTR'   TEXT-f07   '7'  ''  ''  ''  ''  ''  ''.    " 成本中心
*    lm_add_fcat 'KTEXT'   TEXT-f08   '8'  ''  ''  ''  ''  ''  ''.    " 成本中心名称
    lm_add_fcat 'RBUSA'   TEXT-f09   '12'  ''  ''  ''  ''  ''  ''.    " 业务范围

    lm_add_fcat 'GTEXT'   TEXT-f10   '13'  ''  ''  ''  ''  ''  ''.    " 业务范围名称


    lm_add_fcat 'BSTKD'  TEXT-f35   '14'  ''  ''  ''  ''  ''  ''.       " 客户订单号
    lm_add_fcat 'WADAT_IST'  TEXT-f36   '15'  ''  ''  ''  ''  ''  ''.    " 销售出库(退货)日期
    lm_add_fcat 'VBELN'  TEXT-f37   '16'  ''  ''  ''  ''  ''  ''.    " 销售出库单号
*    lm_add_fcat 'FKBTX'   TEXT-f12   '12'  ''  ''  ''  ''  ''  ''.    " 功能范围名称
*    lm_add_fcat 'PRCTR'   TEXT-f24   '12'  ''  ''  ''  ''  ''  ''.    " 利润中心
    lm_add_fcat 'LGMNGS'   TEXT-f45   '17'  ''  ''  ''  ''  ''  ''.    " 未开票数量
    lm_add_fcat 'KMEIN'   TEXT-f46   '18'  ''  ''  ''  ''  ''  ''.    " 单位
    lm_add_fcat 'RTCUR'   TEXT-f13   '19'  ''  ''  ''  ''  ''  ''.    " 币别
    lm_add_fcat 'NETPRS'   TEXT-f38   '20'  ''  ''  ''  ''  ''  ''.    " 销售未税单价
    lm_add_fcat 'MWSBPS'  TEXT-f39   '21'  ''  ''  ''  ''  ''  ''.    " 税率
    lm_add_fcat 'CMPRE'   TEXT-f40   '22'  ''  ''  ''  ''  ''  ''.    " 销售含税单价
    lm_add_fcat 'MWSBPS_A'   TEXT-f41   '23'  ''  ''  ''  ''  ''  ''.    " 发出商品毛利率
    lm_add_fcat 'MWSBP_1'  TEXT-f42   '24'  ''  ''  ''  ''  ''  ''.    " 发出商品金额1
    lm_add_fcat 'MWSBP_2'  TEXT-f43   '25'  ''  ''  ''  ''  ''  ''.    " 发出商品金额2
    lm_add_fcat 'MWSBP_3'  TEXT-f44   '26'  ''  ''  ''  ''  ''  ''.    " 发出商品金额3
    lm_add_fcat 'ZRATE'  TEXT-f52   '26'  ''  ''  ''  ''  ''  ''.    " 汇率
    lm_add_fcat 'HSLZ1'  TEXT-f14   '27'  ''  ''  ''  ''  ''  ''.    " 调整金额(成本库存)
    lm_add_fcat 'HSLY1'  TEXT-f26   '28'  ''  ''  ''  ''  ''  ''.    " 收入
    lm_add_fcat 'HSLY2'  TEXT-f27   '29'  ''  ''  ''  ''  ''  ''.    " 应收(汇总)
    lm_add_fcat 'HSLY3'  TEXT-f47   '30'  ''  ''  ''  ''  ''  ''.    " 税额(汇总)
    lm_add_fcat 'SAKNR1'   TEXT-f48   '31'  ''  'X'  ''  ''  ''  ''.    " 应收科目
    lm_add_fcat 'SAKNR2'   TEXT-f49   '32'  ''  'X'  ''  ''  ''  ''.    " 收入科目
    lm_add_fcat 'SAKNR3'   TEXT-f50   '33'  ''  'X'  ''  ''  ''  ''.    " 税金科目
    lm_add_fcat 'SAKNR'   TEXT-f15   '34'  ''  'X'  ''  ''  ''  ''.    " 成本科目
*    lm_add_fcat 'TXT50S'  TEXT-f16   '35'  ''  ''  ''  ''  ''  ''.    " 对方科目名称
    lm_add_fcat 'BELNR'   TEXT-f19   '36'  ''  ''  ''  '10'  ''  ''.  " 会计凭证

  ELSEIF pv_screen = '200'.
    lm_add_fcat 'BELNR'   TEXT-f00   '10'  ''  ''  ''  ''  ''  ''.    " 分录
    lm_add_fcat 'DOCLN'   TEXT-f21   '10'  ''  ''  ''  ''  ''  ''.    " 凭证行
    lm_add_fcat 'SAKNR'   TEXT-f05   '10'  ''  ''  ''  ''  ''  ''.    " 总账科目
*    lm_add_fcat 'TXT50'   TEXT-f06   '20'  ''  ''  ''  ''  ''  ''.    " 科目名称
    lm_add_fcat 'SGTXT'   TEXT-f25   '20'  ''  ''  ''  ''  ''  ''.    " 文本
*    lm_add_fcat 'FKBER'   TEXT-f11   '20'  ''  ''  ''  ''  ''  ''.    " 功能范围
*    lm_add_fcat 'KOSTL'   TEXT-f07   '20'  ''  ''  ''  ''  ''  ''.    " 成本中心
*    lm_add_fcat 'KTEXT'   TEXT-f08   '20'  ''  ''  ''  ''  ''  ''.    " 成本中心名称
    lm_add_fcat 'GSBER'   TEXT-f09   '20'  ''  ''  ''  ''  ''  ''.    " 业务范围
*    lm_add_fcat 'PRCTR'   TEXT-f24   '20'  ''  ''  ''  ''  ''  ''.    " 利润中心
    lm_add_fcat 'BSCHL'   TEXT-f32   '30'  ''  ''  ''  ''  ''  ''.    " 记账码
    lm_add_fcat 'HSL'     TEXT-f22   '40'  ''  ''  ''  ''  ''  ''.    " 金额
    lm_add_fcat 'RHCUR'   TEXT-f13   '50'  ''  ''  ''  ''  ''  ''.    " 货币码
    lm_add_fcat 'BUKRS'   TEXT-f03   '60'  ''  ''  ''  ''  ''  ''.    " 公司代码
    lm_add_fcat 'GJAHR'   TEXT-f01   '70'  ''  ''  ''  ''  ''  ''.    " 年度
    lm_add_fcat 'MONAT'   TEXT-f02   '80'  ''  ''  ''  ''  ''  ''.    " 期间
    lm_add_fcat 'BLART'   TEXT-f23   '80'  ''  ''  ''  ''  ''  ''.    " 凭证类型
    lm_add_fcat 'VBELN'  TEXT-f37   '80'  ''  ''  ''  ''  ''  ''.    " 销售出库单号
    lm_add_fcat 'MATNR'   TEXT-f34   '80'  ''  ''  ''  ''  ''  ''.    " 料号
    lm_add_fcat 'LGMNGS'   TEXT-f45   '80'  ''  ''  ''  ''  ''  ''.    " 未开票数量
    lm_add_fcat 'KMEIN'   TEXT-f46   '80'  ''  ''  ''  ''  ''  ''.    " 单位
    lm_add_fcat 'ZUONR'   TEXT-f51   '80'  ''  ''  ''  ''  ''  ''.    " 分配号
  ENDIF.

ENDFORM. "SET_FIELDCATALOG

*&---------------------------------------------------------------------*
*&      Form  SET_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->cs_layout  text
*----------------------------------------------------------------------*
FORM set_layout USING pv_screen  TYPE scradnum CHANGING cs_layout TYPE lvc_s_layo .
  CLEAR: cs_layout.
  cs_layout-cwidth_opt = 'X'.  " 自动调节字段长度
  cs_layout-zebra      = 'X'.  " 颜色交替显示
  cs_layout-sel_mode   = 'D'.  " A、B、C、D
  cs_layout-box_fname  = 'SEL'.     "设置列SEL是选择框
*  CS_LAYOUT-EDIT = 'X'.   "单元格可编辑
  IF pv_screen = '100'.
    cs_layout-stylefname = 'EDIT'.   "单元格可编辑
  ENDIF.
ENDFORM. "SET_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  SET_TOOLBAR_EXCLUDING
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->CT_FUNCTION  text
*----------------------------------------------------------------------*
FORM set_toolbar_excluding CHANGING ct_function TYPE ui_functions.
  DATA: ls_function TYPE ui_func.

  CLEAR: ct_function[].
  ls_function = cl_gui_alv_grid=>mc_fc_print.            " 打印
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_graph.            " 显示图形
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_mb_view.             " 视图
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_info.              " 最终用户文档
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_print_back.        " 打印
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_insert_row.    " 插入行
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_delete_row.    " 删除行
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_append_row.    " 附加行
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_copy_row.      " 复制行
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_copy.          " 复制
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_cut.           " 剪切
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_paste.         " 插入总览
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_paste_new_row. " 插入新行
  APPEND ls_function TO ct_function.
  ls_function = cl_gui_alv_grid=>mc_fc_loc_undo.          " 撤销
  APPEND ls_function TO ct_function.
*  ls_function = cl_gui_alv_grid=>mc_mb_export.           " 导出
*  APPEND ls_function TO ct_function.
*  ls_function = cl_gui_alv_grid=>mc_fc_maximum.          " 最大值
*  APPEND ls_function TO ct_function.
*  ls_function = cl_gui_alv_grid=>mc_fc_minimum.          " 最小值
*  APPEND ls_function TO ct_function.
*  ls_function = cl_gui_alv_grid=>mc_fc_sum.              " 总计
*  APPEND ls_function TO ct_function.
*  ls_function = cl_gui_alv_grid=>mc_fc_average.          " 平均值
*  APPEND ls_function TO ct_function.
*  ls_function = cl_gui_alv_grid=>mc_fc_refresh.          " 刷新
*  APPEND ls_function TO ct_function.
*  ls_function = cl_gui_alv_grid=>mc_fc_detail.            " 明细
*  APPEND ls_function TO ct_function.
ENDFORM. "SET_TOOLBAR_EXCLUDING

*&---------------------------------------------------------------------*
*&      Form  REFRESH_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PO_GRID    text
*----------------------------------------------------------------------*
FORM refresh_alv USING po_grid TYPE REF TO cl_gui_alv_grid.
  DATA: ls_scroll TYPE lvc_s_stbl.
  ls_scroll-row = 'X'.
  ls_scroll-col = 'X'.
  CALL METHOD po_grid->refresh_table_display
    EXPORTING
      is_stable      = ls_scroll
      i_soft_refresh = 'X'
    EXCEPTIONS
      finished       = 1
      OTHERS         = 2.

ENDFORM. "REFRESH_ALV
*&---------------------------------------------------------------------*
*& Form ALV_TOOLBAR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- ct_toolbar
*&---------------------------------------------------------------------*
FORM alv_toolbar CHANGING ct_toolbar TYPE ttb_button.
  DATA: ls_toolbar TYPE stb_button.

  ls_toolbar-butn_type = 3.
  APPEND ls_toolbar TO ct_toolbar.

  CLEAR: ls_toolbar.
  ls_toolbar-function  = '&ZPOST'.
  ls_toolbar-icon      = '@3H@'.
  ls_toolbar-quickinfo = TEXT-b01.      " 过账
  ls_toolbar-butn_type = 0.
  ls_toolbar-disabled  = ''.
  ls_toolbar-text      = TEXT-b01.      " 过账
  APPEND ls_toolbar TO ct_toolbar.

  CLEAR: ls_toolbar.
  ls_toolbar-butn_type = 3.
  APPEND ls_toolbar TO ct_toolbar.

  CLEAR: ls_toolbar.
  ls_toolbar-function  = '&ZCHECK'.
  ls_toolbar-icon      = '@8Z@'.
  ls_toolbar-quickinfo = TEXT-b02.     " 模拟
  ls_toolbar-butn_type = 0.
  ls_toolbar-disabled  = ''.
  ls_toolbar-text      = TEXT-b02.     " 模拟
  APPEND ls_toolbar TO ct_toolbar.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> pv_ucomm
*&---------------------------------------------------------------------*
FORM alv_user_command USING pv_ucomm TYPE sy-ucomm.
  CASE pv_ucomm.
    WHEN '&ZPOST'.
      PERFORM call_screen_200 USING '1'.
    WHEN '&ZCHECK'.
      PERFORM call_screen_200 USING '2'.
    WHEN '&IC1'.
      READ TABLE lt_data INTO ls_data INDEX 1. "PS_SELFIELD-TABINDEX.
      IF sy-subrc = 0 .
        SET PARAMETER ID 'ACC' FIELD ls_data-racct.
        SET PARAMETER ID 'BUK' FIELD ls_data-bukrs.
        SET PARAMETER ID 'GJR' FIELD ls_data-ryear.

        CALL TRANSACTION 'FAGLB03' AND SKIP FIRST SCREEN.
      ENDIF.
  ENDCASE.

  PERFORM refresh_alv USING go_grid_100.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form call_bapi_import
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  pv_post   text
*&---------------------------------------------------------------------*
FORM call_bapi_import USING pv_post TYPE char1.
  DATA: ls_documentheader    TYPE bapiache09,
        ls_accountgl         TYPE bapiacgl09,
        ls_accountreceivable TYPE bapiacar09,
        ls_currencyamount    TYPE bapiaccr09,
        ls_return            TYPE bapiret2,
        ls_extension1        TYPE bapiacextc,
        ls_extension2        TYPE bapiparex.

  DATA: ls_head    TYPE s_head,
        ls_item    TYPE s_item,
        ls_ztfi105 TYPE ztfi105.

  DATA: lt_accountgl         LIKE TABLE OF ls_accountgl,
        lt_accountreceivable LIKE TABLE OF ls_accountreceivable, "Customer Item
        lt_currencyamount    LIKE TABLE OF ls_currencyamount,
        lt_return            LIKE TABLE OF ls_return,
        lt_extension1        LIKE TABLE OF bapiacextc WITH HEADER LINE,
        lt_extension2        LIKE TABLE OF bapiparex WITH HEADER LINE. "Reference Structure for BAPI

  DATA: lt_ztfi105 LIKE TABLE OF ls_ztfi105.

  DATA: lv_obj_type TYPE bapiache09-obj_type,
        lv_obj_key  TYPE bapiache09-obj_key,
        lv_obj_sys  TYPE bapiache09-obj_sys.

  DATA: lv_hsl     TYPE acdoca-hsl,
        lv_subrc   TYPE sy-subrc,
        lv_tabix   TYPE sy-tabix,
        lv_buzei   TYPE bseg-buzei,
        lv_mark    TYPE c, "Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑
        lv_message TYPE bapiret2-message.

  CLEAR ls_data1.
  LOOP AT lt_data INTO ls_data1 WHERE sel = 'X'.
    READ TABLE gt_head INTO ls_head INDEX 1.

    CLEAR: lt_accountgl[], lt_currencyamount[], lt_accountreceivable[], lt_return[].
    CLEAR: ls_documentheader, lv_buzei.
    ls_documentheader-username   = sy-uname.       " 用户名
    ls_documentheader-comp_code  = ls_data1-bukrs.  " 公司代码

    ls_documentheader-doc_date   = ls_data1-wadat_ist.  " 凭证中的凭证日期ls_head-bldat
    ls_documentheader-pstng_date = ls_head-budat.  " 凭证中的过帐日期
    ls_documentheader-fisc_year  = ls_head-gjahr.  " 财年
    ls_documentheader-fis_period = ls_head-monat.  " 会计期间
    ls_documentheader-doc_type   = ls_head-blart.  " 凭证类型
    ls_documentheader-header_txt = ls_head-budat && |{ ls_data1-kunag ALPHA = OUT }|.   " 凭证抬头文本
    CLEAR: ls_data.
*  ENDLOOP.

    LOOP AT gt_item INTO ls_item WHERE belnr = ls_data1-belnr1.
      IF ls_item-koart EQ 'D'.
        CLEAR ls_accountreceivable.
        ls_accountreceivable-itemno_acc = ls_item-docln.
        ls_accountreceivable-gl_account = |{ ls_item-saknr ALPHA = IN }|.        "总帐帐目
*      lt_accountreceivable-customer  = gt_out-hkont.         "客户
        ls_accountreceivable-customer  = |{ ls_item-kunag ALPHA = IN }| ."GT_OUT-KUNNR.         "客户
*        ls_accountreceivable-sp_gl_ind  = gt_out-umskz.        "特别总帐标志
        ls_accountreceivable-item_text = ls_item-sgtxt.         "行项文本
*        lt_accountreceivable-bline_date  = gt_out-zfbdt.       "基准日期-到期日
*        ls_accountreceivable-pmnttrms  = ls_item-zterm.         "付款条件
*        CLEAR:l_ztag1.
*        SELECT SINGLE ztag1 INTO l_ztag1 "lt_accountreceivable-DSCT_DAYS1
*          FROM t052 WHERE zterm = ls_item-zterm.
*        ls_accountreceivable-dsct_days1 = l_ztag1.
        ls_accountreceivable-bus_area  = ls_item-gsber.         "业务范围
***** 如果特别总帐标志不为空,则清掉付款条件并加上到期日
*        IF gt_out-umskz <> ''.
*          CLEAR lt_accountreceivable-pmnttrms.
*          IF lt_accountreceivable-bline_date IS INITIAL.
*            lt_accountreceivable-bline_date = ls_documentheader-pstng_date .
*          ENDIF.
*        ENDIF.

*        ls_accountreceivable-pymt_meth  = gt_out-zlsch.         "付款方式
        ls_accountreceivable-alloc_nmbr = ls_item-zuonr.         "分配号
*        ls_accountreceivable-tax_code   = ls_item-mwskz.
        APPEND ls_accountreceivable TO lt_accountreceivable.

      ELSE.
        CLEAR ls_accountgl.
        ls_accountgl-itemno_acc = ls_item-docln.            "项目行号
        ls_accountgl-gl_account = ls_item-saknr.            "会计科目
        ls_accountgl-item_text  = ls_item-sgtxt.            "项目文本
        ls_accountgl-func_area  = ls_item-fkber.            "功能范围
        ls_accountgl-costcenter = ls_item-kostl.            "成本中心
        ls_accountgl-bus_area   = ls_item-gsber.            "业务范围
        ls_accountgl-profit_ctr = ls_item-prctr.            "利润中心
        ls_accountgl-ref_key_1  = ls_item-vbeln.
        ls_accountgl-ref_key_2  = ls_item-posnr.
        ls_accountgl-plant      = ls_item-werks.
        ls_accountgl-material   = ls_item-matnr.
        ls_accountgl-customer   = |{ ls_item-kunag ALPHA = OUT }|.
        ls_accountgl-alloc_nmbr = ls_item-zuonr.
        ls_accountgl-quantity   = ls_item-lgmngs.
        ls_accountgl-base_uom   = ls_item-kmein.

        APPEND ls_accountgl TO lt_accountgl.
      ENDIF.

      CLEAR ls_currencyamount.
      ls_currencyamount-itemno_acc = ls_item-docln.       " 会计凭证行项目编号
      ls_currencyamount-curr_type  = '00'.                " 货币和评估视图
      ls_currencyamount-currency   = ls_head-waers .      " Modify By IT065 At 20240325  LS_ITEM-RHCUR.       " 货币码
      IF ls_item-drcrk = 'S'.
        ls_currencyamount-amt_doccur = abs( ls_item-hsl ).           " 金额
      ELSEIF ls_item-drcrk = 'H'.
        ls_currencyamount-amt_doccur = abs( ls_item-hsl ) * ( -1 ).  " 金额
      ENDIF.
      APPEND ls_currencyamount TO lt_currencyamount.
    ENDLOOP.

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
      EXPORTING
        documentheader    = ls_documentheader
      TABLES
        accountgl         = lt_accountgl
        accountreceivable = lt_accountreceivable
        currencyamount    = lt_currencyamount
        return            = lt_return.

    LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
      lv_subrc = '1'.
      lv_message = lv_message && ls_return-message.
    ENDLOOP.
    IF lv_subrc <> 0.
      LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND belnr1 = ls_data1-belnr1.
        lv_tabix = sy-tabix.
        ls_data-type    = 'E'.
        ls_data-icon    = gc_icon_red.
        ls_data-message = lv_message.
        MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING type icon message.
        CLEAR ls_data.
      ENDLOOP.
      LOOP AT gt_item INTO ls_item WHERE belnr = ls_data1-belnr1.
        lv_tabix = sy-tabix.
        ls_item-type    = 'E'.
        ls_item-icon    = gc_icon_red.
        ls_item-message = lv_message.
        MODIFY gt_item FROM ls_item INDEX lv_tabix TRANSPORTING type icon message.
        CLEAR ls_item.
      ENDLOOP.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      EXIT.
    ENDIF.
  ENDLOOP.

  CHECK pv_post = 'X'.
  CHECK lv_subrc = 0.

  CLEAR ls_data1.
  LOOP AT lt_data INTO ls_data1 WHERE sel = 'X'.
    READ TABLE gt_head INTO ls_head INDEX 1.
    CLEAR: lt_accountgl[], lt_currencyamount[], lt_accountreceivable[], lt_return[],
    lt_ztfi105[], lv_obj_type, lv_obj_key, lv_obj_sys .
    CLEAR: ls_documentheader, lv_buzei.
    ls_documentheader-username   = sy-uname.       " 用户名
    ls_documentheader-comp_code  = ls_data1-bukrs.  " 公司代码
    ls_documentheader-doc_date   = ls_data1-wadat_ist.  " 凭证中的凭证日期
    ls_documentheader-pstng_date = ls_head-budat.  " 凭证中的过帐日期
    ls_documentheader-fisc_year  = ls_head-gjahr.  " 财年
    ls_documentheader-fis_period = ls_head-monat.  " 会计期间
    ls_documentheader-doc_type   = ls_head-blart.  " 凭证类型
    ls_documentheader-header_txt = ls_head-budat && |{ ls_data1-kunag ALPHA = OUT }|.             " 凭证抬头文本
    CLEAR ls_data.
*  ENDLOOP.

    DATA: wa_zexten LIKE zexten.
    LOOP AT gt_item INTO ls_item WHERE belnr = ls_data1-belnr1.
      IF ls_item-koart EQ 'D'.
        CLEAR ls_accountreceivable.
        ls_accountreceivable-itemno_acc = ls_item-docln.
        ls_accountreceivable-gl_account = |{ ls_item-saknr ALPHA = IN }|.        "总帐帐目
*      lt_accountreceivable-customer  = gt_out-hkont.         "客户
        ls_accountreceivable-customer  = |{ ls_item-kunag ALPHA = IN }| ."GT_OUT-KUNNR.         "客户
*        ls_accountreceivable-sp_gl_ind  = gt_out-umskz.        "特别总帐标志
        ls_accountreceivable-item_text = ls_item-sgtxt.         "行项文本
*        lt_accountreceivable-bline_date  = gt_out-zfbdt.       "基准日期-到期日
*        ls_accountreceivable-pmnttrms  = ls_item-zterm.         "付款条件
*        SELECT SINGLE ztag1 INTO @DATA(L_ZTAG1) "lt_accountreceivable-DSCT_DAYS1
*          FROM t052 WHERE zterm = ls_item-zterm.
*        ls_accountreceivable-dsct_days1 = l_ztag1.
        ls_accountreceivable-bus_area  = ls_item-gsber.         "业务范围
***** 如果特别总帐标志不为空,则清掉付款条件并加上到期日
*        IF gt_out-umskz <> ''.
*          CLEAR lt_accountreceivable-pmnttrms.
*          IF lt_accountreceivable-bline_date IS INITIAL.
*            lt_accountreceivable-bline_date = ls_documentheader-pstng_date .
*          ENDIF.
*        ENDIF.

*        ls_accountreceivable-pymt_meth  = gt_out-zlsch.         "付款方式
        ls_accountreceivable-alloc_nmbr = ls_item-zuonr.         "分配号
*        ls_accountreceivable-tax_code   = ls_item-mwskz.
        APPEND ls_accountreceivable TO lt_accountreceivable.

      ELSE.
        CLEAR:lv_mark, ls_accountgl.
        ls_accountgl-itemno_acc = ls_item-docln.            " 会计凭证行项目编号
        ls_accountgl-gl_account = ls_item-saknr.            " 会计科目
        ls_accountgl-item_text  = ls_item-sgtxt.            " 项目文本
        ls_accountgl-func_area  = ls_item-fkber.            " 功能范围
        ls_accountgl-costcenter = ls_item-kostl.            " 成本中心
        ls_accountgl-bus_area   = ls_item-gsber.            " 业务范围
        ls_accountgl-profit_ctr = ls_item-prctr.            " 利润中心
        ls_accountgl-ref_key_1  = ls_item-vbeln.
        ls_accountgl-ref_key_2  = ls_item-posnr.
        ls_accountgl-plant      = ls_item-werks.
        ls_accountgl-material   = ls_item-matnr.
        ls_accountgl-customer   = |{ ls_item-kunag ALPHA = OUT }|.
        ls_accountgl-alloc_nmbr = ls_item-zuonr.
        ls_accountgl-quantity   = ls_item-lgmngs.
        ls_accountgl-base_uom   = ls_item-kmein.

        APPEND ls_accountgl TO lt_accountgl.
      ENDIF.

      CLEAR ls_currencyamount.
      ls_currencyamount-itemno_acc = ls_item-docln.       " 会计凭证行项目编号
      ls_currencyamount-curr_type  = '00'.                " 货币和评估视图
      ls_currencyamount-currency   = ls_head-waers .      " Modify By IT065 At 20240325  LS_ITEM-RHCUR.       " 货币码
      IF ls_item-drcrk = 'S'.
        "Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑  start
        IF ls_item-saknr+0(1) EQ '8'.
          IF ls_item-hsl GT 0  .
            lv_mark = 'X'.
          ENDIF.
        ELSE.
          IF ls_item-hsl LT 0  .
            lv_mark = 'X'.
          ENDIF.
        ENDIF.
        "Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑  end
        ls_currencyamount-amt_doccur = abs( ls_item-hsl ).           " 金额
      ELSEIF ls_item-drcrk = 'H'.
        ls_currencyamount-amt_doccur = abs( ls_item-hsl ) * ( -1 ).  " 金额
      ENDIF.
      APPEND ls_currencyamount TO lt_currencyamount.

*    "标识: 反记帐
**    IF lv_mark = 'X'."Add By IT065 At 20240322 For 袁志琴 新增加海外业务逻辑
*    IF ls_item-drcrk = 'H'.
*      CLEAR: wa_zexten.
*      wa_zexten-posnr   = ls_item-docln.      "行号
*      wa_zexten-bschl   = ls_item-bschl.      "过账码
*      wa_zexten-xnegp   = 'X'.                "标识: 反记帐
*      ls_extension2-structure  = 'ZEXTEN'.
*      ls_extension2-valuepart1 = wa_zexten.
*      APPEND ls_extension2 TO lt_extension2.
*    ENDIF.

      CLEAR ls_item.
    ENDLOOP.

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        documentheader    = ls_documentheader
      IMPORTING
        obj_type          = lv_obj_type
        obj_key           = lv_obj_key
        obj_sys           = lv_obj_sys
      TABLES
        accountgl         = lt_accountgl
        accountreceivable = lt_accountreceivable
        currencyamount    = lt_currencyamount
        return            = lt_return
        extension1        = lt_extension1
        extension2        = lt_extension2.

    LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
      lv_subrc = '1'.
      lv_message = lv_message && ls_return-message.
      CLEAR ls_return.
    ENDLOOP.

    IF lv_subrc = 0.
      LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND belnr1 = ls_data1-belnr1.
        lv_tabix = sy-tabix.
        ls_data-belnr   = lv_obj_key(10).
        ls_data-ryear   = lv_obj_key+14(4).
        ls_data-type    = 'S'.
        ls_data-icon    = gc_icon_green.
        ls_data-message = TEXT-m02.         " 凭证&1记账到公司代码&2中!
        REPLACE '&1' IN ls_data-message WITH ls_data-belnr.
        REPLACE '&2' IN ls_data-message WITH ls_data-bukrs.
        MODIFY lt_data FROM ls_data
        INDEX lv_tabix TRANSPORTING belnr ryear type icon message.

        CLEAR ls_ztfi105.
        LOOP AT gt_item INTO ls_item WHERE belnr = ls_data-belnr1.
          ls_ztfi105-rbukrs = ls_data-bukrs.
          ls_ztfi105-gjahr  = ls_data-ryear.
          ls_ztfi105-belnr  = ls_data-belnr.
          ls_ztfi105-belnr1 = ls_data-belnr1.
          ls_ztfi105-docln  = ls_item-docln.
          ls_ztfi105-poper  = ls_head-monat.
          ls_ztfi105-racct  = ls_data-racct.               " 原始查询出的 会计科目
          ls_ztfi105-saknr  = ls_item-saknr.               " 凭证上会计科目
          ls_ztfi105-rhcur  = ls_data-rtcur.
          ls_ztfi105-drcrk  = ls_item-drcrk.
          ls_ztfi105-hsly1  = ls_data-hsly1.               "本年累计借方(本币)
          ls_ztfi105-hsly2  = ls_data-hsly2.               "本年累计货方(本币)
          IF ls_item-drcrk = 'S'.
            ls_ztfi105-hsl = abs( ls_item-hsl ).           " 金额  LS_ITEM-HSL_S.
          ELSEIF ls_item-drcrk = 'H'.
            ls_ztfi105-hsl = abs( ls_item-hsl ) * ( -1 ).  " 金额  LS_ITEM-HSL_H.
          ENDIF.
          ls_ztfi105-sgtxt   = ls_item-sgtxt.              "文本
          ls_ztfi105-fkber   = ls_item-vbeln.              "功能范围
          ls_ztfi105-kostl   = ls_item-posnr.              "成本中心
          ls_ztfi105-gsber   = ls_item-gsber.              "业务范围
          ls_ztfi105-prctr   = ls_item-prctr.              "利润中心
          ls_ztfi105-tcode   = 'ZFI144'.
          ls_ztfi105-uname   = sy-uname.
          ls_ztfi105-udate   = sy-datum.
          ls_ztfi105-utime   = sy-uzeit.
          APPEND ls_ztfi105 TO lt_ztfi105.
          CLEAR ls_item.
        ENDLOOP.
        CLEAR ls_data.
      ENDLOOP.
      IF lt_ztfi105[] IS NOT INITIAL.
        MODIFY ztfi105 FROM TABLE lt_ztfi105.
      ENDIF.
      IF gt_ztfi144[] IS NOT INITIAL.
        MODIFY ztfi144 FROM TABLE gt_ztfi144.
      ENDIF.

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

    ELSE.
      LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND belnr1 = ls_data1-belnr1.
        lv_tabix = sy-tabix.
        ls_data-type    = 'E'.
        ls_data-icon    = gc_icon_red.
        ls_data-message = lv_message.
        MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING type icon message.
        CLEAR ls_data.
      ENDLOOP.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      EXIT.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CALL_SCREEN_200
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  pv_flag        text
*&---------------------------------------------------------------------*
FORM call_screen_200 USING pv_flag TYPE char1.
* 处理带选择行 SEL ='X'
  DATA : lt_dn  TYPE RANGE OF vbeln_vl WITH HEADER LINE,
         lt_row TYPE  lvc_t_roid,    "内表
         ls_row TYPE  lvc_s_roid.    "工作区

  CLEAR: lt_row[],ls_row.
  CALL METHOD go_grid_100->get_selected_rows
    IMPORTING
      et_row_no = lt_row.

  CLEAR: ls_data, lt_dn, lt_dn[], lt_vf01[].
  LOOP AT lt_data INTO ls_data.
    ls_data-sel = ''.
    MODIFY lt_data FROM ls_data.
    CLEAR : ls_data.
  ENDLOOP.
  LOOP AT lt_row INTO ls_row.
    READ  TABLE  lt_data  INTO ls_data INDEX ls_row-row_id .
    IF  sy-subrc EQ  0 .
*      ls_data-sel = 'X'.
*      MODIFY lt_data FROM ls_data  INDEX sy-tabix  TRANSPORTING sel.
      LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE vbeln EQ ls_data-vbeln.  "同DN勾选择
        <fs_data>-sel = 'X'.
        IF <fs_data>-saknr IS INITIAL OR <fs_data>-saknr1 IS INITIAL OR
          <fs_data>-saknr2 IS INITIAL OR <fs_data>-saknr3 IS INITIAL .
          <fs_data>-icon = gc_icon_red.
          <fs_data>-message = '未获取到相应科目'.
        ENDIF.
        IF <fs_data>-hsly2 EQ 0.
          <fs_data>-icon = gc_icon_red.
          <fs_data>-message = '未获取到应收金额'.
        ENDIF.
        APPEND <fs_data> TO lt_vf01.
      ENDLOOP.
      lt_dn-low = ls_data-vbeln.  COLLECT lt_dn.                                        "统计DN数量
      CLEAR : ls_data.
    ENDIF.
    CLEAR: ls_row.
  ENDLOOP .

  IF lines( lt_dn[] ) NE 1.
    MESSAGE '有且只能勾选一张出货单(DN)进行操作!请确认勾选!' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  DATA: ls_item TYPE s_item.
  DATA: lv_subrc TYPE sy-subrc,
        lv_msg   TYPE string.

*  "READ TABLE LT_DATA INTO LS_DATA INDEX 1.
  LOOP AT lt_data INTO ls_data WHERE sel = 'X' AND icon    = gc_icon_red. "AND BELNR IS NOT INITIAL.
    " 凭证已经生成,不允许再次创建!
    MESSAGE TEXT-m13 TYPE 'S' DISPLAY LIKE 'E'. "有错误行项,不允许此次创建!
    RETURN.
  ENDLOOP.

  PERFORM check_data CHANGING lv_subrc.
  CLEAR lv_subrc.
  PERFORM check_data_vf01 CHANGING lv_subrc lv_msg.
  IF lv_subrc NE 0.
    MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.
*  CHECK LV_SUBRC = 0.

  PERFORM get_item_data CHANGING gt_item.

  IF pv_flag = '1'.
    gv_post = 'X'.
  ELSEIF pv_flag = '2'.
    gv_post = ''.
    PERFORM call_bapi_import USING gv_post.
  ENDIF.

  READ TABLE gt_item INTO ls_item WITH KEY type = 'E'.
  IF sy-subrc EQ 0.
    " 凭证有错误,请检查!
    MESSAGE TEXT-m07 TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  CALL SCREEN 200
       STARTING AT 5   2
       ENDING   AT 160 20.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_ITEM_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- ct_ITEM
*&---------------------------------------------------------------------*
FORM get_item_data CHANGING ct_item TYPE t_item.
  DATA: BEGIN OF ls_skat,
          spras TYPE skat-spras,
          ktopl TYPE skat-ktopl,
          saknr TYPE skat-saknr,
          txt20 TYPE skat-txt20,
          txt50 TYPE skat-txt50,
        END OF ls_skat.

  DATA: ls_head TYPE s_head,
        ls_item TYPE s_item,
        sno     TYPE i.

  DATA: lt_skat LIKE TABLE OF ls_skat.

  DATA: lv_hsl         TYPE acdoca-hsl,
        lv_new1        TYPE char1,
        lv_new2        TYPE i,
        lv_tabix       TYPE sy-tabix,
        lv_accountgl40 TYPE bapiacgl09-gl_account,
        lv_accountgl50 TYPE bapiacgl09-gl_account.

  CLEAR gs_zdate.
  gs_zdate-erdat = sy-datum.
  gs_zdate-erzet = sy-uzeit.
  gs_zdate-ernam = sy-datum.

  sno   = 0.     "凭证序号
  CLEAR: ct_item[],ls_head,ls_data,ls_item,lv_new1,lv_new2, gt_ztfi144[],gs_ztfi144.
  lv_new1 = 'X'.
  LOOP AT gt_head INTO ls_head.
    "借方 S
    lv_new2 = lv_new2 + 1.
    LOOP AT lt_data INTO ls_data WHERE sel = 'X'.
      CLEAR ls_item. "下面逻辑 增加每行 成本,库存
      ls_item-belnr = ls_data-belnr1.
      ls_item-rhcur = ls_data-rtcur.
      ls_item-bukrs = ls_data-bukrs.
      ls_item-gjahr = ls_head-gjahr.
      ls_item-monat = ls_head-monat.
      ls_item-blart = ls_head-blart.
      ls_item-docln = ls_head-belnr.
      ls_item-sgtxt =  ls_data-name_org1 && ls_data-wadat_ist && '发出商品确认收入'.       "文本
      ls_item-fkber = ls_data-rfarea.           "功能范围
      ls_item-kostl = ls_data-rcntr.            "成本中心
      ls_item-gsber = ls_data-rbusa.            "业务范围
      ls_item-prctr = ls_data-prctr.            "利润中心
      sno   = sno + 1.                          "凭证序号
      IF  lv_new1 IS NOT INITIAL.
        IF  ls_data-hsly2 NE 0 .
          ls_item-docln = 4.
        ELSE.
          ls_item-docln = 4.
        ENDIF.
      ELSE.
        ls_item-docln = sno.
      ENDIF.
      ls_item-werks = ls_data-werks.
      ls_item-matnr = ls_data-matnr.
      ls_item-vbeln = ls_data-vbeln.
      ls_item-posnr = ls_data-posnr.
      IF ls_head-belnr = 1.   "借方 S
        "如果 本年累计借方(本币) + 本年累计贷方(本币)> 0,  则对方科目 作为借方科目
        IF ls_data-hslz1 < 0.
          ls_item-saknr = ls_data-saknr.          "对方科目 作  借方 科目编号
          ls_item-txt50 = ls_data-txt50s.
          ls_item-bschl = '40'.
          ls_item-drcrk = 'S'.
          ls_item-hsl   = abs( ls_data-hslz1 ).
        ELSE.
          ls_item-saknr = ls_data-racct.          "科目编号 作  借方 科目编号
          ls_item-txt50 = ls_data-txt50.
          ls_item-bschl = '40'.
          ls_item-drcrk = 'S'.
          ls_item-hsl   = abs( ls_data-hslz1 ).
          ls_item-lgmngs = ls_data-lgmngs.
          ls_item-kmein = ls_data-kmein.
          ls_item-zuonr  = |{ ls_data-kunag ALPHA = OUT }|.
        ENDIF.
      ELSE.      "贷方  H
        "如果 期末余额借方(本币) <> 0,  则 科目 作为 贷方科目
        IF ls_data-hslz1 < 0.
          ls_item-saknr = ls_data-racct.          "科目编号 作  贷方 科目编号
          ls_item-txt50 = ls_data-txt50.
          ls_item-bschl = '50'.
          ls_item-drcrk = 'H'.
          ls_item-hsl   = abs( ls_data-hslz1 ).
          ls_item-lgmngs = ls_data-lgmngs.
          ls_item-kmein = ls_data-kmein.
          ls_item-zuonr  = |{ ls_data-kunag ALPHA = OUT }|.
        ELSE.
          ls_item-saknr = ls_data-saknr.          "对方科目 作  贷方 科目编号
          ls_item-txt50 = ls_data-txt50s.
          ls_item-bschl = '50'.
          ls_item-drcrk = 'H'.
          ls_item-hsl   = abs( ls_data-hslz1 ).
        ENDIF.
      ENDIF.
*      IF ls_item-txt50 CP '*主营业务成本*'  .           " 科目名称 含有 “主营业务成本” 字眼 时, 以下 3 栏位 置空
*        ls_item-kostl   = ''.                          "成本中心
*        ls_item-fkber  = ''.                           "功能范围
*      ENDIF.
      APPEND ls_item TO ct_item.
      CLEAR: ls_item-lgmngs,ls_item-kmein,ls_item-zuonr.
      "再增加  收入 hsly1  saknr2
      IF lv_new2 EQ 1.
        IF ls_data-hsly1 NE 0.
          IF  ls_data-hsly2 NE 0 .
            ls_item-docln = 3.
            sno   = 4.
          ELSE.
            ls_item-docln = 2.
            sno   = 3.
          ENDIF.
          IF ls_data-hsly1 < 0.
            ls_item-saknr = ls_data-saknr2.          "
*           ls_item-txt50 = ls_data-txt50.
            ls_item-bschl = '40'.
            ls_item-drcrk = 'S'.
            ls_item-hsl   = abs( ls_data-hsly1 ).
          ELSE.
            ls_item-saknr = ls_data-saknr2.          "
*           ls_item-txt50 = ls_data-txt50s.
            ls_item-bschl = '50'.
            ls_item-drcrk = 'H'.
            ls_item-hsl   = abs( ls_data-hsly1 ).
          ENDIF.
          ls_item-lgmngs = ls_data-lgmngs.
          ls_item-kmein  = ls_data-kmein.
          ls_item-zuonr  = |{ ls_data-kunag ALPHA = OUT }|.
          APPEND ls_item TO ct_item.
          CLEAR: ls_item-lgmngs,ls_item-kmein, ls_item-zuonr.
        ENDIF.
      ENDIF.

      IF lv_new1 IS NOT INITIAL.  " 逻辑增加 应收 hsly2 saknr1,税金 hsly3  saknr3
        CLEAR: ls_item-werks, ls_item-matnr, ls_item-vbeln, ls_item-posnr, gs_ztfi144.
        CLEAR lv_new1."有且只执行一次  因为是汇总数据
        "增加应收 hsly2 saknr1
        IF ls_data-hsly2 NE 0.
          ls_item-docln = 1.
          IF ls_data-hsly2 < 0.
            ls_item-saknr = ls_data-saknr1.          "
*           ls_item-txt50 = ls_data-txt50.
            ls_item-bschl = '11'.
            ls_item-drcrk = 'H'.
            ls_item-hsl   = abs( ls_data-hsly2 ).
          ELSE.
            ls_item-saknr = ls_data-saknr1.          "
*           ls_item-txt50 = ls_data-txt50s.
            ls_item-bschl = '01'.
            ls_item-drcrk = 'S'.
            ls_item-hsl   = abs( ls_data-hsly2 ).
          ENDIF.
          ls_item-kunag   = ls_data-kunag.
          ls_item-koart   = 'D'.
          APPEND ls_item TO ct_item.
          CLEAR: ls_item-kunag,ls_item-koart.
        ENDIF.
        "增加税金hsly3 saknr3
        IF ls_data-hsly3 NE 0.
          ls_item-docln = 2.
          IF ls_data-hsly3 < 0.
            ls_item-saknr = ls_data-saknr3.          "
*           ls_item-txt50 = ls_data-txt50.
            ls_item-bschl = '40'.
            ls_item-drcrk = 'S'.
            ls_item-hsl   = abs( ls_data-hsly3 ).
          ELSE.
            ls_item-saknr = ls_data-saknr3.          "
*           ls_item-txt50 = ls_data-txt50s.
            ls_item-bschl = '50'.
            ls_item-drcrk = 'H'.
            ls_item-hsl   = abs( ls_data-hsly3 ).
          ENDIF.
          CLEAR ls_item-gsber.
          APPEND ls_item TO ct_item.
        ENDIF.
        CLEAR gs_alv.
        READ TABLE gt_alv INTO gs_alv WITH KEY vbeln = ls_data-vbeln posnr = ls_data-posnr BINARY SEARCH.
        IF sy-subrc EQ 0.
          MOVE-CORRESPONDING gs_alv TO gs_ztfi144.
          gs_ztfi144-erdat1 = gs_alv-erdat.
          MOVE-CORRESPONDING gs_zdate TO gs_ztfi144.
          gs_ztfi144-saknr  = ls_data-saknr.
          gs_ztfi144-saknr1 = ls_data-saknr1.
          gs_ztfi144-saknr2 = ls_data-saknr2.
          gs_ztfi144-saknr3 = ls_data-saknr3.
          gs_ztfi144-hsly1  = ls_data-hsly1.
          gs_ztfi144-hsly2  = ls_data-hsly2.
          gs_ztfi144-hsly3  = ls_data-hsly3.
          gs_ztfi144-hslz1  = ls_data-hslz1.
          gs_ztfi144-zrate  = ls_data-zrate.
          APPEND gs_ztfi144 TO gt_ztfi144.
        ENDIF.
      ENDIF.

      CLEAR ls_data.
    ENDLOOP.
  ENDLOOP.

  SORT ct_item BY belnr docln.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- CV_SUBRC
*&---------------------------------------------------------------------*
FORM check_data CHANGING cv_subrc TYPE sy-subrc.
  DATA: BEGIN OF ls_acdoca,
          rldnr     TYPE acdoca-rldnr,
          rbukrs    TYPE acdoca-rbukrs,
          gjahr     TYPE acdoca-gjahr,
          belnr     TYPE acdoca-belnr,
          docln     TYPE acdoca-docln,
          xreversed TYPE acdoca-xreversed,
        END OF ls_acdoca.

  DATA: ls_ztfi105 TYPE ztfi105.

  DATA: lt_ztfi105 LIKE TABLE OF ls_ztfi105,
        lt_acdoca  LIKE TABLE OF ls_acdoca.

  DATA: lv_tabix TYPE sy-tabix.
  DATA:t_edit TYPE lvc_t_styl.                                "定义单元格编辑
  DATA:s_edit TYPE lvc_s_styl.
  CLEAR cv_subrc.

  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE lt_ztfi105
    FROM ztfi105
    WHERE tcode = 'ZFI144'
    AND   rbukrs IN s_bukrs
    AND   gjahr  IN s_gjahr
    AND   poper  IN s_poper
  %_HINTS HDB 'RESULT_LAG(''hana_sr'')'.

  IF lt_ztfi105[] IS NOT INITIAL.
    SELECT rldnr rbukrs gjahr belnr docln xreversed
      INTO CORRESPONDING FIELDS OF TABLE lt_acdoca
      FROM acdoca
      FOR ALL ENTRIES IN lt_ztfi105
      WHERE rldnr  = '0L'
      AND   rbukrs = lt_ztfi105-rbukrs
      AND   gjahr  = lt_ztfi105-gjahr
      AND   belnr  = lt_ztfi105-belnr
      AND   docln  = lt_ztfi105-docln
    %_HINTS HDB 'RESULT_LAG(''hana_sr'')'.

    SORT lt_acdoca BY rbukrs gjahr belnr docln.
    LOOP AT lt_ztfi105 INTO ls_ztfi105.
      lv_tabix = sy-tabix.
      READ TABLE lt_acdoca INTO ls_acdoca WITH KEY rbukrs = ls_ztfi105-rbukrs
                                                   gjahr  = ls_ztfi105-gjahr
                                                   belnr  = ls_ztfi105-belnr
                                                   docln  = ls_ztfi105-docln BINARY SEARCH.
      IF sy-subrc EQ 0.
        IF ls_acdoca-xreversed = 'X'.
          DELETE lt_ztfi105 INDEX lv_tabix.
        ENDIF.
      ENDIF.
    ENDLOOP.

  ENDIF.
  IF lt_ztfi105[] IS NOT INITIAL.
    cv_subrc = 1.
    SORT lt_ztfi105 BY rbukrs gjahr  racct fkber kostl gsber prctr."BELNR1
    LOOP AT lt_data INTO ls_data.
      lv_tabix = sy-tabix.
      READ TABLE lt_ztfi105 INTO ls_ztfi105 WITH KEY rbukrs = ls_data-bukrs
                                                     gjahr  = s_gjahr-low
                                                     "BELNR1 = LS_DATA-BELNR1
                                                     "RACCT  = LS_DATA-SAKNR
                                                     racct  = ls_data-racct  " 科目
                                                     fkber  = ls_data-vbeln " 功能范围
                                                     kostl  = ls_data-posnr  " 成本中心
                                                     gsber  = ls_data-rbusa  " 业务范围
                                                     prctr  = ls_data-prctr " 利润中心
                                                     BINARY SEARCH.
      IF sy-subrc EQ 0.
        ls_data-ryear   = ls_ztfi105-gjahr.
        ls_data-belnr   = ls_ztfi105-belnr.
        ls_data-type    = 'E'.
        ls_data-icon    = gc_icon_red.
        ls_data-message = TEXT-m10.
        CLEAR:s_edit.
        REFRESH t_edit.
        s_edit-fieldname = 'SAKNR'.
        s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
        INSERT s_edit INTO TABLE t_edit.
        s_edit-fieldname = 'SAKNR1'.
        s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
        INSERT s_edit INTO TABLE t_edit.
        s_edit-fieldname = 'SAKNR2'.
        s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
        INSERT s_edit INTO TABLE t_edit.
        s_edit-fieldname = 'SAKNR3'.
        s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
        INSERT s_edit INTO TABLE t_edit.
        REFRESH ls_data-edit.
        INSERT LINES OF t_edit INTO TABLE ls_data-edit.
        MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING ryear belnr type icon message edit.
      ELSE.
        READ TABLE lt_ztfi105 INTO ls_ztfi105 WITH KEY rbukrs = ls_data-bukrs
                                                       gjahr  = s_gjahr-low
                                                       racct  = ls_data-saknr  " 科目
                                                       fkber  = ls_data-vbeln " 功能范围
                                                       kostl  = ls_data-posnr  " 成本中心
                                                       gsber  = ls_data-rbusa  " 业务范围
                                                       prctr  = ls_data-prctr " 利润中心
                                                       BINARY SEARCH.
        IF sy-subrc EQ 0.
          ls_data-ryear   = ls_ztfi105-gjahr.
          ls_data-belnr   = ls_ztfi105-belnr.
          ls_data-type    = 'E'.
          ls_data-icon    = gc_icon_red.        "黄灯    GC_ICON_RED.
          ls_data-message = TEXT-m11.                 "M10.   本月凭证已生成,不允许重复创建凭证!
          CLEAR:s_edit.
          REFRESH t_edit.
          s_edit-fieldname = 'SAKNR'.
          s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
          INSERT s_edit INTO TABLE t_edit.
          s_edit-fieldname = 'SAKNR1'.
          s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
          INSERT s_edit INTO TABLE t_edit.
          s_edit-fieldname = 'SAKNR2'.
          s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
          INSERT s_edit INTO TABLE t_edit.
          s_edit-fieldname = 'SAKNR3'.
          s_edit-style = cl_gui_alv_grid=>mc_style_disabled.
          INSERT s_edit INTO TABLE t_edit.
          REFRESH ls_data-edit.
          INSERT LINES OF t_edit INTO TABLE ls_data-edit.
          MODIFY lt_data FROM ls_data INDEX lv_tabix TRANSPORTING ryear belnr type icon message edit.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDFORM.

FORM frm_getdata .

  DATA: sdate        TYPE sy-datum,
        edate        TYPE sy-datum,
        smonat       TYPE bkpf-monat,
        lv_rcntr     TYPE ztfi107-rcntr,
        ls_exch_rate TYPE bapi1093_0.

  DATA: lv_gjahr TYPE bseg-gjahr,
        lv_monat TYPE bseg-h_monat.
  DATA: l_budat  TYPE sy-datum,
        lv_vbeln TYPE vbeln_vl.
  DATA: l_gjahr  TYPE gjahr,
        lv_rtype TYPE c.
  RANGES: r_monat FOR bseg-h_monat.
  DATA: lt_alv    TYPE TABLE OF ty_alv,
        seltab    TYPE TABLE OF rsparams,
        seltab_wa LIKE LINE OF seltab.
  DATA lcl_data TYPE REF TO data.
  FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE. "定义承接数据的动态内表

  RANGES: gr_kostl FOR cskt-kostl.      "用Ranges 将 GetData 与 成本中心配置表ZTFI107中成本中心 先取好 以备 AFRU 取值时提升效率
  "以下为取数逻辑 参考程序 复制报表ZFI021NA,删除销售出库单为空的数据

  "初始设置
  CLEAR: lv_rtype,seltab[],seltab_wa.

*  CLEAR :seltab_wa .
*  seltab_wa-selname = 'S_EKORG'.
*  seltab_wa-sign    = 'I'.
*  seltab_wa-option  = 'EQ'.
*  seltab_wa-low = s_bukrs[ 1 ]-low .
*  APPEND seltab_wa TO seltab.
*
*  cl_salv_bs_runtime_info=>set( EXPORTING display  = abap_false
*                                          metadata = abap_false
*                                             data  = abap_true ).
*
*  SUBMIT zfi021na WITH  SELECTION-TABLE seltab
*                  WITH  s_erdat = gv_last_date  AND RETURN .
*  IF sy-subrc = 0.
*    "获取ALV内表的值
*    TRY .
*        WAIT UP TO '0.5' SECONDS.
*        cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lcl_data ).
*
*      CATCH cx_salv_bs_sc_runtime_info INTO DATA(cx_error).
*        lv_rtype = 'E'.
*    ENDTRY.
*
*  ENDIF.
*
*  IF lv_rtype  IS INITIAL. "直接获取
*    "清空所有变量  一定要清,不然可能会对自己的ALV展示会有影响
*    cl_salv_bs_runtime_info=>clear_all( ).
*    ASSIGN lcl_data->* TO <lt_data>.
*    IF <lt_data> IS ASSIGNED.
*      MOVE-CORRESPONDING  <lt_data>[] TO  gt_alv[] .
*    ENDIF .
*
*  ELSE. "参考逻辑
*
*
*
*  ENDIF.


  CLEAR : gt_alv[] , lt_alv[].
  SELECT  * INTO TABLE @DATA(lt_ztfiftpd) FROM ztfiftpd
  WHERE  cprog   =  'ZFI021NA'
    AND  bukrs   IN  @s_bukrs
    AND  yyyymm  =   @gv_last_date(6)   .

  LOOP AT  lt_ztfiftpd INTO DATA(ls_ztfiftpd)  .

    CALL TRANSFORMATION id SOURCE XML ls_ztfiftpd-zdata
     RESULT zdata   = lt_alv    .  "  LS_ZRFCD

    APPEND LINES OF lt_alv TO  gt_alv  .


  ENDLOOP  .

  DELETE gt_alv WHERE vbeln IS INITIAL.  "复制报表ZFI021NA,删除销售出库单为空的数据
  SORT gt_alv BY vbeln posnr.
  CLEAR: gs_output,gt_output[], gr_kostl[], gt_dn[], gt_zrate[].
  LOOP AT gt_alv INTO gs_alv.
    MOVE-CORRESPONDING gs_alv TO gs_output.
    PERFORM frm_add_matn1_input(zmm012) USING gs_output-matnr.
*BAPI_BILLINGDOC_CREATEMULTIPLE
    gs_output-hsly1 = gs_output-lgmngs * gs_output-netprs. "销售未税单价*未开票数量
    gs_output-hsly2 = gs_output-lgmngs * ( 1 + gs_output-mwsbps ) * gs_output-netprs. "销售未税单价*(1+税率)*未开票数量
    APPEND gs_output TO gt_output.
    gs_dn-vbeln = gs_output-vbeln.
    gs_dn-hsly1 = gs_output-hsly1.
    gs_dn-hsly2 = gs_output-hsly2.
    COLLECT gs_dn INTO gt_dn.
    IF gs_output-waerk NE 'CNY'.
      gs_zrate-waerk = gs_output-waerk.
      COLLECT gs_zrate INTO gt_zrate.
    ENDIF.
    CLEAR: gs_dn, gs_zrate, gs_output.

  ENDLOOP.
  CLEAR: gt_alv.

  IF gt_output[] IS INITIAL .
    MESSAGE TEXT-m01 TYPE 'S' DISPLAY LIKE 'E'.   " 无符合条件的数据!
    EXIT.
  ELSE.

    SELECT vkorg, vtweg,matnr, ktgrm  INTO TABLE @DATA(lt_mvke)
      FROM mvke
      FOR ALL ENTRIES IN @gt_output
      WHERE vkorg = @gt_output-bukrs
        AND vtweg = '00'
        AND matnr = @gt_output-matnr
        AND ktgrm NE ''.
    IF sy-subrc EQ 0.
      SORT lt_mvke BY vkorg matnr.
    ENDIF.

    SELECT * INTO TABLE @DATA(lt_c908)
      FROM c908
      WHERE kappl EQ 'VB'
        AND ktopl EQ 'LY00'
        AND vkorg EQ @s_bukrs-low.
    IF sy-subrc EQ 0.
      SORT lt_c908 BY vkorg  ktgrm.
    ENDIF.

    SELECT * INTO TABLE @DATA(lt_c901)
      FROM c901
      WHERE kappl EQ 'V'
        AND kschl EQ 'KOFI'
        AND ktopl EQ 'LY00'
        AND werks EQ @s_bukrs-low
        AND kvsl1 EQ 'Z01'.
    IF sy-subrc EQ 0.
      SORT lt_c901 BY werks ktgrm.
    ENDIF.

    SELECT * INTO TABLE @DATA(lt_c003)
      FROM c003
      WHERE kappl EQ 'V'
        AND kschl EQ 'KOFI'
        AND ktopl EQ 'LY00'
        AND vkorg EQ @s_bukrs-low
        AND kvsl1 EQ 'Z01'.
    IF sy-subrc EQ 0.
      SORT lt_c003 BY vkorg ktgrm.
    ENDIF.
  ENDIF.

  LOOP AT gt_zrate INTO gs_zrate.
    num = sy-tabix.
    CLEAR ls_exch_rate.
    CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL'
      EXPORTING
        rate_type  = 'M'
        from_curr  = gs_zrate-waerk
        to_currncy = 'CNY'
        "date       = gt_vbap-audat
        date       = gv_last_date        " s_date
      IMPORTING
        exch_rate  = ls_exch_rate.

    gs_zrate-zrate = ls_exch_rate-exch_rate.
    MODIFY gt_zrate FROM gs_zrate INDEX num.
  ENDLOOP.

  num = 0.
  SORT gt_dn BY vbeln.
  SORT gt_zrate BY waerk.
  SORT gt_output  BY bukrs werks vbeln matnr.
  CLEAR: ls_data, lt_data[], lv_vbeln.

  LOOP AT gt_output INTO gs_output .
    MOVE-CORRESPONDING gs_output TO ls_data.
    ls_data-ryear  = gs_output-gjahr.
    ls_data-rpmax  = gs_output-monat.           "s_poper-low
    ls_data-bukrs  = gs_output-bukrs.
    ls_data-racct  = gs_output-hkont.          "库存科目
**    ls_data-txt50  = gs_output-txt50.
**    ls_data-rcntr  = gs_output-rcntr.
**    ls_data-ktext  = gs_output-ktext.       "成本中心名称
    ls_data-rbusa  = gs_output-gsber .        "业务范围
**    ls_data-gtext  = gs_output-gtext.       "业务范围名称
**    ls_data-rfarea = gs_output-rfarea.      "功能范围
**    ls_data-fkbtx  = gs_output-fkbtx.       "功能范围名称
**    ls_data-prctr  = gs_output-prctr.       "利润中心
    ls_data-rtcur  = gs_output-waerk.         "币别
    ls_data-hsly1  = gs_output-hsly1 .       "收入  销售未税单价*未开票数量
*    ls_data-hsly2  = gs_output-hsly2.       "本年累计货方(本币)
    ls_data-hslz1  = gs_output-mwsbp_1 + gs_output-mwsbp_2 + gs_output-mwsbp_3.       "成本、库存
    ls_data-werks  = gs_output-werks.
    ls_data-matnr  = gs_output-matnr.
    ls_data-vbeln  = gs_output-vbeln.
    ls_data-posnr  = gs_output-posnr.
    ls_data-kunag  = gs_output-kunag.        "客户编码
    ls_data-name_org1 = gs_output-name_org1. "客户名称
    ls_data-kmein  = gs_output-kmein.
    ls_data-lgmngs = gs_output-lgmngs.
    CLEAR gs_dn.
    READ TABLE gt_dn INTO gs_dn WITH KEY vbeln = gs_output-vbeln BINARY SEARCH.
    IF sy-subrc EQ 0.
      ls_data-hsly2 = gs_dn-hsly2.
      ls_data-hsly3 = gs_dn-hsly2 - gs_dn-hsly1.
    ENDIF.
    "公司名称
    SELECT SINGLE butxt INTO ls_data-butxt
    FROM t001 WHERE bukrs = ls_data-bukrs.

    "科目名称
    IF sy-langu EQ 'E'.
      SELECT SINGLE skat~txt50 INTO ls_data-txt50 FROM skat
        WHERE skat~saknr = ls_data-racct AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
    ELSE.
      SELECT SINGLE skat~txt50 INTO ls_data-txt50 FROM skat
        WHERE skat~saknr = ls_data-racct AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
    ENDIF.

    "1. 对方科目 / 对方科目名称
    READ TABLE lt_mvke INTO DATA(ls_mvke) WITH KEY vkorg = gs_output-bukrs matnr = gs_output-matnr BINARY SEARCH.
    IF sy-subrc EQ 0.
      READ TABLE lt_c901 INTO DATA(ls_c901) WITH KEY werks = gs_output-werks ktgrm = ls_mvke-ktgrm BINARY SEARCH.
      IF sy-subrc EQ 0."优先1在保税部分中查找:用工厂+科目设置组去识别收入科目
        ls_data-saknr2 = ls_c901-sakn2.
*        IF sy-langu EQ 'E'.
*          SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
*            WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
*        ELSE.
*          SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
*            WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
*        ENDIF.
      ELSE."优先2,在1中没找到就取找非保税的:用销售组织+科目设置组找收入科目

        READ TABLE lt_c003 INTO DATA(ls_c003) WITH KEY vkorg = gs_output-bukrs ktgrm = ls_mvke-ktgrm BINARY SEARCH.
        IF sy-subrc EQ 0.
          ls_data-saknr2 = ls_c003-sakn2.
          IF sy-langu EQ 'E'.
            SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
              WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
          ELSE.
            SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
              WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
          ENDIF.
        ENDIF.
      ENDIF.

      READ TABLE lt_c901 INTO ls_c901 WITH KEY werks = gs_output-werks ktgrm = ls_mvke-ktgrm BINARY SEARCH.
      IF sy-subrc EQ 0."优先1在保税部分中查找:用工厂+科目设置组去识别收入科目
        ls_data-saknr = ls_c901-sakn2.
*        IF sy-langu EQ 'E'.
*          SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
*            WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
*        ELSE.
*          SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
*            WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
*        ENDIF.
      ELSE."优先2,在1中没找到就取找非保税的:用销售组织+科目设置组找收入科目

        READ TABLE lt_c003 INTO ls_c003 WITH KEY vkorg = gs_output-bukrs ktgrm = ls_mvke-ktgrm BINARY SEARCH.
        IF sy-subrc EQ 0.
          ls_data-saknr = ls_c003-sakn2.
          IF sy-langu EQ 'E'.
            SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
              WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
          ELSE.
            SELECT SINGLE skat~txt50 INTO ls_data-txt50s FROM skat
              WHERE skat~saknr = ls_data-saknr AND skat~ktopl = 'LY00' AND skat~spras = sy-langu.
          ENDIF.
        ENDIF.
      ENDIF.

      READ TABLE lt_c908 INTO DATA(ls_c908) WITH KEY vkorg = gs_output-bukrs ktgrm = ls_mvke-ktgrm BINARY SEARCH.
      IF sy-subrc EQ 0."优先1取OV64根据物料主数据销售视图2中科目设置组+公司代码找对应的应收科目
        ls_data-saknr1 = ls_c908-sakn1.
*      ELSE."优先2根据销售出库单中的公司代码+客户统御取科目
      ENDIF.
    ENDIF.
    CLEAR: ls_c003,ls_c908,ls_c901, ls_mvke.
    "C908
    IF ls_data-saknr1 IS INITIAL.  "应收科目
      ls_data-saknr1 = '1122010000'.
    ENDIF.
    IF ls_data-saknr3 IS INITIAL.   "税金科目
      ls_data-saknr3 = '2221000000'.
    ENDIF.
    "2. 分摊金额 业务范围
    IF ls_data-rbusa IS INITIAL.
      ls_data-rbusa = '9999'.
    ENDIF.
    "业务范围名称
    SELECT SINGLE tgsbt~gtext INTO ls_data-gtext FROM tgsbt
    WHERE tgsbt~gsber = gs_output-gsber AND tgsbt~spras = sy-langu.

    "3.  汇率
    IF ls_data-rtcur NE 'CNY'.
      CLEAR gs_zrate.
      READ TABLE gt_zrate INTO gs_zrate WITH KEY waerk = ls_data-rtcur BINARY SEARCH.
      IF sy-subrc EQ 0.
        ls_data-zrate = gs_zrate-zrate.
        ls_data-hsly1 = ls_data-hsly1 * ls_data-zrate.
        ls_data-hsly2 = ls_data-hsly2 * ls_data-zrate.
        ls_data-hsly3 = ls_data-hsly3 * ls_data-zrate.
        ls_data-hslz1 = ls_data-hslz1 * ls_data-zrate.
      ENDIF.
    ELSE.
      ls_data-zrate = 1.
    ENDIF.

    IF lv_vbeln NE gs_output-vbeln.
      num = num + 1.
      lv_vbeln = gs_output-vbeln.
    ENDIF.

    IF ls_data-saknr IS INITIAL OR ls_data-saknr1 IS INITIAL
      OR ls_data-saknr2 IS INITIAL OR ls_data-saknr3 IS INITIAL.
*      num = num + 1.
      ls_data-belnr1 = num.
      ls_data-icon = gc_icon_red.
      ls_data-message = '未获取到相应科目'.
      APPEND ls_data TO lt_data.
    ELSE.
      IF ls_data-hsly2 <> 0.
*        num = num + 1.
        ls_data-belnr1 = num.                               "分录
        APPEND ls_data TO lt_data.
      ELSE.
*        num = num + 1.
        ls_data-belnr1 = num.
        ls_data-icon = gc_icon_red.
        ls_data-message = '未获取到应收金额'.
        APPEND ls_data TO lt_data.
      ENDIF.
    ENDIF.
    CLEAR ls_data.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DOUBLE_CLICK 双击事件
*&---------------------------------------------------------------------*
FORM frm_double_click  USING p_row_id TYPE  lvc_s_row
                              p_column_i TYPE lvc_s_col.
  IF p_column_i-fieldname EQ 'RFAREA'.
    READ TABLE lt_data INTO ls_data INDEX p_row_id-index.
    IF sy-subrc = 0 .
      SET PARAMETER ID 'ACC' FIELD ls_data-racct.
      SET PARAMETER ID 'BUK' FIELD ls_data-bukrs.
      SET PARAMETER ID 'GJR' FIELD ls_data-ryear.

      CALL TRANSACTION 'FAGLB03' AND SKIP FIRST SCREEN.
    ENDIF.

  ELSEIF p_column_i-fieldname EQ 'BELNR'.
    READ TABLE lt_data INTO ls_data INDEX p_row_id-index.
    IF sy-subrc = 0 AND ls_data-belnr IS NOT INITIAL.
      SET PARAMETER ID 'BLN' FIELD ls_data-belnr.
      SET PARAMETER ID 'BUK' FIELD ls_data-bukrs.
      SET PARAMETER ID 'GJR' FIELD ls_data-ryear.

      CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHANFWD_DATA
*&---------------------------------------------------------------------*
FORM frm_changed_data  USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

  DATA: lt_data1 TYPE lvc_t_modi,
        ls_data1 LIKE LINE OF lt_data1,
        lv_saknr TYPE saknr,
        lv_error TYPE char1.

  lt_data1 = er_data_changed->mt_mod_cells.

  LOOP AT lt_data1 INTO ls_data1.
    IF ls_data1-fieldname+0(5) EQ 'SAKNR'.
      CLEAR lv_saknr.
      CALL METHOD er_data_changed->get_cell_value
        EXPORTING
          i_row_id    = ls_data1-row_id
          i_fieldname = ls_data1-fieldname
        IMPORTING
          e_value     = lv_saknr.

      IF sy-langu EQ 'E'.
        SELECT SINGLE saknr INTO lv_saknr FROM skat
          WHERE saknr = lv_saknr AND ktopl = 'OCOA' AND spras = sy-langu.
      ELSE.
        SELECT SINGLE saknr INTO lv_saknr FROM skat
          WHERE skat~saknr = lv_saknr AND ktopl = 'LY00' AND spras = sy-langu.
      ENDIF.
      IF sy-subrc NE 0.
        MESSAGE s002(zsys) WITH  '输入的科目不正确,请检查确认!' DISPLAY LIKE 'E'.
      ELSE.
        READ TABLE lt_data ASSIGNING FIELD-SYMBOL(<fs_data>) INDEX ls_data1-row_id.
        IF sy-subrc EQ 0.
          ASSIGN COMPONENT ls_data1-fieldname OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fs_value>).
          IF <fs_value> IS ASSIGNED.
            <fs_value> = lv_saknr.
          ENDIF.
          UNASSIGN: <fs_value>, <fs_data>.
        ENDIF.
      ENDIF.
    ENDIF.
    CLEAR lv_error.
    READ TABLE lt_data ASSIGNING <fs_data> INDEX ls_data1-row_id.
    IF sy-subrc EQ 0.
      IF <fs_data>-saknr IS INITIAL OR <fs_data>-saknr1 IS INITIAL
        OR <fs_data>-saknr2 IS INITIAL OR <fs_data>-saknr3 IS INITIAL.
        <fs_data>-icon = gc_icon_red.
        <fs_data>-message = '未获取到相应科目'.
        lv_error = 'X'.
      ELSE.
        IF <fs_data>-hsly2 EQ 0.
          <fs_data>-icon = gc_icon_red.
          <fs_data>-message = '未获取到应收金额'.
          lv_error = 'X'.
        ENDIF.
      ENDIF.
      IF lv_error IS INITIAL.
        <fs_data>-icon = ''.
        <fs_data>-message = ''.
      ENDIF.
    ENDIF.
    UNASSIGN: <fs_data>.
  ENDLOOP.
  PERFORM refresh_alv USING go_grid_100.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DATA_CHANGED_FINISHED
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> ET_GOOD_CELLS
*&---------------------------------------------------------------------*
FORM frm_data_changed_finished  USING    et_good_cells TYPE lvc_t_modi.
  CHECK et_good_cells[] IS NOT INITIAL.

  DATA stbl TYPE lvc_s_stbl.



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

  CALL METHOD go_grid_100->refresh_table_display
    EXPORTING
      is_stable = stbl.        "更改后数据刷新

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ONF4_HELP
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_FIELDNAME
*&      --> ES_ROW_NO
*&      --> ER_EVENT_DATA
*&---------------------------------------------------------------------*
FORM frm_onf4_help  USING   pv_fieldname pv_fieldvalue pv_row_no TYPE lvc_s_roid
      pv_event_data TYPE REF TO cl_alv_event_data
      pv_display.


  DATA:lv_fieldname1 TYPE dfies-fieldname,
       lv_fieldname2 TYPE help_info-dynprofld.

  DATA:rs_selfield TYPE slis_selfield.
  DATA:ref_grid TYPE REF TO cl_gui_alv_grid.

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

  DATA:BEGIN OF lt_saknr OCCURS 0,
         saknr TYPE skat-saknr,
         txt50 TYPE skat-txt50,
       END OF lt_saknr.

  DATA:ls_saknr LIKE lt_saknr.



  REFRESH:lt_saknr.

  IF sy-langu EQ 'E'.
    SELECT skat~saknr skat~txt50 INTO TABLE lt_saknr FROM skat
      WHERE skat~ktopl = 'OCOA' AND skat~spras = sy-langu.
  ELSE.
    SELECT skat~saknr skat~txt50 INTO TABLE lt_saknr FROM skat
      WHERE  skat~ktopl = 'LY00' AND skat~spras = sy-langu.
  ENDIF.

  lv_fieldname1 = pv_fieldname+0(5) ."搜索帮助的字段名
  lv_fieldname2 = pv_fieldname+0(5) ."搜索帮助的字段名
  CONDENSE lv_fieldname1 NO-GAPS.
  CONDENSE lv_fieldname2 NO-GAPS.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = ref_grid.  "获取全局变量

  REFRESH:lt_return.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = lv_fieldname1
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = lv_fieldname2
      value_org       = 'S'
      display         = 'F'
    TABLES
      value_tab       = lt_saknr
      return_tab      = lt_return
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

  CLEAR:ls_data.
  READ TABLE lt_data INTO ls_data INDEX pv_row_no-row_id.
  IF sy-subrc =  0.
    READ TABLE lt_return INTO ls_return INDEX 1.
    IF sy-subrc = 0.
      IF pv_fieldname EQ 'SAKNR'.       ls_data-saknr  = ls_return-fieldval.      ENDIF.
      IF pv_fieldname EQ 'SAKNR1'.      ls_data-saknr1 = ls_return-fieldval.      ENDIF.
      IF pv_fieldname EQ 'SAKNR2'.      ls_data-saknr2 = ls_return-fieldval.      ENDIF.
      IF pv_fieldname EQ 'SAKNR3'.      ls_data-saknr3 = ls_return-fieldval.      ENDIF.
    ENDIF.
    CLEAR:ls_data-icon,ls_data-message .
    IF ls_data-saknr IS INITIAL OR ls_data-saknr1 IS INITIAL
      OR ls_data-saknr2 IS INITIAL OR ls_data-saknr3 IS INITIAL.
      ls_data-icon = gc_icon_red.
      ls_data-message = '未获取到相应科目'.
    ENDIF.
    IF ls_data-hsly2 EQ 0.
      ls_data-icon = gc_icon_red.
      ls_data-message = '未获取到应收金额'.
    ENDIF.
    MODIFY lt_data FROM ls_data INDEX pv_row_no-row_id."更新ALV内表
  ENDIF.

  PERFORM refresh_alv USING go_grid_100.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_DATA_VF01
*&---------------------------------------------------------------------*
*& text  模拟 VF01 检查错误
*&---------------------------------------------------------------------*
*&      <-- LV_SUBRC
*&      <-- LV_STRING
*&---------------------------------------------------------------------*
FORM check_data_vf01  CHANGING pv_subrc TYPE sy-subrc
                                pv_msg  TYPE string.

  DATA: ls_bill    TYPE bapivbrk,
        lt_bill    TYPE TABLE OF bapivbrk,
        lt_return  TYPE TABLE OF bapiret1,
        ls_return  TYPE bapiret1,
        lt_success TYPE TABLE OF bapivbrksuccess.

  CLEAR: lt_return[], lt_success[],lt_bill[],pv_subrc, pv_msg.
  LOOP AT lt_vf01 INTO ls_data WHERE sel IS NOT INITIAL .
    ls_bill-bill_date = gv_last_date.
    ls_bill-ref_doc   = ls_data-vbeln.
    ls_bill-ref_item  = ls_data-posnr.
    ls_bill-req_qty   = ls_data-lgmngs.
    ls_bill-ref_doc_ca = 'J'.
    APPEND ls_bill TO lt_bill.
  ENDLOOP.

  CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
    EXPORTING
*     CREATORDATAIN =
      testrun       = 'X'
*     POSTING       =
    TABLES
      billingdatain = lt_bill
*     CONDITIONDATAIN       =
*     CCARDDATAIN   =
*     TEXTDATAIN    =
*     ERRORS        =
      return        = lt_return
      success       = lt_success
*     NFMETALLITMS  =
    .
    LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
      pv_subrc = '1'.
      pv_msg   = pv_msg && ls_return-message.
    ENDLOOP.

    IF pv_subrc EQ 1.
      ls_data-icon = gc_icon_red.
      ls_data-message = pv_msg.
      MODIFY lt_data FROM ls_data TRANSPORTING icon message WHERE vbeln = ls_data-vbeln .
      PERFORM refresh_alv USING go_grid_100.
    ENDIF.

ENDFORM.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值