ZR_FI_011

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

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

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

************************************************************************
* TABLE: 定义TABLE
************************************************************************
TABLES: T001,  "公司代码
        CSKS,  "成本中心主数据
        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,  "总分类帐帐目
            KOSTL LIKE BSEG-KOSTL,  "成本中心

            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: ITAB_TEMP3 LIKE ITAB_LIST OCCURS 10 WITH HEADER LINE.

  DATA: BEGIN OF ITAB_CSKS OCCURS 10,"成本中心主数据
          BUKRS LIKE CSKS-BUKRS,    "公司代码
          KOSTL LIKE CSKS-KOSTL,    "成本中心"
          KOSAR LIKE CSKS-KOSAR,    "成本中心类型
  END OF ITAB_CSKS.

*后台记录表
DATA: BEGIN OF ITAB_HT OCCURS 10.
        INCLUDE STRUCTURE ZFI06.
DATA: END OF ITAB_HT.
DATA: ITAB_HT2 LIKE ITAB_HT OCCURS 10 WITH HEADER LINE.

*往数据库增加运行日志
  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,
      QCYE_BALANCE_C(20),
      NCYE_BALANCE LIKE GLT0-HSLVT,
      G_SAKNR LIKE SKAT-SAKNR,
      G_KM_NAME(20),
      G_KM_NAME1(20),
      G_KM_NAME2(20).

DATA: G_BUDAT1 LIKE BKPF-BUDAT,
      G_BUDAT2 LIKE BKPF-BUDAT.
DATA: G_ISEMPTY TYPE I VALUE 0.
DATA: G_KOSAR LIKE CSKS-KOSAR.       "定义成本中心类型

*单据表格上相关坐标值定义
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: G_VALUE_IN(30),              "传进来的值
      G_VALUE_OUT(30).             "经过分隔符号处理的金额
************************************************************************
* DEFINE: 定义宏
************************************************************************
*尾数加'.00'
DATA: LEN TYPE I,
      TIMES TYPE I,
      FLAG TYPE I,
      ENDFLG(1),
      TEST(1).

DEFINE MACRO_ZERO.
  LEN = STRLEN( &1 ).
  TIMES = 0.
  FLAG = 0.
  ENDFLG = 'N'.
  WHILE ENDFLG <> 'Y'.
    MOVE &1+TIMES(1) TO TEST.
    IF TEST = '.'.
      FLAG = 1.
    ENDIF.
    TIMES = TIMES + 1.
    IF TIMES >= 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.
 SELECTION-SCREEN END OF BLOCK YGF.

*费用类型选择
 SELECTION-SCREEN BEGIN OF BLOCK FLAG2 WITH FRAME. TITLE BLK_002.
 PARAMETERS: P_1 RADIOBUTTON GROUP R1, "销售
             P_2 RADIOBUTTON GROUP R1, "管理
             P_3 RADIOBUTTON GROUP R1. "制造
 SELECTION-SCREEN END OF BLOCK FLAG2.

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

*后台相关处理
SELECTION-SCREEN BEGIN OF BLOCK BLK_004 WITH FRAME. TITLE BLK_004 .
PARAMETERS: P_QT RADIOBUTTON GROUP R3,                "前台运行
            P_HT RADIOBUTTON GROUP R3,                "后台运行
            P_SHOW RADIOBUTTON GROUP R3 DEFAULT 'X'.  "显示后台记录
SELECTION-SCREEN END OF BLOCK BLK_004.
*===============================事    件===============================*
************************************************************************
* INITIALIZATION.启动程序开始执行
************************************************************************
INITIALIZATION.
  P_GJAHR = SY-DATUM(4).       "会计年度
  P_MONAT = SY-DATUM+4(2) - 1. "会计期间

  BLK_001 = '检索参数'.
  BLK_002 = '费用类型'.
  BLK_003 = '报表类型'.
  BLK_004 = '运行类型'.
  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 .

  "取费用的成本中心类型及科目名称
  IF P_1 = 'X'.
    G_KOSAR = 'V'.       "销售
    G_SAKNR = '55010000'.
    G_KM_NAME1 = '销售费用'.
    G_KM_NAME2 = '销售费用-'.
  ELSEIF P_2 = 'X'.
    G_KOSAR = 'L'.       "管理
    G_SAKNR = '55020000'.
    G_KM_NAME1 = '管理费用'.
    G_KM_NAME2 = '管理费用-'.
  ELSEIF P_3 = 'X'.
    G_KOSAR = 'F'.       "制造
    G_SAKNR = '55049999'.
    G_KM_NAME1 = '制造费用'.
    G_KM_NAME2 = '制造费用-'.
  ENDIF.

  IF P_REPORT = 'X'.           "报表输出判断
    IF P_QT = 'X'.
      PERFORM. F_PRINT_REPORT.  "前台输出数据
    ELSEIF P_HT = 'X'.         "后台处理
      PERFORM. F_DO_HT.
    ELSEIF P_SHOW = 'X'.       "显示后台运行记录
      PERFORM. F_DO_SHOW.
    ENDIF.
  ELSEIF P_ALV = 'X'.
    PERFORM. F_OUT_ALV.
  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.
