ZR_FI_010

*===============================基本信息===============================*
* 标题:明细分类账(对外-非费用)
* 创建日期:2004-12-28 '    
*===============================定    义===============================*

************************************************************************
* 基本代码
************************************************************************
REPORT ZR_FI_010
NO STANDARD PAGE HEADING
LINE-COUNT 80
LINE-SIZE  125
MESSAGE-ID ZFI1.

************************************************************************
* INCLUDE:包含文件
************************************************************************
INCLUDE OLE2INCL.

************************************************************************
* TABLE: 定义TABLE
************************************************************************
TABLES: T001,  "公司代码
        GLT0,  "总帐科目主记录业务额
        SKAT,  "总帐科目主记录(科目表:说明)
        BKPF,  "会计核算凭证标题(主表)
        BSEG,  "会计核算凭证段(从表)
        ANLC.  "资产值字段

************************************************************************
*INTERNAL TABLES
************************************************************************
*需打印的总账科目列表内表
  DATA: BEGIN OF IT_LIST OCCURS 0,
          SAKNR LIKE SKAT-SAKNR,  "总帐科目号 = SKAT-SAKNR
          TXT20 LIKE SKAT-TXT20.  "总帐科目名称
  DATA: END OF IT_LIST.

*定义内表ITABS(作为辅助使用)
  DATA: BEGIN OF ITABS OCCURS 10.
        INCLUDE STRUCTURE GLT0.
        DATA: TAMOUNT LIKE GLT0-HSLVT.
  DATA: END OF ITABS.

*--每张凭证上的借贷方内表--
  DATA: BEGIN OF ITAB_LIST OCCURS 0,
            BUDAT LIKE BKPF-BUDAT,  "凭证中的记帐日期
            BELNR LIKE BKPF-BELNR,  "会计凭证号码(凭证字号)
            WAERS LIKE BKPF-WAERS,  "货币代码
            KURSF LIKE BKPF-KURSF,  "汇率
            SGTXT LIKE BSEG-SGTXT,  "项目文本(摘要)
            WRBTR LIKE BSEG-WRBTR,  "凭证货币金额
            DMBTR LIKE BSEG-DMBTR,  "按本位币计的金额
            SHKZG LIKE BSEG-SHKZG,  "借方/贷方标识
            SAKNR LIKE BSEG-SAKNR,  "总帐科目号
            HKONT LIKE BSEG-HKONT,  "总分类帐帐目

            DEBIT LIKE GLT0-TSLVT,  "借方(本位币计的金额)
            CREDIT LIKE GLT0-TSLVT, "贷方(本位币计的金额)
            BALANCEWAY(2),          "余额方向
            BALANCE LIKE GLT0-TSLVT,"余额
            BALANCE_C(20),"余额
        END OF ITAB_LIST.
DATA: ITAB_TEMP1 LIKE ITAB_LIST OCCURS 10 WITH HEADER LINE.
DATA: ITAB_TEMP2 LIKE ITAB_LIST OCCURS 10 WITH HEADER LINE.
*--本期合计、累计内表--
  DATA: BEGIN OF ITAB OCCURS 0,
            RACCT LIKE GLT0-RACCT,  "总帐科目号 = SKAT-SAKNR
            TXT20 LIKE SKAT-TXT20,  "总帐科目名称
            TXT50 LIKE SKAT-TXT50,  "总帐科目详细注释

            DRCRK LIKE GLT0-DRCRK,  "借方/贷方标识

            "MONAT TYPE I,           "会计期间
            MONAT(2),               "会计期间
            ZY(14),                 "摘要(本期合计)
            DEBIT LIKE GLT0-TSLVT,  "借方(本位币计的金额)
            CREDIT LIKE GLT0-TSLVT, "贷方(本位币计的金额)
            BALANCEWAY(2),          "余额方向
            BALANCE LIKE GLT0-TSLVT,"余额
            BALANCE_C(20),"余额

            ZY2(14),                 "摘要(本年累计)
            DEBIT2 LIKE GLT0-TSLVT,  "借方(本位币计的金额)
            CREDIT2 LIKE GLT0-TSLVT, "贷方(本位币计的金额)
            BALANCEWAY2(2),          "余额方向
            BALANCE2 LIKE GLT0-TSLVT,"余额
            BALANCE2_C(20),"余额

            HSLVT LIKE GLT0-HSLVT,   "本位币的余额结转 (货币 2)
            HSL01 LIKE GLT0-HSL01,   "按本位币的期间中移动的总计 (货币2)
       END OF ITAB.

