SAP 原币科目余额表

 查看利润分配-未分配利润的科目配置

SPRO

搜索:定义留存收益

双击

 查看

 输入:LXCA

显示:41040112

 或者:OB53

开发区导测试数据

DATA gt_data TYPE TABLE OF skat.

gt_data = VALUE #(
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022020406'  TXT20 = '应付账款-暂估-租赁-非关系人'  TXT50 = '应付账款-暂估-租赁-非关系人'  MCOD1 = '应付账款-暂估-租赁-非关系人' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022020407'  TXT20 = '应付账款-暂估-租赁-关系人'  TXT50 = '应付账款-暂估-租赁-关系人'  MCOD1 = '应付账款-暂估-租赁-关系人' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022020501'  TXT20 = '应付账款-租赁-非关系人'  TXT50 = '应付账款-租赁-非关系人'  MCOD1 = '应付账款-租赁-非关系人' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022020502'  TXT20 = '应付账款-租赁-关系人'  TXT50 = '应付账款-租赁-关系人'  MCOD1 = '应付账款-租赁-关系人' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022029001'  TXT20 = '应付账款-非关系人TIPTOP'  TXT50 = '应付账款-非关系人TIPTOP'  MCOD1 = '应付账款-非关系人TIPTOP' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022029002'  TXT20 = '应付账款-关系人TIPTOP'  TXT50 = '应付账款-关系人TIPTOP'  MCOD1 = '应付账款-关系人TIPTOP' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022029003'  TXT20 = '应付账款-暂估-非关系人TIPTOP'  TXT50 = '应付账款-暂估-非关系人TIPTOP'  MCOD1 = '应付账款-暂估-非关系人TIPTOP' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022029004'  TXT20 = '应付账款-暂估-关系人TIPTOP'  TXT50 = '应付账款-暂估-关系人TIPTOP'  MCOD1 = '应付账款-暂估-关系人TIPTOP' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022029801'  TXT20 = '应付账款-设备款-外币评价'  TXT50 = '应付账款-设备款-外币评价'  MCOD1 = '应付账款-设备款-外币评价' )
( SPRAS = '1'  KTOPL = 'LXCA'  SAKNR = '0022029901'  TXT20 = '应付账款-外币评价'  TXT50 = '应付账款-外币评价'  MCOD1 = '应付账款-外币评价' )
).

"cl_demo_output=>display( gt_data ). "显示内表

MODIFY SKAT FROM TABLE gt_data. "添加内表

"DELETE FROM skat WHERE KTOPL = 'LXCA'. "删除

DATA gt_data1 TYPE TABLE OF SKAT.
DATA gs_data TYPE SKAT.

gs_data-SPRAS = '1'.          ""语言代码
gs_data-KTOPL = 'LXCA'.          ""科目表
gs_data-SAKNR = '22020402'.          ""总账科目编号
gs_data-TXT20 = '应付账款-暂估-关系人'.          ""总帐科目名称
gs_data-TXT50 = '应付账款-暂估-关系人'.          ""总账科目长文本 "

APPEND  gs_data TO gt_data1.
MODIFY SKAT FROM TABLE gt_data1.
DATA gt_data TYPE TABLE OF SKA1.
DATA gs_data TYPE SKA1.

gs_data-MANDT = '110'.          ""集团
gs_data-KTOPL = 'LXCA'.          ""科目表
gs_data-SAKNR = '22020403'.          ""总账科目编号
gs_data-KTOKS = 'GL'.          ""总账科目组 "

APPEND  gs_data TO gt_data.
MODIFY SKA1 FROM TABLE gt_data.
DATA gt_data1 TYPE TABLE OF bseg.
DATA gs_data TYPE bseg.

gs_data-MANDT = '110'.            ""集团
gs_data-BUKRS = 'C111'.            ""公司代码
gs_data-GJAHR = '2022'.            ""会计年度
gs_data-BUZEI = 13 .            ""序号
gs_data-H_MONAT = '1'.          ""会计期间
gs_data-HKONT = '22020402'.            ""总账科目
gs_data-SHKZG = 'H'.            ""借方/贷方标识
gs_data-H_WAERS = 'CNY'.          ""货币码
gs_data-WRBTR = 20 . "10 * 6.            ""凭证货币金额
gs_data-DMBTR = 20 . "60 * 6.            ""按本位币计的金额"

APPEND  gs_data TO gt_data1.
MODIFY bseg FROM TABLE gt_data1.

其他方法

  "直接取“ BKPF  总帐科目主记录 (科目表)”里的年份,不能卡年份条件
  SELECT  bukrs , gjahr FROM BKPF  WHERE  bukrs IN @s_bukrs
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  CLEAR gt_where1.
  LOOP AT gt_data1 INTO gs_data1  .
    COLLECT gs_data1 INTO gt_where1 .
  ENDLOOP.


"相当于,要加DISTINCT 除重
  SELECT DISTINCT bukrs , gjahr FROM BKPF  WHERE  bukrs IN @s_bukrs
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

 累计余额不能用这种方法改

*------------------------------------------"本币余额 求和"-------------------------

  "求和:余额本币
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1.
    CLEAR gs_data2.
    gs_data2-mandt = gs_data1-mandt.                   ""集团
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.                   ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.               ""会计期间
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumye_dmbtr = gs_data1-ye_dmbtr.          ""求和:余额本币
    gs_data2-sumlj_dmbtr = gs_data1-lj_dmbtr.          ""求和:累计余额本币"
    COLLECT gs_data2 INTO gt_where1 .
  ENDLOOP.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  CLEAR gs_data2.
  gs_data2-ye_wrbtr = 0.          ""余额原币
  gs_data2-ye_dmbtr = 0.          ""余额本币
  gs_data2-lj_wrbtr = 0.          ""累计余额原币
  gs_data2-lj_dmbtr = 0.          ""累计余额本币"
  LOOP AT gt_where1 INTO gs_data1  .
    IF gs_data1-sumye_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING ye_wrbtr ye_dmbtr
          WHERE mandt = gs_data1-mandt
          AND bukrs = gs_data1-bukrs
          AND gjahr = gs_data1-gjahr
          AND h_monat = gs_data1-h_monat
          AND hkont = gs_data1-hkont .
    ENDIF.
    IF gs_data1-sumlj_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING lj_wrbtr lj_dmbtr
         WHERE mandt = gs_data1-mandt
         AND bukrs = gs_data1-bukrs
         AND gjahr = gs_data1-gjahr
         AND h_monat = gs_data1-h_monat
         AND hkont = gs_data1-hkont .
    ENDIF.
  ENDLOOP.


"循环取值
  LOOP AT gt_report1 INTO gs_report1  .
    gs_where-bukrs = gs_report1-bukrs.            ""公司代码
    gs_where-hkont =  gs_report1-hkont.            ""总账科目
    gs_where-h_waers =  gs_report1-h_waers .          ""币种"
    i = i + 1 .
    COLLECT gs_where INTO gt_where .
  ENDLOOP.

  LOOP AT gt_where INTO gs_where  .

    LOOP AT gt_report1 INTO gs_report1 WHERE  bukrs = gs_where-bukrs  AND  hkont = gs_where-hkont AND h_waers = gs_where-h_waers  .
      db_wrbtr =  db_wrbtr +  gs_report1-ye_wrbtr  .
      db_dmbtr = db_dmbtr  + gs_report1-ye_dmbtr .
      gs_report1-lj_wrbtr  = db_wrbtr .
      gs_report1-lj_dmbtr  = db_dmbtr .
      MODIFY gt_report1 FROM gs_report1  TRANSPORTING lj_wrbtr  lj_dmbtr .
    ENDLOOP.
  ENDLOOP.
*------------------------------------------"年初余额"-------------------------
  SORT gt_report1 DESCENDING BY mandt bukrs gjahr h_monat hkont h_waers .
  CLEAR wa_report1.
  CLEAR gs_data.
  LOOP AT gt_report1 INTO gs_report1  .
    IF NOT (  wa_report1-bukrs  = gs_report1-bukrs AND wa_report1-gjahr  = gs_report1-gjahr AND wa_report1-hkont  = gs_report1-hkont AND wa_report1-h_waers  = gs_report1-h_waers ) .
      gs_data-bukrs = gs_report1-bukrs.              ""公司代码
      gs_data-gjahr = gs_report1-gjahr.              ""会计年度
      gs_data-h_monat = gs_report1-h_monat.          ""会计期间
      gs_data-hkont = gs_report1-hkont.              ""总账科目
      gs_data-h_waers = gs_report1-h_waers.          ""币种
      gs_data-wrbtr = gs_report1-lj_wrbtr.           ""累计借方发生额原币
      gs_data-dmbtr = gs_report1-lj_dmbtr.           ""累计借方发生额本币
      APPEND gs_data TO gt_beg .
      wa_report1-bukrs  = gs_report1-bukrs .
      wa_report1-gjahr  = gs_report1-gjahr .
      wa_report1-hkont  = gs_report1-hkont .
      wa_report1-h_waers  = gs_report1-h_waers .
    ENDIF.
  ENDLOOP.

  LOOP AT gt_report1 INTO gs_report1  .
    CLEAR gs_data.
    READ TABLE gt_beg INTO gs_data WITH KEY bukrs = gs_report1-bukrs   gjahr = gs_report1-gjahr - 1   hkont = gs_report1-hkont   h_waers = gs_report1-h_waers  .
    IF sy-subrc = 0 .
      gs_report1-qc_wrbtr  = gs_data-wrbtr .
      gs_report1-qc_dmbtr  = gs_data-dmbtr .
      MODIFY gt_report1 FROM gs_report1  TRANSPORTING qc_wrbtr  qc_dmbtr .
    ENDIF.
  ENDLOOP.
  SELECT
      bseg~mandt,            ""集团
      bseg~bukrs,            ""公司代码
      bseg~h_waers,          ""货币码
      bseg~hkont,            ""总账科目
      skat~spras,            ""语言代码
      skat~ktopl,            ""科目表
      skat~saknr,            ""总账科目编号
      skat~txt20,            ""总帐科目名称
      skat~txt50,            ""总账科目长文本
      bseg~gjahr,            ""会计年度
      ska1~ktoks,            ""总账科目组
      bseg~h_monat,          ""会计期间
      bseg~wrbtr,            ""凭证货币金额
      bseg~dmbtr,            ""按本位币计的金额
      bseg~shkzg            ""借方/贷方标识"
  FROM bseg
    LEFT  JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
    LEFT  JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
    INTO CORRESPONDING FIELDS OF TABLE @gt_data1
  WHERE bukrs IN @s_bukrs  AND hkont IN @s_hkont. "公司代码/总账科目
    
     APPEND LINES OF gt_data1 TO gt_data3.
  SELECT
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      bseg~belnr,             ""会计凭证号码
      bseg~buzei,             ""会计凭证中的行项目数
      skat~spras,             ""语言代码
      skat~ktopl,             ""科目表
      skat~saknr,             ""总账科目编号
      skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      bseg~shkzg,             ""借方/贷方标识
      bseg~wrbtr,             ""凭证货币金额
      bseg~dmbtr,             ""按本位币计的金额
      faglflexa~wsl,          ""原交易货币的值(凭证货币)
      faglflexa~hsl          ""用本地货币表示的值 "
  FROM bseg
     LEFT JOIN faglflexa ON bseg~bukrs = faglflexa~rbukrs AND bseg~gjahr = faglflexa~ryear AND bseg~belnr = faglflexa~docnr AND bseg~buzei = faglflexa~buzei
     LEFT  JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
     LEFT  JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
     WHERE bukrs IN @s_bukrs  AND hkont IN @s_hkont"公司代码/总账科目
   UNION
      SELECT
      faglflexa~rclnt AS mandt,            ""集团
      faglflexa~rbukrs AS bukrs,           ""公司代码
      faglflexa~racct AS hkont,            ""科目号
      faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
      faglflexa~ryear AS gjahr,            ""会计年度
      bkpf~monat AS h_monat,          ""过账期间
      faglflexa~docnr AS belnr,            ""会计凭证号码
      faglflexa~buzei,            ""会计凭证中的行项目数
      skat~spras,                 ""语言代码
      skat~ktopl,                 ""科目表
      skat~saknr,                 ""总账科目编号
      skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk AS shkzg,            ""借方/贷方标识
      bseg~wrbtr,                 ""凭证货币金额
      bseg~dmbtr,                 ""按本位币计的金额
      faglflexa~wsl,                ""原交易货币的值(凭证货币)
      faglflexa~hsl                ""用本地货币表示的值 "
   FROM faglflexa
      LEFT JOIN bseg ON bseg~bukrs = faglflexa~rbukrs AND bseg~gjahr = faglflexa~ryear AND bseg~belnr = faglflexa~docnr AND bseg~buzei = faglflexa~buzei
      LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
      LEFT JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      WHERE faglflexa~rbukrs IN @s_bukrs  AND hkont IN @s_hkont"公司代码/总账科目
   INTO CORRESPONDING FIELDS OF TABLE @gt_data1.



  LOOP AT gt_data1 INTO gs_data WHERE shkzg = 'S' . "借方
    CLEAR gs_report1.
    gs_report1-mandt = gs_data-mandt.              ""集团
    gs_report1-bukrs = gs_data-bukrs.              ""公司代码
    gs_report1-gjahr = gs_data-gjahr.              ""会计年度
    gs_report1-h_monat = gs_data-h_monat.          ""会计期间
    gs_report1-hkont = gs_data-hkont.              ""总账科目
    gs_report1-h_waers = gs_data-h_waers.          ""币种
    IF gs_data-wrbtr <> 0.
      gs_report1-jf_wrbtr = gs_data-wrbtr.           ""本月借方发生额原币
      gs_report1-jf_dmbtr = gs_data-dmbtr.           ""本月借方发生额本币
    ELSEIF gs_data-wsl <> 0.
      gs_report1-jf_wrbtr = gs_data-wsl.           ""本月借方发生额原币
      gs_report1-jf_dmbtr = gs_data-hsl.           ""本月借方发生额本币
    ENDIF.
    gs_report1-spras = gs_data-spras.          ""语言代码
    gs_report1-ktopl = gs_data-ktopl.          ""科目表
    gs_report1-saknr = gs_data-saknr.          ""总账科目编号
    gs_report1-txt20 = gs_data-txt20.          ""总帐科目名称
    gs_report1-txt50 = gs_data-txt50.          ""总账科目长文本
    gs_report1-ktoks = gs_data-ktoks.          ""总账科目组 "
    COLLECT gs_report1 INTO gt_report1 .
  ENDLOOP.

  LOOP AT gt_data1 INTO gs_data WHERE shkzg = 'H' . "贷方
    CLEAR gs_report1.
    gs_report1-mandt = gs_data-mandt.              ""集团
    gs_report1-bukrs = gs_data-bukrs.              ""公司代码
    gs_report1-gjahr = gs_data-gjahr.              ""会计年度
    gs_report1-h_monat = gs_data-h_monat.          ""会计期间
    gs_report1-hkont = gs_data-hkont.              ""总账科目
    gs_report1-h_waers = gs_data-h_waers.          ""币种
    IF gs_data-wrbtr <> 0.
      gs_report1-df_wrbtr = gs_data-wrbtr.           ""本月贷方发生额原币
      gs_report1-df_dmbtr = gs_data-dmbtr.           ""本月贷方发生额本币
    ELSEIF gs_data-wsl <> 0.
      gs_report1-df_wrbtr = gs_data-wsl.           ""本月贷方发生额原币
      gs_report1-df_dmbtr = gs_data-hsl.           ""本月贷方发生额本币
    ENDIF.
    gs_report1-spras = gs_data-spras.          ""语言代码
    gs_report1-ktopl = gs_data-ktopl.          ""科目表
    gs_report1-saknr = gs_data-saknr.          ""总账科目编号
    gs_report1-txt20 = gs_data-txt20.          ""总帐科目名称
    gs_report1-txt50 = gs_data-txt50.          ""总账科目长文本
    gs_report1-ktoks = gs_data-ktoks.          ""总账科目组 "
    COLLECT gs_report1 INTO gt_report1 .
  ENDLOOP.

'本想通过凭证编号,凭证栏位去排除之后再去取表faglflexa,但是实际发现太慢了  
 CLEAR wa_data.
    READ TABLE gt_data1 INTO wa_data  WITH KEY bukrs = gs_data-bukrs gjahr = gs_data-gjahr belnr = gs_data-belnr buzei = gs_data-buzei .
    IF NOT sy-subrc = 0 .
      IF gs_data-shkzg = 'H'.
        gs_data-wrbtr = - gs_data-wrbtr .
        gs_data-dmbtr = - gs_data-dmbtr .
      ENDIF.
      APPEND  gs_data TO gt_data3.
    ENDIF.
"用了这个方法有可能导致系统资料不足
*  LOOP AT gt_data1 INTO gs_data1  .
*    IF gs_data1-shkzg = 'H'.
*      gs_data1-wrbtr = - gs_data1-wrbtr .
*      gs_data1-dmbtr = - gs_data1-dmbtr .
*    ENDIF.
*    APPEND  gs_data1 TO gt_data2.
*  ENDLOOP.

"用这个方法,然后再想其他的办法做
APPEND LINES OF gt_data1 TO gt_data2.

REPORT zmm_test_c10089213.


*----------------------------------------------------------------------*
*              INCLUDE 、 TYPES_POOLS 、 TABLES  引 用 区              *
*----------------------------------------------------------------------*
TABLES : bseg ,faglflexa ,bkpf, skat , ska1.
.


*----------------------------------------------------------------------*
*                 T Y P E S -  结 构 定 义                             *
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_data,
         mandt   TYPE mandt,               ""集团
         bukrs   TYPE bukrs,               ""公司代码
         hkont   TYPE hkont,               ""总账科目
         h_waers TYPE waers,               ""货币码
         gjahr   TYPE gjahr,               ""会计年度
         h_monat TYPE monat,               ""会计期间
         belnr   TYPE belnr_d,             ""会计凭证号码
         buzei   TYPE buzei,               ""会计凭证中的行项目数
         spras   TYPE spras,               ""语言代码
         ktopl   TYPE ktopl,               ""科目表
         saknr   TYPE saknr,               ""总账科目编号
         txt20   TYPE txt20_skat,          ""总帐科目名称
         txt50   TYPE txt50_skat,          ""总账科目长文本
         ktoks   TYPE ktoks,               ""总账科目组
         shkzg   TYPE shkzg,               ""借方/贷方标识
         wrbtr   TYPE wrbtr,               ""凭证货币金额
         dmbtr   TYPE dmbtr,               ""按本位币计的金额
         "wsl     TYPE vwcur12,             ""原交易货币的值(凭证货币)
         "hsl     TYPE vlcur12,             ""用本地货币表示的值 "
       END OF ty_data.


TYPES: BEGIN OF ty_report1,
         mandt    TYPE mandt,               ""集团
         bukrs    TYPE bukrs,               ""公司代码
         hkont    TYPE hkont,               ""总账科目
         h_waers  TYPE waers,               ""币种
         gjahr    TYPE gjahr,               ""会计年度
         h_monat  TYPE monat,               ""会计期间
         spras    TYPE spras,               ""语言代码
         ktopl    TYPE ktopl,               ""科目表
         saknr    TYPE saknr,               ""总账科目编号
         txt20    TYPE txt20_skat,          ""总帐科目名称
         txt50    TYPE txt50_skat,          ""总账科目长文本
         ktoks    TYPE ktoks,               ""总账科目组
         qc_wrbtr TYPE wrbtr,               ""期初原币余额
         qc_dmbtr TYPE dmbtr,               ""期初本币余额
         jf_wrbtr TYPE wrbtr,               ""本月借方发生额原币
         jf_dmbtr TYPE dmbtr,               ""本月借方发生额本币
         df_wrbtr TYPE wrbtr,               ""本月贷方发生额原币
         df_dmbtr TYPE dmbtr,               ""本月贷方发生额本币
         shkzg    TYPE shkzg,               ""借贷标识
         ye_wrbtr TYPE wrbtr,               ""余额原币
         ye_dmbtr TYPE dmbtr,               ""余额本币
         lj_wrbtr TYPE wrbtr,               ""累计余额原币
         lj_dmbtr TYPE dmbtr,               ""累计余额本币"
       END OF ty_report1.


*----------------------------------------------------------------------*
*                  DATA 定义                                           *
*----------------------------------------------------------------------*
DATA: gt_data1 TYPE TABLE OF ty_data,
      gt_data2 TYPE TABLE OF ty_data,
      gt_data3 TYPE TABLE OF ty_data,
      gs_data  TYPE ty_data,
      wa_data  TYPE ty_data.

DATA: gt_report1 TYPE TABLE OF ty_report1,
      gt_report2 TYPE TABLE OF ty_report1,
      gt_where1  TYPE TABLE OF ty_report1,
      gt_where2  TYPE TABLE OF ty_report1,
      gt_where3  TYPE TABLE OF ty_report1,
      gt_where4  TYPE TABLE OF ty_report1,
      gt_wfplr1  TYPE TABLE OF ty_report1,
      gt_wfplr2  TYPE TABLE OF ty_report1,
      gs_report1 TYPE ty_report1,
      gs_report2 TYPE ty_report1,
      gs_report3 TYPE ty_report1,
      gs_report4 TYPE ty_report1.


*----------------------------------------------------------------------*
*                  ALV 定义
*----------------------------------------------------------------------*
DATA: wa_layout   TYPE lvc_s_layo, "layout 布局控制 参考结构 lvc_s_layo
      it_fieldcat TYPE lvc_t_fcat, "fieldcat 字段目录 参考结构 LVC_T_FCAT
      wa_fieldcat LIKE LINE OF it_fieldcat.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*

SELECT-OPTIONS s_bukrs FOR bseg-bukrs  OBLIGATORY.   ""公司代码
PARAMETERS  p_gjahr TYPE bseg-gjahr OBLIGATORY.   ""会计年度
SELECT-OPTIONS s_monat FOR bseg-h_monat OBLIGATORY.   ""会计期间
SELECT-OPTIONS s_hkont FOR bseg-hkont.   ""总账科目"
PARAMETERS  p_ktopl TYPE skat-ktopl DEFAULT 'LXCA' OBLIGATORY.   ""科目表
PARAMETERS p_p1 TYPE char1  DEFAULT '' USER-COMMAND flag.
PARAMETERS p_wfplr TYPE bseg-hkont MODIF ID f2 DEFAULT '0041040112'.

*----------------------------------------------------------------------*
*                  初 始 化 块                                         *
*----------------------------------------------------------------------*
*该事件在屏幕未显示之前执行,对程式设置值及屏幕元素进行初始化赋值*
INITIALIZATION.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN .
    IF p_p1 = ''.
      IF screen-group1 = 'F2' .
        screen-active = 0 . "不活动,相当于隐藏
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

*----------------------------------------------------------------------*
*                  逻 辑 处 理 块                                      *
*----------------------------------------------------------------------*

START-OF-SELECTION. "执行按钮后触发
  PERFORM frm_getdata. "取数
  PERFORM frm_layout. "布局
  PERFORM frm_fieldcat. "列
  PERFORM frm_output. "输出

*----------------------------------------------------------------------*
*                  定义宏
*----------------------------------------------------------------------*
  DEFINE init_fieldcat.
    CLEAR wa_fieldcat.
wa_fieldcat-fieldname = &1. "字段
wa_fieldcat-coltext = &2.
wa_fieldcat-fix_column = &3.
wa_fieldcat-hotspot = &4.
wa_fieldcat-key = &5. ""X"
wa_fieldcat-col_pos = &6. "1
*  wa_fieldcat-EDIT = &3.
*  wa_fieldcat-REF_TABLE = &4.
*  wa_fieldcat-REF_FIELD = &5.
*  wa_fieldcat-CHECKBOX = &6 .
*  wa_fieldcat-DO_SUM = &7 .
*  wa_fieldcat-rollname = &8 .
* wa_fieldcat-hotspot = &7 .

APPEND wa_fieldcat TO it_fieldcat.

  END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*& Form FRM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata .

  SELECT
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      bseg~belnr,             ""会计凭证号码
      bseg~buzei,             ""会计凭证中的行项目数
      skat~spras,             ""语言代码
      skat~ktopl,             ""科目表
      skat~saknr,             ""总账科目编号
      skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      bseg~shkzg,             ""借方/贷方标识
      bseg~wrbtr,             ""凭证货币金额
      bseg~dmbtr             ""按本位币计的金额
  FROM bseg
    LEFT JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
    LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
    WHERE bukrs IN @s_bukrs   "公司代码
    INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  APPEND LINES OF gt_data1 TO gt_data3.

  SELECT
      faglflexa~rclnt AS mandt,            ""集团
      faglflexa~rbukrs AS bukrs,           ""公司代码
      faglflexa~racct AS hkont,            ""科目号
      faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
      faglflexa~ryear AS gjahr,            ""会计年度
      bkpf~monat AS h_monat,          ""过账期间
      faglflexa~docnr AS belnr,            ""会计凭证号码
      faglflexa~buzei,            ""会计凭证中的行项目数
      skat~spras,                 ""语言代码
      skat~ktopl,                 ""科目表
      skat~saknr,                 ""总账科目编号
      skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk AS shkzg,            ""借方/贷方标识
      faglflexa~wsl AS wrbtr,                ""原交易货币的值(凭证货币)
      faglflexa~hsl AS  dmbtr                ""用本地货币表示的值 "
  FROM faglflexa
      LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
      LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      WHERE faglflexa~rbukrs IN @s_bukrs  AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' "公司代码 会计凭证号码 排除空,月份排除空
      INTO CORRESPONDING FIELDS OF TABLE @gt_data2.

  LOOP AT gt_data2 INTO gs_data  .
    IF gs_data-shkzg = 'H'.
      gs_data-wrbtr = - gs_data-wrbtr .
      gs_data-dmbtr = - gs_data-dmbtr .
    ENDIF.
    APPEND  gs_data TO gt_data3.
  ENDLOOP.


  CLEAR gs_report1.
  LOOP AT gt_data3 INTO gs_data WHERE shkzg = 'S' . "借方
    gs_report1-mandt = gs_data-mandt.              ""集团
    gs_report1-bukrs = gs_data-bukrs.              ""公司代码
    gs_report1-gjahr = gs_data-gjahr.              ""会计年度
    gs_report1-h_monat = gs_data-h_monat.          ""会计期间
    gs_report1-hkont = gs_data-hkont.              ""总账科目
    gs_report1-h_waers = gs_data-h_waers.          ""币种
    gs_report1-jf_wrbtr = gs_data-wrbtr.           ""本月借方发生额原币!!!
    gs_report1-jf_dmbtr = gs_data-dmbtr.           ""本月借方发生额本币!!!
    gs_report1-spras = gs_data-spras.          ""语言代码
    gs_report1-ktopl = gs_data-ktopl.          ""科目表
    gs_report1-saknr = gs_data-saknr.          ""总账科目编号
    gs_report1-txt20 = gs_data-txt20.          ""总帐科目名称
    gs_report1-txt50 = gs_data-txt50.          ""总账科目长文本
    gs_report1-ktoks = gs_data-ktoks.          ""总账科目组 "
    COLLECT gs_report1 INTO gt_report1 .
  ENDLOOP.

  CLEAR gs_report1.
  LOOP AT gt_data3 INTO gs_data WHERE shkzg = 'H' . "贷方
    gs_report1-mandt = gs_data-mandt.              ""集团
    gs_report1-bukrs = gs_data-bukrs.              ""公司代码
    gs_report1-gjahr = gs_data-gjahr.              ""会计年度
    gs_report1-h_monat = gs_data-h_monat.          ""会计期间
    gs_report1-hkont = gs_data-hkont.              ""总账科目
    gs_report1-h_waers = gs_data-h_waers.          ""币种
    gs_report1-df_wrbtr = gs_data-wrbtr.           ""本月贷方发生额原币!!!
    gs_report1-df_dmbtr = gs_data-dmbtr.           ""本月贷方发生额本币!!!
    gs_report1-spras = gs_data-spras.          ""语言代码
    gs_report1-ktopl = gs_data-ktopl.          ""科目表
    gs_report1-saknr = gs_data-saknr.          ""总账科目编号
    gs_report1-txt20 = gs_data-txt20.          ""总帐科目名称
    gs_report1-txt50 = gs_data-txt50.          ""总账科目长文本
    gs_report1-ktoks = gs_data-ktoks.          ""总账科目组 "
    COLLECT gs_report1 INTO gt_report1 .
  ENDLOOP.