ENDFORM.                    " F_CHECK_INPUT
*&---------------------------------------------------------------------*
*普通报表格式的打印
*&---------------------------------------------------------------------*
FORM. F_PRINT_REPORT.
DATA: I TYPE I VALUE 0,
      J TYPE I VALUE 0,
      K TYPE I VALUE 0,
      MONAT(2),
      NUM_LINE TYPE I VALUE 0,
      FLAG_LINE TYPE I VALUE 0,
      FLAG_PAGE TYPE I VALUE 0.
DATA: DEBIT1 LIKE GLT0-TSLVT,  "借方(本期合计)
      CREDIT1 LIKE GLT0-TSLVT, "贷方
      BALANCEWAY1(2),          "余额方向
      BALANCE1 LIKE GLT0-TSLVT,"余额
      BALANCE1_C(20)."余额
DATA: DEBIT2 LIKE GLT0-TSLVT,  "借方(本年累计)
      CREDIT2 LIKE GLT0-TSLVT, "贷方
      BALANCEWAY2(2),          "余额方向
      BALANCE2 LIKE GLT0-TSLVT,"余额
      BALANCE2_C(20)."余额

DATA: L_BUDAT LIKE BKPF-BUDAT.

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

*分页显示各明细账
LOOP AT IT_LIST.
  NEW-PAGE.
  DEBIT1 = 0.
  CREDIT1 = 0.
  DEBIT2 = 0.
  CREDIT2 = 0.
  BALANCE2 = 0.
  QCYE_BALANCE = 0.
  PAGE_CURR = '1'.

  NUM_LINE = 0.
  I = 0.
  K = 0.
  DO 12 TIMES.
    ZHS = 0.
    I = I + 1.
    MONAT = I.
    G_BUDAT1 = MONAT.
    G_BUDAT2 = MONAT.
    PERFORM. F_GETDATE.                  "取日期期间
    IF ( P_QT = 'X' ) OR ( P_HT = 'X' ).
      PERFORM. F_READ_DATA.              "前台取数
    ELSEIF P_SHOW = 'X'.
      PERFORM. F_READ_HT USING IT_LIST-SAKNR. "前台取数
    ENDIF.

    DESCRIBE TABLE ITAB_LIST LINES ZHS.
    IF ZHS <> 0.
      IF K = 0.
        PERFORM. F_HEAD.
        PERFORM. F_LIST_HEAD.

        "期初余额显示
        CONCATENATE P_GJAHR '01' '01' INTO L_BUDAT.
        L1 = L_BUDAT. L2 = ''. L3 = '    年 初 余 额'. L4 = ''. L5 = ''. L6 = ''.
        L7 = ''. L8 = ''. L9 = '平'. L10 = ''.
        PERFORM. F_LIST.
        NUM_LINE = NUM_LINE + 1.
      ENDIF.
      K = 1.
      DEBIT1 = 0.
      CREDIT1 = 0.

        LOOP AT ITAB_LIST.
          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.

          "本期合计及本年累计借货方处理
          DEBIT1 = DEBIT1 + ITAB_LIST-DEBIT.
          CREDIT1 = CREDIT1 + ITAB_LIST-CREDIT.
          DEBIT2 = DEBIT2 + ITAB_LIST-DEBIT.
          CREDIT2 = CREDIT2 + ITAB_LIST-CREDIT.

          "换页及画行处理
          NUM_LINE = NUM_LINE + 1.
          FLAG_LINE = NUM_LINE MOD 5.
          IF FLAG_LINE = 0.
            ULINE.
          ENDIF.

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

            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.

            NUM_LINE = NUM_LINE + 2.
          ENDIF.
        ENDLOOP.

        "[本期合计][本年累计]余额处理及显示
        BALANCE2 = DEBIT2 - CREDIT2.
        BALANCE2_C = BALANCE2.
        IF BALANCE2 = 0.
          BALANCEWAY2 = '平'.
        ELSEIF BALANCE2 > 0 .
          BALANCEWAY2 = '借'.
        ELSE.
          BALANCEWAY2 = '借'.
          BALANCE2_C = 0 - BALANCE2.
          CONCATENATE '-' BALANCE2_C INTO BALANCE2_C.
        ENDIF.
        CONDENSE BALANCE2_C.

        QCYE_BALANCE = BALANCE2.  "重整期初余额

        L1 = G_BUDAT2. L2 = ''. L3 = '    本 期 合 计'. L4 = ''. L5 = ''. L6 = ''.
        L7 = DEBIT1. L8 = CREDIT1. L9 = BALANCEWAY2. L10 = BALANCE2_C.
        PERFORM. F_LIST.
        NUM_LINE = NUM_LINE + 1.
        FLAG_LINE = NUM_LINE MOD 5.
        IF FLAG_LINE = 0 AND NUM_LINE > 4.
          ULINE.
        ENDIF.

        L1 = G_BUDAT2. L2 = ''. L3 = '    本 年 累 计'. L4 = ''. L5 = ''. L6 = ''.
        L7 = DEBIT2. L8 = CREDIT2. L9 = BALANCEWAY2. L10 = BALANCE2_C.
        PERFORM. F_LIST.
        NUM_LINE = NUM_LINE + 1.
        FLAG_LINE = NUM_LINE MOD 5.
        IF FLAG_LINE = 0.
          ULINE.
        ENDIF.

       J = 1.
    ENDIF.    "结束IF ZHS <> 0.

  ENDDO.      "结束DO 12 TIMES.


  IF K = 1.
      FLAG_LINE = NUM_LINE MOD 5.
      IF ( NUM_LINE = 1 OR NUM_LINE < 6 OR ( FLAG_LINE <> 0 ) )
       AND ( NUM_LINE <> 5 ).
        ULINE.
      ENDIF.
    PERFORM. F_BOTTOM.
  ENDIF.