*往数据库增加运行日志
  DATA: BEGIN OF IT_ZREPORTLOG OCCURS  0.
    INCLUDE TYPE ZREPORTLOG.
  DATA: END OF IT_ZREPORTLOG.
************************************************************************
* CONSTANTS : 定义常量
************************************************************************

************************************************************************
* TYPE : 定义数据类型
************************************************************************
TYPE-POOLS: SLIS.

************************************************************************
* DATA : 定义变量
************************************************************************
DATA: K_KTOPL LIKE SKAT-KTOPL VALUE 'YW01',  "第一行科目名(帐目表)
      QCYE_RACCT(6),                      "期初余额相关变量定义
      QCYE_TXT20(30),
      QCYE_MONAT(2),
      QCYE_DEBIT LIKE GLT0-HSLVT,
      QCYE_CREDIT LIKE GLT0-HSLVT,
      QCYE_BALANCEWAY(2),
      QCYE_BALANCE LIKE GLT0-HSLVT,"ABC1222
      QCYE_BALANCE_C(20),
      NCYE_BALANCE LIKE GLT0-HSLVT,
      G_SAKNR LIKE SKAT-SAKNR,
      G_KM_NAME(20).

DATA: G_BUDAT1 LIKE BKPF-BUDAT,
      G_BUDAT2 LIKE BKPF-BUDAT.
DATA: G_ISEMPTY TYPE I VALUE 0.

*单据表格上相关坐标值定义
DATA: A1 TYPE I VALUE 0,
      A2 TYPE I VALUE 0,
      A3 TYPE I VALUE 0,
      A4 TYPE I VALUE 0,
      A5 TYPE I VALUE 0,
      A6 TYPE I VALUE 0,
      A7 TYPE I VALUE 0,
      A8 TYPE I VALUE 0,
      A9 TYPE I VALUE 0,
      A10 TYPE I VALUE 0,
      A11 TYPE I VALUE 0.

DATA: B1 TYPE I VALUE 0,
      B2 TYPE I VALUE 0,
      B3 TYPE I VALUE 0,
      B4 TYPE I VALUE 0,
      B5 TYPE I VALUE 0,
      B6 TYPE I VALUE 0,
      B7 TYPE I VALUE 0,
      B8 TYPE I VALUE 0,
      B9 TYPE I VALUE 0,
      B10 TYPE I VALUE 0.
DATA: L1 LIKE BKPF-BUDAT,
      L2 LIKE BKPF-BELNR,
      L3 LIKE BKPF-BKTXT,
      L4 LIKE BKPF-WAERS,
      L5 LIKE BKPF-KURSF,
      L6 LIKE BSEG-WRBTR,
      L7 LIKE BSEG-WRBTR,
      L8 LIKE BSEG-WRBTR,
      L9(2),
      L10(20).

DATA: DS(1)  VALUE 'D',            "判断是否该换页的标志
      NAME_LAST LIKE USER_ADDR-NAME_LAST,
      NAME_FIRST LIKE USER_ADDR-NAME_FIRST,
      NAME(16).

DATA: ZYS TYPE I VALUE 0.          "总月数
DATA: ZHS TYPE I VALUE 0.          "总行数
DATA: PAGENUM TYPE I VALUE 0.      "总的页数
DATA: PAGE_CURR(2).                "当前页数
DATA: LIMTA TYPE I VALUE 0.
DATA: LIMTB TYPE I VALUE 0.
DATA: YS TYPE I VALUE 0.           "余数
DATA: XHCS TYPE I VALUE 0.         "循环次数
DATA: PZNO TYPE I VALUE 0.         "每个凭证的页序号
DATA: PZS  TYPE I VALUE 0.         "查询到的凭证数

DATA: I TYPE I VALUE 0,
      FLAG_LINE TYPE I VALUE 0,
      FLAG_PAGE TYPE I VALUE 0.
DATA: G_VALUE_IN(30),              "传进来的值
      G_VALUE_OUT(30).             "经过分隔符号处理的金额

************************************************************************
* DEFINE: 定义宏
************************************************************************
*尾数加'.00'
DATA: LEN TYPE I,
      CS TYPE I,
      YUS TYPE I,
      L TYPE I,
      LEN1 TYPE I,
      FLAG TYPE I,
      ENDFLG(1),
      TEST(1),
      TEMP(20),
      TEMP1(20),
      TEMP2(20).