*------------------------------------------"补 公司~科目~币种、年~月"-------------------------

  CLEAR gs_report2.
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_report1  .
    gs_report2-gjahr = gs_report1-gjahr.              ""会计年度
    gs_report2-h_monat = gs_report1-h_monat.          ""会计期间"
    COLLECT gs_report2 INTO gt_where1 .
  ENDLOOP.

  CLEAR gs_report2.
  CLEAR gt_where2.
  LOOP AT gt_report1 INTO gs_report1  .
    gs_report2-mandt = gs_report1-mandt.              ""集团
    gs_report2-bukrs = gs_report1-bukrs.              ""公司代码
    gs_report2-hkont = gs_report1-hkont.              ""总账科目
    gs_report2-h_waers = gs_report1-h_waers.          ""币种
    gs_report2-spras = gs_report1-spras.              ""语言代码
    gs_report2-ktopl = gs_report1-ktopl.              ""科目表
    gs_report2-saknr = gs_report1-saknr.              ""总账科目编号
    gs_report2-txt20 = gs_report1-txt20.              ""总帐科目名称
    gs_report2-txt50 = gs_report1-txt50.              ""总账科目长文本
    gs_report2-ktoks = gs_report1-ktoks.              ""总账科目组 "
    COLLECT gs_report2 INTO gt_where2 .
  ENDLOOP.

  CLEAR gs_report3.
  LOOP AT gt_where1 INTO gs_report1  .
    LOOP AT gt_where2 INTO gs_report2  .
      gs_report1-mandt = gs_report2-mandt.              ""集团
      gs_report1-bukrs = gs_report2-bukrs.              ""公司代码
      gs_report1-hkont = gs_report2-hkont.              ""总账科目
      gs_report1-h_waers = gs_report2-h_waers.          ""币种
      gs_report1-spras = gs_report2-spras.              ""语言代码
      gs_report1-ktopl = gs_report2-ktopl.              ""科目表
      gs_report1-saknr = gs_report2-saknr.              ""总账科目编号
      gs_report1-txt20 = gs_report2-txt20.              ""总帐科目名称
      gs_report1-txt50 = gs_report2-txt50.              ""总账科目长文本
      gs_report1-ktoks = gs_report2-ktoks.              ""总账科目组
      gs_report1-gjahr = gs_report1-gjahr.              ""会计年度
      gs_report1-h_monat = gs_report1-h_monat.          ""会计期间"
      COLLECT gs_report1 INTO gt_report1 .
    ENDLOOP.
  ENDLOOP.

*------------------------------------------"利润分配-未分配利润补项目"-------------------------

  CLEAR gt_where2.
  SELECT
     skat~spras,                 ""语言代码
     skat~ktopl,                 ""科目表
     skat~saknr,                 ""总账科目编号
     skat~txt20,                 ""总帐科目名称
     skat~txt50,                 ""总账科目长文本
     ska1~ktoks                 ""总账科目组
 FROM skat
     LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
     WHERE  skat~saknr = @p_wfplr  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
     INTO CORRESPONDING FIELDS OF TABLE @gt_where2.

  CLEAR gs_report2.
  CLEAR gt_where3.
  LOOP AT gt_report1 INTO gs_report1  .
    gs_report2-mandt = gs_report1-mandt.              ""集团
    gs_report2-bukrs = gs_report1-bukrs.          ""公司代码
    gs_report2-h_waers = gs_report1-h_waers .          ""货币码
    COLLECT gs_report2 INTO gt_where3 .
  ENDLOOP.

  CLEAR gs_report4.
  LOOP AT gt_where1 INTO gs_report1  .
    LOOP AT gt_where2 INTO gs_report2  .
      LOOP AT gt_where3 INTO gs_report3.
        gs_report4-mandt = gs_report3-mandt.              ""集团
        gs_report4-bukrs = gs_report3-bukrs.              ""公司代码
        gs_report4-hkont = p_wfplr.                         ""总账科目
        gs_report4-h_waers = gs_report3-h_waers.          ""币种
        gs_report4-spras = gs_report2-spras.              ""语言代码
        gs_report4-ktopl = gs_report2-ktopl.              ""科目表
        gs_report4-saknr = gs_report2-saknr.              ""总账科目编号
        gs_report4-txt20 = gs_report2-txt20.              ""总帐科目名称
        gs_report4-txt50 = gs_report2-txt50.              ""总账科目长文本
        gs_report4-ktoks = gs_report2-ktoks.              ""总账科目组
        gs_report4-gjahr = gs_report1-gjahr.              ""会计年度
        gs_report4-h_monat = gs_report1-h_monat.          ""会计期间"
        COLLECT gs_report4 INTO gt_report1 .
        APPEND gs_report4 TO gt_wfplr2 .
      ENDLOOP.
    ENDLOOP.
  ENDLOOP.




*------------------------------------------"余额"-------------------------
  LOOP AT gt_report1 INTO gs_report1  .
    gs_report1-ye_wrbtr = gs_report1-jf_wrbtr - gs_report1-df_wrbtr .          ""余额原币
    gs_report1-ye_dmbtr = gs_report1-jf_dmbtr - gs_report1-df_dmbtr.          ""余额本币"
    IF gs_report1-ye_dmbtr = 0 .
      gs_report1-shkzg = '平'.
    ELSEIF gs_report1-ye_dmbtr > 0 .
      gs_report1-shkzg = '借'.
    ELSEIF gs_report1-ye_dmbtr < 0 .
      gs_report1-shkzg = '贷'.
    ENDIF.
    MODIFY gt_report1 FROM gs_report1  TRANSPORTING ye_wrbtr ye_dmbtr shkzg.
  ENDLOOP.


*------------------------------------------"累计余额"-------------------------

  SORT gt_report1 BY mandt bukrs hkont h_waers gjahr h_monat .
  CLEAR gs_report2.
  LOOP AT gt_report1 INTO gs_report1  .
    IF NOT (  gs_report2-bukrs  = gs_report1-bukrs AND gs_report2-hkont  = gs_report1-hkont AND gs_report2-h_waers  = gs_report1-h_waers ) .
      gs_report2-bukrs  = gs_report1-bukrs .        "公司代码
      gs_report2-hkont  = gs_report1-hkont .        ""总账科目
      gs_report2-h_waers  = gs_report1-h_waers .   ""币种
      gs_report2-lj_wrbtr = 0 .
      gs_report2-lj_dmbtr = 0 .
    ENDIF.
    IF NOT (  gs_report2-gjahr  = gs_report1-gjahr  ) AND gs_report1-ktoks = 'PL'  .
      gs_report2-gjahr  = gs_report1-gjahr .
      gs_report2-lj_wrbtr = 0 .
      gs_report2-lj_dmbtr = 0 .
    ENDIF.
    gs_report2-lj_wrbtr = gs_report2-lj_wrbtr +  gs_report1-ye_wrbtr  .
    gs_report2-lj_dmbtr = gs_report2-lj_dmbtr  + gs_report1-ye_dmbtr .
    gs_report1-lj_wrbtr  = gs_report2-lj_wrbtr .
    gs_report1-lj_dmbtr  = gs_report2-lj_dmbtr .
    MODIFY gt_report1 FROM gs_report1  TRANSPORTING lj_wrbtr  lj_dmbtr .

  ENDLOOP.

*------------------------------"利润分配-未分配利润 累计余额"-------------------------
  CLEAR gs_report2.
  CLEAR gt_wfplr1.
  LOOP AT gt_report1 INTO gs_report1 WHERE ktoks = 'PL' .
    gs_report2-bukrs  = gs_report1-bukrs . "公司代码
    gs_report2-gjahr  = gs_report1-gjahr + 1. ""年
    gs_report2-h_waers  = gs_report1-h_waers . ""币种
    gs_report2-ye_wrbtr = gs_report1-ye_wrbtr.
    gs_report2-ye_dmbtr = gs_report1-ye_dmbtr.
    COLLECT gs_report2 INTO gt_wfplr1.
  ENDLOOP.

  CLEAR gs_report2.
  LOOP AT gt_wfplr1 INTO gs_report1  .
    IF NOT (  gs_report2-bukrs  = gs_report1-bukrs  AND gs_report2-h_waers  = gs_report1-h_waers ) .
      gs_report2-bukrs  = gs_report1-bukrs .        "公司代码
      gs_report2-h_waers  = gs_report1-h_waers .   ""币种
      gs_report2-lj_wrbtr = 0 .
      gs_report2-lj_dmbtr = 0 .
    ENDIF.
    gs_report2-lj_wrbtr = gs_report2-lj_wrbtr +  gs_report1-ye_wrbtr  .
    gs_report2-lj_dmbtr = gs_report2-lj_dmbtr  + gs_report1-ye_dmbtr .
    gs_report1-lj_wrbtr  = gs_report2-lj_wrbtr .
    gs_report1-lj_dmbtr  = gs_report2-lj_dmbtr .
    MODIFY gt_wfplr1 FROM gs_report1  TRANSPORTING lj_wrbtr  lj_dmbtr .
  ENDLOOP.

  CLEAR gs_report3.
  LOOP AT gt_wfplr1 INTO gs_report1.
    LOOP AT gt_report1 INTO gs_report2 WHERE hkont = p_wfplr.
      IF gs_report1-bukrs = gs_report2-bukrs AND gs_report1-gjahr = gs_report2-gjahr AND gs_report1-h_waers = gs_report2-h_waers .
        gs_report3-lj_wrbtr = gs_report1-lj_wrbtr + gs_report2-lj_wrbtr.
        gs_report3-lj_dmbtr = gs_report1-lj_dmbtr + gs_report2-lj_dmbtr.
        MODIFY gt_report1 FROM gs_report3  TRANSPORTING lj_wrbtr  lj_dmbtr .
      ENDIF.
    ENDLOOP.
  ENDLOOP.



*------------------------------------------"上期余额"-------------------------
  CLEAR gs_report2.
  LOOP AT gt_report1 INTO gs_report1  .
    gs_report1-qc_wrbtr  = gs_report1-lj_wrbtr - gs_report1-ye_wrbtr .
    gs_report1-qc_dmbtr  = gs_report1-lj_dmbtr - gs_report1-ye_dmbtr .
    MODIFY gt_report1 FROM gs_report1  TRANSPORTING qc_wrbtr  qc_dmbtr .
  ENDLOOP.


*------------------------------------------"屏幕筛选"-------------------------
  LOOP AT gt_report1 INTO gs_report1 WHERE gjahr = p_gjahr  AND h_monat IN s_monat AND hkont IN s_hkont "会计年度 ,期间,总账科目.
    AND NOT (  qc_wrbtr = 0 AND  qc_dmbtr = 0 AND  jf_wrbtr = 0 AND  jf_dmbtr = 0 AND  df_wrbtr = 0 AND  df_dmbtr = 0 AND  ye_wrbtr = 0 AND  ye_dmbtr = 0 AND  lj_wrbtr = 0 AND  lj_dmbtr = 0 ) .
    APPEND gs_report1 TO gt_report2.
  ENDLOOP.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  wa_layout-cwidth_opt = 'X'. "最适列宽
  wa_layout-zebra = 'X'. "隔行显示斑马纹   使ALV表格按斑马线间隔条码方式显示

  "wa_layout-grid_title = 'test'.
  wa_layout-sel_mode = 'D'.
* wa_layout-excp_fname = 'light'.
  wa_layout-stylefname = 'CELLBTN'.
*  wa_layout-edit = 'X'.
*  wa_layout-box_fname = 'BOX'.
*  wa_layout-confirmation_prompt = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .

  init_fieldcat:

    'BUKRS' '公司代码'(t01) 'X' '' '' '',
    'GJAHR' '会计年度'(t02) 'X' '' '' '',
    'H_MONAT' '会计期间'(t03) 'X' '' '' '',
    'HKONT' '总账科目'(t04) 'X' '' '' '',
    'TXT50' '总账科目长文本 '(t05) 'X' '' '' '',
    'H_WAERS' '币种'(t06) 'X' '' '' '',
    'QC_WRBTR' '期初原币余额'(t07) 'X' '' '' '',
    'QC_DMBTR' '期初本币余额'(t08) 'X' '' '' '',
    'JF_WRBTR' '本月借方发生额原币'(t09) 'X' '' '' '',
    'JF_DMBTR' '本月借方发生额本币'(t10) 'X' '' '' '',
    'DF_WRBTR' '本月贷方发生额原币'(t11) 'X' '' '' '',
    'DF_DMBTR' '本月贷方发生额本币'(t12) 'X' '' '' '',
    'SHKZG' '借贷标识'(t13) 'X' '' '' '',
    'YE_WRBTR' '余额原币'(t14) 'X' '' '' '',
    'YE_DMBTR' '余额本币'(t15) 'X' '' '' '',
    'LJ_WRBTR' '累计余额原币'(t16) 'X' '' '' '',
    'LJ_DMBTR' '累计余额本币'(t17) 'X' '' '' ''."

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
*     i_callback_program = sy-repid   JUAN
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER =
*     I_BUFFER_ACTIVE =
*     I_CALLBACK_PROGRAM = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME   =
*     I_BACKGROUND_ID = ' '
*     I_GRID_TITLE    =
*     I_GRID_SETTINGS =
      is_layout_lvc   = wa_layout
      it_fieldcat_lvc = it_fieldcat
*     IT_EXCLUDING    =
*     IT_SPECIAL_GROUPS_LVC             =
*     IT_SORT_LVC     =
*     IT_FILTER_LVC   =
*     IT_HYPERLINK    =
*     IS_SEL_HIDE     =
*     I_DEFAULT       = 'X'
      i_save          = 'U'
*     IS_VARIANT      =
*     IT_EVENTS       =
*     IT_EVENT_EXIT   =
*     IS_PRINT_LVC    =
*     IS_REPREP_ID_LVC   =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  =
*     I_HTML_HEIGHT_END  =
*     IT_ALV_GRAPHICS =
*     IT_EXCEPT_QINFO_LVC               =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab        = gt_report2
    EXCEPTIONS
      program_error   = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

DEMO区运行

*&---------------------------------------------------------------------*
*& Report ZCOR0054
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
* Program Name: ZCOR001
* Date written: 2023-06-12
* Author's name: C10089213 朱鸿飞
* Last update:
* Program title: 立铠科目余额表(原币)
* Project Name: 立讯精密ERP实施项目
* Version: V1.0


REPORT zcor0054 MESSAGE-ID zfi001.


*----------------------------------------------------------------------*
*              INCLUDE 、 TYPES_POOLS 、 TABLES  引 用 区              *
*----------------------------------------------------------------------*
TABLES : bseg ,faglflexa ,bkpf, skat , ska1 ,t001.



*----------------------------------------------------------------------*
*                 T Y P E S -  结 构 定 义                             *
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_data,
         mandt    TYPE mandt,               ""集团
         bukrs    TYPE bukrs,               ""公司代码
         hkont    TYPE hkont,               ""总账科目
         h_waers  TYPE waers,               ""货币码
         gjahr    TYPE gjahr,               ""会计年度
         h_monat  TYPE monat,               ""会计期间
         "belnr    TYPE belnr_d,             ""会计凭证号码
         "buzei    TYPE buzei,               ""会计凭证中的行项目数
         "spras    TYPE spras,               ""语言代码
         "ktopl    TYPE ktopl,               ""科目表
         "saknr    TYPE saknr,               ""总账科目编号
         "txt20    TYPE txt20_skat,          ""总帐科目名称
         txt50    TYPE txt50_skat,          ""总账科目长文本
         ktoks    TYPE ktoks,               ""总账科目组
         shkzg    TYPE shkzg,               ""借方/贷方标识
         wrbtr    TYPE wrbtr,               ""凭证货币金额
         dmbtr    TYPE dmbtr,               ""按本位币计的金额
         qc_wrbtr TYPE wrbtr,               ""期初原币余额
         qc_dmbtr TYPE dmbtr,               ""期初本币余额
         jf_wrbtr TYPE wrbtr,               ""本月借方发生额原币
         jf_dmbtr TYPE dmbtr,               ""本月借方发生额本币
         df_wrbtr TYPE wrbtr,               ""本月贷方发生额原币
         df_dmbtr TYPE dmbtr,               ""本月贷方发生额本币
         h_shkzg  TYPE shkzg,               ""借贷标识(显示)
         ye_wrbtr TYPE wrbtr,               ""余额原币
         ye_dmbtr TYPE dmbtr,               ""余额本币
         lj_wrbtr TYPE wrbtr,               ""累计余额原币
         lj_dmbtr TYPE dmbtr,               ""累计余额本币"
       END OF ty_data.



*----------------------------------------------------------------------*
*                  DATA 定义                                           *
*----------------------------------------------------------------------*
DATA: gt_data1   TYPE TABLE OF ty_data,
      gt_data2   TYPE TABLE OF ty_data,
      gt_report1 TYPE TABLE OF ty_data,
      gt_report2 TYPE TABLE OF ty_data,
      gt_where1  TYPE TABLE OF ty_data,
      gt_where2  TYPE TABLE OF ty_data,
      gt_where3  TYPE TABLE OF ty_data,
      gt_where4  TYPE TABLE OF ty_data,
      gt_wfplr1  TYPE TABLE OF ty_data,
      gt_wfplr2  TYPE TABLE OF ty_data,
      gt_bukrs   TYPE TABLE OF ty_data,
      gs_data1   TYPE ty_data,
      gs_data2   TYPE ty_data,
      gs_data3   TYPE ty_data,
      gs_data4   TYPE ty_data,
      gs_bukrs   TYPE ty_data,
      se16       TYPE char10.



*----------------------------------------------------------------------*
*                  ALV 定义
*----------------------------------------------------------------------*
DATA: wa_layout   TYPE lvc_s_layo, "layout 布局控制 参考结构 lvc_s_layo
      it_fieldcat TYPE lvc_t_fcat, "fieldcat 字段目录 参考结构 LVC_T_FCAT
      wa_fieldcat LIKE LINE OF it_fieldcat.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK text1.
SELECT-OPTIONS:
 s_bukrs FOR bseg-bukrs   OBLIGATORY,   ""公司代码
 s_gjahr FOR bseg-gjahr   OBLIGATORY,   ""会计年度
 s_monat FOR bseg-h_monat OBLIGATORY,   ""会计期间
 s_hkont FOR bseg-hkont.   ""总账科目"
PARAMETERS p_ktopl TYPE skat-ktopl DEFAULT 'LXCA' OBLIGATORY.   ""科目表
PARAMETERS p_p1 TYPE char1  DEFAULT '' USER-COMMAND flag.
PARAMETERS p_wfplr TYPE bseg-hkont MODIF ID f2 DEFAULT '0041040112' OBLIGATORY.
SELECTION-SCREEN END OF BLOCK text1.



*----------------------------------------------------------------------*
*                  初 始 化 块                                         *
*----------------------------------------------------------------------*
*该事件在屏幕未显示之前执行,对程式设置值及屏幕元素进行初始化赋值*
INITIALIZATION.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN .
    IF p_p1 = ''.
      IF screen-group1 = 'F2' .
        screen-active = 0 . "不活动,相当于隐藏
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

*----------------------------------------------------------------------*
*                  逻 辑 处 理 块                                      *
*----------------------------------------------------------------------*

START-OF-SELECTION. "执行按钮后触发
  PERFORM frm_authority_check. "检查权限
  PERFORM frm_getdata. "取数
  PERFORM frm_layout. "布局
  PERFORM frm_fieldcat. "列
  PERFORM frm_output. "输出

*----------------------------------------------------------------------*
*                  定义宏
*----------------------------------------------------------------------*
  DEFINE init_fieldcat.
    CLEAR wa_fieldcat.
wa_fieldcat-fieldname = &1. "字段
wa_fieldcat-coltext = &2.
wa_fieldcat-fix_column = &3.
wa_fieldcat-hotspot = &4.
wa_fieldcat-key = &5. ""X"
wa_fieldcat-col_pos = &6. "1
*  wa_fieldcat-EDIT = &3.
*  wa_fieldcat-REF_TABLE = &4.
*  wa_fieldcat-REF_FIELD = &5.
*  wa_fieldcat-CHECKBOX = &6 .
*  wa_fieldcat-DO_SUM = &7 .
*  wa_fieldcat-rollname = &8 .
* wa_fieldcat-hotspot = &7 .

APPEND wa_fieldcat TO it_fieldcat.

  END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*& Form FRM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata .

  SELECT  bukrs FROM t001  WHERE  bukrs IN @s_bukrs
  INTO CORRESPONDING FIELDS OF TABLE @gt_bukrs.

  LOOP AT gt_bukrs INTO gs_bukrs  .

    CLEAR gt_data1.
    SELECT
        bseg~mandt,             ""集团
        bseg~bukrs,             ""公司代码
        bseg~hkont,             ""总账科目
        bseg~h_waers,           ""货币码
        bseg~gjahr,             ""会计年度
        bseg~h_monat,           ""会计期间
        "bseg~belnr,             ""会计凭证号码
        "bseg~buzei,             ""会计凭证中的行项目数
        "skat~spras,             ""语言代码
        "skat~ktopl,             ""科目表
        "skat~saknr,             ""总账科目编号
        "skat~txt20,             ""总帐科目名称
        skat~txt50,             ""总账科目长文本
        ska1~ktoks,             ""总账科目组
        bseg~shkzg,             ""借方/贷方标识
        bseg~wrbtr,             ""凭证货币金额
        bseg~dmbtr             ""按本位币计的金额
    FROM bseg
      LEFT JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      WHERE bseg~bukrs = @gs_bukrs-bukrs  "公司代码
      INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

    se16 = 'bseg'.
    PERFORM frm_calculatedata. "计算


    CLEAR gt_data1.
    SELECT
        faglflexa~rclnt AS mandt,            ""集团
        faglflexa~rbukrs AS bukrs,           ""公司代码
        faglflexa~racct AS hkont,            ""科目号
        faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
        faglflexa~ryear AS gjahr,            ""会计年度
        bkpf~monat AS h_monat,          ""过账期间
        "faglflexa~docnr AS belnr,            ""会计凭证号码
        "faglflexa~buzei,            ""会计凭证中的行项目数
        "skat~spras,                 ""语言代码
        "skat~ktopl,                 ""科目表
        "skat~saknr,                 ""总账科目编号
        "skat~txt20,                 ""总帐科目名称
        skat~txt50,                 ""总账科目长文本
        ska1~ktoks,                 ""总账科目组
        faglflexa~drcrk AS shkzg,            ""借方/贷方标识
        faglflexa~wsl AS wrbtr,                ""原交易货币的值(凭证货币)
        faglflexa~hsl AS  dmbtr                ""用本地货币表示的值 "
    FROM faglflexa
        LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
        LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
        LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
        WHERE faglflexa~rbukrs IN @s_bukrs  AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' "公司代码 会计凭证号码 排除空,月份排除空
        INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

    se16 = 'faglflexa'.
    PERFORM frm_calculatedata. "计算



  ENDLOOP.
*------------------------------------------"补 公司~科目~币种、年~月"-------------------------

  CLEAR gs_data2.
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.          ""会计期间"
    COLLECT gs_data2 INTO gt_where1 .
  ENDLOOP.

  CLEAR gs_data2.
  CLEAR gt_where2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "gs_data2-spras = gs_data1-spras.              ""语言代码
    "gs_data2-ktopl = gs_data1-ktopl.              ""科目表
    "gs_data2-saknr = gs_data1-saknr.              ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.              ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.              ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.              ""总账科目组 "
    COLLECT gs_data2 INTO gt_where2 .
  ENDLOOP.

  CLEAR gs_data3.
  LOOP AT gt_where1 INTO gs_data1  .
    LOOP AT gt_where2 INTO gs_data2  .
      gs_data1-mandt = gs_data2-mandt.              ""集团
      gs_data1-bukrs = gs_data2-bukrs.              ""公司代码
      gs_data1-hkont = gs_data2-hkont.              ""总账科目
      gs_data1-h_waers = gs_data2-h_waers.          ""币种
      "gs_data1-spras = gs_data2-spras.              ""语言代码
      "gs_data1-ktopl = gs_data2-ktopl.              ""科目表
      "gs_data1-saknr = gs_data2-saknr.              ""总账科目编号
      "gs_data1-txt20 = gs_data2-txt20.              ""总帐科目名称
      gs_data1-txt50 = gs_data2-txt50.              ""总账科目长文本
      gs_data1-ktoks = gs_data2-ktoks.              ""总账科目组
      gs_data1-gjahr = gs_data1-gjahr.              ""会计年度
      gs_data1-h_monat = gs_data1-h_monat.          ""会计期间"
      COLLECT gs_data1 INTO gt_report1 .
    ENDLOOP.
  ENDLOOP.

*------------------------------------------"利润分配-未分配利润补项目"-------------------------

  CLEAR gt_where2.
  SELECT
     "skat~spras,                 ""语言代码
     "skat~ktopl,                 ""科目表
     "skat~saknr,                 ""总账科目编号
     "skat~txt20,                 ""总帐科目名称
     skat~txt50,                 ""总账科目长文本
     ska1~ktoks                 ""总账科目组
 FROM skat
     LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
     WHERE  skat~saknr = @p_wfplr  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
     INTO CORRESPONDING FIELDS OF TABLE @gt_where2.

  CLEAR gs_data2.
  CLEAR gt_where3.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.          ""公司代码
    gs_data2-h_waers = gs_data1-h_waers .          ""货币码
    COLLECT gs_data2 INTO gt_where3 .
  ENDLOOP.

  CLEAR gs_data4.
  LOOP AT gt_where1 INTO gs_data1  .
    LOOP AT gt_where2 INTO gs_data2  .
      LOOP AT gt_where3 INTO gs_data3.
        gs_data4-mandt = gs_data3-mandt.              ""集团
        gs_data4-bukrs = gs_data3-bukrs.              ""公司代码
        gs_data4-hkont = p_wfplr.                         ""总账科目
        gs_data4-h_waers = gs_data3-h_waers.          ""币种
        "gs_data4-spras = gs_data2-spras.              ""语言代码
        "gs_data4-ktopl = gs_data2-ktopl.              ""科目表
        "gs_data4-saknr = gs_data2-saknr.              ""总账科目编号
        "gs_data4-txt20 = gs_data2-txt20.              ""总帐科目名称
        gs_data4-txt50 = gs_data2-txt50.              ""总账科目长文本
        gs_data4-ktoks = gs_data2-ktoks.              ""总账科目组
        gs_data4-gjahr = gs_data1-gjahr.              ""会计年度
        gs_data4-h_monat = gs_data1-h_monat.          ""会计期间"
        COLLECT gs_data4 INTO gt_report1 .
        APPEND gs_data4 TO gt_wfplr2 .
      ENDLOOP.
    ENDLOOP.
  ENDLOOP.




*------------------------------------------"余额"-------------------------
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-ye_wrbtr = gs_data1-jf_wrbtr - gs_data1-df_wrbtr .          ""余额原币
    gs_data1-ye_dmbtr = gs_data1-jf_dmbtr - gs_data1-df_dmbtr.          ""余额本币"
    IF gs_data1-ye_dmbtr = 0 .
      gs_data1-h_shkzg = '平'.
    ELSEIF gs_data1-ye_dmbtr > 0 .
      gs_data1-h_shkzg = '借'.
    ELSEIF gs_data1-ye_dmbtr < 0 .
      gs_data1-h_shkzg = '贷'.
    ENDIF.
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING ye_wrbtr ye_dmbtr h_shkzg.
  ENDLOOP.


