ABAP ALV模板

发出商品差异分摊

*&---------------------------------------------------------------------*
*& 单位/APPLICANT                 : **** SAP
*& 程序名称/PROGRAM NAME.          : ZFI013
*& 程序描述/PROGRAM DES.           : 发出商品差异分摊平台
*& 开发编号/FS NO.                 :
*& 功能顾问/FUNCTION CONST.        :
*& 申请日期/APPLICATION DATE       : 2023.11.20
*& 技术顾问/DEVELOP CONST.         : ZGQ
*& 开发日期/DEVELOP DATE.          : 2023.11.20
*&---------------------------------------------------------------------*
*&摘要:
*&. 业务背景
*&      查看XXXX信息
*&. 使用场景
*&
*&. 程序使用:
*&       运行TCODE: ZFI013
*&
*&注意:
*&. 代码规范
*&       遵循 《**SAP标准化程序开发规范 V1.0》;
*&. 代码更改(标准化代码使用标准化发布的模板代码)
*&       个人代码更改点为如下代码片段(非此片段不能更改)
*&---------------------------------------------------------------------*
*&变更记录:                                                           *
*&DATE         DEVELOPER           REQNO       DESCRIPTIONS            *
*& ==========  ==================  ==========  ========================*
*&20.11.2023 10:11:30
*&---------------------------------------------------------------------*
REPORT zfi013.

TYPE-POOLS:slis,icon.
TABLES:sscrfields,bkpf.

*----------------------------------------------------------------------*
*   全局类型定义
*----------------------------------------------------------------------*
TYPES:BEGIN OF ty_alv,

         bukrs      TYPE bkpf-bukrs,              "公司代码
         matnr      TYPE vbrp-matnr,              "物料
         werks      TYPE vbrp-werks,              "工厂
         vkorg_auft TYPE vbrp-vkorg_auft,        "销售组织
         gjahr1     TYPE bkpf-gjahr,              "会计年度
         monat1     TYPE bkpf-monat,              "期间
         ktgrd      TYPE vbrk-ktgrd,              "客户科目组
         ktgrm      TYPE vbrp-ktgrm,              "物料科目设置组

         gjahr      TYPE bkpf-gjahr,              "会计年度
         monat      TYPE bkpf-monat,              "期间

         vbeln      TYPE vbrp-vbeln,              "发票号
         posnr      TYPE vbrp-posnr,              "发票行项目
         belnr      TYPE bkpf-belnr,              "会计凭证
         vgbel      TYPE lips-vbeln,              "交货单号
         vgpos      TYPE lips-posnr,              "交货单行项目
         aubel      TYPE vbrp-aubel,              "销售凭证
         aupos      TYPE vbrp-aupos,              "销售凭证项目


         prctr      TYPE vbrp-prctr,              "利润中心
         vtext      TYPE tvkot-vtext,             "销售组织描述
         kunrg_ana  TYPE vbrp-kunrg_ana,          "客户
         name1      TYPE kna1-name1,              "客户名称
         vtext2     TYPE tvktt-vtext,             "客户科目组名称
         arktx      TYPE vbrp-arktx,              "物料描述
         matkl      TYPE vbrp-matkl,              "物料组
         wgbez      TYPE text20,              "物料组描述
         vtext3     TYPE v_tvkm-vtext,            "物料科目设置组描述
         fkimg      TYPE vbrp-fkimg,              "开票数量
         lfimg      TYPE lips-lfimg,              "交货数量
         fksta      TYPE lips-fksta,              "开票状态
         wsl1       TYPE acdoca-wsl,              "发出商品差异
         wsl2       TYPE acdoca-wsl,              "本期调整差异
         cbox       TYPE char2,                       "复选框
         status     TYPE char04,                  "状态灯
         msg        TYPE string,                  "消息
         belnr1     TYPE bkpf-belnr,             "调整凭证
         belnr2     TYPE bkpf-belnr,             "冲销凭证

         wsl        TYPE acdoca-wsl,
         racct      TYPE acdoca-racct,
         blart      TYPE acdoca-blart,

         sfakn      TYPE vbrk-sfakn,
         shkzg      TYPE vbrp-shkzg,

       END OF ty_alv.

TYPES:BEGIN OF ty_alv2,

         bukrs      TYPE bkpf-bukrs,              "公司代码
         gjahr      TYPE bkpf-gjahr,              "会计年度
         monat      TYPE bkpf-monat,              "期间
         vbeln      TYPE vbrp-vbeln,              "发票号
         posnr      TYPE vbrp-posnr,              "发票行项目
         prctr      TYPE vbrp-prctr,              "利润中心

         matnr      TYPE vbrp-matnr,              "物料
         werks      TYPE vbrp-werks,              "工厂
         vkorg_auft TYPE vbrp-vkorg_auft,        "销售组织
         ktgrd      TYPE vbrk-ktgrd,              "客户科目组
         ktgrm      TYPE vbrp-ktgrm,              "物料科目设置组
         belnr      TYPE bkpf-belnr,              "会计凭证
         vgbel      TYPE lips-vbeln,              "交货单号
         vgpos      TYPE lips-posnr,              "交货单行项目
         aubel      TYPE vbrp-aubel,              "销售凭证
         aupos      TYPE vbrp-aupos,              "销售凭证项目
         vtext      TYPE tvkot-vtext,             "销售组织描述
         kunrg_ana  TYPE vbrp-kunrg_ana,          "客户
         name1      TYPE kna1-name1,              "客户名称
         vtext2     TYPE tvktt-vtext,             "客户科目组名称
         arktx      TYPE vbrp-arktx,              "物料描述
         matkl      TYPE vbrp-matkl,              "物料组
         wgbez      TYPE text20,              "物料组描述
         vtext3     TYPE v_tvkm-vtext,            "物料科目设置组描述
         fkimg      TYPE vbrp-fkimg,              "开票数量
         lfimg      TYPE lips-lfimg,              "交货数量
         fksta      TYPE lips-fksta,              "开票状态
         wsl1       TYPE acdoca-wsl,              "发出商品差异
         wsl2       TYPE acdoca-wsl,              "本期调整差异
         cbox       TYPE char2,                       "复选框
         status     TYPE char04,                  "状态灯
         msg        TYPE string,                  "消息
         belnr1     TYPE bkpf-belnr,             "调整凭证
         belnr2     TYPE bkpf-belnr,             "冲销凭证

         wsl        TYPE acdoca-wsl,
         racct      TYPE acdoca-racct,
         blart      TYPE acdoca-blart,
       END OF ty_alv2.