DEFINE MACRO_ZERO.
  LEN = STRLEN( &1 ).
  CS = 0.
  FLAG = 0.
  ENDFLG = 'N'.
  WHILE ENDFLG <> 'Y'.
    MOVE &1+CS(1) TO TEST.
    IF TEST = '.'.
      FLAG = 1.
    ENDIF.
    CS = CS + 1.
    IF CS >= LEN.
      ENDFLG = 'Y'.
    ENDIF.
  ENDWHILE.

  IF FLAG = 0.
    CONCATENATE &1 '.00' INTO &1.
    CONDENSE &1.
  ENDIF.
END-OF-DEFINITION.

*金额加分隔符
DATA: L_LEN TYPE I,
      L_CS TYPE I,
      L_YUS TYPE I,
      L_BZS TYPE I,
      L_L TYPE I,
      L_ENDFLG(1),
      L_TEST(1),
      L_TEMP(30),
      L_TEMP1(30),
      L_TEMP2(30).
DEFINE MACRO_FGF.
  L_TEMP = &1.
  "处理分隔符号
  L_TEMP1 = ''.
  L_TEMP2 = ''.
  L_LEN = STRLEN( L_TEMP ).

  L_BZS = -1.
  L_CS = L_LEN.
  L_ENDFLG = 'N'.
  WHILE L_ENDFLG <> 'Y'.
    MOVE L_TEMP+L_CS(1) TO L_TEMP1.
    IF L_TEMP1 = '.'.
      L_BZS = -1.
    ENDIF.
    IF L_TEMP1 <> '.' AND L_TEMP1 <> ' ' AND L_TEMP1 <> '-'.
      IF L_BZS = 3.
        CONCATENATE ',' L_TEMP2 INTO L_TEMP2.
        L_BZS = 0.
      ENDIF.
    ENDIF.
    CONCATENATE L_TEMP1 L_TEMP2 INTO L_TEMP2.
    L_CS = L_CS - 1.
    L_BZS = L_BZS + 1.

    IF L_CS < 0.
      L_ENDFLG = 'Y'.
    ENDIF.
  ENDWHILE.

  MOVE L_TEMP2 TO &1.
END-OF-DEFINITION.
************************************************************************
*  SELECTION SCREEN : 定义报表筛选条件
************************************************************************
SELECTION-SCREEN SKIP.
*确定过滤参数
 SELECTION-SCREEN BEGIN OF BLOCK YGF WITH FRAME. TITLE BLK_001.
   "公司代码"会计年度"会计期间
    PARAMETERS: P_BUKRS LIKE GLT0-BUKRS OBLIGATORY MEMORY ID 112.
    PARAMETERS: P_GJAHR LIKE GLT0-RYEAR OBLIGATORY DEFAULT SY-DATUM
                MEMORY ID 111.
    SELECT-OPTIONS P_MONAT FOR GLT0-RPMAX OBLIGATORY DEFAULT  '1' TO '16'
                MEMORY ID 111.
   "总帐科目号
    SELECT-OPTIONS P_SAKNR FOR SKAT-SAKNR OBLIGATORY.
 SELECTION-SCREEN END OF BLOCK YGF.

*选择报表类型
 SELECTION-SCREEN BEGIN OF BLOCK BLK_003 WITH FRAME. TITLE BLK_003 .
 PARAMETERS: P_REPORT RADIOBUTTON GROUP R1 DEFAULT 'X',
             P_ALV RADIOBUTTON GROUP R1,
             P_FORM. RADIOBUTTON GROUP R1.
 SELECTION-SCREEN END OF BLOCK BLK_003.

*===============================事    件===============================*
************************************************************************
* INITIALIZATION.启动程序开始执行
************************************************************************
INITIALIZATION.
  P_GJAHR = SY-DATUM(4).       "会计年度
  P_MONAT = SY-DATUM+4(2) - 1. "会计期间

  BLK_001 = '检索参数'.
  BLK_003 = '报表类型'.
  PERFORM. F_INI.
************************************************************************
* AT SELECTION SCREEN:
************************************************************************
AT SELECTION-SCREEN.
  PERFORM. F_CHECK_INPUT.          "检查用户输入
************************************************************************
* START OF SELECTION:
************************************************************************
START-OF-SELECTION.
*往数据库增加运行日志
  IT_ZREPORTLOG-MANDT = SY-MANDT.
  IT_ZREPORTLOG-TCODE = SY-TCODE.
  IT_ZREPORTLOG-DATUM = SY-DATUM.
  IT_ZREPORTLOG-UZEIT = SY-UZEIT.
  IT_ZREPORTLOG-UNAME = SY-UNAME.
  IT_ZREPORTLOG-TITLE = SY-TITLE.
  APPEND IT_ZREPORTLOG.
  INSERT INTO ZREPORTLOG VALUES IT_ZREPORTLOG .

