ZR_FI_005

*===============================基本信息===============================*
* 标题:记账凭证打印
* 创建日期:2004-12-18       
*===============================定    义===============================*

************************************************************************
* 基本代码
************************************************************************
REPORT ZR_FI_005
NO STANDARD PAGE HEADING
MESSAGE-ID ZFI
LINE-SIZE  120
*LINE-COUNT 80.
LINE-COUNT 90.

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

************************************************************************
* TABLE: 定义TABLE
************************************************************************
TABLES: BKPF,         "会计核算凭证标题(主表)
        BSEG,         "会计核算凭证段(从表)
        VBKPF,        "预制凭证的凭证抬头
        SKAT,         "总帐科目主记录(科目表:说明)
        CSKT,         "成本中心说明文本
        CSKS,         "成本中心主数据
        KNA1,         "客户主文件的一般数据
        LFA1,         "供应商主数据 (一般地区)
        USER_ADDR,    "
        T003T.        "凭证类型文本
************************************************************************
*INTERNAL TABLES
************************************************************************
*"--记账凭证明细内表--
DATA: BEGIN OF JZPZ OCCURS 0,
           BUKRS LIKE BSEG-BUKRS,  "公司代码
           BELNR LIKE BKPF-BELNR,  "凭证编号

           BLART LIKE BKPF-BLART,  "凭证类型
           BUDAT LIKE BKPF-BUDAT,  "记账日期
           GJAHR LIKE BKPF-GJAHR,  "会计年度
           MONAT LIKE BKPF-MONAT,  "会计期间
           USNAM LIKE BKPF-USNAM,  "过帐审核人
           PPNAM LIKE BKPF-PPNAM,  "预制人
           XBLNR LIKE BKPF-XBLNR,  "付单椐,参考凭证号

           HKONT LIKE BSEG-HKONT,  "科目代码、总帐科目
           ANLN1 LIKE BSEG-ANLN1,  "帐户代码、主资产号
           KUNNR LIKE BSEG-KUNNR,  "帐户代码、购货方编号
           LIFNR LIKE BSEG-LIFNR,  "供应商编号或债权人帐户号
           SGTXT LIKE BSEG-SGTXT,  "摘要
           KOSTL LIKE BSEG-KOSTL,  "成本中心
           PRCTR LIKE BSEG-PRCTR,  "利润中心
           AUFNR LIKE BSEG-AUFNR,  "订单号
           SHKZG LIKE BSEG-SHKZG,  "借/贷标志
           WRBTR LIKE BSEG-WRBTR,  "金额
           DMBTR LIKE BSEG-DMBTR,  "本位币金额
           KOART LIKE BSEG-KOART,  "帐户类型

           SAKNR(10),  "总帐科目编号
           SAKNR_NAME(200), "合并过后的总帐科目名称

           TXT20 LIKE SKAT-TXT20,  "总帐科目名称
           TXT50 LIKE SKAT-TXT50,  "总帐科目详细注释

           WAERS LIKE BKPF-WAERS,    "货币代码
           KURSF LIKE BKPF-KURSF,    "汇率

           ANLHTXT LIKE ANLH-ANLHTXT,"帐户名称、资产主号说明
           KNAME1  LIKE KNA1-NAME1,  "购货方说明
           KNAME2  LIKE KNA1-NAME2,  "购货方说明
           LNAME1  LIKE LFA1-NAME1,  "供应商说明
           LNAME2  LIKE LFA1-NAME2,  "供应商说明
           SORTL   LIKE KNA1-SORTL,  "客户(或供应商)排序字段(或检索词)

           BUTXT LIKE T001-BUTXT,  "单位名称

           SGTXTA(26),  "第一行摘要
           SGTXTB(26),  "第二行摘要
           SGTXTC(26),  "第三行摘要

           TXT50A(100),  "第一行科目名
           TXT50B(100),  "第二行科目名
           TXT50C LIKE SKAT-TXT50,  "第三行科目名(48)

           ANLHTXTA LIKE ANLH-ANLHTXT,"帐户名称、资产主号说明
           ANLHTXTB LIKE ANLH-ANLHTXT,"帐户名称、资产主号说明

           KNAME1A LIKE KNA1-NAME1, "购货方说明
           KNAME1B LIKE KNA1-NAME1, "购货方说明
           LNAME1A LIKE LFA1-NAME1, "供应商说明
           LNAME1B LIKE LFA1-NAME1, "供应商说明

           ZHDM(15),  "最后帐户代码
           ZHMCA(26), "最后帐户名称第一行
           ZHMCB(26), "最后帐户名称第二行
           ZHMCC(26), "最后帐户名称第三行

           WRBTR_D LIKE BSEG-WRBTR,  "贷方金额
           WRBTR_J LIKE BSEG-WRBTR,  "借方金额

           RQ(14),    "日期

           KTEXT LIKE CSKT-KTEXT,    "成本中心名称
           KOSAR LIKE CSKS-KOSAR,    "成本中心类型
           KOSAR_NAME(4),            "成本中心类型名称
           FYLB(8),                  "费用类别

           KTEXTA(12),  "成本中心名称第一行
           KTEXTB(12),  "成本中心名称第二行
           KTEXTC(12),  "成本中心名称第三行

           LRKTEXT LIKE CEPCT-KTEXT, "利润中心
           LRKTEXTA(12),  "利润中心名称第一行
           LRKTEXTB(12),  "利润中心名称第二行
           LRKTEXTC(12),  "利润中心名称第三行

           AFNTXTA(26), "订单文本第一行
           AFNTXTB(26),
           AFNTXTC(26),

           BUZEI LIKE VBSEGA-BUZEI, "预制凭证的项目号
           XNEGP LIKE BSEG-XNEGP,   "反向记账标志

           STBLG LIKE BKPF-STBLG,    "冲销凭证
           STJAH LIKE BKPF-STJAH,    "冲销年度
      END OF JZPZ.