*------------------------------------------"累计余额"-------------------------

  SORT gt_report1 BY mandt bukrs hkont h_waers gjahr h_monat .
  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    IF NOT (  gs_data2-bukrs  = gs_data1-bukrs AND gs_data2-hkont  = gs_data1-hkont AND gs_data2-h_waers  = gs_data1-h_waers ) .
      gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
      gs_data2-hkont  = gs_data1-hkont .        ""总账科目
      gs_data2-h_waers  = gs_data1-h_waers .   ""币种
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    IF NOT (  gs_data2-gjahr  = gs_data1-gjahr  ) AND gs_data1-ktoks = 'PL'  .
      gs_data2-gjahr  = gs_data1-gjahr .
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
    gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
    gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
    gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .

  ENDLOOP.

*------------------------------"利润分配-未分配利润 累计余额"-------------------------
  CLEAR gs_data2.
  CLEAR gt_wfplr1.
  LOOP AT gt_report1 INTO gs_data1 WHERE ktoks = 'PL' .
    gs_data2-bukrs  = gs_data1-bukrs . "公司代码
    gs_data2-gjahr  = gs_data1-gjahr + 1. ""年
    gs_data2-h_waers  = gs_data1-h_waers . ""币种
    gs_data2-ye_wrbtr = gs_data1-ye_wrbtr.
    gs_data2-ye_dmbtr = gs_data1-ye_dmbtr.
    COLLECT gs_data2 INTO gt_wfplr1.
  ENDLOOP.

  CLEAR gs_data2.
  LOOP AT gt_wfplr1 INTO gs_data1  .
    IF NOT (  gs_data2-bukrs  = gs_data1-bukrs  AND gs_data2-h_waers  = gs_data1-h_waers ) .
      gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
      gs_data2-h_waers  = gs_data1-h_waers .   ""币种
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
    gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
    gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
    gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
    MODIFY gt_wfplr1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .
  ENDLOOP.

  CLEAR gs_data3.
  LOOP AT gt_wfplr1 INTO gs_data1.
    LOOP AT gt_report1 INTO gs_data2 WHERE hkont = p_wfplr.
      IF gs_data1-bukrs = gs_data2-bukrs AND gs_data1-gjahr = gs_data2-gjahr AND gs_data1-h_waers = gs_data2-h_waers .
        gs_data3-lj_wrbtr = gs_data1-lj_wrbtr + gs_data2-lj_wrbtr.
        gs_data3-lj_dmbtr = gs_data1-lj_dmbtr + gs_data2-lj_dmbtr.
        MODIFY gt_report1 FROM gs_data3  TRANSPORTING lj_wrbtr  lj_dmbtr .
      ENDIF.
    ENDLOOP.
  ENDLOOP.



*------------------------------------------"上期余额"-------------------------
  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-qc_wrbtr  = gs_data1-lj_wrbtr - gs_data1-ye_wrbtr .
    gs_data1-qc_dmbtr  = gs_data1-lj_dmbtr - gs_data1-ye_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING qc_wrbtr  qc_dmbtr .
  ENDLOOP.


*------------------------------------------"屏幕筛选"-------------------------
  LOOP AT gt_report1 INTO gs_data1 WHERE gjahr IN s_gjahr  AND h_monat IN s_monat AND hkont IN s_hkont "会计年度 ,期间,总账科目.
    AND NOT (  qc_wrbtr = 0 AND  qc_dmbtr = 0 AND  jf_wrbtr = 0 AND  jf_dmbtr = 0 AND  df_wrbtr = 0 AND  df_dmbtr = 0 AND  ye_wrbtr = 0 AND  ye_dmbtr = 0 AND  lj_wrbtr = 0 AND  lj_dmbtr = 0 ) .
    APPEND gs_data1 TO gt_report2.
  ENDLOOP.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  wa_layout-cwidth_opt = 'X'. "最适列宽
  wa_layout-zebra = 'X'. "隔行显示斑马纹   使ALV表格按斑马线间隔条码方式显示

  "wa_layout-grid_title = 'test'.
  wa_layout-sel_mode = 'D'.
* wa_layout-excp_fname = 'light'.
  wa_layout-stylefname = 'CELLBTN'.
*  wa_layout-edit = 'X'.
*  wa_layout-box_fname = 'BOX'.
*  wa_layout-confirmation_prompt = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .

  init_fieldcat:

    'BUKRS' '公司代码'(t01) 'X' '' '' '',
    'GJAHR' '会计年度'(t02) 'X' '' '' '',
    'H_MONAT' '会计期间'(t03) 'X' '' '' '',
    'HKONT' '总账科目'(t04) 'X' '' '' '',
    'TXT50' '总账科目长文本 '(t05) 'X' '' '' '',
    'H_WAERS' '币种'(t06) 'X' '' '' '',
    'QC_WRBTR' '期初原币余额'(t07) 'X' '' '' '',
    'QC_DMBTR' '期初本币余额'(t08) 'X' '' '' '',
    'JF_WRBTR' '本月借方发生额原币'(t09) 'X' '' '' '',
    'JF_DMBTR' '本月借方发生额本币'(t10) 'X' '' '' '',
    'DF_WRBTR' '本月贷方发生额原币'(t11) 'X' '' '' '',
    'DF_DMBTR' '本月贷方发生额本币'(t12) 'X' '' '' '',
    'H_SHKZG' '借贷标识'(t13) 'X' '' '' '',
    'YE_WRBTR' '余额原币'(t14) 'X' '' '' '',
    'YE_DMBTR' '余额本币'(t15) 'X' '' '' '',
    'LJ_WRBTR' '累计余额原币'(t16) 'X' '' '' '',
    'LJ_DMBTR' '累计余额本币'(t17) 'X' '' '' ''."

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
*     i_callback_program = sy-repid   JUAN
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER =
*     I_BUFFER_ACTIVE =
*     I_CALLBACK_PROGRAM = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME   =
*     I_BACKGROUND_ID = ' '
*     I_GRID_TITLE    =
*     I_GRID_SETTINGS =
      is_layout_lvc   = wa_layout
      it_fieldcat_lvc = it_fieldcat
*     IT_EXCLUDING    =
*     IT_SPECIAL_GROUPS_LVC             =
*     IT_SORT_LVC     =
*     IT_FILTER_LVC   =
*     IT_HYPERLINK    =
*     IS_SEL_HIDE     =
*     I_DEFAULT       = 'X'
      i_save          = 'U'
*     IS_VARIANT      =
*     IT_EVENTS       =
*     IT_EVENT_EXIT   =
*     IS_PRINT_LVC    =
*     IS_REPREP_ID_LVC   =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  =
*     I_HTML_HEIGHT_END  =
*     IT_ALV_GRAPHICS =
*     IT_EXCEPT_QINFO_LVC               =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab        = gt_report2
    EXCEPTIONS
      program_error   = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

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

  CLEAR gs_data2.
  LOOP AT gt_data1 INTO gs_data1 WHERE shkzg = 'S' . "借方
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.          ""会计期间
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    IF se16 = 'faglflexa'.
      IF gs_data1-shkzg = 'H'.
        gs_data1-wrbtr = - gs_data1-wrbtr .
        gs_data1-dmbtr = - gs_data1-dmbtr .
      ENDIF.
    ENDIF.
    gs_data2-jf_wrbtr = gs_data1-wrbtr.           ""本月借方发生额原币!!!
    gs_data2-jf_dmbtr = gs_data1-dmbtr.           ""本月借方发生额本币!!!
    "gs_data2-spras = gs_data1-spras.          ""语言代码
    "gs_data2-ktopl = gs_data1-ktopl.          ""科目表
    "gs_data2-saknr = gs_data1-saknr.          ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.          ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.          ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.          ""总账科目组 "
    COLLECT gs_data2 INTO gt_report1 .
  ENDLOOP.

  CLEAR gs_data2.
  LOOP AT gt_data1 INTO gs_data1 WHERE shkzg = 'H' . "贷方
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.          ""会计期间
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    IF se16 = 'faglflexa'.
      IF gs_data1-shkzg = 'H'.
        gs_data1-wrbtr = - gs_data1-wrbtr .
        gs_data1-dmbtr = - gs_data1-dmbtr .
      ENDIF.
    ENDIF.
    gs_data2-df_wrbtr = gs_data1-wrbtr.           ""本月贷方发生额原币!!!
    gs_data2-df_dmbtr = gs_data1-dmbtr.           ""本月贷方发生额本币!!!
    "gs_data2-spras = gs_data1-spras.          ""语言代码
    "gs_data2-ktopl = gs_data1-ktopl.          ""科目表
    "gs_data2-saknr = gs_data1-saknr.          ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.          ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.          ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.          ""总账科目组 "
    COLLECT gs_data2 INTO gt_report1 .
  ENDLOOP.

  CLEAR gt_data1.
ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  getaction
*&---------------------------------------------------------------------*
*       处理用户权限
*----------------------------------------------------------------------*
FORM frm_authority_check.
  DATA:BEGIN OF lt_bukrs OCCURS 0,
         bukrs LIKE t001-bukrs,
       END OF lt_bukrs.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_bukrs FROM t001 WHERE bukrs IN s_bukrs.
  LOOP AT lt_bukrs.
    AUTHORITY-CHECK OBJECT  'F_SKA1_BUK'
    ID 'BUKRS' FIELD lt_bukrs-bukrs."检查字段
    IF sy-subrc <> 0.
      MESSAGE s021 WITH lt_bukrs-bukrs DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.
ENDFORM.

 DEMO区运行2

 

*&---------------------------------------------------------------------*
*& Report ZCOR0054
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
* Program Name: ZCOR0054
* Date written: 2023-06-27
* Author's name: C10089213 朱鸿飞
* Last update:
* Program title: 立铠科目余额表(原币)
* Project Name: 立讯精密ERP实施项目
* Version: V1.0

*参考资料
*在SAP系统中,凭证项目相关的数据可以在表BKPF(凭证抬头数据)和BSEG(凭证行项目数据)中找到。在BSEG表中,可以使用字段GL_ACCOUNT来查找会计科目16020107相关的凭证项目数据。具体来说,你可以使用如下的SAP ABAP代码来查询该会计科目的凭证项目数据:
*
*SELECT *
*FROM BSEG
*WHERE GL_ACCOUNT = '16020107'.
*需要注意的是,在实际使用中,你需要根据自己的SAP系统配置和权限,来确定可以访问哪些表和字段。另外,我们需要保证查询操作的合法性和准确性,避免对系统数据造成不必要的影响。
*
*
*在SAP系统中,除了BSEG表(凭证行项目数据),还有其他一些表可以存储凭证项目相关的数据。以下是一些常见的例子:
*
*BKPF表:凭证抬头数据表,包含凭证的基本信息,如凭证号、凭证日期、凭证类型等。BKPF表和BSEG表通过凭证号(BELNR)字段进行关联,可以用来检索特定凭证的所有行项目数据。
*COEP表:成本元素总帐凭证行项目数据表,用于存储与成本核算相关的凭证项目数据。COEP表和BSEG表通过凭证号、凭证行项目号(BUZEI)和成本元素(COSTELEMENT)字段进行关联。
*FAGLFLEXA表:总账分析项数据表,用于存储总账分析项相关的凭证数据。FAGLFLEXA表和BSEG表通过凭证号和凭证行项目号字段进行关联。
*FAGL_SPLINFO表:总账分期余额表,用于存储总账分期余额相关的凭证数据。FAGL_SPLINFO表和BSEG表通过凭证号、凭证行项目号和总账分期(FISCPER)字段进行关联。
*需要根据具体情况选择合适的表来查询凭证项目相关的数据。同时,需要注意不同表之间的关联关系,以及表中字段的含义和使用方式。


REPORT zcor001 MESSAGE-ID zfi001.


*----------------------------------------------------------------------*
*              INCLUDE 、 TYPES_POOLS 、 TABLES  引 用 区              *
*----------------------------------------------------------------------*
TABLES : bseg ,faglflexa ,bkpf, skat , ska1 ,t001.



*----------------------------------------------------------------------*
*                 T Y P E S -  结 构 定 义                             *
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_data,
         mandt       TYPE mandt,               ""集团
         bukrs       TYPE bukrs,               ""公司代码
         hkont       TYPE hkont,               ""总账科目
         h_waers     TYPE waers,               ""货币码
         gjahr       TYPE gjahr,               ""会计年度
         h_monat     TYPE monat,               ""会计期间
         "belnr    TYPE belnr_d,             ""会计凭证号码
         "buzei    TYPE buzei,               ""会计凭证中的行项目数
         "spras    TYPE spras,               ""语言代码
         "ktopl    TYPE ktopl,               ""科目表
         "saknr    TYPE saknr,               ""总账科目编号
         "txt20    TYPE txt20_skat,          ""总帐科目名称
         txt50       TYPE txt50_skat,          ""总账科目长文本
         ktoks       TYPE ktoks,               ""总账科目组
         shkzg       TYPE shkzg,               ""借方/贷方标识
         wrbtr       TYPE wrbtr,               ""凭证货币金额
         dmbtr       TYPE dmbtr,               ""按本位币计的金额
         qc_wrbtr    TYPE wrbtr,               ""期初原币余额
         qc_dmbtr    TYPE dmbtr,               ""期初本币余额
         jf_wrbtr    TYPE wrbtr,               ""本月借方发生额原币
         jf_dmbtr    TYPE dmbtr,               ""本月借方发生额本币
         df_wrbtr    TYPE wrbtr,               ""本月贷方发生额原币
         df_dmbtr    TYPE dmbtr,               ""本月贷方发生额本币
         h_shkzg     TYPE shkzg,               ""借贷标识(显示)
         ye_wrbtr    TYPE wrbtr,               ""余额原币
         ye_dmbtr    TYPE dmbtr,               ""余额本币
         lj_wrbtr    TYPE wrbtr,               ""累计余额原币
         lj_dmbtr    TYPE dmbtr,               ""累计余额本币
         waers       TYPE waers,               ""T001货币码
         pswsl       TYPE pswsl,               ""更新总分类帐交易数字货币
         pswbt       TYPE pswbt,               ""总帐中更新的金额
         sumye_dmbtr TYPE dmbtr,               ""求和 余额本币
         sumlj_dmbtr TYPE dmbtr,               ""求和 累计余额本币
       END OF ty_data.



*----------------------------------------------------------------------*
*                  DATA 定义                                           *
*----------------------------------------------------------------------*
DATA: gt_data1   TYPE TABLE OF ty_data,
      gt_report1 TYPE TABLE OF ty_data,
      gt_report2 TYPE TABLE OF ty_data,
      gt_where1  TYPE TABLE OF ty_data,
      gt_where2  TYPE TABLE OF ty_data,
      gt_where3  TYPE TABLE OF ty_data,
      gt_where4  TYPE TABLE OF ty_data,
      gt_wfplr1  TYPE TABLE OF ty_data,
      gt_wfplr2  TYPE TABLE OF ty_data,
      gs_data1   TYPE ty_data,
      gs_data2   TYPE ty_data,
      gs_data3   TYPE ty_data,
      gs_data4   TYPE ty_data,
      bl_wfplr   TYPE boolean.



*----------------------------------------------------------------------*
*                  ALV 定义
*----------------------------------------------------------------------*
DATA: wa_layout   TYPE lvc_s_layo, "layout 布局控制 参考结构 lvc_s_layo
      it_fieldcat TYPE lvc_t_fcat, "fieldcat 字段目录 参考结构 LVC_T_FCAT
      wa_fieldcat LIKE LINE OF it_fieldcat.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK text1.
SELECT-OPTIONS:
 s_bukrs FOR bseg-bukrs   OBLIGATORY,   ""公司代码
 s_gjahr FOR bseg-gjahr   OBLIGATORY,   ""会计年度
 s_monat FOR bseg-h_monat OBLIGATORY,   ""会计期间
 s_hkont FOR bseg-hkont.   ""总账科目"
PARAMETERS:
  p_ktopl TYPE skat-ktopl DEFAULT 'LXCA' OBLIGATORY,   ""科目表
  p_p1    TYPE char1  DEFAULT '' USER-COMMAND flag,
  p_wfplr TYPE bseg-hkont MODIF ID f2 DEFAULT '0041040112' OBLIGATORY.
SELECTION-SCREEN END OF BLOCK text1.



*----------------------------------------------------------------------*
*                  初 始 化 块                                         *
*----------------------------------------------------------------------*
*该事件在屏幕未显示之前执行,对程式设置值及屏幕元素进行初始化赋值*
INITIALIZATION.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN .
    IF p_p1 = ''.
      IF screen-group1 = 'F2' .
        screen-active = 0 . "不活动,相当于隐藏
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

*----------------------------------------------------------------------*
*                  逻 辑 处 理 块                                      *
*----------------------------------------------------------------------*

START-OF-SELECTION. "执行按钮后触发
  PERFORM frm_authority_check. "检查权限
  PERFORM frm_getdata. "取数
  PERFORM frm_layout. "布局
  PERFORM frm_fieldcat. "列
  PERFORM frm_output. "输出



*&---------------------------------------------------------------------*
*& Form FRM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata .

  "由于公司数量多的话数据量会非常大,所以分公司取数据,取完之后清空内表,以避免出现内存不足的情况!!!
  "如果此处筛选了月份的话会出现利润分配-未分配利润无法结转的情况
  "如本月导上月的科目余额表,并不需要本月的科目余额数据,但是此处并没有筛选
  "并没有考虑单独导非利润分配-未分配利润的科目数据取得多的情况,一般而言科目余额表就导全部的科目数据即可
  "faglflexa此表有月份是0的数据,初步判断是年初的余额,但是暂估类的科目没有原币金额,所以最后还是剔除

  "此处并没有取FAGL_SPLINFO,AGL_SPLINFO 未清项目的拆分信息 中 ,
  "举列:单号1900002039,厂区C121,年份2023 分摊了两个科目 22020201 应付账款-非关系人 22210101 应交税费-应交增值税-进项税额  到利润中心,但是会发生借贷方金额发生改变的情况
  "此程序与系统的借贷方发生额会有差异,但是本币累计余额经过核对没有差异

*------------------------------------------"判断需不需要会计科目 利润分配-未分配利润"-------------------------
  IF p_wfplr IN s_hkont .
    bl_wfplr = 'X'.
  ENDIF.

*------------------------------------------"SELECT 取SE16"-------------------------


  CLEAR gt_data1.
  SELECT
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      "bseg~belnr,             ""会计凭证号码
      "bseg~buzei,             ""会计凭证中的行项目数
      "skat~spras,             ""语言代码
      "skat~ktopl,             ""科目表
      "skat~saknr,             ""总账科目编号
      "skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl,             ""更新总分类帐交易数字货币
      SUM( bseg~wrbtr ) AS wrbtr,             ""凭证货币金额
      SUM( bseg~dmbtr ) AS dmbtr,             ""按本位币计的金额
      SUM( bseg~pswbt ) AS pswbt             ""总帐中更新的金额
  FROM bseg
      LEFT JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      LEFT JOIN t001 ON  t001~bukrs = bseg~bukrs
  WHERE
    ( @bl_wfplr = 'X'  AND bseg~bukrs IN @s_bukrs ) OR  "公司代码
    ( @bl_wfplr <> 'X' AND bseg~bukrs IN @s_bukrs  AND bseg~hkont IN @s_hkont ) "公司代码、科目!!!
  GROUP BY
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      "bseg~belnr,             ""会计凭证号码
      "bseg~buzei,             ""会计凭证中的行项目数
      "skat~spras,             ""语言代码
      "skat~ktopl,             ""科目表
      "skat~saknr,             ""总账科目编号
      "skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl             ""更新总分类帐交易数字货币
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  PERFORM frm_calculatedata USING 'bseg'. "计算


  CLEAR gt_data1.
  SELECT
      faglflexa~rclnt AS mandt,            ""集团
      faglflexa~rbukrs AS bukrs,           ""公司代码
      faglflexa~racct AS hkont,            ""科目号
      faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
      faglflexa~ryear AS gjahr,            ""会计年度
      bkpf~monat AS h_monat,          ""过账期间
      "faglflexa~docnr AS belnr,            ""会计凭证号码
      "faglflexa~buzei,            ""会计凭证中的行项目数
      "skat~spras,                 ""语言代码
      "skat~ktopl,                 ""科目表
      "skat~saknr,                 ""总账科目编号
      "skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk AS shkzg,            ""借方/贷方标识
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~wsl WHEN 'H' THEN - faglflexa~wsl END ) AS wrbtr,                ""原交易货币的值(凭证货币)
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~hsl WHEN 'H' THEN - faglflexa~hsl END ) AS dmbtr                ""用本地货币表示的值 "
  FROM faglflexa
      LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
      LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
  WHERE
     ( @bl_wfplr = 'X'  AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs ) OR   "公司代码 会计凭证号码 排除空,月份排除空
     ( @bl_wfplr <> 'X' AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs AND faglflexa~racct IN @s_hkont )   "公司代码 会计凭证号码 排除空,月份排除空、科目!!!
  GROUP BY
      faglflexa~rclnt ,            ""集团
      faglflexa~rbukrs ,           ""公司代码
      faglflexa~racct ,            ""科目号
      faglflexa~rwcur ,          ""原事务货币的货币码
      faglflexa~ryear ,            ""会计年度
      bkpf~monat ,          ""过账期间
      "faglflexa~docnr AS belnr,            ""会计凭证号码
      "faglflexa~buzei,            ""会计凭证中的行项目数
      "skat~spras,                 ""语言代码
      "skat~ktopl,                 ""科目表
      "skat~saknr,                 ""总账科目编号
      "skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk            ""借方/贷方标识
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  PERFORM frm_calculatedata USING 'faglflexa'. "计算





"用了这种方式效率会很低,程式很慢,而且容易数据溢出!!!
*  "直接取“ BKPF  总帐科目主记录 (科目表)”里的年份,不能卡年份条件
*  " DISTINCT 可以去重
*  CLEAR gt_where1.
*  SELECT DISTINCT bukrs , gjahr FROM bkpf  WHERE  bukrs IN @s_bukrs
*  INTO CORRESPONDING FIELDS OF TABLE @gt_where1.
*
*  "卡公司年份主要是担心内存不够,否则不需要这么麻烦
*  LOOP AT gt_where1 INTO gs_data1.
*    IF bl_wfplr = 'X'. "如果包含利润分配未分配利润这个科目就要全选,否则就卡科目的条件,以便提高速度
*
*      "----------------------------------------------------bseg--------------------------------------------
*      CLEAR gt_data1.
*      SELECT
*          bseg~mandt,             ""集团
*          bseg~bukrs,             ""公司代码
*          bseg~hkont,             ""总账科目
*          bseg~h_waers,           ""货币码
*          bseg~gjahr,             ""会计年度
*          bseg~h_monat,           ""会计期间
*          "bseg~belnr,             ""会计凭证号码
*          "bseg~buzei,             ""会计凭证中的行项目数
*          "skat~spras,             ""语言代码
*          "skat~ktopl,             ""科目表
*          "skat~saknr,             ""总账科目编号
*          "skat~txt20,             ""总帐科目名称
*          skat~txt50,             ""总账科目长文本
*          ska1~ktoks,             ""总账科目组
*          bseg~shkzg,             ""借方/贷方标识
*          bseg~wrbtr,             ""凭证货币金额
*          bseg~dmbtr,             ""按本位币计的金额
*          bseg~pswsl,             ""更新总分类帐交易数字货币
*          bseg~pswbt,             ""总帐中更新的金额
*          t001~waers               ""T001货币码
*      FROM bseg
*        LEFT JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
*        LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
*        LEFT JOIN t001 ON  t001~bukrs = bseg~bukrs
*        WHERE bseg~gjahr = @gs_data1-gjahr AND bseg~bukrs = @gs_data1-bukrs "年份、公司代码
*        INTO CORRESPONDING FIELDS OF TABLE @gt_data1.
*
*      PERFORM frm_calculatedata USING 'bseg'. "计算
*
*      "----------------------------------------------------faglflexa--------------------------------------------
*      CLEAR gt_data1.
*      SELECT
*          faglflexa~rclnt AS mandt,            ""集团
*          faglflexa~rbukrs AS bukrs,           ""公司代码
*          faglflexa~racct AS hkont,            ""科目号
*          faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
*          faglflexa~ryear AS gjahr,            ""会计年度
*          bkpf~monat AS h_monat,          ""过账期间
*          "faglflexa~docnr AS belnr,            ""会计凭证号码
*          "faglflexa~buzei,            ""会计凭证中的行项目数
*          "skat~spras,                 ""语言代码
*          "skat~ktopl,                 ""科目表
*          "skat~saknr,                 ""总账科目编号
*          "skat~txt20,                 ""总帐科目名称
*          skat~txt50,                 ""总账科目长文本
*          ska1~ktoks,                 ""总账科目组
*          faglflexa~drcrk AS shkzg,            ""借方/贷方标识
*          faglflexa~wsl AS wrbtr,                ""原交易货币的值(凭证货币)
*          faglflexa~hsl AS  dmbtr                ""用本地货币表示的值 "
*      FROM faglflexa
*          LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
*          LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
*          LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
*          WHERE faglflexa~ryear = @gs_data1-gjahr AND faglflexa~rbukrs = @gs_data1-bukrs  AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00'   "年份、公司代码 会计凭证号码 排除空,月份排除空
*          INTO CORRESPONDING FIELDS OF TABLE @gt_data1.
*
*      PERFORM frm_calculatedata USING 'faglflexa'. "计算
*
*
*    ELSE.  "----------------------------------------------------ELSE--------------------------------------------
*
*
*      ""----------------------------------------------------bseg--------------------------------------------
*      CLEAR gt_data1.
*      SELECT
*          bseg~mandt,             ""集团
*          bseg~bukrs,             ""公司代码
*          bseg~hkont,             ""总账科目
*          bseg~h_waers,           ""货币码
*          bseg~gjahr,             ""会计年度
*          bseg~h_monat,           ""会计期间
*          "bseg~belnr,             ""会计凭证号码
*          "bseg~buzei,             ""会计凭证中的行项目数
*          "skat~spras,             ""语言代码
*          "skat~ktopl,             ""科目表
*          "skat~saknr,             ""总账科目编号
*          "skat~txt20,             ""总帐科目名称
*          skat~txt50,             ""总账科目长文本
*          ska1~ktoks,             ""总账科目组
*          bseg~shkzg,             ""借方/贷方标识
*          bseg~wrbtr,             ""凭证货币金额
*          bseg~dmbtr,             ""按本位币计的金额
*          bseg~pswsl,             ""更新总分类帐交易数字货币
*          bseg~pswbt,             ""总帐中更新的金额
*          t001~waers               ""T001货币码
*      FROM bseg
*        LEFT JOIN skat ON  skat~saknr = bseg~hkont  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
*        LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
*        LEFT JOIN t001 ON  t001~bukrs = bseg~bukrs
*        WHERE bseg~gjahr = @gs_data1-gjahr AND bseg~bukrs = @gs_data1-bukrs   AND hkont IN @s_hkont "年份、公司代码、科目!!!
*        INTO CORRESPONDING FIELDS OF TABLE @gt_data1.
*
*      PERFORM frm_calculatedata USING 'bseg'. "计算
*
*      "----------------------------------------------------faglflexa--------------------------------------------
*      CLEAR gt_data1.
*      SELECT
*          faglflexa~rclnt AS mandt,            ""集团
*          faglflexa~rbukrs AS bukrs,           ""公司代码
*          faglflexa~racct AS hkont,            ""科目号
*          faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
*          faglflexa~ryear AS gjahr,            ""会计年度
*          bkpf~monat AS h_monat,          ""过账期间
*          "faglflexa~docnr AS belnr,            ""会计凭证号码
*          "faglflexa~buzei,            ""会计凭证中的行项目数
*          "skat~spras,                 ""语言代码
*          "skat~ktopl,                 ""科目表
*          "skat~saknr,                 ""总账科目编号
*          "skat~txt20,                 ""总帐科目名称
*          skat~txt50,                 ""总账科目长文本
*          ska1~ktoks,                 ""总账科目组
*          faglflexa~drcrk AS shkzg,            ""借方/贷方标识
*          faglflexa~wsl AS wrbtr,                ""原交易货币的值(凭证货币)
*          faglflexa~hsl AS  dmbtr                ""用本地货币表示的值 "
*      FROM faglflexa
*          LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
*          LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
*          LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
*          WHERE faglflexa~ryear = @gs_data1-gjahr AND faglflexa~rbukrs = @gs_data1-bukrs  AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~racct IN @s_hkont   "年份、公司代码 会计凭证号码 排除空,月份排除空、科目!!!
*          INTO CORRESPONDING FIELDS OF TABLE @gt_data1.
*
*      PERFORM frm_calculatedata USING 'faglflexa'. "计算
*
*    ENDIF.
*  ENDLOOP.