ENDLOOP.
ENDFORM.                     " F_PRINT_REPORT
*&---------------------------------------------------------------------*
*换页处理
*&---------------------------------------------------------------------*
FORM. F_NEWPAGE.

ENDFORM.
*&---------------------------------------------------------------------*
*从数据库中读取明细数据
*&---------------------------------------------------------------------*
FORM. F_READ_DATA .
DATA: L_BALANCE LIKE GLT0-TSLVT.

  CLEAR ITAB_LIST.   REFRESH ITAB_LIST.
  CLEAR ITAB_TEMP1.  REFRESH ITAB_TEMP1.
  CLEAR ITAB_TEMP2.  REFRESH ITAB_TEMP2.
  CLEAR ITAB_TEMP3.  REFRESH ITAB_TEMP3.
  CLEAR ITAB_CSKS.   REFRESH ITAB_CSKS.

  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
          BELNR <> '' AND
          BSTAT = ''.           "凭证状态(去除样本凭证等)

*取每张凭证上的借贷金额
  LOOP AT ITAB_TEMP1.
    SELECT
        BELNR  "会计凭证号码(凭证字号)
        WRBTR  "凭证货币金额
        DMBTR  "按本位币计的金额
        SHKZG  "借方/贷方标识
        SGTXT  "项目文本(摘要)
        SAKNR  "总帐科目号
        HKONT  "总分类帐帐目
        KOSTL  "成本中心
      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 AND
            KOSTL <> ''.

      LOOP AT ITAB_TEMP2.
        MOVE ITAB_TEMP2-BELNR TO ITAB_TEMP3-BELNR.
        MOVE ITAB_TEMP2-WRBTR TO ITAB_TEMP3-WRBTR.
        MOVE ITAB_TEMP2-DMBTR TO ITAB_TEMP3-DMBTR.
        MOVE ITAB_TEMP2-SHKZG TO ITAB_TEMP3-SHKZG.
        MOVE ITAB_TEMP2-HKONT TO ITAB_TEMP3-HKONT.
        MOVE ITAB_TEMP2-KOSTL TO ITAB_TEMP3-KOSTL.
        MOVE ITAB_TEMP2-SGTXT TO ITAB_TEMP3-SGTXT.

        MOVE ITAB_TEMP1-BUDAT TO ITAB_TEMP3-BUDAT.
        MOVE ITAB_TEMP1-WAERS TO ITAB_TEMP3-WAERS.
        IF ITAB_TEMP1-WAERS <> 'RMB'.
          MOVE ITAB_TEMP1-KURSF TO ITAB_TEMP3-KURSF.
        ELSE.
          MOVE '' TO ITAB_TEMP3-KURSF.
        ENDIF.
        APPEND ITAB_TEMP3.
      ENDLOOP.
  ENDLOOP.