*"--会计凭证标题内表--
DATA: BEGIN OF PZBH OCCURS 0,
       FLAG(4),                  "判断是普通凭证还是预制凭证的标志
       FORFLAG(2),               "判断是打印本位币还是金额的标志
       BELNR(10),                "财务凭证编号
       STBLG LIKE BKPF-STBLG,    "冲销凭证
       STJAH LIKE BKPF-STJAH,    "冲销年度
       BUKRS LIKE BKPF-BUKRS,    "公司代码
       GJAHR LIKE BKPF-GJAHR,    "会计年度
       MONAT LIKE BKPF-MONAT,    "会计期间
       BUDAT LIKE BKPF-BUDAT,    "凭证记帐日期
       USNAM LIKE BKPF-USNAM,    "用户名
       BLART LIKE BKPF-BLART,    "凭证类型
       WAERS LIKE BKPF-WAERS,    "货币代码
       KURSF LIKE BKPF-KURSF,    "汇率
       NAME_LAST(10),
       NAME_FIRST(10),
       XBLNR LIKE BKPF-XBLNR,    "参考凭证号(当作附单据数)
      END OF PZBH.

DATA: IT_PRINT_001 LIKE JZPZ 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: FLAG TYPE I VALUE 0.     "标记不同类型的帐户代码
DATA: NIAN(4),   "年
      YUE(2),    "月
      RI(2).     "日

DATA:  HJ_JFJE LIKE BSEG-WRBTR, "合计借方金额
       HJ_DFJE LIKE BSEG-WRBTR. "合计贷方金额

DATA: PAGELINE 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.

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.

*
DATA: XBLANK TYPE I VALUE 0.       "空行数目
DATA: ZHS TYPE I VALUE 0.          "总行数
DATA: PAGENUM TYPE I VALUE 0.      "总的页数
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: DS(1)  VALUE 'D',            "判断是否该换页的标志
             NAME_LAST LIKE USER_ADDR-NAME_LAST,
             NAME_FIRST LIKE USER_ADDR-NAME_FIRST,
             NAME(16).

DATA: I TYPE I VALUE 1,
      J TYPE I VALUE 0.

*用于ALV控件双击事件
DATA: G_SELECTED_FIELD_VALUE(80).

*ALV控件构造时需要的参数
DATA: G_ALV_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      G_ALV_FIELDCAT_LINE LIKE LINE OF G_ALV_FIELDCAT,
      G_ALV_EVENT         TYPE SLIS_T_EVENT.

*ALV控件输出的表头
DATA: G_ALV_LISTHEADER TYPE SLIS_T_LISTHEADER.

*指定ALV控件触发TOP_OF_PAGE事件时调用的子程序
DATA: G_ALV_FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME
             VALUE 'F_ALV_EVENT_TOP_OF_PAGE'.
DATA: G_ALV_FORMNAME_END_OF_LIST TYPE SLIS_FORMNAME
             VALUE 'F_ALV_EVENT_END_OF_LIST'.

*指定ALV控件的显示特征
DATA : G_ALV_LAYOUT TYPE SLIS_LAYOUT_ALV.
************************************************************************
* DEFINE: 定义宏
************************************************************************
DEFINE HCHANGE.
  LEN = STRLEN( JZPZ-&1 ).
  CIS = 0.  BZS = 0.
  ENDFLG = 'N'.
  WHILE ENDFLG <> 'Y'.
    MOVE JZPZ-&1+CIS(1) TO TEST.
    IF TEST < '~' OR TEST = '?'.
      BZS = BZS + 1.
      CIS = CIS + 1.
    ELSE.
      CIS = CIS + 2.
    ENDIF.
    IF CIS >= LEN.
      ENDFLG = 'Y'.
    ENDIF.
  ENDWHILE.
  YUS =  BZS MOD 2 .
END-OF-DEFINITION.
************************************************************************
*  SELECTION SCREEN : 定义报表筛选条件
************************************************************************
SELECTION-SCREEN SKIP.
*确定过滤参数
SELECTION-SCREEN BEGIN OF BLOCK YGF WITH FRAME. TITLE BLK_001.
    PARAMETERS: P_GJAHR LIKE BKPF-GJAHR OBLIGATORY DEFAULT SY-DATUM."会计年度
    PARAMETERS: P_BUKRS LIKE BKPF-BUKRS OBLIGATORY MEMORY ID 051.   "公司代码
SELECTION-SCREEN END OF BLOCK YGF.

SELECTION-SCREEN BEGIN OF BLOCK YANG WITH FRAME. TITLE BLK_002.
    SELECT-OPTIONS P_BLART FOR BKPF-BLART.               "凭证类型
    SELECT-OPTIONS P_BELNR FOR BKPF-BELNR MEMORY ID 052. "财务凭证编号MATCHCODE OBJECT
    SELECT-OPTIONS P_BUDAT FOR BKPF-BUDAT.               "凭证记帐日期
    SELECT-OPTIONS P_PPNAM FOR BKPF-PPNAM.               "预制人
    SELECT-OPTIONS P_USNAM FOR BKPF-USNAM.               "过账审核人


SELECTION-SCREEN END OF BLOCK YANG.