*------------------------------------------"补 公司~科目~币种、年~月"-------------------------
  "比如上个月有发生额,本月没有发生额,但是却又存在累计余额的情况,目的是取出全部科目的累计余额


  "直接取“ BKPF  总帐科目主记录 (科目表)”里的年会计年度、会计期间",不能卡年份条件
  " DISTINCT 可以去重
  "不能直接在 gt_report1 里去取,因为如果筛选了科目,就会发生科目当月没发生额而丢失了期末余额的状况
  CLEAR gt_where1.
  SELECT DISTINCT gjahr ,monat AS  h_monat FROM bkpf  WHERE  bukrs IN @s_bukrs
  INTO CORRESPONDING FIELDS OF TABLE @gt_where1.

  CLEAR gs_data2.
  CLEAR gt_where2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "gs_data2-spras = gs_data1-spras.              ""语言代码
    "gs_data2-ktopl = gs_data1-ktopl.              ""科目表
    "gs_data2-saknr = gs_data1-saknr.              ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.              ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.              ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.              ""总账科目组 "
    COLLECT gs_data2 INTO gt_where2 .
  ENDLOOP.

  LOOP AT gt_where1 INTO gs_data1  .
    LOOP AT gt_where2 INTO gs_data2  .
      "*gs_data2-mandt = gs_data2-mandt.              ""集团
      "*gs_data2-bukrs = gs_data2-bukrs.              ""公司代码
      "*gs_data2-hkont = gs_data2-hkont.              ""总账科目
      "*gs_data2-h_waers = gs_data2-h_waers.          ""币种
      ""gs_data2-spras = gs_data2-spras.              ""语言代码
      ""gs_data2-ktopl = gs_data2-ktopl.              ""科目表
      ""gs_data2-saknr = gs_data2-saknr.              ""总账科目编号
      ""gs_data2-txt20 = gs_data2-txt20.              ""总帐科目名称
      "*gs_data2-txt50 = gs_data2-txt50.              ""总账科目长文本
      "*gs_data2-ktoks = gs_data2-ktoks.              ""总账科目组
      gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
      gs_data2-h_monat = gs_data1-h_monat.          ""会计期间"
      COLLECT gs_data2 INTO gt_report1 .
    ENDLOOP.
  ENDLOOP.

*------------------------------------------"利润分配-未分配利润补项目"-------------------------
  "利润分配-未分配利润此科目系统没有产生凭证,并且初步判断,系统结转的时候是按照本币结转,没有考虑原币的情况,而且几乎不会有发生额,所以需要根据此科目补条目

  IF bl_wfplr = 'X'.


    CLEAR gt_where2.
    SELECT
       "skat~spras,                 ""语言代码
       "skat~ktopl,                 ""科目表
       "skat~saknr,                 ""总账科目编号
       "skat~txt20,                 ""总帐科目名称
       skat~txt50,                 ""总账科目长文本
       ska1~ktoks                 ""总账科目组
   FROM skat
       LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
       WHERE  skat~saknr = @p_wfplr  AND skat~spras = @sy-langu AND skat~ktopl = @p_ktopl
       INTO CORRESPONDING FIELDS OF TABLE @gt_where2.

    CLEAR gs_data2.
    CLEAR gt_where3.
    LOOP AT gt_report1 INTO gs_data1  .
      gs_data2-mandt = gs_data1-mandt.              ""集团
      gs_data2-bukrs = gs_data1-bukrs.          ""公司代码
      gs_data2-h_waers = gs_data1-h_waers .          ""货币码
      COLLECT gs_data2 INTO gt_where3 .
    ENDLOOP.

    CLEAR gs_data4.
    LOOP AT gt_where1 INTO gs_data1  .
      LOOP AT gt_where2 INTO gs_data2  .
        LOOP AT gt_where3 INTO gs_data3.
          gs_data4-mandt = gs_data3-mandt.              ""集团
          gs_data4-bukrs = gs_data3-bukrs.              ""公司代码
          gs_data4-hkont = p_wfplr.                         ""总账科目
          gs_data4-h_waers = gs_data3-h_waers.          ""币种
          "gs_data4-spras = gs_data2-spras.              ""语言代码
          "gs_data4-ktopl = gs_data2-ktopl.              ""科目表
          "gs_data4-saknr = gs_data2-saknr.              ""总账科目编号
          "gs_data4-txt20 = gs_data2-txt20.              ""总帐科目名称
          gs_data4-txt50 = gs_data2-txt50.              ""总账科目长文本
          gs_data4-ktoks = gs_data2-ktoks.              ""总账科目组
          gs_data4-gjahr = gs_data1-gjahr.              ""会计年度
          gs_data4-h_monat = gs_data1-h_monat.          ""会计期间"
          COLLECT gs_data4 INTO gt_report1 .
          APPEND gs_data4 TO gt_wfplr2 .
        ENDLOOP.
      ENDLOOP.
    ENDLOOP.

  ENDIF.


*------------------------------------------"余额"-------------------------
  "余额=借方-贷方
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-ye_wrbtr = gs_data1-jf_wrbtr - gs_data1-df_wrbtr .          ""余额原币
    gs_data1-ye_dmbtr = gs_data1-jf_dmbtr - gs_data1-df_dmbtr.          ""余额本币"
    IF gs_data1-ye_dmbtr = 0 .
      gs_data1-h_shkzg = '平'.
    ELSEIF gs_data1-ye_dmbtr > 0 .
      gs_data1-h_shkzg = '借'.
    ELSEIF gs_data1-ye_dmbtr < 0 .
      gs_data1-h_shkzg = '贷'.
    ENDIF.
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING ye_wrbtr ye_dmbtr h_shkzg.
  ENDLOOP.


*------------------------------------------"本币余额 求和"-------------------------

  "求和:余额本币
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1.
    CLEAR gs_data2.
    gs_data2-mandt = gs_data1-mandt.                   ""集团
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.                   ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.               ""会计期间
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumye_dmbtr = gs_data1-ye_dmbtr.          ""求和:余额本币
    COLLECT gs_data2 INTO gt_where1 .
  ENDLOOP.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  CLEAR gs_data2.
  gs_data2-ye_wrbtr = 0.          ""余额原币
  gs_data2-ye_dmbtr = 0.          ""余额本币
  LOOP AT gt_where1 INTO gs_data1  .
    IF gs_data1-sumye_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING ye_wrbtr ye_dmbtr
          WHERE mandt = gs_data1-mandt
          AND bukrs = gs_data1-bukrs
          AND gjahr = gs_data1-gjahr
          AND h_monat = gs_data1-h_monat
          AND hkont = gs_data1-hkont .
    ENDIF.
  ENDLOOP.



*------------------------------------------"累计余额"-------------------------
  "累计余额一定要先排序
  "排序后按照余额进行累计,但是不同法人,不同科目,不同币别时要清空
  "如果是费用类的科目跨年会结转到利润分配-未分配利润,所以也要跨年清空累计余额

  SORT gt_report1 BY mandt bukrs hkont h_waers gjahr h_monat .
  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    IF NOT (  gs_data2-bukrs  = gs_data1-bukrs AND gs_data2-hkont  = gs_data1-hkont AND gs_data2-h_waers  = gs_data1-h_waers ) .
      gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
      gs_data2-hkont  = gs_data1-hkont .        ""总账科目
      gs_data2-h_waers  = gs_data1-h_waers .   ""币种
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    IF NOT (  gs_data2-gjahr  = gs_data1-gjahr  ) AND gs_data1-ktoks = 'PL'  .
      gs_data2-gjahr  = gs_data1-gjahr .
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
    gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
    gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
    gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .

  ENDLOOP.

*------------------------------"利润分配-未分配利润 累计余额"-------------------------
  "加总费用类的科目余额,并且给下一年的利润分配-未分配利润的累计余额

  IF bl_wfplr = 'X'.

    CLEAR gs_data2.
    CLEAR gt_wfplr1.
    LOOP AT gt_report1 INTO gs_data1 WHERE ktoks = 'PL' .
      gs_data2-bukrs  = gs_data1-bukrs . "公司代码
      gs_data2-gjahr  = gs_data1-gjahr + 1. ""年
      gs_data2-h_waers  = gs_data1-h_waers . ""币种
      gs_data2-ye_wrbtr = gs_data1-ye_wrbtr.
      gs_data2-ye_dmbtr = gs_data1-ye_dmbtr.
      COLLECT gs_data2 INTO gt_wfplr1.
    ENDLOOP.

    CLEAR gs_data2.
    LOOP AT gt_wfplr1 INTO gs_data1  .
      IF NOT (  gs_data2-bukrs  = gs_data1-bukrs  AND gs_data2-h_waers  = gs_data1-h_waers ) .
        gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
        gs_data2-h_waers  = gs_data1-h_waers .   ""币种
        gs_data2-lj_wrbtr = 0 .
        gs_data2-lj_dmbtr = 0 .
      ENDIF.
      gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
      gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
      gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
      gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
      MODIFY gt_wfplr1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .
    ENDLOOP.

    CLEAR gs_data3.
    LOOP AT gt_wfplr1 INTO gs_data1.
      LOOP AT gt_report1 INTO gs_data2 WHERE hkont = p_wfplr.
        IF gs_data1-bukrs = gs_data2-bukrs AND gs_data1-gjahr = gs_data2-gjahr AND gs_data1-h_waers = gs_data2-h_waers .
          gs_data3-lj_wrbtr = gs_data1-lj_wrbtr + gs_data2-lj_wrbtr.
          gs_data3-lj_dmbtr = gs_data1-lj_dmbtr + gs_data2-lj_dmbtr.
          MODIFY gt_report1 FROM gs_data3  TRANSPORTING lj_wrbtr  lj_dmbtr .
        ENDIF.
      ENDLOOP.
    ENDLOOP.

  ENDIF.



*-------------------------------------"累计本币余额 求和"------------------------------

  "求和:累计余额本币
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1.
    CLEAR gs_data2.
    gs_data2-mandt = gs_data1-mandt.                   ""集团
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.                   ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.               ""会计期间
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumlj_dmbtr = gs_data1-lj_dmbtr.          ""求和:余额本币
    COLLECT gs_data2 INTO gt_where1.
  ENDLOOP.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  CLEAR gs_data2.
  gs_data2-lj_wrbtr = 0.          ""余额原币
  gs_data2-lj_dmbtr = 0.          ""余额本币
  LOOP AT gt_where1 INTO gs_data1  .
    IF gs_data1-sumlj_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING lj_wrbtr lj_dmbtr
          WHERE mandt = gs_data1-mandt
          AND bukrs = gs_data1-bukrs
          AND gjahr = gs_data1-gjahr
          AND h_monat = gs_data1-h_monat
          AND hkont = gs_data1-hkont .
    ENDIF.
  ENDLOOP.


*------------------------------------------"上期余额"-------------------------
  "上月余额,不是年初余额

  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-qc_wrbtr  = gs_data1-lj_wrbtr - gs_data1-ye_wrbtr .
    gs_data1-qc_dmbtr  = gs_data1-lj_dmbtr - gs_data1-ye_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING qc_wrbtr  qc_dmbtr .
  ENDLOOP.


*------------------------------------------"屏幕筛选"-------------------------
  "根据公司取出所有数据后,再根据用户的筛选条件筛选具体的科目、月份等信息

  LOOP AT gt_report1 INTO gs_data1 WHERE gjahr IN s_gjahr  AND h_monat IN s_monat AND hkont IN s_hkont "会计年度 ,期间,总账科目.
    AND NOT (  qc_wrbtr = 0 AND  qc_dmbtr = 0 AND  jf_wrbtr = 0 AND  jf_dmbtr = 0 AND  df_wrbtr = 0 AND  df_dmbtr = 0 AND  ye_wrbtr = 0 AND  ye_dmbtr = 0 AND  lj_wrbtr = 0 AND  lj_dmbtr = 0 ) .
    APPEND gs_data1 TO gt_report2.
  ENDLOOP.

  "没有满足条件的数据,提示信息并终止程序
  IF gt_report2 IS INITIAL.
    MESSAGE s001 WITH '“科目余额表”' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.





ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  wa_layout-cwidth_opt = 'X'. "最适列宽
  wa_layout-zebra = 'X'. "隔行显示斑马纹   使ALV表格按斑马线间隔条码方式显示
  wa_layout-sel_mode = 'D'. "选择模式 "'D' 单元格的选择,可以多选单元格 多行,多列,任何单元格多选 用户可以使用最左边的选择按钮来选择多行
  wa_layout-stylefname = 'CELLBTN'. "设置单元

  "wa_layout-grid_title = 'test'.
  "wa_layout-excp_fname = 'light'.
  "wa_layout-edit = 'X'. "可编辑
  "wa_layout-box_fname = 'BOX'.
  "wa_layout-confirmation_prompt = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .


*----------------------------------------------------------------------*
*                  定义宏
*----------------------------------------------------------------------*
  DEFINE init_fieldcat.
    CLEAR wa_fieldcat.
    wa_fieldcat-fieldname = &1. "标题列对应的字段名
    wa_fieldcat-coltext = &2. "列标题 列标题,如果字段参考了DDIC,可不设置
    wa_fieldcat-fix_column = &3. "固定列 与KEY字段类似,固定列但颜色不变蓝,必须要在左边才起作用(如果设置固定列的左边包含非固定列,则该列不固定)
    wa_fieldcat-no_zero = &4. "是否隐藏输出为零的字段 当字段为数值为0时,不显示【如0,0.00,则会显示为空】当字段包含前导0时,隐藏前导0,【如0100,则会显示为100】
    wa_fieldcat-cfieldname = &5. "currency unit field name值为当前输出内表中的货币单位字段的字段名称
    wa_fieldcat-edit = &6. "准备输入 X:可编辑,space:不可编辑 该控制是在整列的级别上,如果想控制仅仅某一行可编辑,则需要通过style来控制

    "wa_fieldcat-col_pos = ''. "输出列  列位置,即从左到右的顺序。若为空,则按字段添加到内表中的顺序
    "wa_fieldcat-key = ''. "关键字段 key值在左右滚动时不移动,蓝色显示
    "wa_fieldcat-hotspot = ''. "单击敏感 设置为带下划线热点,可触发热点、双击事件
    "wa_fieldcat-do_sum = 'X' . "总计列值
    "wa_fieldcat-no_sum = 'X' . "没有总计列值
    "wa_fieldcat-LOWERCASE  = 'X'. "允许/不允许小写字母 X:区分大小写/空:不区分(小写自动转换为大写) "主要影响数据的录入,当通过ALV输入数据的时候,如果未设置该标识,则输入小写字母如abc时,系统自动转换为ABC主键字段一般都是大写,主要是文本、描述字段时需要注意
    "wa_fieldcat-REF_TABLE = ''. "内部表字段的参考表名称
    "wa_fieldcat-REF_FIELD = ''. "部表字段的参考字段名称
    "wa_fieldcat-CHECKBOX = 'X' . "作为复选框输出 复选框标志只有字段值为X时,复选框才会被设置为选中,空或者其它值时为不选中
    "wa_fieldcat-rollname = '' . "F1 帮助的数据元素
    "wa_fieldcat-just = ''. "对齐 空时:字符默认左对齐:C/X/D/T/STRING/XSTRING数值默认右对齐:I/F/P/N 非空时:(R)ight/(L)eft/(C)enter

    APPEND wa_fieldcat TO it_fieldcat.
  END-OF-DEFINITION.


  init_fieldcat:

    'BUKRS' '公司代码'(t01) 'X' '' '' '',
    'GJAHR' '会计年度'(t02) 'X' '' '' '',
    'H_MONAT' '会计期间'(t03) 'X' '' '' '',
    'HKONT' '总账科目'(t04) 'X' 'X' '' '',
    'TXT50' '总账科目长文本 '(t05) 'X' '' '' '',
    'H_WAERS' '币种'(t06) 'X' '' '' '',
    'QC_WRBTR' '期初原币余额'(t07) '' '' 'H_WAERS' '',
    'QC_DMBTR' '期初本币余额'(t08) '' '' '' '',
    'JF_WRBTR' '本月借方发生额原币'(t09)  '' '' 'H_WAERS' '',
    'JF_DMBTR' '本月借方发生额本币'(t10) '' '' '' '',
    'DF_WRBTR' '本月贷方发生额原币'(t11) '' '' 'H_WAERS' '',
    'DF_DMBTR' '本月贷方发生额本币'(t12) '' '' '' '',
    'H_SHKZG' '借贷标识'(t13) '' '' '' '',
    'YE_WRBTR' '余额原币'(t14) '' '' 'H_WAERS' '',
    'YE_DMBTR' '余额本币'(t15) '' '' '' '',
    'LJ_WRBTR' '累计余额原币'(t16) '' '' 'H_WAERS' '',
    'LJ_DMBTR' '累计余额本币'(t17) '' '' '' ''."

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-cprog "sy-repid
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER =
*     I_BUFFER_ACTIVE    =
*     I_CALLBACK_PROGRAM = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME   =
*     I_BACKGROUND_ID    = ' '
*     I_GRID_TITLE       =
*     I_GRID_SETTINGS    =
      is_layout_lvc      = wa_layout
      it_fieldcat_lvc    = it_fieldcat
*     IT_EXCLUDING       =
*     IT_SPECIAL_GROUPS_LVC             =
*     IT_SORT_LVC        =
*     IT_FILTER_LVC      =
*     IT_HYPERLINK       =
*     IS_SEL_HIDE        =
      i_default          = 'X'
      i_save             = 'A' " 'U'
*     IS_VARIANT         =
*     IT_EVENTS          =
*     IT_EVENT_EXIT      =
*     IS_PRINT_LVC       =
*     IS_REPREP_ID_LVC   =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  =
*     I_HTML_HEIGHT_END  =
*     IT_ALV_GRAPHICS    =
*     IT_EXCEPT_QINFO_LVC               =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab           = gt_report2
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
    "LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALCULATEDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_calculatedata USING se16 TYPE char10.

  LOOP AT gt_data1 INTO gs_data1 .
    CLEAR gs_data2.
    IF se16 = 'bseg'. "如果交易货币不是公司代码的本币就默认是原币,进而带出总帐中更新的金额
      IF gs_data1-pswsl <> gs_data1-waers.
        gs_data1-h_waers = gs_data1-pswsl. ""币种
        gs_data1-wrbtr = gs_data1-pswbt.   ""原币
      ENDIF.
    "ELSEIF se16 = 'faglflexa'. "也可以写到SELECT语句里
    "  IF gs_data1-shkzg = 'H'.
    "   gs_data1-wrbtr = - gs_data1-wrbtr .
    "    gs_data1-dmbtr = - gs_data1-dmbtr .
    "  ENDIF.
    ENDIF.
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.          ""会计期间
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "凭证直接取日币是缩小了一百倍,应该通过ALV显示的时候更改而不是改内表,虽然测试的结果是一样的
    "IF gs_data1-h_waers  = 'JPY' . "币别为小币种的时候,数据放大倍数
    "   gs_data1-wrbtr = gs_data1-wrbtr * 100.           ""本月借方发生额原币!!!
    "ENDIF.
    IF gs_data1-shkzg = 'S'. "借方
      gs_data2-jf_wrbtr = gs_data1-wrbtr.           ""本月借方发生额原币!!!
      gs_data2-jf_dmbtr = gs_data1-dmbtr.           ""本月借方发生额本币!!!
    ELSEIF gs_data1-shkzg = 'H'. "贷方
      gs_data2-df_wrbtr = gs_data1-wrbtr.           ""本月贷方发生额原币!!!
      gs_data2-df_dmbtr = gs_data1-dmbtr.           ""本月贷方发生额本币!!!
    ENDIF.
    "gs_data2-spras = gs_data1-spras.          ""语言代码
    "gs_data2-ktopl = gs_data1-ktopl.          ""科目表
    "gs_data2-saknr = gs_data1-saknr.          ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.          ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.          ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.          ""总账科目组 "
    COLLECT gs_data2 INTO gt_report1 .
  ENDLOOP.

  CLEAR gt_data1.
ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  getaction
*&---------------------------------------------------------------------*
*       处理用户权限
*----------------------------------------------------------------------*
FORM frm_authority_check.
  DATA:BEGIN OF lt_bukrs OCCURS 0,
         bukrs LIKE t001-bukrs,
       END OF lt_bukrs.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_bukrs FROM t001 WHERE bukrs IN s_bukrs.
  LOOP AT lt_bukrs.
    AUTHORITY-CHECK OBJECT  'F_SKA1_BUK'
    ID 'BUKRS' FIELD lt_bukrs-bukrs."检查字段
    IF sy-subrc <> 0.
      MESSAGE s021 WITH lt_bukrs-bukrs DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.
ENDFORM.

正式运行1

*&---------------------------------------------------------------------*
*& Report ZCOR0054
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
* Program Name: ZCOR0054
* Date written: 2023-06-27
* Author's name: C10089213 朱鸿飞
* Last update:
* Program title: 立铠科目余额表(原币)
* Project Name: 立讯精密ERP实施项目
* Version: V1.0

*参考资料
*在SAP系统中,凭证项目相关的数据可以在表BKPF(凭证抬头数据)和BSEG(凭证行项目数据)中找到。在BSEG表中,可以使用字段GL_ACCOUNT来查找会计科目16020107相关的凭证项目数据。具体来说,你可以使用如下的SAP ABAP代码来查询该会计科目的凭证项目数据:
*
*SELECT *
*FROM BSEG
*WHERE GL_ACCOUNT = '16020107'.
*需要注意的是,在实际使用中,你需要根据自己的SAP系统配置和权限,来确定可以访问哪些表和字段。另外,我们需要保证查询操作的合法性和准确性,避免对系统数据造成不必要的影响。
*
*
*在SAP系统中,除了BSEG表(凭证行项目数据),还有其他一些表可以存储凭证项目相关的数据。以下是一些常见的例子:
*
*BKPF表:凭证抬头数据表,包含凭证的基本信息,如凭证号、凭证日期、凭证类型等。BKPF表和BSEG表通过凭证号(BELNR)字段进行关联,可以用来检索特定凭证的所有行项目数据。
*COEP表:成本元素总帐凭证行项目数据表,用于存储与成本核算相关的凭证项目数据。COEP表和BSEG表通过凭证号、凭证行项目号(BUZEI)和成本元素(COSTELEMENT)字段进行关联。
*FAGLFLEXA表:总账分析项数据表,用于存储总账分析项相关的凭证数据。FAGLFLEXA表和BSEG表通过凭证号和凭证行项目号字段进行关联。
*FAGL_SPLINFO表:总账分期余额表,用于存储总账分期余额相关的凭证数据。FAGL_SPLINFO表和BSEG表通过凭证号、凭证行项目号和总账分期(FISCPER)字段进行关联。
*需要根据具体情况选择合适的表来查询凭证项目相关的数据。同时,需要注意不同表之间的关联关系,以及表中字段的含义和使用方式。


REPORT zcor0054 MESSAGE-ID zfi001.


*----------------------------------------------------------------------*
*              INCLUDE 、 TYPES_POOLS 、 TABLES  引 用 区              *
*----------------------------------------------------------------------*
TABLES : bseg ,faglflexa ,bkpf, skat , ska1 ,t001 , t030 .


*----------------------------------------------------------------------*
*                 T Y P E S -  结 构 定 义                             *
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_data,
         mandt       TYPE mandt,               ""集团
         bukrs       TYPE bukrs,               ""公司代码
         hkont       TYPE hkont,               ""总账科目
         h_waers     TYPE waers,               ""货币码
         gjahr       TYPE gjahr,               ""会计年度
         h_monat     TYPE monat,               ""会计期间
         "belnr    TYPE belnr_d,             ""会计凭证号码
         "buzei    TYPE buzei,               ""会计凭证中的行项目数
         "ktopl       TYPE ktopl,               ""科目表
         "saknr    TYPE saknr,               ""总账科目编号
         "txt20    TYPE txt20_skat,          ""总帐科目名称
         txt50       TYPE txt50_skat,          ""总账科目长文本
         ktoks       TYPE ktoks,               ""总账科目组
         shkzg       TYPE shkzg,               ""借方/贷方标识
         wrbtr       TYPE wrbtr,               ""凭证货币金额
         dmbtr       TYPE dmbtr,               ""按本位币计的金额
         qc_wrbtr    TYPE wrbtr,               ""期初原币余额
         qc_dmbtr    TYPE dmbtr,               ""期初本币余额
         jf_wrbtr    TYPE wrbtr,               ""本月借方发生额原币
         jf_dmbtr    TYPE dmbtr,               ""本月借方发生额本币
         df_wrbtr    TYPE wrbtr,               ""本月贷方发生额原币
         df_dmbtr    TYPE dmbtr,               ""本月贷方发生额本币
         h_shkzg     TYPE shkzg,               ""借贷标识(显示)
         ye_wrbtr    TYPE wrbtr,               ""余额原币
         ye_dmbtr    TYPE dmbtr,               ""余额本币
         lj_wrbtr    TYPE wrbtr,               ""累计余额原币
         lj_dmbtr    TYPE dmbtr,               ""累计余额本币
         waers       TYPE waers,               ""T001货币码
         pswsl       TYPE pswsl,               ""更新总分类帐交易数字货币
         pswbt       TYPE pswbt,               ""总帐中更新的金额
         sumye_dmbtr TYPE dmbtr,               ""求和 余额本币
         sumlj_dmbtr TYPE dmbtr,               ""求和 累计余额本币
       END OF ty_data.



*----------------------------------------------------------------------*
*                  DATA 定义                                           *
*----------------------------------------------------------------------*
DATA: gt_data1   TYPE TABLE OF ty_data,
      gt_report1 TYPE TABLE OF ty_data,
      gt_report2 TYPE TABLE OF ty_data,
      gt_where1  TYPE TABLE OF ty_data,
      gt_where2  TYPE TABLE OF ty_data,
      gt_wfplr1  TYPE TABLE OF ty_data,
      gt_wfplr2  TYPE TABLE OF ty_data,
      gs_data1   TYPE ty_data,
      gs_data2   TYPE ty_data,
      gs_data3   TYPE ty_data,
      gs_ob53    TYPE ty_data,
      bl_ob53    TYPE boolean.



*----------------------------------------------------------------------*
*                  ALV 定义
*----------------------------------------------------------------------*
DATA: wa_layout   TYPE lvc_s_layo, "layout 布局控制 参考结构 lvc_s_layo
      it_fieldcat TYPE lvc_t_fcat, "fieldcat 字段目录 参考结构 LVC_T_FCAT
      wa_fieldcat LIKE LINE OF it_fieldcat.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK text1.
SELECT-OPTIONS:
 s_bukrs FOR bseg-bukrs   OBLIGATORY,   ""公司代码
 s_gjahr FOR bseg-gjahr   OBLIGATORY,   ""会计年度
 s_monat FOR bseg-h_monat OBLIGATORY,   ""会计期间
 s_hkont FOR bseg-hkont.                ""总账科目"
SELECTION-SCREEN END OF BLOCK text1.



*----------------------------------------------------------------------*
*                  初 始 化 块                                         *
*----------------------------------------------------------------------*
*该事件在屏幕未显示之前执行,对程式设置值及屏幕元素进行初始化赋值*
INITIALIZATION.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.


*----------------------------------------------------------------------*
*                  逻 辑 处 理 块                                      *
*----------------------------------------------------------------------*

START-OF-SELECTION. "执行按钮后触发
  PERFORM frm_authority_check. "检查权限
  PERFORM frm_getdata. "取数
  PERFORM frm_layout. "布局
  PERFORM frm_fieldcat. "列
  PERFORM frm_output. "输出



*&---------------------------------------------------------------------*
*& Form FRM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata .

*------------------------------------------"查询 利润分配-未分配利润 的会计科目"-------------------------
  "OB53 查看配置
  "SAP 总账在年结时可以自动结转本年利润或未分配利润,也就是说系统自动将利润表科目余额转入资产负债表科目中的本年利润或未分配利润。这里是定义转入的科目,称之为留存收益科目。
  "SPRO :IMG→财务会计→总帐会计→主记录→准备→定义留存收益
  "不支持多个公司对应不同的科目表
  SELECT SINGLE
       t030~konth AS hkont,        "利润分配-未分配利润 的会计科目
       "skat~saknr,                 ""总账科目编号
       "skat~txt20,                 ""总帐科目名称
       skat~txt50,                 ""总账科目长文本
       ska1~ktoks                 ""总账科目组
    FROM t030
    LEFT JOIN t001 ON t001~ktopl = t030~ktopl "科目表
    LEFT JOIN skat ON skat~saknr = t030~konth  AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl "利润分配-未分配利润 的会计科目、语言码、科目表
    LEFT JOIN ska1 ON skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl "利润分配-未分配利润 的会计科目、科目表
    WHERE t001~bukrs IN @s_bukrs AND t030~ktosl = 'BIL' AND t030~komok = 'X' " tcode:OB53  BIL:结转余额
    INTO CORRESPONDING FIELDS OF @gs_ob53.

  IF gs_ob53 IS INITIAL.
    MESSAGE s001 WITH '“利润分配-未分配利润 的 会计科目”'  DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.


*------------------------------------------"判断需不需要会计科目 利润分配-未分配利润"-------------------------
  IF gs_ob53-hkont IN s_hkont .
    bl_ob53 = 'X'.
  ENDIF.

*------------------------------------------"SELECT 取SE16"-------------------------

  "此处并没有取FAGL_SPLINFO,AGL_SPLINFO 未清项目的拆分信息 中 ,
  "举列:单号1900002039,厂区C121,年份2023 分摊了两个科目 22020201 应付账款-非关系人 22210101 应交税费-应交增值税-进项税额  到利润中心,但是会发生借贷方金额发生改变的情况
  "此程序与系统的借贷方发生额会有差异,但是本币累计余额经过核对没有差异

  "如果此处筛选了月份的话会出现利润分配-未分配利润无法结转的情况
  "为了算出累计余额需要计算所有月份的凭证的行项目,而不是只取下了条件的月份的数据计算
  "就一般而言,是本月导上月(结完账月份)的科目余额表,并不需要本月的科目余额数据,但是此处并没有筛选,会取多了一点数据


  CLEAR gt_data1.
  SELECT
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      "bseg~belnr,             ""会计凭证号码
      "bseg~buzei,             ""会计凭证中的行项目数
      "skat~ktopl,             ""科目表
      "skat~saknr,             ""总账科目编号
      "skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl,             ""更新总分类帐交易数字货币
      SUM( bseg~wrbtr ) AS wrbtr,             ""凭证货币金额
      SUM( bseg~dmbtr ) AS dmbtr,             ""按本位币计的金额
      SUM( bseg~pswbt ) AS pswbt             ""总帐中更新的金额
  FROM bseg
      LEFT JOIN t001 ON t001~bukrs = bseg~bukrs
      LEFT JOIN skat ON skat~saknr = bseg~hkont AND skat~spras = @sy-langu  AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON skat~saknr = ska1~saknr AND skat~ktopl = ska1~ktopl
  WHERE
    ( @bl_ob53 = 'X'  AND bseg~bukrs IN @s_bukrs ) OR  "公司代码
    ( @bl_ob53 <> 'X' AND bseg~bukrs IN @s_bukrs  AND bseg~hkont IN @s_hkont ) "公司代码、科目!!!
  GROUP BY
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      "bseg~belnr,             ""会计凭证号码
      "bseg~buzei,             ""会计凭证中的行项目数
      "skat~ktopl,             ""科目表
      "skat~saknr,             ""总账科目编号
      "skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl             ""更新总分类帐交易数字货币
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  PERFORM frm_calculatedata USING 'bseg'. "计算


  "faglflexa此表有月份是0的数据,初步判断是年初的余额,但是暂估类的科目没有原币金额,所以最后还是剔除
  CLEAR gt_data1.
  SELECT
      faglflexa~rclnt AS mandt,            ""集团
      faglflexa~rbukrs AS bukrs,           ""公司代码
      faglflexa~racct AS hkont,            ""科目号
      faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
      faglflexa~ryear AS gjahr,            ""会计年度
      bkpf~monat AS h_monat,          ""过账期间
      "faglflexa~docnr AS belnr,            ""会计凭证号码
      "faglflexa~buzei,            ""会计凭证中的行项目数
      "skat~ktopl,                 ""科目表
      "skat~saknr,                 ""总账科目编号
      "skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk AS shkzg,            ""借方/贷方标识
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~wsl WHEN 'H' THEN - faglflexa~wsl END ) AS wrbtr,                ""原交易货币的值(凭证货币)
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~hsl WHEN 'H' THEN - faglflexa~hsl END ) AS dmbtr                ""用本地货币表示的值 "
  FROM faglflexa
      LEFT JOIN t001 ON  t001~bukrs = faglflexa~rbukrs
      LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
  WHERE
     ( @bl_ob53 = 'X'  AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs ) OR   "公司代码 会计凭证号码 排除空,月份排除空
     ( @bl_ob53 <> 'X' AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs AND faglflexa~racct IN @s_hkont )   "公司代码 会计凭证号码 排除空,月份排除空、科目!!!
  GROUP BY
      faglflexa~rclnt ,            ""集团
      faglflexa~rbukrs ,           ""公司代码
      faglflexa~racct ,            ""科目号
      faglflexa~rwcur ,          ""原事务货币的货币码
      faglflexa~ryear ,            ""会计年度
      bkpf~monat ,          ""过账期间
      "faglflexa~docnr AS belnr,            ""会计凭证号码
      "faglflexa~buzei,            ""会计凭证中的行项目数
      "skat~ktopl,                 ""科目表
      "skat~saknr,                 ""总账科目编号
      "skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk            ""借方/贷方标识
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  PERFORM frm_calculatedata USING 'faglflexa'. "计算



*------------------------------------------"补 公司~科目~币种、年~月"-------------------------
  "比如上个月有发生额,本月没有发生额,但是却又存在累计余额的情况,目的是取出全部科目的累计余额


  "直接取“ BKPF  总帐科目主记录 (科目表)”里的年会计年度、会计期间",不能卡年份条件
  " DISTINCT 可以去重
  "不能直接在 gt_report1 里去取,因为如果筛选了科目,就会发生科目当月没发生额而丢失了期末余额的状况
  CLEAR gt_where1.
  SELECT DISTINCT gjahr ,monat AS  h_monat FROM bkpf  WHERE  bukrs IN @s_bukrs
  INTO CORRESPONDING FIELDS OF TABLE @gt_where1. " gt_where1: 年、月

  CLEAR gs_data2.
  CLEAR gt_where2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "gs_data2-spras = gs_data1-spras.              ""语言代码
    "gs_data2-ktopl = gs_data1-ktopl.              ""科目表
    "gs_data2-saknr = gs_data1-saknr.              ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.              ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.              ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.              ""总账科目组 "
    COLLECT gs_data2 INTO gt_where2 .
  ENDLOOP.

  LOOP AT gt_where1 INTO gs_data1  .
    LOOP AT gt_where2 INTO gs_data2  .
      "*gs_data2-mandt = gs_data2-mandt.              ""集团
      "*gs_data2-bukrs = gs_data2-bukrs.              ""公司代码
      "*gs_data2-hkont = gs_data2-hkont.              ""总账科目
      "*gs_data2-h_waers = gs_data2-h_waers.          ""币种
      ""gs_data2-spras = gs_data2-spras.              ""语言代码
      ""gs_data2-ktopl = gs_data2-ktopl.              ""科目表
      ""gs_data2-saknr = gs_data2-saknr.              ""总账科目编号
      ""gs_data2-txt20 = gs_data2-txt20.              ""总帐科目名称
      "*gs_data2-txt50 = gs_data2-txt50.              ""总账科目长文本
      "*gs_data2-ktoks = gs_data2-ktoks.              ""总账科目组
      gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
      gs_data2-h_monat = gs_data1-h_monat.          ""会计期间"
      COLLECT gs_data2 INTO gt_report1 .
    ENDLOOP.
  ENDLOOP.

*------------------------------------------"利润分配-未分配利润补项目"-------------------------
  "利润分配-未分配利润此科目系统没有产生凭证,并且初步判断,系统结转的时候是按照本币结转,没有考虑原币的情况,而且几乎不会有发生额,所以需要根据此科目补条目

  IF bl_ob53 = 'X'.

    CLEAR gs_data2.
    CLEAR gt_where2.
    LOOP AT gt_report1 INTO gs_data1  .
      gs_data2-mandt = gs_data1-mandt.              ""集团
      gs_data2-bukrs = gs_data1-bukrs.          ""公司代码
      gs_data2-h_waers = gs_data1-h_waers .          ""货币码
      COLLECT gs_data2 INTO gt_where2 .
    ENDLOOP.

    " gt_where1: 年、月 ,上面添加后并没有清空
    CLEAR gs_data3.
    LOOP AT gt_where1 INTO gs_data1  .
      LOOP AT gt_where2 INTO gs_data2.
        gs_data3-mandt = gs_data2-mandt.              ""集团
        gs_data3-bukrs = gs_data2-bukrs.              ""公司代码
        gs_data3-hkont = gs_ob53-hkont.               ""总账科目 利润分配-未分配利润
        gs_data3-h_waers = gs_data2-h_waers.          ""币种
        gs_data3-txt50 = gs_ob53-txt50.              ""总账科目长文本
        gs_data3-ktoks = gs_ob53-ktoks.              ""总账科目组
        gs_data3-gjahr = gs_data1-gjahr.              ""会计年度
        gs_data3-h_monat = gs_data1-h_monat.          ""会计期间"
        COLLECT gs_data3 INTO gt_report1 .
        APPEND gs_data3 TO gt_wfplr2 .
      ENDLOOP.
    ENDLOOP.

  ENDIF.


*------------------------------------------"余额"-------------------------
  "余额=借方-贷方
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-ye_wrbtr = gs_data1-jf_wrbtr - gs_data1-df_wrbtr .          ""余额原币
    gs_data1-ye_dmbtr = gs_data1-jf_dmbtr - gs_data1-df_dmbtr.          ""余额本币"
    IF gs_data1-ye_dmbtr = 0 .
      gs_data1-h_shkzg = '平'.
    ELSEIF gs_data1-ye_dmbtr > 0 .
      gs_data1-h_shkzg = '借'.
    ELSEIF gs_data1-ye_dmbtr < 0 .
      gs_data1-h_shkzg = '贷'.
    ENDIF.
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING ye_wrbtr ye_dmbtr h_shkzg.
  ENDLOOP.


*------------------------------------------"本币余额 求和"-------------------------

  "求和:余额本币
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1.
    CLEAR gs_data2.
    gs_data2-mandt = gs_data1-mandt.                   ""集团
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.                   ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.               ""会计期间
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumye_dmbtr = gs_data1-ye_dmbtr.          ""求和:余额本币
    COLLECT gs_data2 INTO gt_where1 .
  ENDLOOP.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  CLEAR gs_data2.
  gs_data2-ye_wrbtr = 0.          ""余额原币
  gs_data2-ye_dmbtr = 0.          ""余额本币
  LOOP AT gt_where1 INTO gs_data1  .
    IF gs_data1-sumye_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING ye_wrbtr ye_dmbtr
          WHERE mandt = gs_data1-mandt
          AND bukrs = gs_data1-bukrs
          AND gjahr = gs_data1-gjahr
          AND h_monat = gs_data1-h_monat
          AND hkont = gs_data1-hkont .
    ENDIF.
  ENDLOOP.



*------------------------------------------"累计余额"-------------------------
  "累计余额一定要先排序
  "排序后按照余额进行累计,但是不同法人,不同科目,不同币别时要清空
  "如果是费用类的科目跨年会结转到利润分配-未分配利润,所以也要跨年清空累计余额

  SORT gt_report1 BY mandt bukrs hkont h_waers gjahr h_monat .
  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    IF NOT (  gs_data2-bukrs  = gs_data1-bukrs AND gs_data2-hkont  = gs_data1-hkont AND gs_data2-h_waers  = gs_data1-h_waers ) .
      gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
      gs_data2-hkont  = gs_data1-hkont .        ""总账科目
      gs_data2-h_waers  = gs_data1-h_waers .   ""币种
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    IF NOT (  gs_data2-gjahr  = gs_data1-gjahr  ) AND gs_data1-ktoks = 'PL'  . "'PL':损益类科目
      gs_data2-gjahr  = gs_data1-gjahr .
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
    gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
    gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
    gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .
  ENDLOOP.

*------------------------------"利润分配-未分配利润 累计余额"-------------------------
  "加总费用类的科目余额,并且给下一年的利润分配-未分配利润的累计余额

  IF bl_ob53 = 'X'.

    CLEAR gs_data2.
    CLEAR gt_wfplr1.
    LOOP AT gt_report1 INTO gs_data1 WHERE ktoks = 'PL' .
      gs_data2-bukrs  = gs_data1-bukrs . "公司代码
      gs_data2-gjahr  = gs_data1-gjahr + 1. ""年
      gs_data2-h_waers  = gs_data1-h_waers . ""币种
      gs_data2-ye_wrbtr = gs_data1-ye_wrbtr.
      gs_data2-ye_dmbtr = gs_data1-ye_dmbtr.
      COLLECT gs_data2 INTO gt_wfplr1.
    ENDLOOP.

    CLEAR gs_data2.
    LOOP AT gt_wfplr1 INTO gs_data1  .
      IF NOT (  gs_data2-bukrs  = gs_data1-bukrs  AND gs_data2-h_waers  = gs_data1-h_waers ) .
        gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
        gs_data2-h_waers  = gs_data1-h_waers .   ""币种
        gs_data2-lj_wrbtr = 0 .
        gs_data2-lj_dmbtr = 0 .
      ENDIF.
      gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
      gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
      gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
      gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
      MODIFY gt_wfplr1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .
    ENDLOOP.

    CLEAR gs_data3.
    LOOP AT gt_wfplr1 INTO gs_data1.
      LOOP AT gt_report1 INTO gs_data2 WHERE hkont = gs_ob53-hkont.
        IF gs_data1-bukrs = gs_data2-bukrs AND gs_data1-gjahr = gs_data2-gjahr AND gs_data1-h_waers = gs_data2-h_waers .
          gs_data3-lj_wrbtr = gs_data1-lj_wrbtr + gs_data2-lj_wrbtr.
          gs_data3-lj_dmbtr = gs_data1-lj_dmbtr + gs_data2-lj_dmbtr.
          MODIFY gt_report1 FROM gs_data3  TRANSPORTING lj_wrbtr  lj_dmbtr .
        ENDIF.
      ENDLOOP.
    ENDLOOP.

  ENDIF.



*-------------------------------------"累计本币余额 求和"------------------------------

  "求和:累计余额本币
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1.
    CLEAR gs_data2.
    gs_data2-mandt = gs_data1-mandt.                   ""集团
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.                   ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.               ""会计期间
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumlj_dmbtr = gs_data1-lj_dmbtr.          ""求和:余额本币
    COLLECT gs_data2 INTO gt_where1.
  ENDLOOP.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  CLEAR gs_data2.
  gs_data2-lj_wrbtr = 0.          ""余额原币
  gs_data2-lj_dmbtr = 0.          ""余额本币
  LOOP AT gt_where1 INTO gs_data1  .
    IF gs_data1-sumlj_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING lj_wrbtr lj_dmbtr
          WHERE mandt = gs_data1-mandt
          AND bukrs = gs_data1-bukrs
          AND gjahr = gs_data1-gjahr
          AND h_monat = gs_data1-h_monat
          AND hkont = gs_data1-hkont .
    ENDIF.
  ENDLOOP.


*------------------------------------------"上期余额"-------------------------
  "上月余额,不是年初余额

  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-qc_wrbtr  = gs_data1-lj_wrbtr - gs_data1-ye_wrbtr .
    gs_data1-qc_dmbtr  = gs_data1-lj_dmbtr - gs_data1-ye_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING qc_wrbtr  qc_dmbtr .
  ENDLOOP.


*------------------------------------------"屏幕筛选"-------------------------
  "根据公司取出所有数据后,再根据用户的筛选条件筛选具体的科目、月份等信息

  LOOP AT gt_report1 INTO gs_data1 WHERE gjahr IN s_gjahr  AND h_monat IN s_monat AND hkont IN s_hkont "会计年度 ,期间,总账科目.
    AND NOT (  qc_wrbtr = 0 AND  qc_dmbtr = 0 AND  jf_wrbtr = 0 AND  jf_dmbtr = 0 AND  df_wrbtr = 0 AND  df_dmbtr = 0 AND  ye_wrbtr = 0 AND  ye_dmbtr = 0 AND  lj_wrbtr = 0 AND  lj_dmbtr = 0 ) .
    APPEND gs_data1 TO gt_report2.
  ENDLOOP.

  "没有满足条件的数据,提示信息并终止程序
  IF gt_report2 IS INITIAL.
    MESSAGE s001 WITH '“科目余额表”' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.



ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  wa_layout-cwidth_opt = 'X'. "最适列宽
  wa_layout-zebra = 'X'. "隔行显示斑马纹   使ALV表格按斑马线间隔条码方式显示
  wa_layout-sel_mode = 'D'. "选择模式 "'D' 单元格的选择,可以多选单元格 多行,多列,任何单元格多选 用户可以使用最左边的选择按钮来选择多行
  wa_layout-stylefname = 'CELLBTN'. "设置单元

  "wa_layout-grid_title = 'test'.
  "wa_layout-excp_fname = 'light'.
  "wa_layout-edit = 'X'. "可编辑
  "wa_layout-box_fname = 'BOX'.
  "wa_layout-confirmation_prompt = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .


*----------------------------------------------------------------------*
*                  定义宏
*----------------------------------------------------------------------*
  DEFINE init_fieldcat.
    CLEAR wa_fieldcat.
    wa_fieldcat-fieldname = &1. "标题列对应的字段名
    wa_fieldcat-coltext = &2. "列标题 列标题,如果字段参考了DDIC,可不设置
    wa_fieldcat-fix_column = &3. "固定列 与KEY字段类似,固定列但颜色不变蓝,必须要在左边才起作用(如果设置固定列的左边包含非固定列,则该列不固定)
    wa_fieldcat-no_zero = &4. "是否隐藏输出为零的字段 当字段为数值为0时,不显示【如0,0.00,则会显示为空】当字段包含前导0时,隐藏前导0,【如0100,则会显示为100】
    wa_fieldcat-cfieldname = &5. "currency unit field name值为当前输出内表中的货币单位字段的字段名称
    wa_fieldcat-edit = &6. "准备输入 X:可编辑,space:不可编辑 该控制是在整列的级别上,如果想控制仅仅某一行可编辑,则需要通过style来控制

    "wa_fieldcat-col_pos = ''. "输出列  列位置,即从左到右的顺序。若为空,则按字段添加到内表中的顺序
    "wa_fieldcat-key = ''. "关键字段 key值在左右滚动时不移动,蓝色显示
    "wa_fieldcat-hotspot = ''. "单击敏感 设置为带下划线热点,可触发热点、双击事件
    "wa_fieldcat-do_sum = 'X' . "总计列值
    "wa_fieldcat-no_sum = 'X' . "没有总计列值
    "wa_fieldcat-LOWERCASE  = 'X'. "允许/不允许小写字母 X:区分大小写/空:不区分(小写自动转换为大写) "主要影响数据的录入,当通过ALV输入数据的时候,如果未设置该标识,则输入小写字母如abc时,系统自动转换为ABC主键字段一般都是大写,主要是文本、描述字段时需要注意
    "wa_fieldcat-REF_TABLE = ''. "内部表字段的参考表名称
    "wa_fieldcat-REF_FIELD = ''. "部表字段的参考字段名称
    "wa_fieldcat-CHECKBOX = 'X' . "作为复选框输出 复选框标志只有字段值为X时,复选框才会被设置为选中,空或者其它值时为不选中
    "wa_fieldcat-rollname = '' . "F1 帮助的数据元素
    "wa_fieldcat-just = ''. "对齐 空时:字符默认左对齐:C/X/D/T/STRING/XSTRING数值默认右对齐:I/F/P/N 非空时:(R)ight/(L)eft/(C)enter

    APPEND wa_fieldcat TO it_fieldcat.
  END-OF-DEFINITION.


  init_fieldcat:

    'BUKRS' '公司代码'(t01) 'X' '' '' '',
    'GJAHR' '会计年度'(t02) 'X' '' '' '',
    'H_MONAT' '会计期间'(t03) 'X' '' '' '',
    'HKONT' '总账科目'(t04) 'X' 'X' '' '',
    'TXT50' '总账科目长文本 '(t05) 'X' '' '' '',
    'H_WAERS' '币种'(t06) 'X' '' '' '',
    'QC_WRBTR' '期初原币余额'(t07) '' '' 'H_WAERS' '',
    'QC_DMBTR' '期初本币余额'(t08) '' '' '' '',
    'JF_WRBTR' '本月借方发生额原币'(t09)  '' '' 'H_WAERS' '',
    'JF_DMBTR' '本月借方发生额本币'(t10) '' '' '' '',
    'DF_WRBTR' '本月贷方发生额原币'(t11) '' '' 'H_WAERS' '',
    'DF_DMBTR' '本月贷方发生额本币'(t12) '' '' '' '',
    'H_SHKZG' '借贷标识'(t13) '' '' '' '',
    'YE_WRBTR' '余额原币'(t14) '' '' 'H_WAERS' '',
    'YE_DMBTR' '余额本币'(t15) '' '' '' '',
    'LJ_WRBTR' '累计余额原币'(t16) '' '' 'H_WAERS' '',
    'LJ_DMBTR' '累计余额本币'(t17) '' '' '' ''."

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-cprog "sy-repid
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER =
*     I_BUFFER_ACTIVE    =
*     I_CALLBACK_PROGRAM = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME   =
*     I_BACKGROUND_ID    = ' '
*     I_GRID_TITLE       =
*     I_GRID_SETTINGS    =
      is_layout_lvc      = wa_layout
      it_fieldcat_lvc    = it_fieldcat
*     IT_EXCLUDING       =
*     IT_SPECIAL_GROUPS_LVC             =
*     IT_SORT_LVC        =
*     IT_FILTER_LVC      =
*     IT_HYPERLINK       =
*     IS_SEL_HIDE        =
      i_default          = 'X'
      i_save             = 'A' " 'U'
*     IS_VARIANT         =
*     IT_EVENTS          =
*     IT_EVENT_EXIT      =
*     IS_PRINT_LVC       =
*     IS_REPREP_ID_LVC   =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  =
*     I_HTML_HEIGHT_END  =
*     IT_ALV_GRAPHICS    =
*     IT_EXCEPT_QINFO_LVC               =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab           = gt_report2
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
    "LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALCULATEDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_calculatedata USING se16 TYPE char10.

  LOOP AT gt_data1 INTO gs_data1 .
    CLEAR gs_data2.
    IF se16 = 'bseg'. "如果交易货币不是公司代码的本币就默认是原币,进而带出总帐中更新的金额
      IF gs_data1-pswsl <> gs_data1-waers.
        gs_data1-h_waers = gs_data1-pswsl. ""币种
        gs_data1-wrbtr = gs_data1-pswbt.   ""原币
      ENDIF.
      "ELSEIF se16 = 'faglflexa'. "也可以写到SELECT语句里
      "  IF gs_data1-shkzg = 'H'.
      "   gs_data1-wrbtr = - gs_data1-wrbtr .
      "    gs_data1-dmbtr = - gs_data1-dmbtr .
      "  ENDIF.
    ENDIF.
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.          ""会计期间
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "凭证直接取日币是缩小了一百倍,应该通过ALV显示的时候更改而不是改内表,虽然测试的结果是一样的
    "IF gs_data1-h_waers  = 'JPY' . "币别为小币种的时候,数据放大倍数
    "   gs_data1-wrbtr = gs_data1-wrbtr * 100.           ""本月借方发生额原币!!!
    "ENDIF.
    IF gs_data1-shkzg = 'S'. "借方
      gs_data2-jf_wrbtr = gs_data1-wrbtr.           ""本月借方发生额原币!!!
      gs_data2-jf_dmbtr = gs_data1-dmbtr.           ""本月借方发生额本币!!!
    ELSEIF gs_data1-shkzg = 'H'. "贷方
      gs_data2-df_wrbtr = gs_data1-wrbtr.           ""本月贷方发生额原币!!!
      gs_data2-df_dmbtr = gs_data1-dmbtr.           ""本月贷方发生额本币!!!
    ENDIF.
    "gs_data2-ktopl = gs_data1-ktopl.          ""科目表
    "gs_data2-saknr = gs_data1-saknr.          ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.          ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.          ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.          ""总账科目组 "
    COLLECT gs_data2 INTO gt_report1 .
  ENDLOOP.

  CLEAR gt_data1.
ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  getaction
*&---------------------------------------------------------------------*
*       处理用户权限
*----------------------------------------------------------------------*
FORM frm_authority_check.
  DATA:BEGIN OF lt_bukrs OCCURS 0,
         bukrs LIKE t001-bukrs,
       END OF lt_bukrs.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_bukrs FROM t001 WHERE bukrs IN s_bukrs.
  LOOP AT lt_bukrs.
    AUTHORITY-CHECK OBJECT  'F_SKA1_BUK'
    ID 'BUKRS' FIELD lt_bukrs-bukrs."检查字段
    IF sy-subrc <> 0.
      MESSAGE s021 WITH lt_bukrs-bukrs DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.
ENDFORM.

 正式运行2

*&---------------------------------------------------------------------*
*& Report ZCOR0054
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
* Program Name: ZCOR0054
* Date written: 2023-06-27
* Author's name: C10089213 朱鸿飞
* Last update:
* Program title: 立铠科目余额表(原币)
* Project Name: 立讯精密ERP实施项目
* Version: V1.0

*参考资料
*在SAP系统中,凭证项目相关的数据可以在表BKPF(凭证抬头数据)和BSEG(凭证行项目数据)中找到。在BSEG表中,可以使用字段GL_ACCOUNT来查找会计科目16020107相关的凭证项目数据。具体来说,你可以使用如下的SAP ABAP代码来查询该会计科目的凭证项目数据:
*
*SELECT *
*FROM BSEG
*WHERE GL_ACCOUNT = '16020107'.
*需要注意的是,在实际使用中,你需要根据自己的SAP系统配置和权限,来确定可以访问哪些表和字段。另外,我们需要保证查询操作的合法性和准确性,避免对系统数据造成不必要的影响。
*
*
*在SAP系统中,除了BSEG表(凭证行项目数据),还有其他一些表可以存储凭证项目相关的数据。以下是一些常见的例子:
*
*BKPF表:凭证抬头数据表,包含凭证的基本信息,如凭证号、凭证日期、凭证类型等。BKPF表和BSEG表通过凭证号(BELNR)字段进行关联,可以用来检索特定凭证的所有行项目数据。
*COEP表:成本元素总帐凭证行项目数据表,用于存储与成本核算相关的凭证项目数据。COEP表和BSEG表通过凭证号、凭证行项目号(BUZEI)和成本元素(COSTELEMENT)字段进行关联。
*FAGLFLEXA表:总账分析项数据表,用于存储总账分析项相关的凭证数据。FAGLFLEXA表和BSEG表通过凭证号和凭证行项目号字段进行关联。
*FAGL_SPLINFO表:总账分期余额表,用于存储总账分期余额相关的凭证数据。FAGL_SPLINFO表和BSEG表通过凭证号、凭证行项目号和总账分期(FISCPER)字段进行关联。
*需要根据具体情况选择合适的表来查询凭证项目相关的数据。同时,需要注意不同表之间的关联关系,以及表中字段的含义和使用方式。


REPORT zcor0054 MESSAGE-ID zfi001.