*----------------------------------------------------------------------*
*   全局变量定义
*----------------------------------------------------------------------*
DATA:gt_alv  TYPE TABLE OF ty_alv,
      gs_alv  TYPE ty_alv,
      gt_data TYPE TABLE OF ty_alv,
      gs_data TYPE ty_alv.

DATA:
   gt_data2 TYPE TABLE OF ty_alv2,
   gs_data2 TYPE ty_alv2.

DATA:gt_fi013 TYPE TABLE OF ztfi013,
      gs_fi013 TYPE ztfi013.

DATA:gv_wsl TYPE acdoca-wsl.

*----------------------------------------------------------------------*
*   常量定义
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
*   宏定义
*----------------------------------------------------------------------*
DEFINE init_fieldcat.

   CLEAR gs_fieldcat.
   gs_fieldcat-fieldname = &1."表中字段名,大写
   gs_fieldcat-coltext = &2."alv显示字段名
   gs_fieldcat-key = &3.
   gs_fieldcat-no_zero = &4.
   gs_fieldcat-icon = &5.
   gs_fieldcat-ref_table = &6.
   gs_fieldcat-ref_field = &7.
   gs_fieldcat-no_out = &8.
   gs_fieldcat-outputlen = &9.
   APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.


*----------------------------------------------------------------------*
*   ALV定义
*----------------------------------------------------------------------*
DATA:gt_fieldcat TYPE lvc_t_fcat, "字段目录内表
      gs_fieldcat TYPE lvc_s_fcat, "字段目录工作区
      gs_layout   TYPE lvc_s_layo. "用于定义ALV表单的相关格式、属性

*----------------------------------------------------------------------*
*   选择屏幕
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1.

   PARAMETERS:p_bukrs TYPE bkpf-bukrs OBLIGATORY, "公司代码
              p_gjahr TYPE bkpf-gjahr OBLIGATORY, "会计年度
              p_monat TYPE bkpf-monat OBLIGATORY. "期间

SELECTION-SCREEN END OF BLOCK b1.

*--------------------------------------------------------------------*
*事件流 1
*--------------------------------------------------------------------*
INITIALIZATION.

*--------------------------------------------------------------------*
*事件流 2
*--------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT .

*--------------------------------------------------------------------*
*事件流 3
*--------------------------------------------------------------------*
AT SELECTION-SCREEN.

*--------------------------------------------------------------------*
*事件流  4
*--------------------------------------------------------------------*

START-OF-SELECTION.
   PERFORM frm_get_data. "获取数据
   PERFORM frm_display. "数据展示

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

*获取发票凭证
   SELECT vbrp~vbeln                 ,
          vbrp~posnr                 ,
          acdoca~rbukrs AS bukrs     ,
          acdoca~gjahr               ,
          acdoca~poper AS monat      ,
          acdoca~wsl                 ,
          acdoca~racct               ,
          acdoca~blart               ,
          vbrk~belnr                 ,
          vbrk~ktgrd                 ,
          vbrp~vgbel                 ,
          vbrp~vgpos                 ,
          vbrp~aubel                 ,
          vbrp~aupos                 ,
          vbrp~prctr                 ,
          vbrp~vkorg_auft            ,
          vbrp~kunrg_ana             ,
          vbrp~matnr                 ,
          vbrp~arktx                 ,
          vbrp~werks                 ,
          vbrp~matkl                 ,
          vbrp~ktgrm                 ,
          vbrp~fkimg                 ,
          vbrk~sfakn                 ,
          vbrp~shkzg
*         substring( likp~wadat_ist , 1 ,4 )  AS gjahr1,
*         substring( likp~wadat_ist , 5 ,2 )  AS monat1
     FROM acdoca
     JOIN vbrp ON acdoca~awref = vbrp~vbeln AND acdoca~awitem = vbrp~posnr
     JOIN vbrk ON acdoca~awref = vbrk~vbeln
     JOIN likp ON vbrp~vgbel = likp~vbeln
    WHERE acdoca~rbukrs = @p_bukrs
      AND acdoca~gjahr = @p_gjahr
      AND acdoca~poper = @p_monat
*     AND substring( likp~wadat_ist , 1 ,4 ) = @p_gjahr
*     AND substring( likp~wadat_ist , 5 ,2 ) = @p_monat
      AND acdoca~blart IN ('RV','ML')
      INTO CORRESPONDING FIELDS OF TABLE @gt_alv.

*     AND vbrp~shkzg = ''
*  AND vbrk~sfakn = ''.

   IF gt_alv IS NOT INITIAL.

     DATA:lr_range LIKE RANGE OF vbrk-vbeln.
     DATA:lrs_range LIKE LINE  OF lr_range.