*特殊汇总类型参数
SELECTION-SCREEN BEGIN OF BLOCK BLK_005 WITH FRAME. TITLE BLK_005 .
    PARAMETERS: P_TYPE1 AS CHECKBOX.            "汇总凭证上的GR/IR行项目
    PARAMETERS: P_TYPE2 AS CHECKBOX.            "汇总调整标准成本时的凭证
SELECTION-SCREEN END OF BLOCK BLK_005.

*选择凭证类型
SELECTION-SCREEN BEGIN OF BLOCK BLK_002 WITH FRAME. TITLE BLK_003 .
    PARAMETERS: P_PRINT1 RADIOBUTTON GROUP R1 DEFAULT 'X',
                P_PRINT2 RADIOBUTTON GROUP R1,
                P_PRINT3 RADIOBUTTON GROUP R1.
SELECTION-SCREEN END OF BLOCK BLK_002.

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


*===============================事    件===============================*
************************************************************************
* INITIALIZATION.启动程序开始执行
************************************************************************
INITIALIZATION.
  BLK_001 = '必选参数'.
  BLK_002 = '可选参数'.
  BLK_003 = '打印类型'.
  BLK_004 = '报表类型'.
  BLK_005 = '特殊参数处理'.

  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_ALV = 'X'.
    PERFORM. F_PRINT_ALV.
  ENDIF.
************************************************************************
* END OF SELECTION
************************************************************************
END-OF-SELECTION.

************************************************************************
* TOP OF PAGE
************************************************************************
TOP-OF-PAGE.
*  PERFORM. F_HEADER.
*  PERFORM. F_LIST.
************************************************************************
* END OF PAGE
************************************************************************
END-OF-PAGE.


*===============================子 例 程===============================*
*&---------------------------------------------------------------------*
*过滤条件有效性检查
*&---------------------------------------------------------------------*
FORM. F_CHECK_INPUT.
  "判断是否存在该凭证记录
  SELECT SINGLE *
    FROM BKPF
    WHERE BUKRS = P_BUKRS AND GJAHR = P_GJAHR
      AND BELNR IN P_BELNR   "会计凭证号码
      AND BUDAT IN P_BUDAT   "凭证中的记帐日期
      AND BLART IN P_BLART   "凭证类型
      AND PPNAM IN P_PPNAM   "预制人
      AND USNAM IN P_USNAM.  "过账审核人

  IF SY-SUBRC <> 0.
    MESSAGE E001.
  ENDIF.
ENDFORM.                    " F_CHECK_INPUT
*&---------------------------------------------------------------------*
*从数据库中读取数据,填充报表输出时所用的内表
*&---------------------------------------------------------------------*
FORM. F_READ_DATA .
  REFRESH PZBH.

*取数到--会计凭证标题内表--
  SELECT BELNR BUKRS GJAHR MONAT BUDAT USNAM BLART WAERS KURSF XBLNR STBLG STJAH
    FROM  BKPF                              "--一般会计凭证标题--
    INTO  CORRESPONDING FIELDS OF TABLE PZBH
    WHERE BUKRS = P_BUKRS AND GJAHR = P_GJAHR
          AND BELNR IN P_BELNR
          AND BUDAT IN P_BUDAT
          AND BLART IN P_BLART
          AND PPNAM IN P_PPNAM  "预制人
          AND USNAM IN P_USNAM  "过账审核人
    ORDER BY BELNR.

*取数到--1.记账凭证明细内表、2.其它--
*开始循环取数
  DESCRIBE TABLE PZBH LINES PZS.
  IF PZS = 0.                              "查询到的凭证数
    MESSAGE I001.
  ELSE.
    LOOP AT PZBH.
      IF PZBH-BELNR <> '' .
        HJ_JFJE = 0.
        HJ_DFJE = 0.
        PERFORM. F_PZOUT.               "取数(一般记账凭证)
        PERFORM. F_FENHANG.             "换行处理
        IF P_REPORT = 'X'.
          PERFORM. F_PRINT_REPORT.      "最终打印显示
        ELSEIF P_ALV = 'X'.
          PERFORM. F_DO_ALV.
        ENDIF.
      ENDIF.

    ENDLOOP.
  ENDIF.

ENDFORM.                    " F_READ_DATA
*&---------------------------------------------------------------------
*&      一般记账凭证取数
*&---------------------------------------------------------------------
FORM. F_PZOUT.
  DATA: L_KOSAR_NAME(4),
        L_FYLB(8).

  DATA : L_TXT1 LIKE SKAT-TXT50,     "
         L_KOSTL LIKE CSKS-KOSTL,    "
         L_KTEXT LIKE CSKT-KTEXT,    "
         L_AUFNR LIKE BSEG-AUFNR,    "内部订单号
         L_KUNNR LIKE BSEG-KUNNR,
         L_LIFNR LIKE BSEG-LIFNR,
         L_SORTL LIKE LFA1-SORTL,
         L_TEMP(100).

  REFRESH JZPZ.
  CLEAR JZPZ.

***取凭证数
  SELECT   BUKRS   "单位名称,代码
           BELNR   "凭证编号
           GJAHR
           HKONT   "总分类帐帐目
           ANLN1   "帐户代码、主资产号
           KUNNR   "帐户代码、购货方编号
           LIFNR   "供应商编号或债权人帐户号
           SGTXT   "摘要
           KOSTL   "成本中心
           PRCTR
           AUFNR   "订单号
           SHKZG   "借/贷标志
           WRBTR   "金额
           DMBTR   "按本位币计的金额
           XNEGP
           KOART   "帐户类型
  FROM BSEG
  INTO CORRESPONDING FIELDS OF JZPZ
  WHERE BUKRS = P_BUKRS AND BELNR = PZBH-BELNR
   AND  GJAHR = P_GJAHR.
    APPEND JZPZ.
    CLEAR JZPZ.
  ENDSELECT.

  SORT JZPZ DESCENDING BY BELNR SHKZG.

  "取会计期间
  LOOP AT JZPZ.
    JZPZ-MONAT = PZBH-MONAT.
    MODIFY JZPZ.
  ENDLOOP.
  "取冲销凭证号及年度
  LOOP AT JZPZ.
    JZPZ-STBLG = PZBH-STBLG.
    JZPZ-STJAH = PZBH-STJAH.
    MODIFY JZPZ.
  ENDLOOP.