*取成本中心主数据
  SELECT BUKRS                 "公司代码
         KOSTL                 "成本中心
         KOSAR                 "成本中心类型
    FROM CSKS
    INTO CORRESPONDING FIELDS OF ITAB_CSKS
     WHERE KOKRS = '1000'       "控制范围
     AND BUKRS = P_BUKRS        "公司代码
     AND KOSAR = G_KOSAR.       "成本中心类型
    APPEND ITAB_CSKS.
    CLEAR ITAB_CSKS.
  ENDSELECT.

*整合内表
  LOOP AT ITAB_TEMP3.
    LOOP AT ITAB_CSKS.
      IF ( ITAB_TEMP3-KOSTL = ITAB_CSKS-KOSTL ).
        MOVE ITAB_TEMP3-BELNR TO ITAB_LIST-BELNR.
        MOVE ITAB_TEMP3-WRBTR TO ITAB_LIST-WRBTR.
        MOVE ITAB_TEMP3-DMBTR TO ITAB_LIST-DMBTR.
        MOVE ITAB_TEMP3-SHKZG TO ITAB_LIST-SHKZG.
        MOVE ITAB_TEMP3-SAKNR TO ITAB_LIST-SAKNR.

        MOVE ITAB_TEMP3-BUDAT TO ITAB_LIST-BUDAT.
        MOVE ITAB_TEMP3-SGTXT TO ITAB_LIST-SGTXT.
        MOVE ITAB_TEMP3-WAERS TO ITAB_LIST-WAERS.
        MOVE ITAB_TEMP3-KURSF TO ITAB_LIST-KURSF.
        MOVE ITAB_TEMP3-KOSTL TO ITAB_LIST-KOSTL.
        APPEND ITAB_LIST.
      ENDIF.
    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 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.
    CONDENSE ITAB_LIST-BALANCE_C.
    MODIFY ITAB_LIST.
    L_BALANCE = ITAB_LIST-BALANCE.
  ENDLOOP.

*后台处理
  IF P_HT = 'X'.
    LOOP AT ITAB_LIST.
      ITAB_HT-FLAG = G_KOSAR.
      ITAB_HT-BUKRS = P_BUKRS.
      ITAB_HT-RYEAR = P_GJAHR.
      ITAB_HT-RPMAX = ''.
      ITAB_HT-BUDAT = ITAB_LIST-BUDAT.
      ITAB_HT-BELNR = ITAB_LIST-BELNR.
      ITAB_HT-SGTXT = ITAB_LIST-SGTXT.
      ITAB_HT-WAERS = ITAB_LIST-WAERS.
      ITAB_HT-KURSF = ITAB_LIST-KURSF.
      ITAB_HT-WRBTR = ITAB_LIST-WRBTR.
      ITAB_HT-SHKZG = ITAB_LIST-SHKZG.
      ITAB_HT-HKONT = ITAB_LIST-HKONT.
      ITAB_HT-ZDEBIT = ITAB_LIST-DEBIT.
      ITAB_HT-ZCREDIT = ITAB_LIST-CREDIT.
      ITAB_HT-ZBALANCEWAY = ITAB_LIST-BALANCEWAY.
      ITAB_HT-ZBALANCE = ITAB_LIST-BALANCE.
      ITAB_HT-ZBALANCE_C = ITAB_LIST-BALANCE_C.
      APPEND ITAB_HT.
    ENDLOOP.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*后台处理