*排除被冲销的数据
     CLEAR:lr_range,lrs_range.
     LOOP AT  gt_alv INTO gs_alv  WHERE  sfakn <> ''.
       APPEND VALUE #( sign  = 'I'  option  = 'EQ'  low  = gs_alv-sfakn ) TO lr_range.
       APPEND VALUE #( sign  = 'I'  option  = 'EQ'  low  = gs_alv-vbeln ) TO lr_range.
     ENDLOOP.
     DELETE gt_alv WHERE vbeln IN lr_range.


     "销售组织描述
     SELECT spras,
            vkorg,
            vtext
       INTO TABLE @DATA(lt_tvkot)
       FROM tvkot
        FOR ALL ENTRIES IN @gt_alv
      WHERE vkorg = @gt_alv-vkorg_auft
     AND spras = @sy-langu.
     SORT lt_tvkot BY vkorg.

     "客户名称
     SELECT kunnr,
            name1
       INTO TABLE @DATA(lt_kna1)
       FROM kna1
        FOR ALL ENTRIES IN @gt_alv
     WHERE kunnr = @gt_alv-kunrg_ana.
     SORT lt_kna1 BY kunnr.

     "客户科目组名称
     SELECT spras,
            ktgrd,
            vtext
       INTO TABLE @DATA(lt_tvktt)
       FROM tvktt
        FOR ALL ENTRIES IN @gt_alv
      WHERE ktgrd = @gt_alv-ktgrd
     AND spras = @sy-langu.
     SORT lt_tvktt BY ktgrd.

     "物料组描述
     SELECT matkl,
            wgbez,
            spras
       INTO TABLE @DATA(lt_t023t)
       FROM t023t
        FOR ALL ENTRIES IN @gt_alv
      WHERE matkl = @gt_alv-matkl
     AND spras = @sy-langu.
     SORT lt_t023t BY matkl.

     "物料科目设置组描述
     SELECT ktgrm,
            vtext
       INTO TABLE @DATA(lt_tvkmt)
       FROM tvkmt
        FOR ALL ENTRIES IN @gt_alv
      WHERE ktgrm = @gt_alv-ktgrm
        AND spras = @sy-langu.
     SORT lt_tvkmt BY ktgrm.

     "交货数量、开票状态
     SELECT lips~vbeln,
            lips~posnr,
            lips~lfimg,
            lips~fksta,
            lips~fkivp,
            likp~lfart,
            likp~wadat_ist
       INTO TABLE @DATA(lt_lips)
       FROM lips
       JOIN likp ON lips~vbeln = likp~vbeln
        FOR ALL ENTRIES IN @gt_alv
      WHERE lips~vbeln = @gt_alv-vgbel
     AND lips~posnr = @gt_alv-vgpos.
     SORT lt_lips BY vbeln posnr.


*&&&---数据处理
*发出商品差异总额
*    LOOP AT gt_alv INTO gs_alv WHERE blart = 'ML' AND racct = '1407010001'.
*      gv_wsl = gv_wsl + gs_alv-wsl.
*      CLEAR:gs_alv.
*    ENDLOOP.

     DATA:lv_fkimg TYPE vbrp-fkimg,        "开票数量
          lv_lfimg TYPE lips-lfimg.        "交货数量

     gt_data = gt_alv.
     SORT gt_data BY vbeln posnr.
     DELETE ADJACENT DUPLICATES FROM gt_data COMPARING vbeln posnr.
     SORT gt_data BY bukrs gjahr monat matnr werks vkorg_auft ktgrd ktgrm.
     LOOP AT gt_data INTO gs_data.
       "销售组织描述
       READ TABLE lt_tvkot INTO DATA(ls_tvkot) WITH KEY vkorg = gs_data-vkorg_auft BINARY SEARCH.
       IF sy-subrc = 0.
         gs_data-vtext = ls_tvkot-vtext.
         CLEAR:ls_tvkot.
       ENDIF.

       ""客户名称
       READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = gs_data-kunrg_ana BINARY SEARCH.
       IF sy-subrc = 0.
         gs_data-name1 = ls_kna1-name1.
         CLEAR:ls_kna1.
       ENDIF.

       "客户科目组名称
       READ TABLE lt_tvktt INTO DATA(ls_tvktt) WITH KEY ktgrd = gs_data-ktgrd BINARY SEARCH.
       IF sy-subrc = 0.
         gs_data-vtext2 = ls_tvktt-vtext.
         CLEAR:ls_tvktt.
       ENDIF.

       "物料组描述
       READ TABLE lt_t023t INTO DATA(ls_t023t) WITH KEY matkl = gs_data-matkl BINARY SEARCH.
       IF sy-subrc = 0.
         gs_data-wgbez = ls_t023t-wgbez.
         CLEAR:ls_t023t.
       ENDIF.

       "物料科目设置组描述
       READ TABLE lt_tvkmt INTO DATA(ls_tvkmt) WITH KEY ktgrm = gs_data-ktgrm BINARY SEARCH.
       IF sy-subrc = 0.
         gs_data-vtext3 = ls_tvkmt-vtext.
         CLEAR:ls_tvkmt.
       ENDIF.

       "交货数量、开票状态
       READ TABLE lt_lips INTO  DATA(ls_lips) WITH KEY vbeln = gs_data-vgbel posnr = gs_data-vgpos BINARY SEARCH.
       IF sy-subrc = 0.
         gs_data-lfimg = ls_lips-lfimg.
         IF ls_lips-lfart = 'NLCC'.
           gs_data-fksta = ls_lips-fkivp.
         ELSE.
           gs_data-fksta = ls_lips-fksta.

         ENDIF.