*凭证相同项目GI/IR汇总处理
  IF P_TYPE1 = 'X'.
    PERFORM. F_GET_TYPE1.
  ENDIF.
*汇总调整标准成本时的凭证
  IF P_TYPE2 = 'X'.
    PERFORM. F_GET_TYPE2.
  ENDIF.

*取货币名称及汇率
  LOOP AT JZPZ.
    SELECT WAERS     "货币代码
           KURSF     "汇率
      FROM BKPF
      INTO CORRESPONDING FIELDS OF JZPZ
      WHERE BELNR = JZPZ-BELNR AND
            BUKRS = P_BUKRS AND
            GJAHR = P_GJAHR.
      MODIFY JZPZ.
    ENDSELECT.
  ENDLOOP.

*取附单据数XBLNR
  LOOP AT JZPZ.
    LOOP AT PZBH.
     IF PZBH-BELNR = JZPZ-BELNR.
       JZPZ-XBLNR = PZBH-XBLNR.
     ENDIF.
    ENDLOOP.
    MODIFY JZPZ INDEX SY-TABIX.
  ENDLOOP.

*取成本中心名称KTEXT
  LOOP AT JZPZ.
    SELECT KTEXT
      FROM CSKT
      INTO CORRESPONDING FIELDS OF JZPZ
      WHERE SPRAS = '1' AND KOKRS = '1000'
        AND KOSTL = JZPZ-KOSTL.
      MODIFY JZPZ.
    ENDSELECT.
  ENDLOOP.
*取成本中心类型KOSAR_NAME;L_KOSAR_NAME
*取费用类别
  LOOP AT JZPZ.
    IF JZPZ-HKONT+2(4) = '4200'.
      L_KOSAR_NAME = ''.
      L_FYLB = ''.
      SELECT KOSAR
        FROM CSKS
        INTO L_KOSAR_NAME
        WHERE KOKRS = '1000'
          AND KOSTL = JZPZ-KOSTL.
      ENDSELECT.
      IF L_KOSAR_NAME = 'F'.
        L_KOSAR_NAME = '制'.
        L_FYLB = '制造费用'.
      ELSEIF L_KOSAR_NAME = 'L'.
        L_KOSAR_NAME = '管'.
        L_FYLB = '管理费用'.
      ELSEIF L_KOSAR_NAME = 'V'.
        L_KOSAR_NAME = '销'.
        L_FYLB = '销售费用'.
      ENDIF.
      MOVE L_KOSAR_NAME TO JZPZ-KOSAR_NAME.
      MOVE L_FYLB TO JZPZ-FYLB.
      MODIFY JZPZ.
    ENDIF.
  ENDLOOP.

*取客户的简称(检索词)
  LOOP AT JZPZ.
    SELECT SORTL
      FROM KNA1
      INTO CORRESPONDING FIELDS OF JZPZ
      WHERE KUNNR = JZPZ-KUNNR.
      MODIFY JZPZ.
    ENDSELECT.
  ENDLOOP.
*取供应商的简称(检索词)
  LOOP AT JZPZ.
    SELECT SORTL
      FROM LFA1
      INTO CORRESPONDING FIELDS OF JZPZ
      WHERE LIFNR = JZPZ-LIFNR.
      MODIFY JZPZ.
    ENDSELECT.
  ENDLOOP.

*取会计科目
  LOOP AT JZPZ.
    SELECT TXT20                  "总帐科目名称
           TXT50                  "总帐科目详细注释
    FROM SKAT CLIENT SPECIFIED    "总帐科目主记录(科目表:说明)
    INTO CORRESPONDING FIELDS OF JZPZ
    WHERE MANDT = SY-MANDT AND SAKNR = JZPZ-HKONT AND
          KTOPL = '1000' AND SPRAS = '1'.  "会计科目表、语言
      MODIFY JZPZ.
    ENDSELECT.
  ENDLOOP.