*  Perform. F_READ_DATA.         "取数

  IF P_REPORT = 'X'.           "报表输出判断
    PERFORM. F_PRINT_REPORT.    "输出数据
  ELSEIF P_ALV = 'X'.
    PERFORM. F_OUT_ALV.
  ELSE.
    PERFORM. F_OUT_FORM.
  ENDIF.
END-OF-SELECTION.
************************************************************************
* TOP OF PAGE
************************************************************************
TOP-OF-PAGE.
*  PERFORM. F_HEAD.
************************************************************************
* END OF PAGE
************************************************************************
END-OF-PAGE.
*  PERFORM. F_BOTTOM.


*===============================子 例 程===============================*
*&---------------------------------------------------------------------*
*过滤条件有效性检查
*&---------------------------------------------------------------------*
FORM. F_CHECK_INPUT.
  DATA: P_MONAT1 TYPE D,
        P_MONAT2 TYPE D,
        Q_SAKNR(12).

  P_MONAT1 = P_MONAT+4(2).
  P_MONAT2 = P_MONAT+7(2).

  IF ( P_MONAT1 < '01' ) OR ( P_MONAT1 > '16' ) OR
   ( P_MONAT2 < '01' ) OR ( P_MONAT2 > '16' ).
    MESSAGE E101.    "该会计期间不存在!
  ENDIF.

*判断LOW < HIGH
  IF P_MONAT1 > P_MONAT2.
    MESSAGE E102.    "会计期间LOW值不能大于HIGH值!
  ENDIF.

*判断是否存在该记录
  IF P_SAKNR+0(7) = 'IEQ0000'.
    Q_SAKNR = P_SAKNR+7(10).
  ELSE.
    Q_SAKNR = P_SAKNR+3(10).
  ENDIF.

  SELECT SINGLE *
    FROM SKAT
   WHERE SPRAS = '1' AND
      KTOPL = '1000' AND
      SAKNR = Q_SAKNR.       "取明细科目代码
  IF SY-SUBRC <> 0 .
    MESSAGE E103.   "不存在该会计科目!
  ENDIF.
ENDFORM.                    " F_CHECK_INPUT
*&---------------------------------------------------------------------*
*普通报表格式的打印
*&---------------------------------------------------------------------*
FORM. F_PRINT_REPORT.
DATA: L_DEBIT LIKE GLT0-TSLVT,  "借方(本位币计的金额)
      L_CREDIT LIKE GLT0-TSLVT, "贷方(本位币计的金额)
      L_BALANCEWAY(2),          "余额方向
      L_BALANCE LIKE GLT0-TSLVT,"余额
      L_BALANCE_C(20),          "余额
      L_BUDAT1 LIKE BKPF-BUDAT,
      L_BUDAT2 LIKE BKPF-BUDAT.

*获取科目LIST
  SELECT SAKNR TXT20
    FROM SKAT
    INTO CORRESPONDING FIELDS OF TABLE IT_LIST
    WHERE SPRAS = '1' AND
          KTOPL = '1000' AND
          SAKNR IN P_SAKNR.

*分页显示各明细账
LOOP AT IT_LIST.
  IF IT_LIST-SAKNR+2(4) = '4200'.
    CONTINUE.
  ENDIF.

  NEW-PAGE.      "针对不同明细科目进行分页
  PAGE_CURR = '1'.
  G_SAKNR = IT_LIST-SAKNR.

  CLEAR ITAB.   REFRESH ITAB.
  CLEAR ITABS.  REFRESH ITABS.
  QCYE_DEBIT = 0 .
  QCYE_CREDIT = 0 .
  QCYE_BALANCEWAY = ''.
  QCYE_BALANCE = 0.
  L_BUDAT2 = '00000000'.
  L_DEBIT = 0. L_CREDIT = 0.
  L_BALANCE = 0.

  PERFORM. F_READ_TOTALDATA."取数
  PERFORM. F_GETKMNAME.     "取会计科目代码及名称
  PERFORM. F_EMPTYCHECK.    "判断期初余额及本期间内是否有发生额

  IF G_ISEMPTY = 1.
    NEW-PAGE.
    PERFORM. F_HEAD.
    PERFORM. F_LIST_HEAD.
    PERFORM. F_QCYE_SHOW."期初余额显示
    I = 1.

    LOOP AT ITAB.
      "明细账显示
      IF ( ITAB-DEBIT <> 0 ) OR ( ITAB-CREDIT <> 0 ) .
        G_BUDAT1 = ITAB-MONAT.
        G_BUDAT2 = ITAB-MONAT.
        PERFORM. F_GETDATE.       "取日期期间
        PERFORM. F_READ_DATA.     "取数

        L_BUDAT2 = '00000000'.
        L_DEBIT = 0. L_CREDIT = 0.