*增加交货年度
         gs_data-gjahr1  = ls_lips-wadat_ist+(4).
         gs_data-monat1  = ls_lips-wadat_ist+4(2).
         CLEAR:ls_lips.
       ENDIF.

*      "发出商品差异
*      gs_data-wsl1 = gv_wsl.

       MODIFY gt_data FROM gs_data.
       CLEAR:gs_data.
     ENDLOOP.


     DATA(lt_alv)   = gt_data.
     SORT lt_alv BY  bukrs gjahr1 monat1 werks matnr .
     DELETE ADJACENT DUPLICATES FROM lt_alv COMPARING bukrs gjahr1 monat1 werks matnr .

     SELECT
       a~monat1,
       rbukrs,
       acdoca~gjahr AS gjahr1,
       acdoca~werks,
       acdoca~matnr,
       SUM( acdoca~wsl ) AS wsl
       FROM acdoca
       INNER JOIN @lt_alv AS a ON  a~bukrs  = acdoca~rbukrs
                              AND  a~werks  = acdoca~werks
                              AND  a~matnr  = acdoca~matnr
                              AND  a~gjahr1  = acdoca~gjahr
                              AND  a~monat1  = substring( acdoca~poper , 2,2 )
       WHERE acdoca~blart  = 'ML'
       AND acdoca~racct = '1407010001'
       GROUP BY
       a~monat1,
       rbukrs,
       acdoca~gjahr,
       acdoca~werks,
       acdoca~matnr
       INTO TABLE @DATA(lt_acdo).

     LOOP AT  gt_data ASSIGNING FIELD-SYMBOL(<fs1>).
       READ   TABLE lt_acdo INTO DATA(ls_acdo) WITH KEY  rbukrs = <fs1>-bukrs
                                                         gjahr1  = <fs1>-gjahr1
                                                         werks  = <fs1>-werks
                                                         matnr  = <fs1>-matnr
                                                         monat1  = <fs1>-monat1 .
       IF  sy-subrc  = 0.
         <fs1>-wsl1  = ls_acdo-wsl.
       ENDIF.
       CLEAR ls_acdo.
     ENDLOOP.


     LOOP AT gt_data INTO gs_data.

       "开票数量加总
       lv_fkimg = lv_fkimg + gs_data-fkimg.
       "交货数量加总
       lv_lfimg = lv_lfimg + gs_data-lfimg.

       MOVE-CORRESPONDING gs_data TO gs_alv.
       CLEAR ls_acdo.
       READ TABLE  lt_acdo INTO ls_acdo WITH KEY  rbukrs  = gs_data-bukrs
                                                  gjahr1  = gs_data-gjahr1
                                                  monat1  = gs_data-monat1
                                                  matnr   = gs_data-matnr
                                                  werks   = gs_data-werks      .

       AT END OF ktgrm.

         "本期差异调整
         IF lv_lfimg <> 0.

           gs_data-wsl2 = ls_acdo-wsl * ( lv_fkimg / lv_lfimg ).
         ELSE.
           gs_data-wsl2 = 0.
         ENDIF.

         LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lv_data>) WHERE matnr = gs_alv-matnr
                                                               AND werks = gs_alv-werks
                                                               AND vkorg_auft = gs_alv-vkorg_auft
                                                               AND ktgrd = gs_alv-ktgrd
                                                               AND gjahr1 = gs_alv-gjahr1
                                                               AND monat1 = gs_alv-monat1
                                                               AND ktgrm = gs_alv-ktgrm.
           <lv_data>-wsl2 = gs_data-wsl2.

         ENDLOOP.
         CLEAR:lv_fkimg,lv_lfimg,gs_data.
       ENDAT.

     ENDLOOP.

   ENDIF.
   IF gt_data IS NOT INITIAL .

     SELECT * FROM ztfi013
       FOR ALL ENTRIES IN @gt_data
       WHERE  bukrs =  @gt_data-bukrs
      AND     gjahr =  @gt_data-gjahr
      AND     monat =  @gt_data-monat
      AND     vbeln =  @gt_data-vbeln
      AND     posnr =  @gt_data-posnr
       INTO TABLE @DATA(lt_fi013).

     SORT lt_fi013 BY   bukrs
                        gjahr
                        monat
                        vbeln
                        posnr.
     LOOP AT  gt_data ASSIGNING FIELD-SYMBOL(<data>).
       READ TABLE lt_fi013 INTO DATA(ls_013) WITH KEY bukrs  =  <data>-bukrs
                                                      gjahr  =  <data>-gjahr
                                                      monat  =  <data>-monat
                                                      vbeln  =  <data>-vbeln
                                                      posnr  =  <data>-posnr BINARY SEARCH.
       IF  sy-subrc  = 0.
         <data>-belnr1 = ls_013-belnr1.
         <data>-belnr2 = ls_013-belnr2.
       ENDIF.
       CLEAR ls_013.
     ENDLOOP.

     SORT gt_data BY vbeln posnr.
     CLEAR:gv_wsl.
     endif.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display .
   PERFORM frm_fieldcat.
   PERFORM frm_build_layout.
   PERFORM frm_alvout.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .
   REFRESH gt_fieldcat.
* 复选框
   CLEAR gs_fieldcat .
   gs_fieldcat-fieldname = 'CBOX' .
   gs_fieldcat-scrtext_l = '复选框' .
   gs_fieldcat-checkbox = 'X'.
   gs_fieldcat-edit = 'X'.
   gs_fieldcat-key = 'X'.