*合并会计科目名称
  LOOP AT JZPZ.
    "1:会计科目 = 会计科目代码(HKONT)+成本中心类别(KOSAR_NAME)+成本中心号(KOSTL)
    "            +费用类别(FYLB)+会计科目描述(TXT50)+成本中心名称(KTEXT)
    "2:会议科目 = 会计科目代码(HKONT)+客户号(KUNNR OR LIFNR)
    "            +会计科目描述(TXT50)+客户名称(SORTL)
    L_TXT1 = JZPZ-TXT50.
    CONDENSE L_TXT1.                   "去掉左右空格
    CONCATENATE L_TXT1 '' INTO L_TXT1.
    L_KOSAR_NAME = JZPZ-KOSAR_NAME.
    CONDENSE L_KOSAR_NAME.
    CONCATENATE L_KOSAR_NAME '' INTO L_KOSAR_NAME.
    L_KOSTL = JZPZ-KOSTL.
    CONDENSE L_KOSTL.
    CONCATENATE L_KOSTL '' INTO L_KOSTL.
    L_FYLB = JZPZ-FYLB.
    CONDENSE L_FYLB.
    CONCATENATE L_FYLB '' INTO L_FYLB.
    L_KTEXT = JZPZ-KTEXT.
    CONDENSE L_KTEXT.
    CONCATENATE L_KTEXT '' INTO L_KTEXT.
    L_AUFNR = JZPZ-AUFNR.
    CONDENSE L_AUFNR.
    IF L_AUFNR = ''.
      CONCATENATE L_AUFNR '' INTO L_AUFNR.
    ELSE.
      CONCATENATE '-' L_AUFNR '' INTO L_AUFNR.
    ENDIF.
    L_KUNNR = JZPZ-KUNNR.
    CONDENSE L_KUNNR.
    CONCATENATE L_KUNNR '' INTO L_KUNNR.
    L_LIFNR = JZPZ-LIFNR.
    CONDENSE L_LIFNR.
    CONCATENATE L_LIFNR '' INTO L_LIFNR.
    L_SORTL = JZPZ-SORTL.
    CONDENSE L_SORTL.
    CONCATENATE L_SORTL '' INTO L_SORTL.

    IF JZPZ-KOART = 'D'.
      CONCATENATE JZPZ-HKONT L_KUNNR L_TXT1 '-' L_SORTL INTO L_TEMP.
    ELSEIF JZPZ-KOART = 'K'.
      CONCATENATE JZPZ-HKONT L_LIFNR L_TXT1 '-' L_SORTL INTO L_TEMP.
    ELSE.
      IF JZPZ-HKONT+2(4) = '4200'.
        CONCATENATE JZPZ-HKONT L_KOSAR_NAME L_KOSTL L_FYLB
                    '-' L_TXT1 '-' L_KTEXT L_AUFNR INTO L_TEMP.
      ELSE.
        CONCATENATE JZPZ-HKONT L_TXT1 L_AUFNR INTO L_TEMP.
      ENDIF.
    ENDIF.
    MOVE L_TEMP TO JZPZ-SAKNR_NAME.
    MODIFY JZPZ.
  ENDLOOP.

*取过帐人
  LOOP AT JZPZ.
    SELECT     BLART   "凭证类型
               BUDAT   "记账日期
               USNAM   "过帐审核人
               PPNAM   "预制人
               USNAM   "过账人、用户名
               XBLNR   "付单椐,参照
    FROM BKPF CLIENT SPECIFIED
    INTO CORRESPONDING FIELDS OF JZPZ
    WHERE MANDT = SY-MANDT AND GJAHR = P_GJAHR
          AND BUKRS = JZPZ-BUKRS AND BELNR = JZPZ-BELNR.
      MODIFY JZPZ.
    ENDSELECT.
  ENDLOOP.
ENDFORM.                    " F_PZOUT
*&---------------------------------------------------------------------
*&     为分行而进行的操作
*&---------------------------------------------------------------------
FORM. F_FENHANG.
  DATA: TEST(1).
  DATA: LEN TYPE I VALUE 0,
        CIS TYPE I VALUE 0,
        BZS TYPE I VALUE 0,
        YUS TYPE I VALUE 0,
        WEI TYPE I VALUE 0,
        ZHI TYPE I VALUE 0,
        ENDFLG(1) VALUE 'N',
        V_KTEXT LIKE AUFK-KTEXT,
        AULEN TYPE I VALUE 0.

  LOOP AT JZPZ.
    "摘要处理
    CLEAR JZPZ-SGTXTA.
    CLEAR JZPZ-SGTXTB.
    CLEAR JZPZ-SGTXTC.
    MOVE  JZPZ-SGTXT+0(20)  TO JZPZ-SGTXTA.
    HCHANGE SGTXTA.       "宏运用
    IF YUS <> 0.
      MOVE  JZPZ-SGTXT+0(19) TO JZPZ-SGTXTA.
      WEI = 19.
    ELSE.
      MOVE  JZPZ-SGTXT+0(20) TO JZPZ-SGTXTA.
      WEI = 20.
    ENDIF.
    ZHI = 50 - WEI.
    MOVE  JZPZ-SGTXT+WEI(ZHI) TO JZPZ-SGTXTB.

    "会计科目处理
*    IF P_PRINT2 = 'X'.
    IF JZPZ-WAERS = 'RMB'.
      CLEAR JZPZ-TXT50A.
      CLEAR JZPZ-TXT50B.
      CLEAR JZPZ-TXT50C.
      MOVE  JZPZ-SAKNR_NAME+0(64) TO JZPZ-TXT50A.
      HCHANGE TXT50A.       "宏运用

      IF YUS <> 0.
        MOVE  JZPZ-SAKNR_NAME+0(63)  TO JZPZ-TXT50A.
        WEI = 63.
      ELSE.
        MOVE  JZPZ-SAKNR_NAME+0(64)  TO JZPZ-TXT50A.
        WEI = 64.
      ENDIF.
      ZHI = 100 - WEI.
      MOVE  JZPZ-SAKNR_NAME+WEI(ZHI) TO JZPZ-TXT50B.
      MODIFY JZPZ.
*    ELSEIF P_PRINT3 = 'X'.
    ELSEIF JZPZ-WAERS <> 'RMB'.
      CLEAR JZPZ-TXT50A.
      CLEAR JZPZ-TXT50B.
      CLEAR JZPZ-TXT50C.
      MOVE  JZPZ-SAKNR_NAME+0(34) TO JZPZ-TXT50A.
      HCHANGE TXT50A.       "宏运用

      IF YUS <> 0.
        MOVE  JZPZ-SAKNR_NAME+0(35)  TO JZPZ-TXT50A.
        WEI = 35.
      ELSE.
        MOVE  JZPZ-SAKNR_NAME+0(34)  TO JZPZ-TXT50A.
        WEI = 34.
      ENDIF.
      ZHI = 80 - WEI.
      MOVE  JZPZ-SAKNR_NAME+WEI(ZHI) TO JZPZ-TXT50B.
      MODIFY JZPZ.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " F_FENHANG