*&---------------------------------------------------------------------*
FORM. F_DO_HT.
DATA I TYPE I VALUE 0.
  DO 3 TIMES.
    I = I + 1.
    CASE I.
      WHEN 1. G_KOSAR = 'V'.
      WHEN 2. G_KOSAR = 'L'.
      WHEN 3. G_KOSAR = 'F'.
    ENDCASE.

  PERFORM. F_PRINT_REPORT.

  LOOP AT ITAB_HT.
    SELECT *
      FROM ZFI06
      INTO CORRESPONDING FIELDS OF TABLE ITAB_HT2
      WHERE FLAG = G_KOSAR
        AND BUKRS = P_BUKRS
        AND RYEAR = P_GJAHR
        AND RPMAX = ''
        AND BUDAT = ITAB_HT-BUDAT
        AND BELNR = ITAB_HT-BELNR.

    IF SY-SUBRC = 0.
      "更新相同的记录
      LOOP AT ITAB_HT2.
         UPDATE ZFI06
           SET SGTXT = ITAB_HT-SGTXT
               WAERS = ITAB_HT-WAERS
               KURSF = ITAB_HT-KURSF
               WRBTR = ITAB_HT-WRBTR
               SHKZG = ITAB_HT-SHKZG
               HKONT = ITAB_HT-HKONT
               ZDEBIT = ITAB_HT-ZDEBIT
               ZCREDIT = ITAB_HT-ZCREDIT
               ZBALANCEWAY = ITAB_HT-ZBALANCEWAY
               ZBALANCE = ITAB_HT-ZBALANCE
               ZBALANCE_C = ITAB_HT-ZBALANCE_C
               AEDAT = SY-DATUM
               AENAM = SY-UNAME
           WHERE FLAG = G_KOSAR
             AND BUKRS = P_BUKRS
             AND RYEAR = P_GJAHR
             AND RPMAX = ''
             AND BUDAT = ITAB_HT-BUDAT
             AND BELNR = ITAB_HT-BELNR.
      ENDLOOP.
    ELSE.
      "新增记录
      ITAB_HT-ERDAT = SY-DATUM.
      ITAB_HT-AEDAT = SY-DATUM.
      ITAB_HT-ERNAM = SY-UNAME.
      ITAB_HT-AENAM = SY-UNAME.

      INSERT INTO ZFI06
        VALUES ITAB_HT .
    ENDIF.

  ENDLOOP.

  ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*后台记录显示
*&---------------------------------------------------------------------*
FORM. F_DO_SHOW.
  PERFORM. F_PRINT_REPORT.

ENDFORM.
*&---------------------------------------------------------------------*
*后台记录读取
*&---------------------------------------------------------------------*
FORM. F_READ_HT USING P_SAKNR.
  SELECT
      BUDAT                    "凭证中的记帐日期
      BELNR                    "会计凭证号码(凭证字号)
      WAERS                    "货币代码
      KURSF                    "汇率
      SGTXT                    "项目文本(摘要)
      WRBTR                    "凭证货币金额
      SHKZG                    "借方/贷方标识
      HKONT                    "总帐科目号
      ZDEBIT AS DEBIT          "借方(本位币计的金额)
      ZCREDIT AS CREDIT        "贷方(本位币计的金额)
      ZBALANCEWAY AS BALANCEWAY"余额方向
      ZBALANCE AS BALANCE      "余额
      ZBALANCE_C AS BALANCE_C
    FROM ZFI06
    INTO CORRESPONDING FIELDS OF TABLE ITAB_LIST
    WHERE FLAG = G_KOSAR
      AND BUKRS = P_BUKRS
      AND RYEAR = P_GJAHR
      AND RPMAX = ''
      AND BUDAT >= G_BUDAT1
      AND BELNR <= G_BUDAT2
      AND HKONT = P_SAKNR.

ENDFORM.
*&---------------------------------------------------------------------*
*取会计日期期间
*&---------------------------------------------------------------------*
FORM. F_GETDATE.
DATA: L_DAY(2),
      L_MOD TYPE I.