*----------------------------------------------------------------------*
*              INCLUDE 、 TYPES_POOLS 、 TABLES  引 用 区              *
*----------------------------------------------------------------------*
TABLES : bseg ,faglflexa ,bkpf, skat , ska1 ,t001 , t030 .


*----------------------------------------------------------------------*
*                 T Y P E S -  结 构 定 义                             *
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_data,
         mandt       TYPE mandt,               ""集团
         bukrs       TYPE bukrs,               ""公司代码
         hkont       TYPE hkont,               ""总账科目
         h_waers     TYPE waers,               ""货币码
         gjahr       TYPE gjahr,               ""会计年度
         h_monat     TYPE monat,               ""会计期间
         "belnr    TYPE belnr_d,             ""会计凭证号码
         "buzei    TYPE buzei,               ""会计凭证中的行项目数
         "ktopl       TYPE ktopl,               ""科目表
         "saknr    TYPE saknr,               ""总账科目编号
         "txt20    TYPE txt20_skat,          ""总帐科目名称
         txt50       TYPE txt50_skat,          ""总账科目长文本
         ktoks       TYPE ktoks,               ""总账科目组
         shkzg       TYPE shkzg,               ""借方/贷方标识
         wrbtr       TYPE wrbtr,               ""凭证货币金额
         dmbtr       TYPE dmbtr,               ""按本位币计的金额
         qc_wrbtr    TYPE wrbtr,               ""期初原币余额
         qc_dmbtr    TYPE dmbtr,               ""期初本币余额
         jf_wrbtr    TYPE wrbtr,               ""本月借方发生额原币
         jf_dmbtr    TYPE dmbtr,               ""本月借方发生额本币
         df_wrbtr    TYPE wrbtr,               ""本月贷方发生额原币
         df_dmbtr    TYPE dmbtr,               ""本月贷方发生额本币
         h_shkzg     TYPE shkzg,               ""借贷标识(显示)
         ye_wrbtr    TYPE wrbtr,               ""余额原币
         ye_dmbtr    TYPE dmbtr,               ""余额本币
         lj_wrbtr    TYPE wrbtr,               ""累计余额原币
         lj_dmbtr    TYPE dmbtr,               ""累计余额本币
         waers       TYPE waers,               ""T001货币码
         pswsl       TYPE pswsl,               ""更新总分类帐交易数字货币
         pswbt       TYPE pswbt,               ""总帐中更新的金额
         sumye_dmbtr TYPE dmbtr,               ""求和 余额本币
         sumlj_dmbtr TYPE dmbtr,               ""求和 累计余额本币
       END OF ty_data.



*----------------------------------------------------------------------*
*                  DATA 定义                                           *
*----------------------------------------------------------------------*
DATA: gt_data1   TYPE TABLE OF ty_data,
      gt_report1 TYPE TABLE OF ty_data,
      gt_report2 TYPE TABLE OF ty_data,
      gt_report3 TYPE TABLE OF ty_data,
      gt_where1  TYPE TABLE OF ty_data,
      gt_where2  TYPE TABLE OF ty_data,
      gt_wfplr1  TYPE TABLE OF ty_data,
      gt_wfplr2  TYPE TABLE OF ty_data,
      gs_data1   TYPE ty_data,
      gs_data2   TYPE ty_data,
      gs_data3   TYPE ty_data,
      gs_ob53    TYPE ty_data,
      bl_ob53    TYPE boolean.



*----------------------------------------------------------------------*
*                  ALV 定义
*----------------------------------------------------------------------*
DATA: lt_fieldcat TYPE lvc_t_fcat, "fieldcat 字段目录 参考结构 LVC_T_FCAT
      ls_fieldcat LIKE LINE OF lt_fieldcat,
      wa_layout   TYPE lvc_s_layo, "layout 布局控制 参考结构 lvc_s_layo
      lt_sort     TYPE lvc_t_sort, "排序
      ls_sort     LIKE LINE OF lt_sort.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK text1.
SELECT-OPTIONS s_bukrs FOR bseg-bukrs   OBLIGATORY.   ""公司代码
PARAMETERS p_gjahr LIKE bseg-gjahr   OBLIGATORY.   ""会计年度
SELECT-OPTIONS s_monat FOR bseg-h_monat OBLIGATORY.   ""会计期间
SELECT-OPTIONS s_hkont FOR bseg-hkont.                ""总账科目"
SELECTION-SCREEN END OF BLOCK text1.



*----------------------------------------------------------------------*
*                  初 始 化 块                                         *
*----------------------------------------------------------------------*
*该事件在屏幕未显示之前执行,对程式设置值及屏幕元素进行初始化赋值*
INITIALIZATION.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.


*----------------------------------------------------------------------*
*                  逻 辑 处 理 块                                      *
*----------------------------------------------------------------------*

START-OF-SELECTION. "执行按钮后触发
  PERFORM frm_authority_check. "检查权限
  PERFORM frm_getdata. "取数
  PERFORM frm_layout. "布局
  PERFORM frm_fieldcat. "列
  PERFORM frm_sort. "排序
  PERFORM frm_output. "输出



*&---------------------------------------------------------------------*
*& Form FRM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata .

*------------------------------------------"查询 利润分配-未分配利润 的会计科目"-------------------------
  "OB53 查看配置
  "SAP 总账在年结时可以自动结转本年利润或未分配利润,也就是说系统自动将利润表科目余额转入资产负债表科目中的本年利润或未分配利润。这里是定义转入的科目,称之为留存收益科目。
  "SPRO :IMG→财务会计→总帐会计→主记录→准备→定义留存收益
  "不支持多个公司对应不同的科目表
  SELECT SINGLE
       t030~konth AS hkont,        "利润分配-未分配利润 的会计科目
       "skat~saknr,                 ""总账科目编号
       "skat~txt20,                 ""总帐科目名称
       skat~txt50,                 ""总账科目长文本
       ska1~ktoks                 ""总账科目组
    FROM t030
    LEFT JOIN t001 ON t001~ktopl = t030~ktopl "科目表
    LEFT JOIN skat ON skat~saknr = t030~konth  AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl "利润分配-未分配利润 的会计科目、语言码、科目表
    LEFT JOIN ska1 ON skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl "利润分配-未分配利润 的会计科目、科目表
    WHERE t001~bukrs IN @s_bukrs AND t030~ktosl = 'BIL' AND t030~komok = 'X' " tcode:OB53  BIL:结转余额
    INTO CORRESPONDING FIELDS OF @gs_ob53.

  IF gs_ob53 IS INITIAL.
    MESSAGE s001 WITH '“利润分配-未分配利润 的 会计科目”'  DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.


*------------------------------------------"判断需不需要会计科目 利润分配-未分配利润"-------------------------
  IF gs_ob53-hkont IN s_hkont .
    bl_ob53 = 'X'.
  ENDIF.

*------------------------------------------"SELECT 取SE16"-------------------------

  "此处并没有取FAGL_SPLINFO,AGL_SPLINFO 未清项目的拆分信息 中 ,
  "举列:单号1900002039,厂区C121,年份2023 分摊了两个科目 22020201 应付账款-非关系人 22210101 应交税费-应交增值税-进项税额  到利润中心,但是会发生借贷方金额发生改变的情况
  "此程序与系统的借贷方发生额会有差异,但是本币累计余额经过核对没有差异

  "如果此处筛选了月份的话会出现利润分配-未分配利润无法结转的情况
  "为了算出累计余额需要计算所有月份的凭证的行项目,而不是只取下了条件的月份的数据计算
  "就一般而言,是本月导上月(结完账月份)的科目余额表,并不需要本月的科目余额数据,但是此处并没有筛选,会取多了一点数据


  CLEAR gt_data1.
  SELECT
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      "bseg~belnr,             ""会计凭证号码
      "bseg~buzei,             ""会计凭证中的行项目数
      "skat~ktopl,             ""科目表
      "skat~saknr,             ""总账科目编号
      "skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl,             ""更新总分类帐交易数字货币
      SUM( bseg~wrbtr ) AS wrbtr,             ""凭证货币金额
      SUM( bseg~dmbtr ) AS dmbtr,             ""按本位币计的金额
      SUM( bseg~pswbt ) AS pswbt             ""总帐中更新的金额
  FROM bseg
      LEFT JOIN t001 ON t001~bukrs = bseg~bukrs
      LEFT JOIN skat ON skat~saknr = bseg~hkont AND skat~spras = @sy-langu  AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON skat~saknr = ska1~saknr AND skat~ktopl = ska1~ktopl
  WHERE
    ( @bl_ob53 = 'X'  AND bseg~bukrs IN @s_bukrs ) OR  "公司代码
    ( @bl_ob53 <> 'X' AND bseg~bukrs IN @s_bukrs  AND bseg~hkont IN @s_hkont ) "公司代码、科目!!!
  GROUP BY
      bseg~mandt,             ""集团
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      bseg~h_monat,           ""会计期间
      "bseg~belnr,             ""会计凭证号码
      "bseg~buzei,             ""会计凭证中的行项目数
      "skat~ktopl,             ""科目表
      "skat~saknr,             ""总账科目编号
      "skat~txt20,             ""总帐科目名称
      skat~txt50,             ""总账科目长文本
      ska1~ktoks,             ""总账科目组
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl             ""更新总分类帐交易数字货币
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  PERFORM frm_calculatedata USING 'bseg'. "计算


  "faglflexa此表有月份是0的数据,初步判断是年初的余额,但是暂估类的科目没有原币金额,所以最后还是剔除
  CLEAR gt_data1.
  SELECT
      faglflexa~rclnt AS mandt,            ""集团
      faglflexa~rbukrs AS bukrs,           ""公司代码
      faglflexa~racct AS hkont,            ""科目号
      faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
      faglflexa~ryear AS gjahr,            ""会计年度
      bkpf~monat AS h_monat,          ""过账期间
      "faglflexa~docnr AS belnr,            ""会计凭证号码
      "faglflexa~buzei,            ""会计凭证中的行项目数
      "skat~ktopl,                 ""科目表
      "skat~saknr,                 ""总账科目编号
      "skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk AS shkzg,            ""借方/贷方标识
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~wsl WHEN 'H' THEN - faglflexa~wsl END ) AS wrbtr,                ""原交易货币的值(凭证货币)
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~hsl WHEN 'H' THEN - faglflexa~hsl END ) AS dmbtr                ""用本地货币表示的值 "
  FROM faglflexa
      LEFT JOIN t001 ON  t001~bukrs = faglflexa~rbukrs
      LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
  WHERE
     ( @bl_ob53 = 'X'  AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs ) OR   "公司代码 会计凭证号码 排除空,月份排除空
     ( @bl_ob53 <> 'X' AND faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs AND faglflexa~racct IN @s_hkont )   "公司代码 会计凭证号码 排除空,月份排除空、科目!!!
  GROUP BY
      faglflexa~rclnt ,            ""集团
      faglflexa~rbukrs ,           ""公司代码
      faglflexa~racct ,            ""科目号
      faglflexa~rwcur ,          ""原事务货币的货币码
      faglflexa~ryear ,            ""会计年度
      bkpf~monat ,          ""过账期间
      "faglflexa~docnr AS belnr,            ""会计凭证号码
      "faglflexa~buzei,            ""会计凭证中的行项目数
      "skat~ktopl,                 ""科目表
      "skat~saknr,                 ""总账科目编号
      "skat~txt20,                 ""总帐科目名称
      skat~txt50,                 ""总账科目长文本
      ska1~ktoks,                 ""总账科目组
      faglflexa~drcrk            ""借方/贷方标识
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  PERFORM frm_calculatedata USING 'faglflexa'. "计算



*------------------------------------------"补 公司~科目~币种、年~月"-------------------------
  "比如上个月有发生额,本月没有发生额,但是却又存在累计余额的情况,目的是取出全部科目的累计余额


  "直接取“ BKPF  总帐科目主记录 (科目表)”里的年会计年度、会计期间",不能卡年份条件
  " DISTINCT 可以去重
  "不能直接在 gt_report1 里去取,因为如果筛选了科目,就会发生科目当月没发生额而丢失了期末余额的状况
  CLEAR gt_where1.
  SELECT DISTINCT gjahr ,monat AS  h_monat FROM bkpf  WHERE  bukrs IN @s_bukrs
  INTO CORRESPONDING FIELDS OF TABLE @gt_where1. " gt_where1: 年、月

  CLEAR gs_data2.
  CLEAR gt_where2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "gs_data2-spras = gs_data1-spras.              ""语言代码
    "gs_data2-ktopl = gs_data1-ktopl.              ""科目表
    "gs_data2-saknr = gs_data1-saknr.              ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.              ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.              ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.              ""总账科目组 "
    COLLECT gs_data2 INTO gt_where2 .
  ENDLOOP.

  LOOP AT gt_where1 INTO gs_data1  .
    LOOP AT gt_where2 INTO gs_data2  .
      "*gs_data2-mandt = gs_data2-mandt.              ""集团
      "*gs_data2-bukrs = gs_data2-bukrs.              ""公司代码
      "*gs_data2-hkont = gs_data2-hkont.              ""总账科目
      "*gs_data2-h_waers = gs_data2-h_waers.          ""币种
      ""gs_data2-spras = gs_data2-spras.              ""语言代码
      ""gs_data2-ktopl = gs_data2-ktopl.              ""科目表
      ""gs_data2-saknr = gs_data2-saknr.              ""总账科目编号
      ""gs_data2-txt20 = gs_data2-txt20.              ""总帐科目名称
      "*gs_data2-txt50 = gs_data2-txt50.              ""总账科目长文本
      "*gs_data2-ktoks = gs_data2-ktoks.              ""总账科目组
      gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
      gs_data2-h_monat = gs_data1-h_monat.          ""会计期间"
      COLLECT gs_data2 INTO gt_report1 .
    ENDLOOP.
  ENDLOOP.

*------------------------------------------"利润分配-未分配利润补项目"-------------------------
  "利润分配-未分配利润此科目系统没有产生凭证,并且初步判断,系统结转的时候是按照本币结转,没有考虑原币的情况,而且几乎不会有发生额,所以需要根据此科目补条目

  IF bl_ob53 = 'X'.

    CLEAR gs_data2.
    CLEAR gt_where2.
    LOOP AT gt_report1 INTO gs_data1  .
      gs_data2-mandt = gs_data1-mandt.              ""集团
      gs_data2-bukrs = gs_data1-bukrs.          ""公司代码
      gs_data2-h_waers = gs_data1-h_waers .          ""货币码
      COLLECT gs_data2 INTO gt_where2 .
    ENDLOOP.

    " gt_where1: 年、月 ,上面添加后并没有清空
    CLEAR gs_data3.
    LOOP AT gt_where1 INTO gs_data1  .
      LOOP AT gt_where2 INTO gs_data2.
        gs_data3-mandt = gs_data2-mandt.              ""集团
        gs_data3-bukrs = gs_data2-bukrs.              ""公司代码
        gs_data3-hkont = gs_ob53-hkont.               ""总账科目 利润分配-未分配利润
        gs_data3-h_waers = gs_data2-h_waers.          ""币种
        gs_data3-txt50 = gs_ob53-txt50.              ""总账科目长文本
        gs_data3-ktoks = gs_ob53-ktoks.              ""总账科目组
        gs_data3-gjahr = gs_data1-gjahr.              ""会计年度
        gs_data3-h_monat = gs_data1-h_monat.          ""会计期间"
        COLLECT gs_data3 INTO gt_report1 .
        APPEND gs_data3 TO gt_wfplr2 .
      ENDLOOP.
    ENDLOOP.

  ENDIF.


*------------------------------------------"余额"-------------------------
  "余额=借方-贷方
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-ye_wrbtr = gs_data1-jf_wrbtr - gs_data1-df_wrbtr .          ""余额原币
    gs_data1-ye_dmbtr = gs_data1-jf_dmbtr - gs_data1-df_dmbtr.          ""余额本币"
    IF gs_data1-ye_dmbtr = 0 .
      gs_data1-h_shkzg = '平'.
    ELSEIF gs_data1-ye_dmbtr > 0 .
      gs_data1-h_shkzg = '借'.
    ELSEIF gs_data1-ye_dmbtr < 0 .
      gs_data1-h_shkzg = '贷'.
    ENDIF.
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING ye_wrbtr ye_dmbtr h_shkzg.
  ENDLOOP.


*------------------------------------------"本币余额 求和"-------------------------

  "求和:余额本币
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1.
    CLEAR gs_data2.
    gs_data2-mandt = gs_data1-mandt.                   ""集团
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.                   ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.               ""会计期间
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumye_dmbtr = gs_data1-ye_dmbtr.          ""求和:余额本币
    COLLECT gs_data2 INTO gt_where1 .
  ENDLOOP.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  CLEAR gs_data2.
  gs_data2-ye_wrbtr = 0.          ""余额原币
  gs_data2-ye_dmbtr = 0.          ""余额本币
  LOOP AT gt_where1 INTO gs_data1  .
    IF gs_data1-sumye_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING ye_wrbtr ye_dmbtr
          WHERE mandt = gs_data1-mandt
          AND bukrs = gs_data1-bukrs
          AND gjahr = gs_data1-gjahr
          AND h_monat = gs_data1-h_monat
          AND hkont = gs_data1-hkont .
    ENDIF.
  ENDLOOP.



*------------------------------------------"累计余额"-------------------------
  "累计余额一定要先排序
  "排序后按照余额进行累计,但是不同法人,不同科目,不同币别时要清空
  "如果是费用类的科目跨年会结转到利润分配-未分配利润,所以也要跨年清空累计余额

  SORT gt_report1 BY mandt bukrs hkont h_waers gjahr h_monat .
  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    IF NOT ( gs_data2-bukrs  = gs_data1-bukrs AND gs_data2-hkont  = gs_data1-hkont AND gs_data2-h_waers  = gs_data1-h_waers ) .
      gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
      gs_data2-hkont  = gs_data1-hkont .        ""总账科目
      gs_data2-h_waers  = gs_data1-h_waers .   ""币种
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    IF NOT ( gs_data2-gjahr  = gs_data1-gjahr  ) AND gs_data1-ktoks = 'PL'  . "'PL':损益类科目
      gs_data2-gjahr  = gs_data1-gjahr .
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
    gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
    gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
    gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .
  ENDLOOP.

*------------------------------"利润分配-未分配利润 累计余额"-------------------------
  "加总费用类的科目余额,并且给下一年的利润分配-未分配利润的累计余额

  IF bl_ob53 = 'X'.

    CLEAR gs_data2.
    CLEAR gt_wfplr1.
    LOOP AT gt_report1 INTO gs_data1 WHERE ktoks = 'PL' .
      gs_data2-bukrs  = gs_data1-bukrs . "公司代码
      gs_data2-gjahr  = gs_data1-gjahr + 1. ""年
      gs_data2-h_waers  = gs_data1-h_waers . ""币种
      gs_data2-ye_wrbtr = gs_data1-ye_wrbtr.
      gs_data2-ye_dmbtr = gs_data1-ye_dmbtr.
      COLLECT gs_data2 INTO gt_wfplr1.
    ENDLOOP.

    CLEAR gs_data2.
    LOOP AT gt_wfplr1 INTO gs_data1  .
      IF NOT ( gs_data2-bukrs  = gs_data1-bukrs  AND gs_data2-h_waers  = gs_data1-h_waers ) .
        gs_data2-bukrs  = gs_data1-bukrs .        "公司代码
        gs_data2-h_waers  = gs_data1-h_waers .   ""币种
        gs_data2-lj_wrbtr = 0 .
        gs_data2-lj_dmbtr = 0 .
      ENDIF.
      gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
      gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
      gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
      gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
      MODIFY gt_wfplr1 FROM gs_data1  TRANSPORTING lj_wrbtr  lj_dmbtr .
    ENDLOOP.

    CLEAR gs_data3.
    LOOP AT gt_wfplr1 INTO gs_data1.
      LOOP AT gt_report1 INTO gs_data2 WHERE hkont = gs_ob53-hkont.
        IF gs_data1-bukrs = gs_data2-bukrs AND gs_data1-gjahr = gs_data2-gjahr AND gs_data1-h_waers = gs_data2-h_waers .
          gs_data3-lj_wrbtr = gs_data1-lj_wrbtr + gs_data2-lj_wrbtr.
          gs_data3-lj_dmbtr = gs_data1-lj_dmbtr + gs_data2-lj_dmbtr.
          MODIFY gt_report1 FROM gs_data3  TRANSPORTING lj_wrbtr  lj_dmbtr .
        ENDIF.
      ENDLOOP.
    ENDLOOP.

  ENDIF.


*-------------------------------------"累计本币余额 求和"------------------------------

  "求和:累计余额本币
  CLEAR gt_where1.
  LOOP AT gt_report1 INTO gs_data1.
    CLEAR gs_data2.
    gs_data2-mandt = gs_data1-mandt.                   ""集团
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.                   ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.               ""会计期间
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumlj_dmbtr = gs_data1-lj_dmbtr.          ""求和:余额本币
    COLLECT gs_data2 INTO gt_where1.
  ENDLOOP.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  CLEAR gs_data2.
  gs_data2-lj_wrbtr = 0.          ""余额原币
  gs_data2-lj_dmbtr = 0.          ""余额本币
  LOOP AT gt_where1 INTO gs_data1  .
    IF gs_data1-sumlj_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING lj_wrbtr lj_dmbtr
          WHERE mandt = gs_data1-mandt
          AND bukrs = gs_data1-bukrs
          AND gjahr = gs_data1-gjahr
          AND h_monat = gs_data1-h_monat
          AND hkont = gs_data1-hkont .
    ENDIF.
  ENDLOOP.


*------------------------------------------"上期余额"-------------------------
  "上月余额,不是年初余额

  CLEAR gs_data2.
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-qc_wrbtr  = gs_data1-lj_wrbtr - gs_data1-ye_wrbtr .
    gs_data1-qc_dmbtr  = gs_data1-lj_dmbtr - gs_data1-ye_dmbtr .
    MODIFY gt_report1 FROM gs_data1  TRANSPORTING qc_wrbtr  qc_dmbtr .
  ENDLOOP.


*------------------------------------------"屏幕筛选"-------------------------
  "根据公司取出所有数据后,再根据用户的筛选条件筛选具体的科目、月份等信息

  LOOP AT gt_report1 INTO gs_data1 WHERE gjahr = p_gjahr  AND h_monat IN s_monat AND hkont IN s_hkont "会计年度 ,期间,总账科目.
    AND NOT ( qc_wrbtr = 0 AND  qc_dmbtr = 0 AND  jf_wrbtr = 0 AND  jf_dmbtr = 0 AND  df_wrbtr = 0 AND  df_dmbtr = 0 AND  ye_wrbtr = 0 AND  ye_dmbtr = 0 AND  lj_wrbtr = 0 AND  lj_dmbtr = 0 ) .
    APPEND gs_data1 TO gt_report2.
  ENDLOOP.

  "没有满足条件的数据,提示信息并终止程序
  IF gt_report2 IS INITIAL.
    MESSAGE s001 WITH '“科目余额表”' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.



*------------------------------------------"调整逻辑进行取值合并"-------------------------
  CLEAR:gs_data1,gs_data2,gs_data3.
  "此处不计算月份和借贷标识
  LOOP AT gt_report2 INTO gs_data2  .
    READ TABLE gt_report3 INTO gs_data3 WITH KEY bukrs = gs_data2-bukrs  hkont = gs_data2-hkont h_waers = gs_data2-h_waers gjahr = gs_data2-gjahr BINARY SEARCH.
    IF sy-subrc <> 0 .
      gs_data1-bukrs = gs_data2-bukrs.                ""公司代码
      gs_data1-gjahr = gs_data2-gjahr.                ""会计年度
      gs_data1-hkont = gs_data2-hkont.                ""总账科目
      gs_data1-txt50 = gs_data2-txt50.                ""总账科目长文本
      gs_data1-h_waers = gs_data2-h_waers.            ""币种
      gs_data1-qc_wrbtr = gs_data2-qc_wrbtr.          ""期初原币余额
      gs_data1-qc_dmbtr = gs_data2-qc_dmbtr.          ""期初本币余额
      gs_data1-jf_wrbtr = gs_data2-jf_wrbtr.          ""本月借方发生额原币
      gs_data1-jf_dmbtr = gs_data2-jf_dmbtr.          ""本月借方发生额本币
      gs_data1-df_wrbtr = gs_data2-df_wrbtr.          ""本月贷方发生额原币
      gs_data1-df_dmbtr = gs_data2-df_dmbtr.          ""本月贷方发生额本币
      gs_data1-ye_wrbtr = gs_data2-ye_wrbtr.          ""余额原币
      gs_data1-ye_dmbtr = gs_data2-ye_dmbtr.          ""余额本币
      gs_data1-lj_wrbtr = gs_data2-lj_wrbtr.          ""累计余额原币
      gs_data1-lj_dmbtr = gs_data2-lj_dmbtr.          ""累计余额本币"
      APPEND gs_data1 TO gt_report3.
    ELSE.
      gs_data1-jf_wrbtr = gs_data2-jf_wrbtr + gs_data3-jf_wrbtr.          ""本月借方发生额原币
      gs_data1-jf_dmbtr = gs_data2-jf_dmbtr + gs_data3-jf_dmbtr.          ""本月借方发生额本币
      gs_data1-df_wrbtr = gs_data2-df_wrbtr + gs_data3-df_wrbtr.          ""本月贷方发生额原币
      gs_data1-df_dmbtr = gs_data2-df_dmbtr + gs_data3-df_dmbtr.          ""本月贷方发生额本币
      gs_data1-ye_wrbtr = gs_data2-ye_wrbtr + gs_data3-ye_wrbtr.          ""余额原币
      gs_data1-ye_dmbtr = gs_data2-ye_dmbtr + gs_data3-ye_dmbtr.          ""余额本币
      gs_data1-lj_wrbtr = gs_data2-lj_wrbtr.          ""累计余额原币
      gs_data1-lj_dmbtr = gs_data2-lj_dmbtr.          ""累计余额本币"
      MODIFY gt_report3 FROM gs_data1 TRANSPORTING jf_wrbtr jf_dmbtr df_wrbtr df_dmbtr ye_wrbtr ye_dmbtr lj_wrbtr lj_dmbtr
       WHERE bukrs = gs_data2-bukrs  and hkont = gs_data2-hkont and h_waers = gs_data2-h_waers and  gjahr = gs_data2-gjahr.
    ENDIF.
    CLEAR gs_data1.
  ENDLOOP.

  LOOP AT gt_report3 INTO gs_data1  .
    IF gs_data1-ye_dmbtr = 0 .
      gs_data1-h_shkzg = '平'.
    ELSEIF gs_data1-ye_dmbtr > 0 .
      gs_data1-h_shkzg = '借'.
    ELSEIF gs_data1-ye_dmbtr < 0 .
      gs_data1-h_shkzg = '贷'.
    ENDIF.
    MODIFY gt_report3 FROM gs_data1  TRANSPORTING  h_shkzg.
  ENDLOOP.





ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  wa_layout-cwidth_opt = 'X'. "最适列宽
  wa_layout-zebra = 'X'. "隔行显示斑马纹   使ALV表格按斑马线间隔条码方式显示
  wa_layout-sel_mode = 'D'. "选择模式 "'D' 单元格的选择,可以多选单元格 多行,多列,任何单元格多选 用户可以使用最左边的选择按钮来选择多行
  wa_layout-stylefname = 'CELLBTN'. "设置单元

  "wa_layout-grid_title = 'test'.
  "wa_layout-excp_fname = 'light'.
  "wa_layout-edit = 'X'. "可编辑
  "wa_layout-box_fname = 'BOX'.
  "wa_layout-confirmation_prompt = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .


*----------------------------------------------------------------------*
*                  定义宏
*----------------------------------------------------------------------*
  DEFINE macro_fieldcat.
    CLEAR ls_fieldcat.
    ls_fieldcat-fieldname = &1. "标题列对应的字段名
    ls_fieldcat-coltext = &2. "列标题 列标题,如果字段参考了DDIC,可不设置
    ls_fieldcat-fix_column = &3. "固定列 与KEY字段类似,固定列但颜色不变蓝,必须要在左边才起作用(如果设置固定列的左边包含非固定列,则该列不固定)
    ls_fieldcat-no_zero = &4. "是否隐藏输出为零的字段 当字段为数值为0时,不显示【如0,0.00,则会显示为空】当字段包含前导0时,隐藏前导0,【如0100,则会显示为100】
    ls_fieldcat-cfieldname = &5. "currency unit field name值为当前输出内表中的货币单位字段的字段名称
    ls_fieldcat-edit = &6. "准备输入 X:可编辑,space:不可编辑 该控制是在整列的级别上,如果想控制仅仅某一行可编辑,则需要通过style来控制

    "ls_fieldcat-col_pos = ''. "输出列  列位置,即从左到右的顺序。若为空,则按字段添加到内表中的顺序
    "ls_fieldcat-key = ''. "关键字段 key值在左右滚动时不移动,蓝色显示
    "ls_fieldcat-hotspot = ''. "单击敏感 设置为带下划线热点,可触发热点、双击事件
    "ls_fieldcat-do_sum = 'X' . "总计列值
    "ls_fieldcat-no_sum = 'X' . "没有总计列值
    "ls_fieldcat-LOWERCASE  = 'X'. "允许/不允许小写字母 X:区分大小写/空:不区分(小写自动转换为大写) "主要影响数据的录入,当通过ALV输入数据的时候,如果未设置该标识,则输入小写字母如abc时,系统自动转换为ABC主键字段一般都是大写,主要是文本、描述字段时需要注意
    "ls_fieldcat-REF_TABLE = ''. "内部表字段的参考表名称
    "ls_fieldcat-REF_FIELD = ''. "部表字段的参考字段名称
    "ls_fieldcat-CHECKBOX = 'X' . "作为复选框输出 复选框标志只有字段值为X时,复选框才会被设置为选中,空或者其它值时为不选中
    "ls_fieldcat-rollname = '' . "F1 帮助的数据元素
    "ls_fieldcat-just = ''. "对齐 空时:字符默认左对齐:C/X/D/T/STRING/XSTRING数值默认右对齐:I/F/P/N 非空时:(R)ight/(L)eft/(C)enter

    APPEND ls_fieldcat TO lt_fieldcat.
  END-OF-DEFINITION.


  macro_fieldcat:

    'BUKRS' '公司代码'(t01) 'X' '' '' '',
    'GJAHR' '会计年度'(t02) 'X' '' '' '',
   " 'H_MONAT' '会计期间'(t03) 'X' '' '' '',
    'HKONT' '总账科目'(t04) 'X' 'X' '' '',
    'TXT50' '总账科目长文本 '(t05) 'X' '' '' '',
    'H_WAERS' '币种'(t06) 'X' '' '' '',
    'QC_WRBTR' '期初原币余额'(t07) '' '' 'H_WAERS' '',
    'QC_DMBTR' '期初本币余额'(t08) '' '' '' '',
    'JF_WRBTR' '本月借方发生额原币'(t09)  '' '' 'H_WAERS' '',
    'JF_DMBTR' '本月借方发生额本币'(t10) '' '' '' '',
    'DF_WRBTR' '本月贷方发生额原币'(t11) '' '' 'H_WAERS' '',
    'DF_DMBTR' '本月贷方发生额本币'(t12) '' '' '' '',
    'H_SHKZG' '借贷标识'(t13) '' '' '' '',
    'YE_WRBTR' '余额原币'(t14) '' '' 'H_WAERS' '',
    'YE_DMBTR' '余额本币'(t15) '' '' '' '',
    'LJ_WRBTR' '累计余额原币'(t16) '' '' 'H_WAERS' '',
    'LJ_DMBTR' '累计余额本币'(t17) '' '' '' ''."

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

  DEFINE macro_sort.
    CLEAR ls_sort.
    ls_sort-fieldname = &1. "标题列对应的字段名
    ls_sort-up = &2. "列标题 列标题,如果字段参考了DDIC,可不设置
    APPEND ls_sort TO lt_sort.
  END-OF-DEFINITION.

  macro_sort:
    'BUKRS'  'X',
    'GJAHR'  'X',
    'HKONT'  'X'.
  " 'H_MONAT' 'X'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-cprog "sy-repid
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER =
*     I_BUFFER_ACTIVE    =
*     I_CALLBACK_PROGRAM = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME   =
*     I_BACKGROUND_ID    = ' '
*     I_GRID_TITLE       =
*     I_GRID_SETTINGS    =
      is_layout_lvc      = wa_layout
      it_fieldcat_lvc    = lt_fieldcat
*     IT_EXCLUDING       =
*     IT_SPECIAL_GROUPS_LVC             =
      it_sort_lvc        = lt_sort
*     IT_FILTER_LVC      =
*     IT_HYPERLINK       =
*     IS_SEL_HIDE        =
      i_default          = 'X'
      i_save             = 'A' " 'U'
*     IS_VARIANT         =
*     IT_EVENTS          =
*     IT_EVENT_EXIT      =
*     IS_PRINT_LVC       =
*     IS_REPREP_ID_LVC   =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  =
*     I_HTML_HEIGHT_END  =
*     IT_ALV_GRAPHICS    =
*     IT_EXCEPT_QINFO_LVC               =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab           = gt_report3
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
    "LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALCULATEDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_calculatedata USING se16 TYPE char10.

  LOOP AT gt_data1 INTO gs_data1 .
    CLEAR gs_data2.
    IF se16 = 'bseg'. "如果交易货币不是公司代码的本币就默认是原币,进而带出总帐中更新的金额
      IF gs_data1-pswsl <> gs_data1-waers.
        gs_data1-h_waers = gs_data1-pswsl. ""币种
        gs_data1-wrbtr = gs_data1-pswbt.   ""原币
      ENDIF.
      "ELSEIF se16 = 'faglflexa'. "也可以写到SELECT语句里
      "  IF gs_data1-shkzg = 'H'.
      "   gs_data1-wrbtr = - gs_data1-wrbtr .
      "    gs_data1-dmbtr = - gs_data1-dmbtr .
      "  ENDIF.
    ENDIF.
    gs_data2-mandt = gs_data1-mandt.              ""集团
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-gjahr = gs_data1-gjahr.              ""会计年度
    gs_data2-h_monat = gs_data1-h_monat.          ""会计期间
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "凭证直接取日币是缩小了一百倍,应该通过ALV显示的时候更改而不是改内表,虽然测试的结果是一样的
    "IF gs_data1-h_waers  = 'JPY' . "币别为小币种的时候,数据放大倍数
    "   gs_data1-wrbtr = gs_data1-wrbtr * 100.           ""本月借方发生额原币!!!
    "ENDIF.
    IF gs_data1-shkzg = 'S'. "借方
      gs_data2-jf_wrbtr = gs_data1-wrbtr.           ""本月借方发生额原币!!!
      gs_data2-jf_dmbtr = gs_data1-dmbtr.           ""本月借方发生额本币!!!
    ELSEIF gs_data1-shkzg = 'H'. "贷方
      gs_data2-df_wrbtr = gs_data1-wrbtr.           ""本月贷方发生额原币!!!
      gs_data2-df_dmbtr = gs_data1-dmbtr.           ""本月贷方发生额本币!!!
    ENDIF.
    "gs_data2-ktopl = gs_data1-ktopl.          ""科目表
    "gs_data2-saknr = gs_data1-saknr.          ""总账科目编号
    "gs_data2-txt20 = gs_data1-txt20.          ""总帐科目名称
    gs_data2-txt50 = gs_data1-txt50.          ""总账科目长文本
    gs_data2-ktoks = gs_data1-ktoks.          ""总账科目组 "
    COLLECT gs_data2 INTO gt_report1 .
  ENDLOOP.

  CLEAR gt_data1.
ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  getaction
*&---------------------------------------------------------------------*
*       处理用户权限
*----------------------------------------------------------------------*
FORM frm_authority_check.
  DATA:BEGIN OF lt_bukrs OCCURS 0,
         bukrs LIKE t001-bukrs,
       END OF lt_bukrs.

  SELECT bukrs INTO CORRESPONDING FIELDS OF TABLE lt_bukrs FROM t001 WHERE bukrs IN s_bukrs.
  LOOP AT lt_bukrs.
    AUTHORITY-CHECK OBJECT  'F_SKA1_BUK'
    ID 'BUKRS' FIELD lt_bukrs-bukrs."检查字段
    IF sy-subrc <> 0.
      MESSAGE s021 WITH lt_bukrs-bukrs DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.
ENDFORM.

 正式运行3

         budat00   TYPE budat,          ""当年1月的上个月
         budat01   TYPE budat,          ""当年1月
         budat02   TYPE budat,          ""当年2月
         budat03   TYPE budat,          ""当年3月
         budat04   TYPE budat,          ""当年4月
         budat05   TYPE budat,          ""当年5月
         budat06   TYPE budat,          ""当年6月
         budat07   TYPE budat,          ""当年7月
         budat08   TYPE budat,          ""当年8月
         budat09   TYPE budat,          ""当年9月
         budat10   TYPE budat,          ""当年10月
         budat11   TYPE budat,          ""当年11月
         budat12   TYPE budat,          ""当年12月"

*------------------------------------------"计算屏幕中输入年份的月底日期"-------------------------

  gs_time-budat01 = p_gjahr && '0101'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat01 IMPORTING last_day_of_month = gs_time-budat01.

  gs_time-budat02 = p_gjahr && '0201'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat02 IMPORTING last_day_of_month = gs_time-budat02.

  gs_time-budat03 = p_gjahr && '0301'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat03 IMPORTING last_day_of_month = gs_time-budat03.

  gs_time-budat04 = p_gjahr && '0401'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat04 IMPORTING last_day_of_month = gs_time-budat04.

  gs_time-budat05 = p_gjahr && '0501'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat05 IMPORTING last_day_of_month = gs_time-budat05.

  gs_time-budat06 = p_gjahr && '0601'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat06 IMPORTING last_day_of_month = gs_time-budat06.

  gs_time-budat07 = p_gjahr && '0701'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat07 IMPORTING last_day_of_month = gs_time-budat07.

  gs_time-budat08 = p_gjahr && '0801'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat08 IMPORTING last_day_of_month = gs_time-budat08.

  gs_time-budat09 = p_gjahr && '0901'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat09 IMPORTING last_day_of_month = gs_time-budat09.

  gs_time-budat10 = p_gjahr && '1001'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat10 IMPORTING last_day_of_month = gs_time-budat10.

  gs_time-budat11 = p_gjahr && '1101'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat11 IMPORTING last_day_of_month = gs_time-budat11.

  gs_time-budat12 = p_gjahr && '1201'.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = gs_time-budat12 IMPORTING last_day_of_month = gs_time-budat12.


  gs_time-budat00 = p_gjahr && '0101'.

  "获取上个月当前日期
  CALL FUNCTION 'RSARCH_DATE_SHIFT'
    EXPORTING
      i_date             = gs_time-budat00
      i_shift            = 1
      i_shift_unit       = 'MON'
      i_option           = 'LT'
    IMPORTING
      e_date             = gs_time-budat00
    EXCEPTIONS
      illegal_shift_unit = 1
      out_of_bounds      = 2
      illegal_option     = 3
      OTHERS             = 4.

  "获取月末日期
  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = gs_time-budat00
    IMPORTING
      last_day_of_month = gs_time-budat00.