*&---------------------------------------------------------------------
*&最终打印显示,处理当前页码
*&---------------------------------------------------------------------
FORM. F_PRINT_REPORT.
  DESCRIBE TABLE JZPZ LINES ZHS.
  YS = ZHS MOD 8 ."5.
  IF YS <> 0.
    XBLANK = 8 - YS."5 - YS.
  ENDIF.
  IF YS = 0 .   "不用打空行的情况
    PAGENUM = ZHS DIV 8 ."5 .
    CLEAR XHCS.
    XHCS = 1.
    DO PAGENUM  TIMES.
      LIMTA = 8 * XHCS - 7."5 * XHCS - 4.
      LIMTB = 8 * XHCS."5 * XHCS.
      J = I MOD 2.

      IF DS = 'D' .
        IF J <> 0 .
          NEW-PAGE.
        ENDIF.
        MOVE 'D' TO DS.
      ELSE.
        SKIP 7.
        PERFORM. F_HEADER.
        PERFORM. F_LIST.
        MOVE 'D' TO DS.
      ENDIF.

      IF J <> 0 .
        NEW-PAGE.
      ENDIF.
      IF J = 0 .
        SKIP 18.
*        SKIP 24.
      ENDIF.
      PERFORM. F_HEADER.
      PERFORM. F_LIST.
      PERFORM. F_BODY USING LIMTA LIMTB .
      IF XHCS = PAGENUM.
        PERFORM. F_BOTTOM USING 'Y'.
      ELSE.
        PERFORM. F_BOTTOM USING 'N'.
      ENDIF.
      I = I + 1.
      XHCS = XHCS + 1.
    ENDDO.
  ELSE.
    PAGENUM = ZHS DIV 8 + 1."5 + 1.

    CLEAR XHCS.
    XHCS = 1.
    DO PAGENUM  TIMES.
      J = I MOD 2.
      IF XHCS = PAGENUM.        "说明是最后一页
        LIMTA = 8 * XHCS - 7."5 * XHCS - 4.
        LIMTB = 8 * ( XHCS - 1 ) + YS ."5 * ( XHCS - 1 ) + YS .

        IF DS = 'D' .
          IF J <> 0 .
            NEW-PAGE.
          ENDIF.
          MOVE 'D' TO DS.
        ELSE.
          SKIP 7.

          PERFORM. F_HEADER.
          PERFORM. F_LIST.
          MOVE 'D' TO DS.
        ENDIF.

        IF J <> 0 .
          NEW-PAGE.
        ENDIF.
        IF J = 0 .
          SKIP 18.
*          SKIP 24.
        ENDIF.
        PERFORM. F_HEADER.
        PERFORM. F_LIST.
        PERFORM. F_BODY USING LIMTA LIMTB .
        PERFORM. F_BLANK USING XBLANK.
        PERFORM. F_BOTTOM USING 'Y'.
      ELSE.
        LIMTA = 8 * XHCS - 7."5 * XHCS - 4.
        LIMTB = 8 * XHCS ."5 * XHCS .

        IF DS = 'D' .
          IF J <> 0 .
            NEW-PAGE.
          ENDIF.
          IF J = 0 .
            SKIP 18.
*            SKIP 24.
          ENDIF.

          PERFORM. F_HEADER.
          PERFORM. F_LIST.
          MOVE 'D' TO DS.
        ELSE.
          SKIP 7.

          PERFORM. F_HEADER.
          PERFORM. F_LIST.
          MOVE 'D' TO DS.
        ENDIF.

        PERFORM. F_BODY USING LIMTA LIMTB .
        PERFORM. F_BOTTOM USING 'N'.
      ENDIF.
      I = I + 1.
      XHCS = XHCS + 1.
    ENDDO.
  ENDIF.

ENDFORM.                    " F_PRINT_REPORT
*&---------------------------------------------------------------------
*&      Form  F_BLANK
*&---------------------------------------------------------------------
FORM. F_BLANK USING NBLANK.
  DO NBLANK TIMES.
*    IF P_PRINT3 = 'X'.
    IF JZPZ-WAERS <> 'RMB'.
      WRITE: AT /A1  SY-VLINE,
             AT  A2  SY-VLINE,
             AT  A3  SY-VLINE,
             AT  A4  SY-VLINE,
             AT  A5  SY-VLINE,
             AT  A7  SY-VLINE,
             AT  A8  SY-VLINE,
             AT  A9  SY-VLINE.
      WRITE: AT /A1  SY-VLINE,
             AT  A2  SY-VLINE,
             AT  A3  SY-VLINE,
             AT  A4  SY-VLINE,
             AT  A5  SY-VLINE,
             AT  A7  SY-VLINE,
             AT  A8  SY-VLINE,
             AT  A9  SY-VLINE.
    ELSE.
      WRITE: AT /A1  SY-VLINE,
             AT  A2  SY-VLINE,
             AT  A7  SY-VLINE,
             AT  A8  SY-VLINE,
             AT  A9  SY-VLINE.
      WRITE: AT /A1  SY-VLINE,
             AT  A2  SY-VLINE,
             AT  A7  SY-VLINE,
             AT  A8  SY-VLINE,
             AT  A9  SY-VLINE.
    ENDIF.

    WRITE: AT /A1   SY-VLINE.
    WRITE: AT  A9   SY-VLINE.
    ULINE  AT  A1(120).
  ENDDO.