*  ls_fcat2-hotspot = 'X'.
   APPEND gs_fieldcat TO gt_fieldcat.

   init_fieldcat 'STATUS ' '状态灯' '' '' '' '' '' '' '' .
   init_fieldcat 'MSG ' '消息' '' '' '' '' '' '' '' .
   init_fieldcat 'BUKRS ' '公司代码' '' '' '' 'BKPF' 'BUKRS' '' '' .
   init_fieldcat 'GJAHR ' '开票会计年度' '' '' '' 'BKPF' 'GJAHR' '' '' .
   init_fieldcat 'MONAT ' '开票期间' '' '' '' 'BKPF' 'MONAT' '' '' .
   init_fieldcat 'VBELN ' '发票号' '' '' '' 'VBRP' 'VBELN' '' '' .
   init_fieldcat 'POSNR ' '发票行项目' '' '' '' 'VBRP' 'POSNR' '' '' .
   init_fieldcat 'BELNR ' '会计凭证' '' '' '' 'BKPF' 'BELNR' '' '' .
   init_fieldcat 'VGBEL ' '交货单号' '' '' '' 'LIPS' 'VBELN' '' '' .
   init_fieldcat 'VGPOS ' '交货单行项目' '' '' '' 'LIPS' 'POSNR' '' '' .
   init_fieldcat 'AUBEL ' '销售凭证' '' '' '' 'VBRP' 'AUBEL' '' '' .
   init_fieldcat 'AUPOS ' '销售凭证项目' '' '' '' 'VBRP' 'AUPOS' '' '' .
   init_fieldcat 'GJAHR1 ' '交货会计年度' '' '' '' 'BKPF' 'GJAHR' '' '' .
   init_fieldcat 'MONAT1 ' '交货期间' '' '' '' 'BKPF' 'MONAT' '' '' .

   init_fieldcat 'PRCTR ' '利润中心' '' '' '' 'VBRP' 'PRCTR' '' '' .
   init_fieldcat 'VKORG_AUFT ' '销售组织' '' '' '' 'VBRP' 'VKORG_AUFT' '' '' .
   init_fieldcat 'VTEXT ' '销售组织描述' '' '' '' 'TVKOT' 'VTEXT' '' '' .
   init_fieldcat 'KUNRG_ANA ' '客户' '' '' '' 'VBRP' 'KUNRG_ANA' '' '' .
   init_fieldcat 'NAME1 ' '客户名称' '' '' '' 'KNA1' 'NAME1' '' '' .
   init_fieldcat 'KTGRD ' '客户组科目' '' '' '' 'VBRK' 'KTGRD' '' '' .
   init_fieldcat 'VTEXT2 ' '客户科目组名称' '' '' '' 'TVKTT' 'VTEXT' '' '' .
   init_fieldcat 'MATNR ' '物料' '' '' '' 'VBRP' 'MATNR' '' '' .
   init_fieldcat 'ARKTX ' '物料描述' '' '' '' 'VBRP' 'ARKTX' '' '' .
   init_fieldcat 'WERKS ' '工厂' '' '' '' 'VBRP' 'WERKS' '' '' .
   init_fieldcat 'MATKL ' '物料组' '' '' '' 'VBRP' 'MATKL' '' '' .
   init_fieldcat 'WGBEZ ' '物料组描述' '' '' '' '' '' '' '' .
   init_fieldcat 'KTGRM ' '物料科目设置组' '' '' '' 'VBRP' 'KTGRM' '' '' .
   init_fieldcat 'VTEXT3 ' '物料科目设置组描述' '' '' '' 'VBRP' 'VTEXT' '' '' .
   init_fieldcat 'FKIMG ' '开票数量' '' '' '' 'VBRP' 'KTGRM' '' '' .
   init_fieldcat 'LFIMG ' '交货数量' '' '' '' 'LIPS' 'LFIMG' '' '' .
   init_fieldcat 'FKSTA ' '开票状态' '' '' '' 'LIPS' 'FKSTA' '' '' .
   init_fieldcat 'WSL1 ' '发出商品差异' '' '' '' 'ACDOCA' 'WSL' '' '' .
   init_fieldcat 'WSL2 ' '本期调整差异' '' '' '' 'ACDOCA' 'WSL' '' '' .
   init_fieldcat 'BELNR1 ' '调整凭证' '' '' '' 'BKPF' 'BELNR' '' '' .
   init_fieldcat 'BELNR2 ' '冲销凭证' '' '' '' 'BKPF' 'BELNR' '' '' .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_build_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_build_layout .
   CLEAR gs_layout.
   gs_layout-sel_mode = 'A'.   "设置选择模式"
   gs_layout-cwidth_opt = 'X'.  "优化列宽设置"
   gs_layout-zebra = 'X'.       "设置斑马线"
*  gs_layout-box_fname = 'CBOX'. "行可选中
   gs_layout-no_toolbar = 'X'. "隐藏工具栏。
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_alvout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_alvout .
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
     EXPORTING
*     i_grid_title             = r_title
       i_callback_program       = sy-repid
       is_layout_lvc            = gs_layout
       it_fieldcat_lvc          = gt_fieldcat
*     it_event_exit            = gt_event_exit[]
*     I_GRID_SETTINGS          = GW_LVC_S_GLAY
       i_callback_pf_status_set = 'PF_STATUS_SET'
       i_callback_user_command  = 'USER_COMMAND'
       i_default                = 'X'
       i_save                   = 'A'
     TABLES
       t_outtab                 = gt_data
     EXCEPTIONS
       program_error            = 1
       OTHERS                   = 2.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  PF_STATUS_SET
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
   SET PF-STATUS 'STANDARD'. "自定义状态名称

ENDFORM.