*        L_BALANCE = 0.
        LOOP AT ITAB_LIST.
          "每日合计处理
          IF ( IT_LIST-SAKNR+2(4) = '1001' ) OR ( IT_LIST-SAKNR+2(4) = '1002' ) OR
            ( IT_LIST-SAKNR+2(4) = '1009' ) .
            L_BUDAT1 = ITAB_LIST-BUDAT.
            L_DEBIT = L_DEBIT + ITAB_LIST-DEBIT.
            L_CREDIT = L_CREDIT + ITAB_LIST-CREDIT.
            IF ( L_BUDAT2 <> L_BUDAT1 ) AND ( L_BUDAT2 <> '00000000' ).
              L_DEBIT = L_DEBIT - ITAB_LIST-DEBIT.
              L_CREDIT = L_CREDIT - ITAB_LIST-CREDIT.

              "余额处理
              L_BALANCE = L_BALANCE + L_DEBIT - L_CREDIT.
              IF L_BALANCE = 0.
                L_BALANCEWAY = '平'.
              ELSEIF L_BALANCE > 0 .
                L_BALANCEWAY = '借'.
                L_BALANCE_C = L_BALANCE.
              ELSE.
                L_BALANCEWAY = '借'.
                L_BALANCE_C = 0 - L_BALANCE.
                CONCATENATE '-' L_BALANCE_C INTO L_BALANCE_C.
              ENDIF.
              CONDENSE L_BALANCE_C.

              L1 = L_BUDAT2. L2 = ''. L3 = '    本 日 合 计'. L4 = ''. L5 = ''. L6 = ''.
              L7 = L_DEBIT. L8 = L_CREDIT.
              L9 = L_BALANCEWAY. L10 = L_BALANCE_C.
              PERFORM. F_LIST.

              L_BUDAT2 = ITAB_LIST-BUDAT.
              L_DEBIT = ITAB_LIST-DEBIT.
              L_CREDIT = ITAB_LIST-CREDIT.

              "换行、换页处理
              PERFORM. F_NEWPAGE.
            ELSE.
              L_BUDAT2 = ITAB_LIST-BUDAT.
            ENDIF.
          ENDIF.

          "本日值显示
          L1 = ITAB_LIST-BUDAT. L2 = ITAB_LIST-BELNR. L3 = ITAB_LIST-SGTXT.
          L4 = ITAB_LIST-WAERS. L5 = ITAB_LIST-KURSF. L6 = ITAB_LIST-WRBTR.
          L7 = ITAB_LIST-DEBIT. L8 = ITAB_LIST-CREDIT.L9 = ITAB_LIST-BALANCEWAY.
          L10 = ITAB_LIST-BALANCE_C.
          PERFORM. F_LIST.

          "换行,换页处理
          PERFORM. F_NEWPAGE.
        ENDLOOP.

        "每日合计处理(最后一条记录处理)
        IF ( IT_LIST-SAKNR+2(4) = '1001' ) OR ( IT_LIST-SAKNR+2(4) = '1002' ) OR
          ( IT_LIST-SAKNR+2(4) = '1009' ).
              L_BUDAT1 = ITAB_LIST-BUDAT.

              "余额处理
              L_BALANCE = L_BALANCE + L_DEBIT - L_CREDIT.
              IF L_BALANCE = 0.
                L_BALANCEWAY = '平'.
              ELSEIF L_BALANCE > 0 .
                L_BALANCEWAY = '借'.
                L_BALANCE_C = L_BALANCE.
              ELSE.
                L_BALANCEWAY = '借'.
                L_BALANCE_C = 0 - L_BALANCE.
                CONCATENATE '-' L_BALANCE_C INTO L_BALANCE_C.
              ENDIF.
              CONDENSE L_BALANCE_C.

              L1 = L_BUDAT2. L2 = ''. L3 = '    本 日 合 计'. L4 = ''. L5 = ''. L6 = ''.
              L7 = L_DEBIT. L8 = L_CREDIT.
              L9 = L_BALANCEWAY. L10 = L_BALANCE_C.
              PERFORM. F_LIST.

              "换行、换页处理
              PERFORM. F_NEWPAGE.
        ENDIF.

        QCYE_BALANCE = ITAB-BALANCE2.  "重整期初余额

        "[本期合计][本年累计]显示
        ITAB-CREDIT = 0 - ITAB-CREDIT.
        ITAB-CREDIT2 = 0 - ITAB-CREDIT2.

        L1 = G_BUDAT2. L2 = ''. L3 = '    本 期 合 计'. L4 = ''. L5 = ''. L6 = ''.
        L7 = ITAB-DEBIT. L8 = ITAB-CREDIT. L9 = ITAB-BALANCEWAY2. L10 = ITAB-BALANCE2_C.
        PERFORM. F_LIST.
        I = I + 1.
        FLAG_LINE = I MOD 5.
        IF FLAG_LINE = 0 AND I > 5.
          ULINE.
        ENDIF.

        L1 = G_BUDAT2. L2 = ''. L3 = '    本 年 累 计'. L4 = ''. L5 = ''. L6 = ''.
        L7 = ITAB-DEBIT2. L8 = ITAB-CREDIT2. L9 = ITAB-BALANCEWAY2. L10 = ITAB-BALANCE2_C.
        PERFORM. F_LIST.
        "注:[本期合计余额]相等于当期[本年累计余额]
        I = I + 1.
        FLAG_LINE = I MOD 5.
        IF FLAG_LINE = 0.
          ULINE.
        ENDIF.
      ENDIF.
    ENDLOOP.

    FLAG_LINE = I MOD 5.
    IF ( I = 1 OR I < 6 OR ( FLAG_LINE <> 0 ) ) AND ( I <> 5 ).
      ULINE.
    ENDIF.
    PERFORM. F_BOTTOM.

  ENDIF.    "结束G_ISEMPTY = 1