ENDFORM.                    " F_BLANK
*&---------------------------------------------------------------------
*&为显示ALV清单而增加内表内容
*&---------------------------------------------------------------------
FORM. F_DO_ALV.

  LOOP AT JZPZ.
    IT_PRINT_001-BUKRS = JZPZ-BUKRS.
    IT_PRINT_001-GJAHR = JZPZ-GJAHR.
    IT_PRINT_001-MONAT = JZPZ-MONAT.
    IT_PRINT_001-BUDAT = JZPZ-BUDAT.
    IT_PRINT_001-BLART = JZPZ-BLART.
    IT_PRINT_001-BELNR = JZPZ-BELNR.
    IT_PRINT_001-SGTXT = JZPZ-SGTXT.
    IT_PRINT_001-HKONT = JZPZ-HKONT.
    JZPZ-TXT50A = JZPZ-TXT50A+10(90).
    CONCATENATE JZPZ-TXT50A JZPZ-TXT50B INTO JZPZ-TXT50A.
    IT_PRINT_001-TXT50A = JZPZ-TXT50A.
    IT_PRINT_001-WAERS = JZPZ-WAERS.
    IT_PRINT_001-KURSF = JZPZ-KURSF.
    IT_PRINT_001-WRBTR = JZPZ-WRBTR.
    IF JZPZ-SHKZG = 'S'.
      IT_PRINT_001-WRBTR_J = JZPZ-DMBTR.
      IT_PRINT_001-WRBTR_D = 0.
    ELSEIF JZPZ-SHKZG = 'H'.
      IT_PRINT_001-WRBTR_D = JZPZ-DMBTR.
      IT_PRINT_001-WRBTR_J = 0.
    ENDIF.
    IT_PRINT_001-PPNAM = JZPZ-PPNAM.
    IT_PRINT_001-USNAM = JZPZ-USNAM.

    APPEND IT_PRINT_001.
 ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------
*&      Form  F_HEADER
*&      单据表头显示
*&---------------------------------------------------------------------
FORM. F_HEADER.
  DATA: STR1(4),
        L_COMP(26),
        L_TYPE(20).              "凭证类型

  SELECT T001~BUTXT
    FROM T001
    INTO L_COMP
    WHERE T001~BUKRS = P_BUKRS.
  ENDSELECT.
*  "取公司名称
*  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.
  "取凭证类型
  SELECT LTEXT
    FROM T003T
    INTO L_TYPE
   WHERE BLART = JZPZ-BLART
     AND SPRAS = '1'.
  ENDSELECT.

  MOVE SY-PAGNO TO STR1.
  WRITE: /50 L_COMP.
  SKIP.
  WRITE: /55  '记  帐  凭  证'.
  WRITE: 87  '凭证类型:', JZPZ-BLART, L_TYPE.
  WRITE: / .
ENDFORM.                    " F_HEADER
*&---------------------------------------------------------------------
*&      Form  F_LIST
*&      单据列名显示
*&---------------------------------------------------------------------
FORM. F_LIST.
  DATA: PAGNO(3).
  DATA: STRPAGE(3).

  MOVE JZPZ-BUDAT+0(4) TO NIAN.
  MOVE JZPZ-BUDAT+4(2) TO YUE.
  MOVE JZPZ-BUDAT+6(2) TO RI.

  WRITE: /2 '冲销凭证:', JZPZ-STBLG, '/', JZPZ-STJAH.
  WRITE: 87  '凭证编号:'.
  WRITE: 97  JZPZ-BELNR.

  WRITE: 55  NIAN.
  WRITE: 59  '年'.
  WRITE: 61  YUE.
  WRITE: 63  '月'.
  WRITE: 65   RI.
  WRITE: 67  '日'.

*显示凭证总页数及当前页
  DESCRIBE TABLE JZPZ LINES ZHS.
  YS = ZHS MOD 8."5.
  IF YS = 0 .
    PAGENUM = ZHS DIV 8."5 .
  ELSE.
    PAGENUM = ZHS DIV 8 + 1.
  ENDIF.

  MOVE XHCS TO PAGNO.
  MOVE PAGENUM  TO STRPAGE.
  WRITE: 108 '(', PAGNO, '/' ,STRPAGE , ')'.

  ULINE .
*  IF P_PRINT3 = 'X'.
  IF JZPZ-WAERS <> 'RMB'.
    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 A7   SY-VLINE,
         AT B7 '    借方金额',
         AT A8  SY-VLINE,
         AT B8 '   贷方金额',
         AT A9  SY-VLINE.
  ELSE.
    WRITE: AT /A1 SY-VLINE,
         AT B1  '       摘  要',
         AT A2  SY-VLINE,
         AT B2 '             会计科目',
         AT A7   SY-VLINE,
         AT B7 '    借方金额',
         AT A8  SY-VLINE,
         AT B8 '   贷方金额',
         AT A9  SY-VLINE.
  ENDIF.

  WRITE: AT /A1   SY-VLINE.
  WRITE: AT  A9   SY-VLINE.
  ULINE  AT  A1(120).
ENDFORM.                    " F_LIST
*&---------------------------------------------------------------------
*&      单据表身数据显示
*&---------------------------------------------------------------------
FORM. F_BODY USING VAL1 VAL2.
  DATA : L_TXT1(36),
         L_TXT2(36).

  LOOP AT JZPZ FROM VAL1 TO VAL2.
    WRITE: AT /A1   SY-VLINE.