*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                             rs_selfield TYPE slis_selfield.

   DATA: lo_grid TYPE REF TO cl_gui_alv_grid.

   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
     IMPORTING
       e_grid = lo_grid.  "获取全局变量

   CALL METHOD lo_grid->check_changed_data. "获取响应事件

   CASE r_ucomm.
     WHEN 'ZPOST'.
       PERFORM frm_zpost.
     WHEN 'ZCX'.
       PERFORM frm_zcx.
   ENDCASE.

   CALL METHOD lo_grid->check_changed_data. "获取响应事件
   rs_selfield-refresh = 'X'.                "刷新界面
   rs_selfield-col_stable = 'X'.
   rs_selfield-row_stable = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_zpost
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_zpost.
*&---BAPI变量定义
   DATA:ls_documentheader    TYPE bapiache09, "抬头
        lt_accountgl         TYPE STANDARD TABLE OF bapiacgl09, "总账
        ls_accountgl         TYPE bapiacgl09,
        lt_accountreceivable TYPE STANDARD TABLE OF bapiacar09, "客户
        ls_accountreceivable TYPE bapiacar09,
        lt_accountpayable    TYPE STANDARD TABLE OF bapiacap09, "供应商
        ls_accountpayable    TYPE bapiacap09,
        lt_currencyamount    TYPE STANDARD TABLE OF bapiaccr09, "金额
        ls_currencyamount    TYPE bapiaccr09,
        lt_tax               TYPE STANDARD TABLE OF bapiactx09, "税
        ls_tax               TYPE bapiactx09,
        lt_copac             TYPE STANDARD TABLE OF bapiackec9, "CO-PA 科目分配特性
        ls_copac             TYPE bapiackec9,
        lt_copav             TYPE STANDARD TABLE OF bapiackev9, "CO-PA 科目分配值字段
        ls_copav             TYPE bapiackev9,
        lt_extension2        TYPE STANDARD TABLE OF bapiparex,  "增强字段
        ls_extension2        TYPE bapiparex,
        ls_zsfi_bseg         TYPE zsfi_bseg,
        lt_return            TYPE STANDARD TABLE OF bapiret2,   "返回消息
        ls_return            TYPE bapiret2,
        lv_key               TYPE bapiache09-obj_key,           "返回凭证号
        lv_msg               TYPE bapi_msg,
        lv_msg2              TYPE bapi_msg,
        lt_mwdat             TYPE TABLE OF  rtax1u15, "税计算
        ls_mwdat             TYPE rtax1u15.

   DATA:lv_date TYPE sy-datum.
   lv_date = p_gjahr && p_monat && '00'.
* 获取本月最后一天
   CALL FUNCTION 'LAST_DAY_OF_MONTHS'
     EXPORTING
       day_in            = lv_date       " 输入日期 20140101
     IMPORTING
       last_day_of_month = lv_date        "返回日期:20140131
     EXCEPTIONS
       day_in_no_date    = 1
       OTHERS            = 2.

   IF gt_data IS NOT INITIAL .
     SELECT vkorg,
            ktgrd,
            ktgrm,
            sakn2
       INTO TABLE @DATA(lt_c001)
       FROM c001
        FOR ALL ENTRIES IN @gt_data
      WHERE vkorg = @gt_data-vkorg_auft
        AND ktgrd = @gt_data-ktgrd
        AND ktgrm = @gt_data-ktgrm
        AND kschl = 'KOFI'
        AND ktopl = 'ZUCH'
        AND kvsl1 = 'ZV1'.

       SORT lt_c001 BY vkorg ktgrd ktgrm.
     ENDIF.
*检查会计凭证是否存在
     IF gt_data IS NOT INITIAL.

       "冲销凭证
*    SELECT BUKRS,
*           BELNR,
*           GJAHR,
*           STBLG
*      INTO TABLE @DATA(lt_bkpf)
*      FROM bkpf
*       FOR ALL ENTRIES IN @gt_data
*     WHERE bukrs = @gt_data-bukrs
*       AND gjahr = @gt_data-gjahr
*       AND belnr = @gt_data-belnr.
*     SORT lt_bkpf by bukrs gjahr belnr.
     ENDIF.

     IF gt_data IS NOT INITIAL.
       SELECT bukrs,
              gjahr,
              monat,
              vbeln,
              posnr,
              belnr1,
              belnr2
         INTO TABLE @DATA(lt_log)
         FROM ztfi013
          FOR ALL ENTRIES IN @gt_data
        WHERE bukrs = @gt_data-bukrs
          AND gjahr = @gt_data-gjahr
          AND monat = @gt_data-monat
          AND vbeln = @gt_data-vbeln
          AND posnr = @gt_data-posnr.
         SORT lt_log BY bukrs gjahr monat vbeln posnr.
       ENDIF.
*抬头数据
       " 公司代码
       ls_documentheader-username = sy-uname.
       ls_documentheader-comp_code = p_bukrs.
       " 凭证日期
       ls_documentheader-doc_date = lv_date.
       " 过账日期
       ls_documentheader-pstng_date = lv_date.
       " 凭证类型
       ls_documentheader-doc_type = 'SU'.
       " 过账期间
       ls_documentheader-fis_period = p_monat.
*  " 参考凭证号
*  ls_documentheader-ref_doc_no = ls_head-xblnr.
       " 凭证抬头文本
       ls_documentheader-header_txt = p_monat && '月发出商品差异调整'.