ENDLOOP.

ENDFORM.                     " F_PRINT_REPORT
*&---------------------------------------------------------------------*
*换页处理
*&---------------------------------------------------------------------*
FORM. F_NEWPAGE.
  I = I + 1.
  FLAG_LINE = I MOD 5.
  IF FLAG_LINE = 0.
    ULINE.
  ENDIF.

  PAGENUM = I MOD 59 .
  IF PAGENUM = 0.
    L1 = ''. L2 = ''. L3 = '(过次页)'. L4 = ''. L5 = ''. L6 = ''.
    L7 = ''. L8 = ''. L9 = ''. L10 = ITAB_LIST-BALANCE_C.
    PERFORM. F_LIST.
    ULINE.

    NEW-PAGE.
    PAGE_CURR = PAGE_CURR + 1.
    PERFORM. F_HEAD.
    PERFORM. F_LIST_HEAD.

    L1 = ''. L2 = ''. L3 = '(承前页)'. L4 = ''. L5 = ''. L6 = ''.
    L7 = ''. L8 = ''. L9 = ''. L10 = ITAB_LIST-BALANCE_C.
    PERFORM. F_LIST.
    I = I + 2.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*从数据库中读取明细数据
*&---------------------------------------------------------------------*
FORM. F_READ_DATA .
DATA: L_BALANCE LIKE GLT0-TSLVT.

  CLEAR ITAB_TEMP1.  REFRESH ITAB_TEMP1.
  CLEAR ITAB_TEMP2.  REFRESH ITAB_TEMP2.
  CLEAR ITAB_LIST.   REFRESH ITAB_LIST.

  SELECT
      BELNR  "会计凭证号码(凭证字号)
      BUDAT  "凭证中的记帐日期
      WAERS  "货币代码
      KURSF  "汇率
    FROM BKPF
    INTO CORRESPONDING FIELDS OF TABLE ITAB_TEMP1
    WHERE BUKRS = P_BUKRS AND
          GJAHR = P_GJAHR AND
          BUDAT >= G_BUDAT1 AND
          BUDAT <= G_BUDAT2 AND
          BSTAT = ''.           "凭证状态(去除样本凭证等)