* G_BUDAT1 = P_MONAT+4(2).
* G_BUDAT2 = P_MONAT+7(2).
 "月初
 IF ( G_BUDAT1+1(1) = '' ) AND ( G_BUDAT1 <> '10' ).
   CONCATENATE '0' G_BUDAT1 INTO G_BUDAT1.
 ENDIF.
 CONCATENATE P_GJAHR G_BUDAT1 '01' INTO G_BUDAT1.

 "月底
 IF ( G_BUDAT2+1(1) = '' ) AND ( G_BUDAT2 <> '10' ).
   CONCATENATE '0' G_BUDAT2 INTO G_BUDAT2.
 ENDIF.
 IF G_BUDAT2 > '12'.
   G_BUDAT2 = '12'.
 ENDIF.
 IF G_BUDAT2 = '04' OR G_BUDAT2 = '06' OR
   G_BUDAT2 = '09' OR G_BUDAT2 = '11'.
   L_DAY = '30'.
 ELSEIF G_BUDAT2 = '02'.
   L_MOD = G_BUDAT2 MOD 4.
   IF L_MOD = 0.
     L_DAY = '29'.
   ELSE.
     L_DAY = '28'.
   ENDIF.
 ELSE.
   L_DAY = '31'.
 ENDIF.
 CONDENSE L_DAY NO-GAPS.
 CONCATENATE P_GJAHR G_BUDAT2 L_DAY INTO G_BUDAT2.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F_OUT_ALV
*&---------------------------------------------------------------------*
FORM. F_OUT_ALV .

ENDFORM.                    " F_OUT_ALV
*&---------------------------------------------------------------------*
*&      Form  F_OUT_FORM
*&---------------------------------------------------------------------*
FORM. F_OUT_FORM. .
  CALL FUNCTION 'OPEN_FORM'
  EXPORTING
    DEVICE                      = 'PRINTER'
    FORM                        = 'F_CJM0004'
    LANGUAGE                    = SY-LANGU
  EXCEPTIONS
    CANCELED                    = 1
    DEVICE                      = 2
    FORM                        = 3
    OPTIONS                     = 4
    UNCLOSED                    = 5
    MAIL_OPTIONS                = 6
    ARCHIVE_ERROR               = 7
    INVALID_FAX_NUMBER          = 8
    MORE_PARAMS_NEEDED_IN_BATCH = 9
    SPOOL_ERROR                 = 10
    OTHERS                      = 11.
ENDFORM.                    " F_OUT_FORM
*&---------------------------------------------------------------------*
*&      单据列名显示
*&---------------------------------------------------------------------*
FORM. F_LIST_HEAD .
  WRITE: AT /A1 SY-VLINE,
         AT B1  '   日期',
         AT A2  SY-VLINE,
         AT B2 '  凭证字号',
         AT A3  SY-VLINE,
         AT B3 '        摘要',
         AT A4  SY-VLINE,
         AT B4 '币别',
         AT A5  SY-VLINE,
         AT B5 '  汇率',
         AT A6   SY-VLINE,
         AT B6 '    原币金额',
         AT A7  SY-VLINE,
         AT B7 '    借方金额',
         AT A8  SY-VLINE,
         AT B8 '    贷方金额',
         AT A9  SY-VLINE,
         AT B9 '',
         AT B10 '   余额',
         AT A11 SY-VLINE.

  WRITE: AT /A1   SY-VLINE.
  ULINE  AT  A1(125).
ENDFORM.                    " F_LIST_HEAD
*&---------------------------------------------------------------------*
*&      单据列名显示
*&---------------------------------------------------------------------*
FORM. F_LIST .
  WRITE: AT /A1 SY-VLINE.
  WRITE: AT B1 L1. "日期
  WRITE: AT A2 SY-VLINE.
  WRITE: AT B2 L2.  "凭证字号
  WRITE: AT A3 SY-VLINE.
  WRITE: AT B3 L3.  "摘要
  WRITE: AT A4 SY-VLINE.
  WRITE: AT B4 L4.  "币别
  WRITE: AT A5 SY-VLINE.
  WRITE: AT B5 L5.  "汇率

  WRITE: AT A6 SY-VLINE.
  IF L6 <> 0 .
    WRITE: AT B6 L6.  "原币金额
  ELSE.
    WRITE: AT B6 ''.
  ENDIF.

  WRITE: AT A7 SY-VLINE.
  IF L7 <> 0 .
    WRITE: AT B7 L7 RIGHT-JUSTIFIED.  "借方金额
  ELSE.
    WRITE: AT B7 ''.
  ENDIF.

  WRITE: AT A8 SY-VLINE.
  IF L8 <> 0 .
    WRITE: AT B8 L8 RIGHT-JUSTIFIED. "贷方金额
  ELSE.
    WRITE: AT B8 ''.
  ENDIF.

  WRITE: AT A9 SY-VLINE.
  WRITE: AT B9 L9."余额方向

  WRITE: AT A10 SY-VLINE.
  IF L10 <> 0 .
    MACRO_ZERO L10.
    MACRO_FGF L10.
    WRITE: AT B10 L10 CENTERED."LEFT-JUSTIFIED"余额
  ELSE.
    WRITE: AT B10 ''.
  ENDIF.
  WRITE: AT A11 SY-VLINE.