*数据执行
       MOVE-CORRESPONDING gt_data TO gt_data2.
       SORT gt_data2 BY vbeln posnr.
       LOOP AT gt_data2 INTO gs_data2 WHERE cbox = 'X'.
         READ TABLE lt_log INTO DATA(ls_log) WITH KEY bukrs = gs_data-bukrs gjahr = gs_data-gjahr monat = gs_data-monat
                                                      vbeln = gs_data-vbeln posnr = gs_data-posnr BINARY SEARCH.
         IF sy-subrc = 0.
           IF ls_log-belnr1 IS NOT INITIAL AND ls_log-belnr2 IS  INITIAL.
             gs_data2-status = icon_red_light."红灯
             gs_data2-msg = '请先冲销调整凭证!'.

             MODIFY gt_data2 FROM gs_data2.
             CONTINUE.
           ENDIF.
         ENDIF.

         CLEAR:gs_alv.
         MOVE-CORRESPONDING gs_data2 TO gs_alv.
         AT END OF vbeln.

*行项目数据1

           "行项目编号
           ls_zsfi_bseg-posnr = '10'.
           "记账码
           IF gs_alv-wsl2 < 0.
             ls_zsfi_bseg-bschl = '40'.
           ELSE.
             ls_zsfi_bseg-bschl = '50'.
           ENDIF.

           ls_extension2-structure = 'ZSFI_BSEG'.
           ls_extension2-valuepart1 = ls_zsfi_bseg. " ZSFI_BSEG超出240位就放VALUEPART2/3/4
           APPEND ls_extension2 TO lt_extension2.


           CLEAR:ls_accountgl.
           " 行项目编号
           ls_accountgl-itemno_acc = '10'.
           "总账科目
           ls_accountgl-gl_account = '1407010001'.
           " 利润中心
           ls_accountgl-profit_ctr = gs_alv-prctr.
           "分配编号
           ls_accountgl-alloc_nmbr = gs_alv-matnr.
           "项目文本
           ls_accountgl-item_text = gs_alv-arktx.
           APPEND ls_accountgl TO lt_accountgl.
           CLEAR:ls_accountgl.
*金额
           CLEAR:ls_currencyamount.
           " 行项目编号
           ls_currencyamount-itemno_acc = '10'.
           " 货币码
           ls_currencyamount-currency = 'CNY'.
           " 交易货币金额
           IF   gs_alv-wsl2 < 0.
             ls_currencyamount-amt_doccur = abs( gs_alv-wsl2 ).

           ELSE.
             ls_currencyamount-amt_doccur =  -1 * abs( gs_alv-wsl2 ).
           ENDIF.
           APPEND ls_currencyamount TO lt_currencyamount.

*行项目数据2
           "行项目编号
           ls_zsfi_bseg-posnr = '20'.
           "记账码
           IF gs_alv-wsl2 < 0.
             ls_zsfi_bseg-bschl = '50'.
           ELSE.
             ls_zsfi_bseg-bschl = '40'.
           ENDIF.

           ls_extension2-structure = 'ZSFI_BSEG'.
           ls_extension2-valuepart1 = ls_zsfi_bseg. " ZSFI_BSEG超出240位就放VALUEPART2/3/4
           APPEND ls_extension2 TO lt_extension2.


           " 行项目编号
           ls_accountgl-itemno_acc = '20'.
           "总账科目
           READ TABLE lt_c001 INTO DATA(ls_c001) WITH KEY vkorg = gs_alv-vkorg_auft ktgrd = gs_alv-ktgrd ktgrm = gs_alv-ktgrm BINARY SEARCH.
           IF sy-subrc = 0.
             ls_accountgl-gl_account = ls_c001-sakn2.
             CLEAR:ls_c001.
           ENDIF.
           " 利润中心
           ls_accountgl-profit_ctr = gs_alv-prctr.
           "分配编号
           ls_accountgl-alloc_nmbr = gs_alv-matnr.
           "项目文本
           ls_accountgl-item_text = gs_alv-arktx.
           APPEND ls_accountgl TO lt_accountgl.
           CLEAR:ls_accountgl.
*金额
           CLEAR:ls_currencyamount.
           " 行项目编号
           ls_currencyamount-itemno_acc = '20'.
           " 货币码
           ls_currencyamount-currency = 'CNY'.
           " 交易货币金额
           IF   gs_alv-wsl1 > 0.
             ls_currencyamount-amt_doccur = abs( gs_alv-wsl2 ).
           ELSE.
             ls_currencyamount-amt_doccur =  -1 * abs( gs_alv-wsl2 ).
           ENDIF.

           APPEND ls_currencyamount TO lt_currencyamount.

           CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
             EXPORTING
               documentheader    = ls_documentheader
             IMPORTING
               obj_key           = lv_key
             TABLES
               accountgl         = lt_accountgl
               accountreceivable = lt_accountreceivable
               accountpayable    = lt_accountpayable
               accounttax        = lt_tax
               currencyamount    = lt_currencyamount
               criteria          = lt_copac
               valuefield        = lt_copav
               extension2        = lt_extension2
               return            = lt_return.
           CLEAR:lv_msg.
           LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A'.
             CLEAR:lv_msg2.
             CALL FUNCTION 'MESSAGE_TEXT_BUILD'
               EXPORTING
                 msgid               = ls_return-id
                 msgnr               = ls_return-number
                 msgv1               = ls_return-message_v1
                 msgv2               = ls_return-message_v2
                 msgv3               = ls_return-message_v3
                 msgv4               = ls_return-message_v4
               IMPORTING
                 message_text_output = lv_msg2.
             lv_msg = |{ lv_msg }/{ lv_msg2 }|.
           ENDLOOP.
           IF lv_msg IS NOT INITIAL .
             CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
             LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<lv_data1>) WHERE vbeln = gs_alv-vbeln.

               <lv_data1>-status = icon_red_light."红灯
               <lv_data1>-msg = lv_msg.
             ENDLOOP.
           ELSE.
             CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
               EXPORTING
                 wait = 'X'.
             LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<lv_data2>) WHERE vbeln = gs_alv-vbeln .

               <lv_data2>-status = icon_green_light."绿灯
               <lv_data2>-msg = '会计凭证创建成功!'.
               <lv_data2>-belnr1 = lv_key+0(10).
             ENDLOOP.
             "o_resp-sapnum = lv_key+0(10).
           ENDIF.

           CLEAR:ls_zsfi_bseg,lt_extension2,lt_return,lt_accountgl,ls_accountgl,lt_currencyamount,ls_currencyamount.
         ENDAT.

       ENDLOOP.