*取每张凭证上的借贷金额
  ZHS = 0.
  LOOP AT ITAB_TEMP1.
    SELECT
        BELNR  "会计凭证号码(凭证字号)
        WRBTR  "凭证货币金额
        DMBTR  "按本位币计的金额
        SHKZG  "借方/贷方标识
        SGTXT  "项目文本(摘要)
        SAKNR  "总帐科目号
        HKONT  "总分类帐帐目
      FROM BSEG
      INTO CORRESPONDING FIELDS OF TABLE ITAB_TEMP2
      WHERE BUKRS = P_BUKRS AND GJAHR = P_GJAHR AND
            BELNR = ITAB_TEMP1-BELNR AND
            HKONT = IT_LIST-SAKNR.

      LOOP AT ITAB_TEMP2.
        MOVE ITAB_TEMP2-BELNR TO ITAB_LIST-BELNR.
        MOVE ITAB_TEMP2-WRBTR TO ITAB_LIST-WRBTR.
        MOVE ITAB_TEMP2-DMBTR TO ITAB_LIST-DMBTR.
        MOVE ITAB_TEMP2-SHKZG TO ITAB_LIST-SHKZG.
        MOVE ITAB_TEMP2-SAKNR TO ITAB_LIST-SAKNR.
        MOVE ITAB_TEMP2-SGTXT TO ITAB_LIST-SGTXT.

        MOVE ITAB_TEMP1-BUDAT TO ITAB_LIST-BUDAT.
        MOVE ITAB_TEMP1-WAERS TO ITAB_LIST-WAERS.
        IF ITAB_TEMP1-WAERS <> 'RMB'.
          MOVE ITAB_TEMP1-KURSF TO ITAB_LIST-KURSF.
        ELSE.
          MOVE '' TO ITAB_LIST-KURSF.
        ENDIF.
        APPEND ITAB_LIST.
        ZHS = ZHS + 1.
      ENDLOOP.
  ENDLOOP.

*处理借贷方金额
  LOOP AT ITAB_LIST.
    IF ITAB_LIST-SHKZG = 'S'.
      MOVE ITAB_LIST-DMBTR TO ITAB_LIST-DEBIT.
    ELSEIF ITAB_LIST-SHKZG = 'H'.
      MOVE ITAB_LIST-DMBTR TO ITAB_LIST-CREDIT.
    ENDIF.

    MODIFY ITAB_LIST.
  ENDLOOP.

  SORT ITAB_LIST BY BUDAT.

  L_BALANCE = QCYE_BALANCE.
*处理明细余额
  LOOP AT ITAB_LIST.
    ITAB_LIST-BALANCE = L_BALANCE + ITAB_LIST-DEBIT - ITAB_LIST-CREDIT.
    ITAB_LIST-BALANCE_C = ITAB_LIST-BALANCE.

  IF ( ( IT_LIST-SAKNR+2(1) <> '2' ) AND ( IT_LIST-SAKNR+2(1) <> '3' ) AND
   ( IT_LIST-SAKNR+2(1) <> '5' ) AND ( IT_LIST-SAKNR+2(1) <> '6' ) AND
   ( IT_LIST-SAKNR <> '0015020001' ) AND ( IT_LIST-SAKNR <> '0011410001' ) ) OR
   ( IT_LIST-SAKNR = '0021710101' ) OR ( IT_LIST-SAKNR = '0021710102' ) OR
   ( IT_LIST-SAKNR = '0021710103' ) OR ( IT_LIST-SAKNR = '0021710104' ) OR
   ( IT_LIST-SAKNR = '0021710105' ) OR ( IT_LIST-SAKNR = '0021710110' ) OR
   ( IT_LIST-SAKNR = '0021710111' ) OR ( IT_LIST-SAKNR = '0021710112' ) OR
   ( IT_LIST-SAKNR = '0021710117' ) OR
   ( IT_LIST-SAKNR+2(4) = '5401' ) OR ( IT_LIST-SAKNR+2(4) = '5402' ) OR
   ( IT_LIST-SAKNR+2(4) = '5405' ) OR ( IT_LIST-SAKNR = '0055010000' ) OR
   ( IT_LIST-SAKNR = '0055020000' ) OR ( IT_LIST-SAKNR = '0055030002' ) OR
   ( IT_LIST-SAKNR = '0055030003' ) OR ( IT_LIST-SAKNR = '0055030004' ) OR
   ( IT_LIST-SAKNR = '0055030005' ) OR ( IT_LIST-SAKNR+2(4) = '5601' ) OR
   ( IT_LIST-SAKNR+2(4) = '5701' ).
      IF ITAB_LIST-BALANCE = 0.
        ITAB_LIST-BALANCEWAY = '平'.
      ELSEIF ITAB_LIST-BALANCE > 0 .
        ITAB_LIST-BALANCEWAY = '借'.
      ELSE.
        ITAB_LIST-BALANCEWAY = '借'.
        ITAB_LIST-BALANCE_C = 0 - ITAB_LIST-BALANCE.
        CONCATENATE '-' ITAB_LIST-BALANCE_C INTO ITAB_LIST-BALANCE_C.
      ENDIF.
    ELSE.
      IF ITAB_LIST-BALANCE = 0.
        ITAB_LIST-BALANCEWAY = '平'.
      ELSEIF ITAB_LIST-BALANCE > 0 .
        ITAB_LIST-BALANCEWAY = '贷'.
        CONCATENATE '-' ITAB_LIST-BALANCE_C INTO ITAB_LIST-BALANCE_C.
      ELSE.
        ITAB_LIST-BALANCEWAY = '贷'.
        ITAB_LIST-BALANCE_C = 0 - ITAB_LIST-BALANCE.
      ENDIF.
    ENDIF.

    CONDENSE ITAB_LIST-BALANCE_C.
    MODIFY ITAB_LIST.
    L_BALANCE = ITAB_LIST-BALANCE.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*从数据库中读取本期合计数据