ENDFORM.                    " F_LIST
*&---------------------------------------------------------------------*
*&      单据表头显示
*&---------------------------------------------------------------------*
FORM. F_HEAD.
DATA : L_MONAT1(2),
       L_MONAT2(2),
       L_COMP(30),
       G_TITLE1(20),
       G_TITLE2(50).

  "取公司名称
  IF P_BUKRS = '1000'.
    L_COMP = '单位名称:厦门松霖卫浴有限公司'.
  ELSEIF P_BUKRS = '2000'.
    L_COMP = '单位名称:厦门益周塑胶有限公司'.
  ELSEIF P_BUKRS = '3000'.
    L_COMP = '单位名称:厦门易洁卫浴有限公司'.
  ELSEIF P_BUKRS = '4000'.
    L_COMP = '单位名称:厦门玩铜五金有限公司'.
  ELSEIF P_BUKRS = '5000'.
    L_COMP = '单位名称:厦门松霖科技有限公司'.
  ENDIF.

  L_MONAT1 = P_MONAT+4(2).
  L_MONAT2 = P_MONAT+7(2).
  IF L_MONAT1 > '12'.
    L_MONAT1 = '12'.
  ENDIF.
  IF L_MONAT2 > '12'.
    L_MONAT2 = '12'.
  ENDIF.

  CONCATENATE G_KM_NAME1 '明细账' INTO G_TITLE1.
  CONCATENATE '明细科目:(' IT_LIST-SAKNR  ')' G_KM_NAME2
              IT_LIST-TXT20 INTO G_TITLE2.
  CONDENSE G_TITLE2.
  WRITE: 60 G_TITLE1.
  SKIP.
  WRITE: 117 '第', PAGE_CURR CENTERED , '页'.
  WRITE: /2 L_COMP.
  WRITE: 51 '会计期间:',P_GJAHR,'年',L_MONAT1,'月至',L_MONAT2,'月'.
  WRITE: /2 G_TITLE2.
  WRITE: 109 '币别:综合本位币'.
  ULINE  AT /A1 .
ENDFORM.                    " SUB_OUTPUTHEAD
*&---------------------------------------------------------------------
*&      单据表尾显示
*&---------------------------------------------------------------------
FORM. F_BOTTOM.
*取制单人
 CLEAR NAME_LAST.
 CLEAR NAME_FIRST.
 CLEAR NAME.
 SELECT NAME_LAST NAME_FIRST
      FROM USER_ADDR
   INTO (NAME_LAST, NAME_FIRST)
   WHERE BNAME = SY-UNAME .   "取logon 帐号
 ENDSELECT.
 CONCATENATE NAME_LAST(4) NAME_FIRST(8) INTO NAME.

 WRITE: AT 70  '操作员',NAME+0(10) LEFT-JUSTIFIED .
 WRITE: AT 90 '打印时间:',SY-DATUM,SY-UZEIT.
ENDFORM.                    "F_BOTTOM
*&---------------------------------------------------------------------*
*&      取总账科目代码、名称
*&---------------------------------------------------------------------*
FORM. F_GETKMNAME.
  CASE G_SAKNR .