*存表
       CLEAR:gt_data.
       MOVE-CORRESPONDING gt_data2 TO gt_data.
       DELETE gt_data2 WHERE cbox <> 'X'.
       MOVE-CORRESPONDING gt_data2 TO gt_fi013.
       MODIFY ztfi013 FROM TABLE gt_fi013.
       COMMIT WORK.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_zcx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_zcx.
   DATA : l_bkpf    TYPE bkpf.
   DATA : l_reversal TYPE bapiacrev,
          l_bus_act  TYPE bapiache09-bus_act,
          l_obj_key  TYPE bapiacrev-obj_key,
          gt_return  TYPE TABLE OF bapiret2 WITH HEADER LINE,
          i_return   TYPE bapiret2.


   IF gt_data IS NOT INITIAL.
     SELECT bukrs,
            gjahr,
            monat,
            vbeln,
            posnr,
            belnr1,
            belnr2
       INTO TABLE @DATA(gt_log)
       FROM ztfi013
        FOR ALL ENTRIES IN @gt_data
      WHERE bukrs = @gt_data-bukrs
        AND gjahr = @gt_data-gjahr
        AND monat = @gt_data-monat
        AND vbeln = @gt_data-vbeln
        AND posnr = @gt_data-posnr.
       SORT gt_log BY bukrs gjahr monat vbeln posnr.
     ENDIF.
     CLEAR:gt_data2[].
     MOVE-CORRESPONDING gt_data TO gt_data2.
     LOOP AT gt_data2 INTO gs_data2 WHERE cbox = 'X'.
       "校验日志
       READ TABLE gt_log INTO DATA(gs_log) WITH KEY bukrs = gs_data2-bukrs gjahr = gs_data2-gjahr monat = gs_data2-monat
                                                      vbeln = gs_data2-vbeln posnr = gs_data2-posnr BINARY SEARCH.
       IF sy-subrc = 0.
         IF gs_log-belnr1 IS INITIAL.
           gs_data2-status = icon_red_light."红灯
           gs_data2-msg = '未进行调整,不允许冲销!'.

           MODIFY gt_data2 FROM gs_data2.
           CONTINUE.
         ENDIF.
       ENDIF.

       CLEAR:gs_alv.
       MOVE-CORRESPONDING gs_data2 TO gs_alv.
       AT END OF vbeln.

         SELECT SINGLE * FROM bkpf INTO l_bkpf WHERE bukrs = gs_alv-bukrs
                                               AND   belnr = gs_alv-belnr1
                                               AND   gjahr = gs_alv-gjahr
                                               AND   xreversal = ''.

           IF sy-subrc <> 0.

             LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<ls_data3>) WHERE vbeln = gs_alv-vbeln.

               <ls_data3>-status = icon_red_light."红灯
               <ls_data3>-msg = '没有数据或该凭证已冲销!'.
             ENDLOOP.

           ELSE.

             l_reversal-obj_type     = l_bkpf-awtyp.
             l_reversal-obj_key_r    = l_bkpf-awkey.
             l_reversal-pstng_date   = l_bkpf-budat.
             l_reversal-fis_period   = l_bkpf-monat.
             l_reversal-comp_code    = l_bkpf-bukrs.
*          l_reversal-ac_doc_no    = l_bkpf-belnr.
             l_reversal-reason_rev   = '03'.

*   取得系统 LOGICAL SYSTEM
             CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
               IMPORTING
                 own_logical_system = l_reversal-obj_sys.


             CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
               EXPORTING
                 reversal = l_reversal
                 bus_act  = l_bkpf-glvor
*         IMPORTING
*               OBJ_TYPE =
                 obj_key  = l_obj_key
*               OBJ_SYS  =
               TABLES
                 return   = gt_return.

             READ TABLE gt_return WITH KEY type = 'E'.
             IF sy-subrc = 0.
               CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
               LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<ls_data1>) WHERE vbeln = gs_alv-vbeln.

                 <ls_data1>-status = icon_red_light."红灯
                 <ls_data1>-msg = '冲销失败!'.
               ENDLOOP.
             ELSE.
               CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                 EXPORTING
                   wait = 'X'.
               LOOP AT gt_data2 ASSIGNING FIELD-SYMBOL(<ls_data2>) WHERE vbeln = gs_alv-vbeln .

                 <ls_data2>-status = icon_green_light."绿灯
                 <ls_data2>-msg = '冲销成功!'.
                 <ls_data2>-belnr2 = l_obj_key(10).
               ENDLOOP.
             ENDIF.
           ENDIF.
           CLEAR:gt_return,l_obj_key,l_bkpf,l_reversal.
         ENDAT.

       ENDLOOP.

*存表
       CLEAR:gt_data.
       MOVE-CORRESPONDING gt_data2 TO gt_data.
       DELETE gt_data2 WHERE cbox <> 'X'.
       MOVE-CORRESPONDING gt_data2 TO gt_fi013.
       MODIFY ztfi013 FROM TABLE gt_fi013.
       COMMIT WORK.
ENDFORM.
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值