*&---------------------------------------------------------------------*
FORM. F_READ_TOTALDATA .
DATA : I TYPE I,
       J TYPE I,
       TEMP_DEBIT2 LIKE ITAB-DEBIT2, "本年累计借方+年初数
       TEMP_CREDIT2 LIKE ITAB-CREDIT2. "本年累计贷方+年初数

*获取本期合计数据
  SELECT *
    FROM GLT0
    INTO CORRESPONDING FIELDS OF ITABS
    WHERE BUKRS = P_BUKRS AND RYEAR = P_GJAHR  "公司代码、会计年度
      AND RACCT = G_SAKNR          "取总账科目代码
*      and RBUSA = ''
*      and RPMAX >= P_MONAT+4(2)    "期间处理
*      and RPMAX <= P_MONAT+7(2)
    ORDER BY RPMAX ASCENDING.
    APPEND ITABS.
    CLEAR ITABS.
  ENDSELECT.

  CLEAR ITAB.
  I = 0.
  DO 16 TIMES.
    I = I + 1.
    ITAB-MONAT = I.
    APPEND ITAB.
  ENDDO.

**开始循环
LOOP AT ITABS.
  J = 0.
  DO 16 TIMES.
    J = J + 1.
    READ TABLE ITAB INDEX J.

    CASE J.
*处理1月份数据
    WHEN 1.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL01.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01.          "本年累计
       NCYE_BALANCE = NCYE_BALANCE + ITABS-HSLVT.
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL01.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01.        "本年累计
       NCYE_BALANCE = NCYE_BALANCE + ITABS-HSLVT.
     ENDIF.
*处理2月份数据
    WHEN 2.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL02.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL02.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 .
     ENDIF.
*处理3月份数据
    WHEN 3.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL03.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03.
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL03.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03.
     ENDIF.
*处理4月份数据
    WHEN 4.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL04.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL04.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04.
     ENDIF.
*处理5月份数据
    WHEN 5.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL05.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL05.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 .
     ENDIF.
*处理6月份数据
    WHEN 6.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL06.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL06.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 .
     ENDIF.
*处理7月份数据
    WHEN 7.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL07.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL07.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07 .
     ENDIF.
*处理8月份数据
    WHEN 8.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL08.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL08.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 .
     ENDIF.
*处理9月份数据
    WHEN 9.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL09.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL09.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 .
     ENDIF.
*处理10月份数据
    WHEN 10.
      IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL10.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL10.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10 .
     ENDIF.
*处理11月份数据
    WHEN 11.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL11.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL11.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 .
     ENDIF.
*处理12月份数据
    WHEN 12.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL12.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 + ITABS-HSL12 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL12.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 + ITABS-HSL12 .
     ENDIF.
*处理13月份数据
    WHEN 13.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL13.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 + ITABS-HSL12 + ITABS-HSL13 .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL13.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 + ITABS-HSL12 + ITABS-HSL13 .
     ENDIF.
*处理14月份数据
    WHEN 14.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL14.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 + ITABS-HSL12 + ITABS-HSL13
                     + ITABS-HSL14  .
     ELSEIF ITABS-DRCRK = 'H'.
       ITAB-CREDIT = ITAB-CREDIT + ITABS-HSL14.          "贷方本期合计
       ITAB-CREDIT2 = ITAB-CREDIT2 + ITABS-HSL01         "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 + ITABS-HSL12 + ITABS-HSL13
                     + ITABS-HSL14 .
     ENDIF.
*处理15月份数据
    WHEN 15.
     IF ITABS-DRCRK = 'S'.
       ITAB-DEBIT = ITAB-DEBIT + ITABS-HSL15.            "借方本期合计
       ITAB-DEBIT2 = ITAB-DEBIT2 + ITABS-HSL01           "本年累计
                     + ITABS-HSL02 + ITABS-HSL03 + ITABS-HSL04
                     + ITABS-HSL05 + ITABS-HSL06 + ITABS-HSL07
                     + ITABS-HSL08 + ITABS-HSL09 + ITABS-HSL10
                     + ITABS-HSL11 + ITABS-HSL12 + ITABS-HSL13
          &a

请使用浏览器的分享功能分享到微信等