*第一行打印处理
    L_TXT1 = JZPZ-SGTXTA.
    CONDENSE L_TXT1.                   "去掉左右空格
    CONCATENATE L_TXT1 '' INTO L_TXT1.
    WRITE: AT B1 JZPZ-SGTXTA.
    WRITE: AT  A2   SY-VLINE.

    WRITE: AT B2 JZPZ-TXT50A.  "SAKNR_NAME.

*    IF P_PRINT3 = 'X'.
    IF JZPZ-WAERS <> 'RMB'.
      WRITE: AT  A3   SY-VLINE.
      WRITE: AT  B3   JZPZ-WAERS CENTERED.    "货币代码
      WRITE: AT  A4   SY-VLINE.
      WRITE: AT  B4   JZPZ-WRBTR CENTERED.    "金额
      WRITE: AT  A5   SY-VLINE.
      WRITE: AT  B5   JZPZ-KURSF.             "汇率
    ENDIF.
    WRITE: AT  A7   SY-VLINE.

    IF JZPZ-SHKZG = 'H'.
      WRITE: AT B7  ''.
      WRITE: AT A8  SY-VLINE.
      WRITE: AT B8  JZPZ-DMBTR.
      WRITE: AT A9  SY-VLINE.
      HJ_DFJE = HJ_DFJE + JZPZ-DMBTR.
    ELSEIF JZPZ-SHKZG = 'S'.
      WRITE: AT B7 JZPZ-DMBTR.
      WRITE: AT A8  SY-VLINE.
      WRITE: AT B8 ''.
      WRITE: AT A9  SY-VLINE.
      HJ_JFJE = HJ_JFJE + JZPZ-DMBTR.
    ENDIF.
*第一行打印完毕

*第二行打印处理
    WRITE:  AT /A1 SY-VLINE.
    L_TXT2 = JZPZ-SGTXTB.
    CONDENSE L_TXT2.                   "去掉左右空格
    CONCATENATE L_TXT2 '' INTO L_TXT2.
    WRITE: AT  B1 L_TXT2.
    WRITE:  AT  A2 SY-VLINE.

    L_TXT2 = JZPZ-TXT50B.
    CONDENSE L_TXT2.                   "去掉左右空格
    CONCATENATE L_TXT2 '' INTO L_TXT2.
    WRITE: AT  B2 L_TXT2.

*    IF P_PRINT3 = 'X'.
    IF JZPZ-WAERS <> 'RMB'.
      WRITE: AT  A3 SY-VLINE.
      WRITE: AT  A4 SY-VLINE.
      WRITE: AT  A5 SY-VLINE.
    ENDIF.

    WRITE: AT  A7  SY-VLINE.
    WRITE: AT  A8  SY-VLINE.
    WRITE: AT  A9  SY-VLINE.
*第二行打印完毕

    WRITE: AT /A1   SY-VLINE.
    WRITE: AT  A9   SY-VLINE.
    ULINE  AT  A1(120).
  ENDLOOP.

ENDFORM.                    " F_BODY
*&---------------------------------------------------------------------
*&      Form  F_BOTTOM
*&---------------------------------------------------------------------
FORM. F_BOTTOM USING FLGG.
DATA L_TEMP(50).

  L_TEMP = JZPZ-XBLNR.
  IF L_TEMP <> ''.
    CONCATENATE '  附单据' L_TEMP '张' INTO L_TEMP.
  ELSE.
    L_TEMP = '  附单据 0 张'.
  ENDIF.
  L_TEMP = ''.  "暂时去掉

  IF FLGG = 'Y'.
    WRITE: AT /A1  SY-VLINE,
           AT  B1 L_TEMP,
           AT  B5  '   合计',
           AT  B7 HJ_JFJE,        "合计借方金额
           AT  A7  SY-VLINE,
           AT  B8 HJ_DFJE,        "合计贷方金额
           AT  A8  SY-VLINE,
           AT  A9  SY-VLINE.
  ELSE.
    WRITE: AT /A1  SY-VLINE,
           AT  B1 L_TEMP,
           AT  B5  '   合计',
           AT  A7  SY-VLINE,
           AT  A8  SY-VLINE,
           AT  A9  SY-VLINE.
  ENDIF.

  WRITE: AT /A1   SY-VLINE.
  WRITE: AT  A9   SY-VLINE.
  ULINE  AT  A1(120).

  WRITE: AT /70  '审核记帐人:'.
  WRITE: AT 100 '预制人:'.

*取审核记账人USNAM
  CLEAR NAME_LAST.
  CLEAR NAME_FIRST.
  CLEAR NAME.
  SELECT NAME_LAST NAME_FIRST
       FROM USER_ADDR
    INTO (NAME_LAST, NAME_FIRST)
    WHERE BNAME = JZPZ-USNAM.
  ENDSELECT.
  CONCATENATE NAME_LAST(10) NAME_FIRST(8) INTO NAME.
  WRITE: AT 82 NAME LEFT-JUSTIFIED .
*取预制人PPNAM
  CLEAR NAME_LAST.
  CLEAR NAME_FIRST.
  CLEAR NAME.
  SELECT NAME_LAST NAME_FIRST
       FROM USER_ADDR
    INTO (NAME_LAST, NAME_FIRST)
    WHERE BNAME = JZPZ-PPNAM.
  ENDSELECT.
  CONCATENATE NAME_LAST(10) NAME_FIRST(8) INTO NAME.
  WRITE: AT 108 NAME LEFT-JUSTIFIED .
ENDFORM.                    " F_BOTTOM
*&---------------------------------------------------------------------*
*&GR/IR汇总处理
*&---------------------------------------------------------------------*
FORM. F_GET_TYPE1.
  "GR/IR汇总处理
  PERF

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值