( @pattern = 'ENDING' AND bkpf~gjahr EQ @p_gjahr AND (
( @p_monat1 EQ '01' AND bkpf~budat GT @gs_time-budat00 ) OR
( @p_monat1 EQ '02' AND bkpf~budat GT @gs_time-budat01 ) OR
( @p_monat1 EQ '03' AND bkpf~budat GT @gs_time-budat02 ) OR
( @p_monat1 EQ '04' AND bkpf~budat GT @gs_time-budat03 ) OR
( @p_monat1 EQ '05' AND bkpf~budat GT @gs_time-budat04 ) OR
( @p_monat1 EQ '06' AND bkpf~budat GT @gs_time-budat05 ) OR
( @p_monat1 EQ '07' AND bkpf~budat GT @gs_time-budat06 ) OR
( @p_monat1 EQ '08' AND bkpf~budat GT @gs_time-budat07 ) OR
( @p_monat1 EQ '09' AND bkpf~budat GT @gs_time-budat08 ) OR
( @p_monat1 EQ '10' AND bkpf~budat GT @gs_time-budat09 ) OR
( @p_monat1 EQ '11' AND bkpf~budat GT @gs_time-budat10 ) OR
( @p_monat1 EQ '12' AND bkpf~budat GT @gs_time-budat11 )
) AND (
( @p_monat2 EQ '01' AND bkpf~budat LE @gs_time-budat01 AND ( bseg~augdt GT @gs_time-budat01 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '02' AND bkpf~budat LE @gs_time-budat02 AND ( bseg~augdt GT @gs_time-budat02 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '03' AND bkpf~budat LE @gs_time-budat03 AND ( bseg~augdt GT @gs_time-budat03 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '04' AND bkpf~budat LE @gs_time-budat04 AND ( bseg~augdt GT @gs_time-budat04 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '05' AND bkpf~budat LE @gs_time-budat05 AND ( bseg~augdt GT @gs_time-budat05 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '06' AND bkpf~budat LE @gs_time-budat06 AND ( bseg~augdt GT @gs_time-budat06 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '07' AND bkpf~budat LE @gs_time-budat07 AND ( bseg~augdt GT @gs_time-budat07 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '08' AND bkpf~budat LE @gs_time-budat08 AND ( bseg~augdt GT @gs_time-budat08 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '09' AND bkpf~budat LE @gs_time-budat09 AND ( bseg~augdt GT @gs_time-budat09 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '10' AND bkpf~budat LE @gs_time-budat10 AND ( bseg~augdt GT @gs_time-budat10 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '11' AND bkpf~budat LE @gs_time-budat11 AND ( bseg~augdt GT @gs_time-budat11 OR bseg~augdt IS INITIAL ) ) OR
( @p_monat2 EQ '12' AND bkpf~budat LE @gs_time-budat12 AND ( bseg~augdt GT @gs_time-budat12 OR bseg~augdt IS INITIAL ) )
) ) OR

  ( @pattern = 'ENDING'    AND bkpf~gjahr EQ @p_gjahr AND bkpf~budat GT @gs_time-budat_beg AND bkpf~budat LE @gs_time-budat_end ) OR

    ELSEIF lv_way = 'ENDING'.
      IF gs_data1-shkzg = 'S'. "借方
        gs_data2-ye_wrbtr = gs_data1-wrbtr.           """原币余额!!!
        gs_data2-ye_dmbtr = gs_data1-dmbtr.           """本币余额!!!
      ELSEIF gs_data1-shkzg = 'H'. "贷方
        gs_data2-ye_wrbtr = - gs_data1-wrbtr.           """"原币余额!!!
        gs_data2-ye_dmbtr = - gs_data1-dmbtr.           """本币余额!!!
      ENDIF.

最终运行

*&---------------------------------------------------------------------*
*& Report ZCOR0054
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
* Program Name: ZCOR0054
* Date written: 2023-06-27
* Author's name: C10089213 朱鸿飞
* Last update:
* Program title: 立铠科目余额表(原币)
* Project Name: 立讯精密ERP实施项目
* Version: V1.0

*参考资料:
*在SAP系统中,除了BSEG表(凭证行项目数据),还有其他一些表可以存储凭证项目相关的数据。以下是一些常见的例子:
*BKPF表:凭证抬头数据表,包含凭证的基本信息,如凭证号、凭证日期、凭证类型等。BKPF表和BSEG表通过凭证号(BELNR)字段进行关联,可以用来检索特定凭证的所有行项目数据。
*COEP表:成本元素总帐凭证行项目数据表,用于存储与成本核算相关的凭证项目数据。COEP表和BSEG表通过凭证号、凭证行项目号(BUZEI)和成本元素(COSTELEMENT)字段进行关联。
*FAGLFLEXA表:总账分析项数据表,用于存储总账分析项相关的凭证数据。FAGLFLEXA表和BSEG表通过凭证号和凭证行项目号字段进行关联。
*FAGL_SPLINFO表:总账分期余额表,用于存储总账分期余额相关的凭证数据。FAGL_SPLINFO表和BSEG表通过凭证号、凭证行项目号和总账分期(FISCPER)字段进行关联。
*需要根据具体情况选择合适的表来查询凭证项目相关的数据。同时,需要注意不同表之间的关联关系,以及表中字段的含义和使用方式。


REPORT zcor0054 MESSAGE-ID zfi001.


*----------------------------------------------------------------------*
*              INCLUDE 、 TYPES_POOLS 、 TABLES  引 用 区              *
*----------------------------------------------------------------------*
TABLES : bseg,faglflexa,bkpf,skat,ska1,t001,t030 .


*----------------------------------------------------------------------*
*                 T Y P E S -  结 构 定 义                             *
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_data,
         bukrs       TYPE bukrs,               ""公司代码
         hkont       TYPE hkont,               ""总账科目
         h_waers     TYPE waers,               ""货币码
         txt50       TYPE txt50_skat,          ""总账科目长文本
         gjahr       TYPE gjahr,               ""会计年度
         shkzg       TYPE shkzg,               ""借方/贷方标识
         wrbtr       TYPE wrbtr,               ""凭证货币金额
         dmbtr       TYPE dmbtr,               ""按本位币计的金额
         qc_wrbtr    TYPE wrbtr,               ""期初原币余额
         qc_dmbtr    TYPE dmbtr,               ""期初本币余额
         jf_wrbtr    TYPE wrbtr,               ""本月借方发生额原币
         jf_dmbtr    TYPE dmbtr,               ""本月借方发生额本币
         df_wrbtr    TYPE wrbtr,               ""本月贷方发生额原币
         df_dmbtr    TYPE dmbtr,               ""本月贷方发生额本币
         h_shkzg     TYPE shkzg,               ""借贷标识(显示)
         ye_wrbtr    TYPE wrbtr,               ""余额原币
         ye_dmbtr    TYPE dmbtr,               ""余额本币
         lj_wrbtr    TYPE wrbtr,               ""累计余额原币
         lj_dmbtr    TYPE dmbtr,               ""累计余额本币
         waers       TYPE waers,               ""T001货币码
         pswsl       TYPE pswsl,               ""更新总分类帐交易数字货币
         pswbt       TYPE pswbt,               ""总帐中更新的金额
         sumye_dmbtr TYPE dmbtr,               ""求和 余额本币
         sumlj_dmbtr TYPE dmbtr,               ""求和 累计余额本币
       END OF ty_data.

TYPES: BEGIN OF ty_time,
         budat_beg TYPE budat, "输入年月的上期的最后一天
         gjahr_beg TYPE bseg-gjahr, "输入年月的上期的年
         budat_end TYPE budat, "输入年月的结束日期的最后一天
       END OF ty_time.

*----------------------------------------------------------------------*
*                  DATA 定义                                           *
*----------------------------------------------------------------------*
DATA: gt_data1   TYPE TABLE OF ty_data,
      gt_report1 TYPE TABLE OF ty_data,
      gt_report2 TYPE TABLE OF ty_data,
      gt_wfplr1  TYPE TABLE OF ty_data,
      gs_data1   TYPE ty_data,
      gs_data2   TYPE ty_data,
      gs_data3   TYPE ty_data,
      gs_ob53    TYPE ty_data,
      gs_time    TYPE ty_time.



*----------------------------------------------------------------------*
*                  ALV 定义
*----------------------------------------------------------------------*
DATA: lt_fieldcat TYPE lvc_t_fcat, "fieldcat 字段目录 参考结构 LVC_T_FCAT
      ls_fieldcat LIKE LINE OF lt_fieldcat,
      wa_layout   TYPE lvc_s_layo, "layout 布局控制 参考结构 lvc_s_layo
      lt_sort     TYPE lvc_t_sort, "排序
      ls_sort     LIKE LINE OF lt_sort.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*
"OBLIGATORY
SELECTION-SCREEN BEGIN OF BLOCK text1.
SELECT-OPTIONS s_bukrs FOR bseg-bukrs .   ""公司代码
PARAMETERS p_gjahr LIKE bseg-gjahr .   ""会计年度
PARAMETERS p_monat1 LIKE bseg-h_monat.   ""起始会计期间
PARAMETERS p_monat2 LIKE bseg-h_monat .   ""结束会计期间
SELECT-OPTIONS s_hkont FOR bseg-hkont.    ""总账科目"
SELECTION-SCREEN END OF BLOCK text1.



*----------------------------------------------------------------------*
*                  初 始 化 块                                         *
*----------------------------------------------------------------------*
*该事件在屏幕未显示之前执行,对程式设置值及屏幕元素进行初始化赋值*
INITIALIZATION.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.


*----------------------------------------------------------------------*
*                  逻 辑 处 理 块                                      *
*----------------------------------------------------------------------*

START-OF-SELECTION. "执行按钮后触发
  PERFORM frm_authority_check. "检查权限
  PERFORM frm_selection_check. "屏幕检查
  PERFORM frm_getdata. "取数
  PERFORM frm_layout. "布局
  PERFORM frm_fieldcat. "列
  PERFORM frm_sort. "排序
  PERFORM frm_output. "输出



*&---------------------------------------------------------------------*
*& Form FRM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata .

*------------------------------------------"计算屏幕中输入起始年月的上个月的期末日期"-------------------------

  gs_time-budat_beg = p_gjahr && p_monat1 && '01'.

  "获取上个月当前日期
  CALL FUNCTION 'RSARCH_DATE_SHIFT'
    EXPORTING
      i_date             = gs_time-budat_beg
      i_shift            = 1
      i_shift_unit       = 'MON'
      i_option           = 'LT'
    IMPORTING
      e_date             = gs_time-budat_beg
    EXCEPTIONS
      illegal_shift_unit = 1
      out_of_bounds      = 2
      illegal_option     = 3
      OTHERS             = 4.

  "获取月末日期
  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = gs_time-budat_beg
    IMPORTING
      last_day_of_month = gs_time-budat_beg.

  gs_time-gjahr_beg = gs_time-budat_beg+0(4).

*------------------------------------------"计算屏幕中输入截止年月的月末日期"-------------------------


  gs_time-budat_end = p_gjahr && p_monat2 && '01'.

  "获取月末日期
  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = gs_time-budat_end
    IMPORTING
      last_day_of_month = gs_time-budat_end.


*--------------------------------------------------------"期初余额"-----------------------------------------------------------------

  PERFORM frm_getdata_sql USING 'BEGIN'. "期初
  PERFORM frm_getdata_sql USING 'ACCRUAL'."发生额
  "PERFORM frm_getdata_sql USING 'ENDING'."余额
  PERFORM frm_getdata_sql USING 'AGGREGATE'."累计


*------------------------------------------"损益类 PL 的会计科目 年初是0"-------------------------
  " DISTINCT 可以去重

  IF p_monat1 = '01'.

    SELECT DISTINCT
       saknr AS hkont        "会计科目
    FROM ska1
    LEFT JOIN t001 ON t001~ktopl = ska1~ktopl "科目表
    WHERE t001~bukrs IN @s_bukrs  AND ska1~ktoks = 'PL'
      AND ska1~saknr IN @s_hkont
   INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

    IF gt_data1 IS NOT INITIAL.

      SORT gt_data1 BY hkont.

      LOOP AT gt_report1 INTO gs_data1.
        READ TABLE gt_data1 INTO gs_data2 WITH KEY hkont = gs_data1-hkont BINARY SEARCH.
        IF sy-subrc = 0.
          gs_data2-qc_wrbtr = 0.           ""期初原币余额!!!
          gs_data2-qc_dmbtr = 0.           ""期初本币余额!!!
          MODIFY gt_report1 FROM gs_data2 TRANSPORTING qc_wrbtr qc_dmbtr.
        ENDIF.
      ENDLOOP.
    ENDIF.

    CLEAR:gs_data1,gs_data2,gt_data1.
  ENDIF.

*------------------------------------------"查询 利润分配-未分配利润 的会计科目"-------------------------
  "OB53 查看配置
  "SAP 总账在年结时可以自动结转本年利润或未分配利润,也就是说系统自动将利润表科目余额转入资产负债表科目中的本年利润或未分配利润。这里是定义转入的科目,称之为留存收益科目。
  "SPRO :IMG→财务会计→总帐会计→主记录→准备→定义留存收益
  "不支持多个公司对应不同的科目表
  SELECT SINGLE
       t030~konth AS hkont,        "利润分配-未分配利润 的会计科目
       skat~txt50                 ""总账科目长文本
 FROM t030
    LEFT JOIN t001 ON t001~ktopl = t030~ktopl "科目表
    LEFT JOIN skat ON skat~saknr = t030~konth  AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl "利润分配-未分配利润 的会计科目、语言码、科目表
    LEFT JOIN ska1 ON skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl "利润分配-未分配利润 的会计科目、科目表
    WHERE t001~bukrs IN @s_bukrs AND t030~ktosl = 'BIL' AND t030~komok = 'X' " tcode:OB53  BIL:结转余额
    INTO CORRESPONDING FIELDS OF @gs_ob53.

  IF gs_ob53 IS INITIAL.
    MESSAGE s001 WITH '“利润分配-未分配利润 的 会计科目”'  DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ELSE.

    IF gs_ob53-hkont IN s_hkont . " 判断需不需要会计科目 利润分配-未分配利润
      SELECT DISTINCT
          bseg~bukrs,             ""公司代码
          bseg~h_waers           ""货币码
      FROM bseg
      WHERE bseg~bukrs IN @s_bukrs
      INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

      LOOP AT gt_data1 INTO gs_data1  .
        gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
        gs_data2-hkont = gs_ob53-hkont.               ""总账科目 利润分配-未分配利润
        gs_data2-h_waers = gs_data1-h_waers.          ""币种
        gs_data2-txt50 = gs_ob53-txt50.              ""总账科目长文本
        COLLECT gs_data2 INTO gt_report1 .
      ENDLOOP.
      CLEAR:gs_data1,gs_data2,gt_data1.

      PERFORM frm_getdata_wfplr. "未分配利润

      LOOP AT gt_report1 INTO gs_data1.
        IF gs_data1-hkont = gs_ob53-hkont.
          READ TABLE gt_wfplr1 INTO gs_data2 WITH KEY bukrs = gs_data1-bukrs h_waers = gs_data1-h_waers gjahr = p_gjahr BINARY SEARCH."公司、币种、年度
          "期初、和累计的 年初余额是一样的,在加上当期的金额
          IF sy-subrc = 0.
            gs_data3-qc_wrbtr = gs_data1-qc_wrbtr + gs_data2-lj_wrbtr.
            gs_data3-qc_dmbtr = gs_data1-qc_dmbtr + gs_data2-lj_dmbtr.
            gs_data3-lj_wrbtr = gs_data1-lj_wrbtr + gs_data2-lj_wrbtr.
            gs_data3-lj_dmbtr = gs_data1-lj_dmbtr + gs_data2-lj_dmbtr.
            MODIFY gt_report1 FROM gs_data3 TRANSPORTING qc_wrbtr qc_dmbtr lj_wrbtr lj_dmbtr.
          ENDIF.
        ENDIF.
      ENDLOOP.
      CLEAR:gs_data1,gs_data2,gs_data3.

    ENDIF.
  ENDIF.



*------------------------------------------余额"-------------------------
  "余额=借方-贷方
  LOOP AT gt_report1 INTO gs_data1  .
    gs_data1-ye_wrbtr = gs_data1-jf_wrbtr - gs_data1-df_wrbtr .          "余额原币
    gs_data1-ye_dmbtr = gs_data1-jf_dmbtr - gs_data1-df_dmbtr.          "余额本币"
    IF gs_data1-ye_dmbtr = 0 .
      gs_data1-h_shkzg = '平'.
    ELSEIF gs_data1-ye_dmbtr > 0 .
      gs_data1-h_shkzg = '借'.
    ELSEIF gs_data1-ye_dmbtr < 0 .
      gs_data1-h_shkzg = '贷'.
    ENDIF.
    MODIFY gt_report1 FROM gs_data1 TRANSPORTING h_shkzg ye_wrbtr ye_dmbtr.
  ENDLOOP.
  CLEAR gs_data1.


*-------------------------------------"累计本币余额 求和"------------------------------

  "求和:累计余额本币
  LOOP AT gt_report1 INTO gs_data1.
    gs_data2-bukrs = gs_data1-bukrs.                   ""公司代码
    gs_data2-hkont = gs_data1-hkont.                   ""总账科目
    gs_data2-sumlj_dmbtr = gs_data1-lj_dmbtr.          ""求和:余额本币
    COLLECT gs_data2 INTO gt_data1.
  ENDLOOP.
  CLEAR:gs_data1,gs_data2.

  "如果科目汇总后本币金额是零,则原币余额和本币余额也是零
  gs_data2-lj_wrbtr = 0.          ""余额原币
  gs_data2-lj_dmbtr = 0.          ""余额本币
  LOOP AT gt_data1 INTO gs_data1.
    IF gs_data1-sumlj_dmbtr = 0 .
      MODIFY gt_report1 FROM gs_data2 TRANSPORTING lj_wrbtr lj_dmbtr WHERE bukrs = gs_data1-bukrs  AND hkont = gs_data1-hkont.
    ENDIF.
  ENDLOOP.
  CLEAR:gs_data1,gs_data2,gt_data1.


*------------------------------------------"去掉前面0"-------------------------
  LOOP AT gt_report1 INTO gs_data1.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = gs_data1-hkont
      IMPORTING
        output = gs_data1-hkont.
    MODIFY gt_report1 FROM gs_data1 TRANSPORTING hkont .
  ENDLOOP.
  CLEAR gs_data1.


*------------------------------------------"屏幕筛选"-------------------------
  "根据公司取出所有数据后,再根据用户的筛选条件筛选具体的科目、月份等信息

  LOOP AT gt_report1 INTO gs_data1 WHERE
   NOT ( qc_wrbtr = 0 AND  qc_dmbtr = 0 AND  jf_wrbtr = 0 AND  jf_dmbtr = 0 AND  df_wrbtr = 0 AND  df_dmbtr = 0 AND  ye_wrbtr = 0 AND  ye_dmbtr = 0 AND  lj_wrbtr = 0 AND  lj_dmbtr = 0 ) .
    APPEND gs_data1 TO gt_report2.
  ENDLOOP.
  CLEAR gs_data1.


  SORT gt_report2 BY bukrs hkont h_waers.""公司代码、总账科目、货币码

  "没有满足条件的数据,提示信息并终止程序
  IF gt_report2 IS INITIAL.
    MESSAGE s001 WITH '“科目余额表”' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_layout .
  wa_layout-cwidth_opt = 'X'. "最适列宽
  wa_layout-zebra = 'X'. "隔行显示斑马纹   使ALV表格按斑马线间隔条码方式显示
  wa_layout-sel_mode = 'D'. "选择模式 "'D' 单元格的选择,可以多选单元格 多行,多列,任何单元格多选 用户可以使用最左边的选择按钮来选择多行
  wa_layout-stylefname = 'CELLBTN'. "设置单元

  "wa_layout-grid_title = 'test'.
  "wa_layout-excp_fname = 'light'.
  "wa_layout-edit = 'X'. "可编辑
  "wa_layout-box_fname = 'BOX'.
  "wa_layout-confirmation_prompt = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_fieldcat .


*----------------------------------------------------------------------*
*                  定义宏
*----------------------------------------------------------------------*
  DEFINE macro_fieldcat.
    CLEAR ls_fieldcat.
    ls_fieldcat-fieldname = &1. "标题列对应的字段名
    ls_fieldcat-coltext = &2. "列标题 列标题,如果字段参考了DDIC,可不设置
    ls_fieldcat-fix_column = &3. "固定列 与KEY字段类似,固定列但颜色不变蓝,必须要在左边才起作用(如果设置固定列的左边包含非固定列,则该列不固定)
    ls_fieldcat-no_zero = &4. "是否隐藏输出为零的字段 当字段为数值为0时,不显示【如0,0.00,则会显示为空】当字段包含前导0时,隐藏前导0,【如0100,则会显示为100】
    ls_fieldcat-cfieldname = &5. "currency unit field name值为当前输出内表中的货币单位字段的字段名称
    ls_fieldcat-edit = &6. "准备输入 X:可编辑,space:不可编辑 该控制是在整列的级别上,如果想控制仅仅某一行可编辑,则需要通过style来控制

    "ls_fieldcat-col_pos = ''. "输出列  列位置,即从左到右的顺序。若为空,则按字段添加到内表中的顺序
    "ls_fieldcat-key = ''. "关键字段 key值在左右滚动时不移动,蓝色显示
    "ls_fieldcat-hotspot = ''. "单击敏感 设置为带下划线热点,可触发热点、双击事件
    "ls_fieldcat-do_sum = 'X' . "总计列值
    "ls_fieldcat-no_sum = 'X' . "没有总计列值
    "ls_fieldcat-LOWERCASE  = 'X'. "允许/不允许小写字母 X:区分大小写/空:不区分(小写自动转换为大写) "主要影响数据的录入,当通过ALV输入数据的时候,如果未设置该标识,则输入小写字母如abc时,系统自动转换为ABC主键字段一般都是大写,主要是文本、描述字段时需要注意
    "ls_fieldcat-REF_TABLE = ''. "内部表字段的参考表名称
    "ls_fieldcat-REF_FIELD = ''. "部表字段的参考字段名称
    "ls_fieldcat-CHECKBOX = 'X' . "作为复选框输出 复选框标志只有字段值为X时,复选框才会被设置为选中,空或者其它值时为不选中
    "ls_fieldcat-rollname = '' . "F1 帮助的数据元素
    "ls_fieldcat-just = ''. "对齐 空时:字符默认左对齐:C/X/D/T/STRING/XSTRING数值默认右对齐:I/F/P/N 非空时:(R)ight/(L)eft/(C)enter

    APPEND ls_fieldcat TO lt_fieldcat.
  END-OF-DEFINITION.


  macro_fieldcat:

    'BUKRS' '公司代码'(t01) 'X' '' '' '',
    'HKONT' '总账科目'(t02) 'X' 'X' '' '',
    'TXT50' '总账科目长文本 '(t03) 'X' '' '' '',
    'H_WAERS' '币种'(t04) 'X' '' '' '',
    'QC_WRBTR' '期初原币余额'(t05) '' '' 'H_WAERS' '',
    'QC_DMBTR' '期初本币余额'(t06) '' '' '' '',
    'JF_WRBTR' '本月借方发生额原币'(t07)  '' '' 'H_WAERS' '',
    'JF_DMBTR' '本月借方发生额本币'(t08) '' '' '' '',
    'DF_WRBTR' '本月贷方发生额原币'(t09) '' '' 'H_WAERS' '',
    'DF_DMBTR' '本月贷方发生额本币'(t10) '' '' '' '',
    'H_SHKZG' '借贷标识'(t11) '' '' '' '',
    'YE_WRBTR' '余额原币'(t12) '' '' 'H_WAERS' '',
    'YE_DMBTR' '余额本币'(t13) '' '' '' '',
    'LJ_WRBTR' '累计余额原币'(t14) '' '' 'H_WAERS' '',
    'LJ_DMBTR' '累计余额本币'(t15) '' '' '' ''."

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

  DEFINE macro_sort.
    CLEAR ls_sort.
    ls_sort-fieldname = &1. "标题列对应的字段名
    ls_sort-up = &2. "列标题 列标题,如果字段参考了DDIC,可不设置
    APPEND ls_sort TO lt_sort.
  END-OF-DEFINITION.

  macro_sort:
    'BUKRS'  'X',
    'HKONT'  'X'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_output .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-cprog "sy-repid
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER =
*     I_BUFFER_ACTIVE    =
*     I_CALLBACK_PROGRAM = ' '
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME   =
*     I_BACKGROUND_ID    = ' '
*     I_GRID_TITLE       =
*     I_GRID_SETTINGS    =
      is_layout_lvc      = wa_layout
      it_fieldcat_lvc    = lt_fieldcat
*     IT_EXCLUDING       =
*     IT_SPECIAL_GROUPS_LVC             =
      it_sort_lvc        = lt_sort
*     IT_FILTER_LVC      =
*     IT_HYPERLINK       =
*     IS_SEL_HIDE        =
      i_default          = 'X'
      i_save             = 'A' " 'U'
*     IS_VARIANT         =
*     IT_EVENTS          =
*     IT_EVENT_EXIT      =
*     IS_PRINT_LVC       =
*     IS_REPREP_ID_LVC   =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  =
*     I_HTML_HEIGHT_END  =
*     IT_ALV_GRAPHICS    =
*     IT_EXCEPT_QINFO_LVC               =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab           = gt_report2
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
    "LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_SQL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata_sql USING pattern TYPE char10.

*------------------------------------------"SELECT 取SE16"-------------------------

  "此处并没有取FAGL_SPLINFO,AGL_SPLINFO 未清项目的拆分信息 中 ,
  "举列:单号1900002039,厂区C121,年份2023 分摊了两个科目 22020201 应付账款-非关系人 22210101 应交税费-应交增值税-进项税额  到利润中心,但是会发生借贷方金额发生改变的情况
  "此程序与系统的借贷方发生额会有差异,但是本币累计余额经过核对没有差异

  "如果此处筛选了月份的话会出现利润分配-未分配利润无法结转的情况
  "为了算出累计余额需要计算所有月份的凭证的行项目,而不是只取下了条件的月份的数据计算
  "就一般而言,是本月导上月(结完账月份)的科目余额表,并不需要本月的科目余额数据,但是此处并没有筛选,会取多了一点数据

*比较逻辑运算符
*等于     EQ
*不等于   NE <>  ><
*小于     LT
*小于等于 LE
*大于     GT
*大于等于 GE

  CLEAR gt_data1.
  SELECT
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      skat~txt50,             ""总账科目长文本
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl,             ""更新总分类帐交易数字货币
      SUM( bseg~wrbtr ) AS wrbtr,             ""凭证货币金额
      SUM( bseg~dmbtr ) AS dmbtr,             ""按本位币计的金额
      SUM( bseg~pswbt ) AS pswbt             ""总帐中更新的金额
  FROM bseg
      LEFT JOIN bkpf ON bkpf~bukrs = bseg~bukrs AND bkpf~gjahr = bseg~gjahr AND bkpf~belnr = bseg~belnr
      LEFT JOIN t001 ON t001~bukrs = bseg~bukrs
      LEFT JOIN skat ON skat~saknr = bseg~hkont AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON skat~saknr = ska1~saknr AND skat~ktopl = ska1~ktopl
  WHERE
      bseg~bukrs IN @s_bukrs AND bseg~hkont IN @s_hkont AND "公司代码、总账科目
      "BEGIN:凭证抬头的过账日期小于等于“输入年月的上期的最后一天”。凭证单身的清账时间大于此日期或者是空。总账科目组PL,费用类科目组只能取当年的,因为跨年会结转。
      "ACCRUAL:凭证抬头的年份等于查询的年份。凭证抬头的过账日期大于“输入年月的上期的最后一天”,小于“输入年月的结束日期的最后一天”
      "AGGREGATE:凭证抬头的过账日期小于等于“输入年月的结束日期的最后一天”。凭证单身的清账时间大于此日期或者是空。总账科目组PL,费用类科目组只能取当年的,因为跨年会结转。
     ( ( @pattern = 'BEGIN'     AND bkpf~budat LE @gs_time-budat_beg AND ( bseg~augdt GT @gs_time-budat_beg OR bseg~augdt IS INITIAL ) AND ( ( ska1~ktoks = 'PL' AND bkpf~gjahr = @gs_time-gjahr_beg ) OR ska1~ktoks NE 'PL' ) ) OR
       ( @pattern = 'ACCRUAL'   AND bkpf~gjahr EQ @p_gjahr AND bkpf~budat GT @gs_time-budat_beg AND bkpf~budat LE @gs_time-budat_end  ) OR
       ( @pattern = 'AGGREGATE' AND bkpf~budat LE @gs_time-budat_end AND ( bseg~augdt GT @gs_time-budat_end OR bseg~augdt IS INITIAL ) AND ( ( ska1~ktoks = 'PL' AND bkpf~gjahr = @p_gjahr ) OR ska1~ktoks NE 'PL' ) ) )
  GROUP BY
      bseg~bukrs,             ""公司代码
      bseg~hkont,             ""总账科目
      bseg~h_waers,           ""货币码
      skat~txt50,             ""总账科目长文本
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl             ""更新总分类帐交易数字货币
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  IF gt_data1 IS NOT INITIAL.
    PERFORM frm_calculatedata USING pattern  'BSEG'.
  ENDIF.


  "FAGLFLEXA此表有月份是0的数据,初步判断是年初的余额,但是暂估类的科目没有原币金额,所以最后还是剔除
  CLEAR gt_data1.
  SELECT
      faglflexa~rbukrs AS bukrs,           ""公司代码
      faglflexa~racct AS hkont,            ""科目号
      faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
      skat~txt50,                 ""总账科目长文本
      faglflexa~drcrk AS shkzg,            ""借方/贷方标识
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~wsl WHEN 'H' THEN - faglflexa~wsl END ) AS wrbtr,                ""原交易货币的值(凭证货币)
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~hsl WHEN 'H' THEN - faglflexa~hsl END ) AS dmbtr                ""用本地货币表示的值 "
  FROM faglflexa
      LEFT JOIN t001 ON  t001~bukrs = faglflexa~rbukrs
      LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
  WHERE "会计凭证号码排除空,月份排除空、公司代码、科目
     faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs AND faglflexa~racct IN @s_hkont AND
     ( ( @pattern = 'BEGIN'     AND bkpf~budat LE @gs_time-budat_beg AND ( ( ska1~ktoks = 'PL' AND bkpf~gjahr = @gs_time-gjahr_beg ) OR ska1~ktoks NE 'PL' ) ) OR
       ( @pattern = 'ACCRUAL'   AND bkpf~gjahr EQ @p_gjahr AND bkpf~budat GT @gs_time-budat_beg AND bkpf~budat LE @gs_time-budat_end ) OR
       ( @pattern = 'AGGREGATE' AND bkpf~budat LE @gs_time-budat_end AND ( ( ska1~ktoks = 'PL' AND bkpf~gjahr = @p_gjahr ) OR ska1~ktoks NE 'PL' ) ) )
  GROUP BY
      faglflexa~rbukrs ,           ""公司代码
      faglflexa~racct ,            ""科目号
      faglflexa~rwcur ,          ""原事务货币的货币码
      skat~txt50,                 ""总账科目长文本
      faglflexa~drcrk            ""借方/贷方标识
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  IF gt_data1 IS NOT INITIAL.
    PERFORM frm_calculatedata USING pattern 'FAGLFLEXA'. "计算
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CALCULATEDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_calculatedata USING lv_way TYPE char10
                                se16 TYPE char10.


  LOOP AT gt_data1 INTO gs_data1 .
    CLEAR gs_data2.
    IF se16 = 'BSEG'. "如果交易货币不是公司代码的本币就默认是原币,进而带出总帐中更新的金额
      IF gs_data1-pswsl <> gs_data1-waers.
        gs_data1-h_waers = gs_data1-pswsl. ""币种
        gs_data1-wrbtr = gs_data1-pswbt.   ""原币
      ENDIF.
      "ELSEIF se16 = 'FAGLFLEXA'. "也可以写到SELECT语句里
      "  IF gs_data1-shkzg = 'H'.
      "   gs_data1-wrbtr = - gs_data1-wrbtr .
      "    gs_data1-dmbtr = - gs_data1-dmbtr .
      "  ENDIF.
    ENDIF.
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-hkont = gs_data1-hkont.              ""总账科目
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    "凭证直接取日币是缩小了一百倍,应该通过ALV显示的时候更改而不是改内表,虽然测试的结果是一样的
    "IF gs_data1-h_waers  = 'JPY' . "币别为小币种的时候,数据放大倍数
    "   gs_data1-wrbtr = gs_data1-wrbtr * 100.           ""本月借方发生额原币!!!
    "ENDIF.
    IF lv_way = 'BEGIN'.
      IF gs_data1-shkzg = 'S'. "借方
        gs_data2-qc_wrbtr = gs_data1-wrbtr.           ""期初原币余额!!!
        gs_data2-qc_dmbtr = gs_data1-dmbtr.           ""期初本币余额!!!
      ELSEIF gs_data1-shkzg = 'H'. "贷方
        gs_data2-qc_wrbtr = - gs_data1-wrbtr.           """期初原币余额!!!
        gs_data2-qc_dmbtr = - gs_data1-dmbtr.           ""期初本币余额!!!
      ENDIF.
    ELSEIF lv_way = 'ACCRUAL'.
      IF gs_data1-shkzg = 'S'. "借方
        gs_data2-jf_wrbtr = gs_data1-wrbtr.           ""借方发生额原币!!!
        gs_data2-jf_dmbtr = gs_data1-dmbtr.           ""借方发生额本币!!!
      ELSEIF gs_data1-shkzg = 'H'. "贷方
        gs_data2-df_wrbtr = gs_data1-wrbtr.           ""贷方发生额原币!!!
        gs_data2-df_dmbtr = gs_data1-dmbtr.           ""贷方发生额本币!!!
      ENDIF.
    ELSEIF lv_way = 'AGGREGATE'.
      IF gs_data1-shkzg = 'S'. "借方
        gs_data2-lj_wrbtr = gs_data1-wrbtr.           ""累计原币余额!!!
        gs_data2-lj_dmbtr = gs_data1-dmbtr.           ""累计本币余额!!!
      ELSEIF gs_data1-shkzg = 'H'. "贷方
        gs_data2-lj_wrbtr = - gs_data1-wrbtr.           """累计原币余额!!!
        gs_data2-lj_dmbtr = - gs_data1-dmbtr.           ""累计本币余额!!!
      ENDIF.
    ENDIF.
    gs_data2-txt50 = gs_data1-txt50.          ""总账科目长文本
    COLLECT gs_data2 INTO gt_report1 .
  ENDLOOP.

  CLEAR gt_data1.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_SQL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_getdata_wfplr.


  SELECT
      bseg~bukrs,             ""公司代码
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl,             ""更新总分类帐交易数字货币
      SUM( bseg~wrbtr ) AS wrbtr,             ""凭证货币金额
      SUM( bseg~dmbtr ) AS dmbtr,             ""按本位币计的金额
      SUM( bseg~pswbt ) AS pswbt             ""总帐中更新的金额
  FROM bseg
      LEFT JOIN bkpf ON bkpf~bukrs = bseg~bukrs AND bkpf~gjahr = bseg~gjahr AND bkpf~belnr = bseg~belnr
      LEFT JOIN t001 ON t001~bukrs = bseg~bukrs
      LEFT JOIN skat ON skat~saknr = bseg~hkont AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON skat~saknr = ska1~saknr AND skat~ktopl = ska1~ktopl
  WHERE
      bseg~bukrs IN @s_bukrs AND ska1~ktoks = 'PL' AND bkpf~gjahr LT @p_gjahr "公司、科目组、小于年度
  GROUP BY
      bseg~bukrs,             ""公司代码
      bseg~h_waers,           ""货币码
      bseg~gjahr,             ""会计年度
      t001~waers,               ""T001货币码
      bseg~shkzg,             ""借方/贷方标识
      bseg~pswsl             ""更新总分类帐交易数字货币
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  IF gt_data1 IS NOT INITIAL.
    PERFORM frm_calculatedata_wfplr USING  'BSEG'.
  ENDIF.

  "FAGLFLEXA此表有月份是0的数据,初步判断是年初的余额,但是暂估类的科目没有原币金额,所以最后还是剔除
  CLEAR gt_data1.
  SELECT
      faglflexa~rbukrs AS bukrs,           ""公司代码
      faglflexa~rwcur AS h_waers,          ""原事务货币的货币码
      faglflexa~ryear AS gjahr,            ""会计年度
      faglflexa~drcrk AS shkzg,            ""借方/贷方标识
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~wsl WHEN 'H' THEN - faglflexa~wsl END ) AS wrbtr,                ""原交易货币的值(凭证货币)
      SUM( CASE faglflexa~drcrk WHEN 'S' THEN faglflexa~hsl WHEN 'H' THEN - faglflexa~hsl END ) AS dmbtr                ""用本地货币表示的值 "
  FROM faglflexa
      LEFT JOIN t001 ON  t001~bukrs = faglflexa~rbukrs
      LEFT JOIN skat ON  skat~saknr = faglflexa~racct  AND skat~spras = @sy-langu AND skat~ktopl = t001~ktopl
      LEFT JOIN ska1 ON  skat~saknr = ska1~saknr  AND skat~ktopl = ska1~ktopl
      LEFT JOIN bkpf ON  bkpf~bukrs = faglflexa~rbukrs AND bkpf~gjahr = faglflexa~ryear AND bkpf~belnr = faglflexa~docnr
  WHERE "会计凭证号码排除空,月份排除空
     faglflexa~buzei = '000' AND NOT bkpf~monat = '00' AND faglflexa~rbukrs IN @s_bukrs AND ska1~ktoks = 'PL' AND bkpf~gjahr LT @p_gjahr "公司、科目组、小于年度
  GROUP BY
      faglflexa~rbukrs,           ""公司代码
      faglflexa~rwcur,          ""原事务货币的货币码
      faglflexa~ryear,            ""会计年度
      faglflexa~drcrk            ""借方/贷方标识
  INTO CORRESPONDING FIELDS OF TABLE @gt_data1.

  IF gt_data1 IS NOT INITIAL.
    PERFORM frm_calculatedata_wfplr USING 'FAGLFLEXA'. "计算
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CALCULATEDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_calculatedata_wfplr USING se16 TYPE char10.

  LOOP AT gt_data1 INTO gs_data1 .
    CLEAR gs_data2.
    IF se16 = 'BSEG'. "如果交易货币不是公司代码的本币就默认是原币,进而带出总帐中更新的金额
      IF gs_data1-pswsl <> gs_data1-waers.
        gs_data1-h_waers = gs_data1-pswsl. ""币种
        gs_data1-wrbtr = gs_data1-pswbt.   ""原币
      ENDIF.
    ENDIF.
    gs_data2-bukrs = gs_data1-bukrs.              ""公司代码
    gs_data2-gjahr = gs_data1-gjahr + 1.              ""会计年度
    gs_data2-h_waers = gs_data1-h_waers.          ""币种
    IF gs_data1-shkzg = 'S'. "借方
      gs_data2-ye_wrbtr = gs_data1-wrbtr.           """原币余额!!!
      gs_data2-ye_dmbtr = gs_data1-dmbtr.           """本币余额!!!
    ELSEIF gs_data1-shkzg = 'H'. "贷方
      gs_data2-ye_wrbtr = - gs_data1-wrbtr.           """"原币余额!!!
      gs_data2-ye_dmbtr = - gs_data1-dmbtr.           """本币余额!!!
    ENDIF.
    COLLECT gs_data2 INTO gt_wfplr1 .
  ENDLOOP.
  CLEAR:gt_data1,gs_data1,gs_data2.

  SORT gt_wfplr1 BY bukrs h_waers gjahr.""公司代码、货币码、年度

  "算损益类科目的累计值
  LOOP AT gt_wfplr1 INTO gs_data1.
    IF NOT ( gs_data2-bukrs  = gs_data1-bukrs AND gs_data2-h_waers = gs_data1-h_waers ) .
      gs_data2-bukrs = gs_data1-bukrs .        "公司代码
      gs_data2-h_waers = gs_data1-h_waers .   ""币种
      gs_data2-lj_wrbtr = 0 .
      gs_data2-lj_dmbtr = 0 .
    ENDIF.
    gs_data2-lj_wrbtr = gs_data2-lj_wrbtr +  gs_data1-ye_wrbtr  .
    gs_data2-lj_dmbtr = gs_data2-lj_dmbtr  + gs_data1-ye_dmbtr .
    gs_data1-lj_wrbtr  = gs_data2-lj_wrbtr .
    gs_data1-lj_dmbtr  = gs_data2-lj_dmbtr .
    MODIFY gt_wfplr1 FROM gs_data1 TRANSPORTING lj_wrbtr lj_dmbtr .
  ENDLOOP.
  CLEAR:gs_data1,gs_data2.

ENDFORM.

*&---------------------------------------------------------------------*
*&      FORM  getaction
*&---------------------------------------------------------------------*
*       处理用户权限
*----------------------------------------------------------------------*
FORM frm_authority_check.
  DATA:BEGIN OF lt_bukrs OCCURS 0,
         bukrs LIKE t001-bukrs,
       END OF lt_bukrs.

  SELECT bukrs INTO CORRESPONDING FIELDS OF TABLE lt_bukrs FROM t001 WHERE bukrs IN s_bukrs.
  LOOP AT lt_bukrs.
    AUTHORITY-CHECK OBJECT  'F_SKA1_BUK'
    ID 'BUKRS' FIELD lt_bukrs-bukrs."检查字段
    IF sy-subrc <> 0.
      MESSAGE s021 WITH lt_bukrs-bukrs DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SELECTION_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_selection_check .
*等于     EQ
*不等于   NE <>  ><
*小于     LT
*小于等于 LE
*大于     GT
*大于等于 GE

  IF s_bukrs IS INITIAL.
    MESSAGE s000 WITH '“公司代码”为空!' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  IF p_gjahr IS INITIAL.
    MESSAGE s000 WITH '“会计年度”为空!' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  IF p_monat1 IS INITIAL.
    MESSAGE s000 WITH '“开始月份”为空!' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ELSE.
    IF NOT ( p_monat1 GE '01' AND p_monat1 LE '12' ).
      MESSAGE s000 WITH '“开始月份”只能输入1月到12月!' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDIF.

  IF p_monat2 IS INITIAL.
    MESSAGE s000 WITH '“结束月份”为空!' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ELSE.
    IF NOT ( p_monat2 GE '01' AND p_monat2 LE '12' ).
      MESSAGE s000 WITH '“结束月份”只能输入1月到12月!' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDIF.

  IF p_monat2 LT p_monat1.
    MESSAGE s000 WITH '“开始月份”不能大于“结束月份”!' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.


ENDFORM.

参考资料

*在SAP系统中,凭证项目相关的数据可以在表BKPF(凭证抬头数据)和BSEG(凭证行项目数据)中找到。在BSEG表中,可以使用字段GL_ACCOUNT来查找会计科目16020107相关的凭证项目数据。具体来说,你可以使用如下的SAP ABAP代码来查询该会计科目的凭证项目数据:
*
*SELECT *
*FROM BSEG
*WHERE GL_ACCOUNT = '16020107'.
*需要注意的是,在实际使用中,你需要根据自己的SAP系统配置和权限,来确定可以访问哪些表和字段。另外,我们需要保证查询操作的合法性和准确性,避免对系统数据造成不必要的影响。
*
*
*在SAP系统中,除了BSEG表(凭证行项目数据),还有其他一些表可以存储凭证项目相关的数据。以下是一些常见的例子:
*
*BKPF表:凭证抬头数据表,包含凭证的基本信息,如凭证号、凭证日期、凭证类型等。BKPF表和BSEG表通过凭证号(BELNR)字段进行关联,可以用来检索特定凭证的所有行项目数据。
*COEP表:成本元素总帐凭证行项目数据表,用于存储与成本核算相关的凭证项目数据。COEP表和BSEG表通过凭证号、凭证行项目号(BUZEI)和成本元素(COSTELEMENT)字段进行关联。
*FAGLFLEXA表:总账分析项数据表,用于存储总账分析项相关的凭证数据。FAGLFLEXA表和BSEG表通过凭证号和凭证行项目号字段进行关联。
*FAGL_SPLINFO表:总账分期余额表,用于存储总账分期余额相关的凭证数据。FAGL_SPLINFO表和BSEG表通过凭证号、凭证行项目号和总账分期(FISCPER)字段进行关联。
*需要根据具体情况选择合适的表来查询凭证项目相关的数据。同时,需要注意不同表之间的关联关系,以及表中字段的含义和使用方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值