****** 一、资产类
    WHEN '0042000011'.
      G_KM_NAME = ' 办公费 '.
    WHEN '0042000021'.
      G_KM_NAME = ' 交通费 '.
    WHEN '0042000031'.
      G_KM_NAME = '电话费'.
    WHEN '0042000041'.
      G_KM_NAME = '差旅费 '.
    WHEN '0042000051'.
      G_KM_NAME = '应酬费 '.
    WHEN '0042000061'.
      G_KM_NAME = '工资 '.
    WHEN '0042000071'.
      G_KM_NAME = '福利费 '.
    WHEN '0042000081'.
      G_KM_NAME = '人力资源费 '.
    WHEN '0042000091'.
      G_KM_NAME = '医保及社保 '.
    WHEN '0042000101'.
      G_KM_NAME = '误餐费'.
    WHEN '0042000111'.
      G_KM_NAME = '邮寄费 '.
    WHEN '0042000121'.
      G_KM_NAME = '汽车费'.
    WHEN '0042000131'.
      G_KM_NAME = '普通运费 '.
    WHEN '0042000141'.
      G_KM_NAME = '空运费 '.
    WHEN '0042000151'.
      G_KM_NAME = 'CF/CIF价海空运费 '.
    WHEN '0042000161'.
      G_KM_NAME = '进口报关费 '.
    WHEN '0042000171'.
      G_KM_NAME = '出口报关费 '.
    WHEN '0042000181'.
      G_KM_NAME = '材料耗用'.
    WHEN '0042000191'.
      G_KM_NAME = '研发物耗 '.
    WHEN '0042000192'.
      G_KM_NAME = '品检物耗'.
    WHEN '0042000201'.
      G_KM_NAME = '低值易耗品摊消'.
    WHEN '0042000211'.
      G_KM_NAME = '无形资产摊消'.
    WHEN '0042000221'.
      G_KM_NAME = '房租 '.
    WHEN '0042000231'.
      G_KM_NAME = '水电费 '.
    WHEN '0042000241'.
      G_KM_NAME = '物业管理费 '.
    WHEN '0042000251'.
      G_KM_NAME = '折旧费'.
    WHEN '0042000261'.
      G_KM_NAME = '咨询费 '.
    WHEN '0042000271'.
      G_KM_NAME = '设计制作费 '.
    WHEN '0042000281'.
      G_KM_NAME = '索赔款 '.
    WHEN '0042000291'.
      G_KM_NAME = '佣金 '.
    WHEN '0042000301'.
      G_KM_NAME = '软件费'.
    WHEN '0042000311'.
      G_KM_NAME = '维护费 '.
    WHEN '0042000321'.
      G_KM_NAME = '维修费 '.
    WHEN '0042000331'.
      G_KM_NAME = '装修费'.
    WHEN '0042000341'.
      G_KM_NAME = '测试费 '.
    WHEN '0042000351'.
      G_KM_NAME = '环保费'.
    WHEN '0042000361'.
      G_KM_NAME = '保险费 '.
    WHEN '0042000371'.
      G_KM_NAME = '加工费 '.
    WHEN '0042000381'.
      G_KM_NAME = '开办费 '.
    WHEN '0042000391'.
      G_KM_NAME = '专利费 '.
    WHEN '0042000401'.
      G_KM_NAME = '印花税 '.
    WHEN '0042000411'.
      G_KM_NAME = '车船使用税 '.
    WHEN '0042000421'.
      G_KM_NAME = '坏帐准备'.
    WHEN '0042000431'.
      G_KM_NAME = '其他 '.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      单据表格上相关坐标值初始
*&---------------------------------------------------------------------*
FORM. F_INI .
  MOVE 1   TO  A1.   "日期
  MOVE 2   TO  B1.
  MOVE 12  TO  A2.   "凭证字号
  MOVE 13  TO  B2.
  MOVE 25  TO  A3.   "摘要
  MOVE 26  TO  B3.
  MOVE 45  TO  A4.   "币别
  MOVE 46  TO  B4.
  MOVE 50  TO  A5.   "汇率
  MOVE 51  TO  B5.
  MOVE 60  TO  A6.   "原币金额
  MOVE 61  TO  B6.
  MOVE 76  TO  A7.   "借方金额
  MOVE 77  TO  B7.
  MOVE 92  TO  A8.   "贷方金额
  MOVE 93  TO  B8.
  MOVE 108 TO  A9.   "余额方向
  MOVE 109 TO  B9.
  MOVE 111 TO  A10.  "余额
  MOVE 112 TO  B10.
  MOVE 125 TO  A11.
ENDFORM.                    " F_INI

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/765243/viewspace-253294/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/765243/viewspace-253294/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值