SMARTFORMS打印


*&---------------------------------------------------------------------*
*& TYPES定義
*&---------------------------------------------------------------------*
TYPES:
  BEGIN OF TYP_ITEM,
    SGTXT TYPE ACDOCA-SGTXT, " 项目文本
    RACCT TYPE ACDOCA-RACCT, " 会计年度
    HSL_S TYPE STRING,       " 借方
    HSL_H TYPE STRING,       " 贷方
  END OF TYP_ITEM,
  TYP_T_ITEM TYPE STANDARD TABLE OF TYP_ITEM,
  BEGIN OF TYP_ALV,
    BUKRS TYPE BKPF-BUKRS, " 公司代码
    GJAHR TYPE BKPF-GJAHR, " 会计年度
    MONAT TYPE BKPF-MONAT, " 会计期间
    BUDAT TYPE BKPF-BUDAT, " 过账日期
    BELNR TYPE BKPF-BELNR, " 会计凭证号码
    BLART TYPE BKPF-BLART, " 凭证类型
    XBLNR TYPE BKPF-XBLNR, " 参照
    BKTXT TYPE BKPF-BKTXT, " 凭证抬头文本
    STBLG TYPE BKPF-STBLG, " 冲销凭证号
    PPNAM TYPE BKPF-PPNAM, " 预制
    USNAM TYPE BKPF-USNAM, " 过账人
    ZCK   TYPE CHAR01,     " 复选框
  END OF TYP_ALV,
  TYP_T_ALV TYPE STANDARD TABLE OF TYP_ALV.

*&---------------------------------------------------------------------*
*& DATA定義
*&---------------------------------------------------------------------*
* 选择屏幕用
DATA:
  GV_USNAM TYPE BKPF-USNAM,
  GV_PPNAM TYPE BKPF-PPNAM,
  GV_BLART TYPE BKPF-BLART,
  GV_BELNR TYPE BKPF-BELNR,
  GV_BUDAT TYPE BKPF-BUDAT,
  GV_MONAT TYPE BKPF-MONAT.

* ALV用
DATA:
  GS_LAYOUT   TYPE LVC_S_LAYO,
  GT_FIELDCAT TYPE LVC_T_FCAT,
  GT_ALV      TYPE TYP_T_ALV.

* 打印用
DATA:
  GT_ITEM      TYPE TYP_T_ITEM.

*&---------------------------------------------------------------------*
*  选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLC01 WITH FRAME TITLE TEXT-001.
PARAMETERS:
  P_BUKRS TYPE BKPF-BUKRS OBLIGATORY, " 公司代码
  P_GJAHR TYPE BKPF-GJAHR OBLIGATORY. " 会计年度
SELECT-OPTIONS:
  S_MONAT FOR GV_MONAT OBLIGATORY,   " 会计期间
  S_BUDAT FOR GV_BUDAT,              " 过账日期
  S_BELNR FOR GV_BELNR,              " 会计凭证号
  S_BLART FOR GV_BLART,              " 凭证类型
  S_PPNAM FOR GV_PPNAM,              " 预制人
  S_USNAM FOR GV_USNAM.              " 过账人
SELECTION-SCREEN END OF BLOCK BLC01.

*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM GET_DATA.

  PERFORM OUT_ALV.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM GET_DATA .

  DATA:
    LS_ALV   TYPE TYP_ALV,
    LR_POPER TYPE RANGE OF POPER,
    LS_POPER LIKE LINE OF LR_POPER.

* 获取会计核算凭证标题
  SELECT BUKRS, " 公司代码
         GJAHR, " 会计年度
         MONAT, " 会计期间
         BUDAT, " 过账日期
         BELNR, " 会计凭证号码
         BLART, " 凭证类型
         PPNAM, " 预制
         USNAM, " 用户名
         STBLG, " 冲销凭证号
         XBLNR, " 参考
         BKTXT  " 抬头文本
    INTO TABLE @DATA(LT_BKPF)
    FROM BKPF
    WHERE BUKRS = @P_BUKRS
      AND GJAHR = @P_GJAHR
      AND MONAT IN @S_MONAT
      AND BUDAT IN @S_BUDAT
      AND BELNR IN @S_BELNR
      AND BLART IN @S_BLART
      AND PPNAM IN @S_PPNAM
      AND USNAM IN @S_USNAM.

* 取得失败的场合
  IF SY-SUBRC = 0 AND
    LT_BKPF IS NOT INITIAL.

  ELSE.

    MESSAGE '指定关键字的表目没有找到' TYPE 'S'.

    LEAVE LIST-PROCESSING.

  ENDIF.

* ALV数据编辑
  LOOP AT LT_BKPF INTO DATA(LS_BKPF).

    MOVE-CORRESPONDING LS_BKPF TO LS_ALV.

    APPEND LS_ALV TO GT_ALV.
    CLEAR LS_ALV.

  ENDLOOP.



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

* 编辑FIELDCAT
  PERFORM FRM_SET_FIELDCAT:
    USING '1' '1' 'ZCK' '复选框',        "复选框
    USING '1' '2' 'BUKRS' '公司代码',    "公司代码
    USING '1' '3' 'GJAHR' '会计年度',    "会计年度
    USING '1' '4' 'MONAT' '会计期间',    "会计期间
    USING '1' '5' 'BUDAT' '过账日期',    "过账日期
    USING '1' '6' 'BELNR' '会计凭证号码',"会计凭证号码
    USING '1' '7' 'BLART' '凭证类型',    "凭证类型
    USING '1' '8' 'XBLNR' '参考',        "参考
    USING '1' '9' 'BKTXT' '凭证抬头文本',"凭证抬头文本
    USING '1' '10' 'STBLG' '冲销凭证号', "冲销凭证号
    USING '1' '11' 'PPNAM' '预制',       "预制
    USING '1' '12' 'USNAM' '过账人'.     "过账人

* 编辑LAYOUT
  PERFORM FRM_SET_LAYOUT.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING " 传入
      I_CALLBACK_PROGRAM       = SY-CPROG    " 当前程序
      IS_LAYOUT_LVC            = GS_LAYOUT   " alv样式
      IT_FIELDCAT_LVC          = GT_FIELDCAT "alv字段设置
      I_CALLBACK_PF_STATUS_SET = 'FRM_STATUS_SET' "设置gui状态
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND' "响应功能
*    IMPORTING "传出
    TABLES " 传入/传出
      T_OUTTAB                 = GT_ALV " ALV数据
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_STATUS_SET
*&---------------------------------------------------------------------*
*& 设定GUI状态
*&---------------------------------------------------------------------*
*&      --> P_
*&---------------------------------------------------------------------*
FORM FRM_STATUS_SET USING EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'ZSTATUS01'." 设置gui状态
*  SET PF-STATUS 'ZSTATUS01' EXCLUDING EXTAB." 设置gui状态
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& 功能处理
*&---------------------------------------------------------------------*
*&      --> P_
*&---------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING LV_UCOMM LIKE SY-UCOMM  " 获取功能码
                            SELFIELD TYPE SLIS_SELFIELD. " 光标位置信息
* 定义 ALV使用的结构和内表
  DATA:
    LS_LAYOUT   TYPE LVC_S_LAYO,
    LS_FIELDCAT TYPE LVC_S_FCAT,
    LT_FIELDCAT TYPE LVC_T_FCAT.

* 将更新后的数据传到alv所对应的内表
  DATA:LR_GRID TYPE REF TO CL_GUI_ALV_GRID.

* 获取ALV获取全局数据
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.

* 检查被更改的数据
  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.

* 刷新ALV
  SELFIELD-REFRESH = 'X'.

  CASE LV_UCOMM.
    WHEN 'ZPRT'.
* 打印
      PERFORM FRM_PRINT.
    WHEN 'ZBACK'.
      LEAVE TO SCREEN 0." 返回选择屏幕
    WHEN 'ZCANEL' OR 'ZEXIT'.
      LEAVE PROGRAM. " 退出程序
    WHEN OTHERS.

  ENDCASE.

* 获取FIELDCAT
  LR_GRID->GET_FRONTEND_FIELDCATALOG( IMPORTING ET_FIELDCATALOG = LT_FIELDCAT ).
* 设置FIELDCAT
  LR_GRID->SET_FRONTEND_FIELDCATALOG( IT_FIELDCATALOG = LT_FIELDCAT ).

* 获取LAYOUT
  LR_GRID->GET_FRONTEND_LAYOUT( IMPORTING ES_LAYOUT = LS_LAYOUT ).
* 编辑layout
* 设置LAYOUT
  LR_GRID->SET_FRONTEND_LAYOUT( IS_LAYOUT = LS_LAYOUT ).

* 基于行列稳定刷新
  DATA:LS_STBL TYPE LVC_S_STBL.
  LS_STBL-ROW = 'X'.
  LS_STBL-COL = 'X'.
  LR_GRID->REFRESH_TABLE_DISPLAY( IS_STABLE = LS_STBL )."刷新ALV展示的表
*  LR_GRID->REFRESH_TABLE_DISPLAY( IS_STABLE = VALUE LVC_S_STBL( ROW = 'X'
*                                                                COL = 'X' ) )."刷新ALV展示的表

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&      --> P_
*&      --> P_
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT
  USING P_ROW TYPE LVC_ROWPOS
        P_COL TYPE LVC_COLPOS
        P_FIELDNAME TYPE LVC_FNAME
        P_TEXT TYPE CHAR40.

  DATA:
  LS_FIELDCAT TYPE LVC_S_FCAT.

  LS_FIELDCAT-ROW_POS = P_ROW.
  LS_FIELDCAT-COL_POS = P_COL.
  LS_FIELDCAT-FIELDNAME = P_FIELDNAME.
  LS_FIELDCAT-COLTEXT   = P_TEXT."描述
  LS_FIELDCAT-SCRTEXT_L = P_TEXT.
  LS_FIELDCAT-SCRTEXT_M = P_TEXT.
  LS_FIELDCAT-SCRTEXT_S = P_TEXT.

* 复选框
  IF P_FIELDNAME = 'ZCK'.
    LS_FIELDCAT-CHECKBOX = ABAP_TRUE."复选框
    LS_FIELDCAT-EDIT      = ABAP_TRUE."可编辑
  ENDIF.

  APPEND LS_FIELDCAT TO GT_FIELDCAT.
  CLEAR LS_FIELDCAT.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
* 编辑layout
  GS_LAYOUT-ZEBRA      = 'X'. " 斑马线
  GS_LAYOUT-NO_ROWMARK = 'X'. " 禁用行选择
  GS_LAYOUT-CWIDTH_OPT = 'X'. " 优化列宽度
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PRINT
*&---------------------------------------------------------------------*
*& 打印
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_PRINT.

  DATA:
    LV_BUDAT TYPE CHAR15," 年月日
    LV_BUTXT TYPE T001-BUTXT," 公司代码或公司的名称
    LS_RETURN  TYPE SSFCRESCL,  " 表格打印结束时返回值
    LS_ITEM    TYPE TYP_ITEM,
    LV_FNAM    TYPE RS38L_FNAM, " 功能模块的名称
    LS_JOBOUT  TYPE SSFCRESOP,  " 表格打印开始时返回值
    LS_OUTPUT  TYPE SSFCOMPOP,  " 打印参数选项
    LS_CONTROL TYPE SSFCTRLOP.  " 打印控制

* 获取单位名称
  SELECT SINGLE BUTXT
    INTO LV_BUTXT
    FROM T001
    WHERE BUKRS = P_BUKRS.
*--------------------ssf open-----------------*
* smartforms 打印参数设置
  LS_OUTPUT-TDDEST   = 'LP01'." 输出设备
  LS_OUTPUT-TDIEXIT  = 'X'.   " 立刻退出迟于打印预览中的打印/传真
  LS_OUTPUT-TDIMMED  = 'X'.   " 立即假脱机打印
  LS_OUTPUT-TDDELETE = 'X'.   " 立即假脱机删除
  LS_OUTPUT-TDNOPREV = ''.    " 无打印预览

  LS_CONTROL-PREVIEW   = 'X'. " 打印预览
  LS_CONTROL-NO_DIALOG = ' '. "
  LS_CONTROL-NO_OPEN   = 'X'. "
  LS_CONTROL-NO_CLOSE  = 'X'. "

* 打开打印机
  CALL FUNCTION 'SSF_OPEN'
    EXPORTING
      USER_SETTINGS      = ''
      OUTPUT_OPTIONS     = LS_OUTPUT
      CONTROL_PARAMETERS = LS_CONTROL
    IMPORTING
      JOB_OUTPUT_OPTIONS = LS_JOBOUT
    EXCEPTIONS
      FORMATTING_ERROR   = 1
      INTERNAL_ERROR     = 2
      SEND_ERROR         = 3
      USER_CANCELED      = 4
      OTHERS             = 5.

  IF SY-SUBRC <> 0.
    EXIT.
  ENDIF.

* 获取功能块的名称
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME            = '   '  " 表单名
    IMPORTING
      FM_NAME             = LV_FNAM
    EXCEPTIONS
      NO_FORM             = 1
      NO_FOUNCTION_MODULE = 2
      OTHERS              = 3.

  IF  SY-SUBRC <>  0 .
    MESSAGE
         ID SY-MSGID                             "システムid
       TYPE SY-MSGTY                             "
     NUMBER SY-MSGNO                             "
       WITH SY-MSGV1                             "
            SY-MSGV2                             "
            SY-MSGV3                             "
            SY-MSGV4.                            "
  ENDIF.

*数据处理
  LOOP AT GT_ALV INTO DATA(LS_ALV)
    WHERE ZCK = ABAP_TRUE.
    CLEAR:GT_ITEM.

*
    SELECT A~SGTXT,"摘要
           A~RACCT,"科目
           A~BSCHL,"过账码
           A~HSL,  "金额
           B~SHKZG "借贷标识
      INTO TABLE @DATA(LT_ACDOCA)
      FROM ACDOCA AS A
      INNER JOIN TBSL AS B ON A~BSCHL = B~BSCHL
      WHERE RLDNR  = '0L' " 分类账
        AND BELNR  = @LS_ALV-BELNR
        AND RBUKRS = @LS_ALV-BUKRS
        AND GJAHR  = @LS_ALV-GJAHR
        AND POPER  = @LS_ALV-MONAT.

    LOOP AT LT_ACDOCA INTO DATA(LS_ACDOCA).

      LS_ITEM-SGTXT = LS_ACDOCA-SGTXT.
      LS_ITEM-RACCT = LS_ACDOCA-RACCT.
      IF LS_ACDOCA-SHKZG = 'S' ." 借方
        LS_ITEM-HSL_S = LS_ACDOCA-HSL.
      ENDIF.
      IF LS_ACDOCA-SHKZG = 'H' ." 贷方
        LS_ITEM-HSL_H = LS_ACDOCA-HSL * -1.
      ENDIF.

      COLLECT LS_ITEM INTO GT_ITEM.
      CLEAR LS_ITEM.

    ENDLOOP.
    DO 10 TIMES.
      APPEND LS_ITEM TO GT_ITEM.
    ENDDO.

* 拼接年月日
  CONCATENATE LS_ALV-BUDAT+0(4) '年'
              LS_ALV-BUDAT+4(2) '月'
              LS_ALV-BUDAT+6(2) '日'
         INTO LV_BUDAT.

* 启动smartforms
    CALL FUNCTION LV_FNAM
      EXPORTING
        CONTROL_PARAMETERS = LS_CONTROL
        OUTPUT_OPTIONS     = LS_OUTPUT
        USER_SETTINGS      = ''
        IV_BUTXT           = LV_BUTXT
        IV_BUDAT           = LV_BUDAT
        IV_BELNR           = LS_ALV-BELNR
      EXCEPTIONS
        FORMATTING_ERROR   = 1
        INTERNAL_ERROR     = 2
        SEND_ERROR         = 3
        USER_CANCELED      = 4
        OTHERS             = 5.

    IF  SY-SUBRC <> 0.
*     error handling
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 .
    ENDIF .

  ENDLOOP.
*-----------------ssf close-------------------*
  CALL FUNCTION 'SSF_CLOSE'
    IMPORTING
      JOB_OUTPUT_INFO  = LS_RETURN
    EXCEPTIONS
      FORMATTING_ERROR = 1
      INTERNAL_ERROR   = 2
      SEND_ERROR       = 3
      OTHERS           = 4.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PRINT
*&---------------------------------------------------------------------*
*& 打印
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_ZERO
  CHANGING OT_ITEM TYPE TYP_T_ITEM.

  LOOP AT OT_ITEM ASSIGNING FIELD-SYMBOL(<LFS_ITEM>).

    IF <LFS_ITEM>-HSL_H IS INITIAL.

      <LFS_ITEM>-HSL_H = '0.00'.

    ENDIF.
    IF <LFS_ITEM>-HSL_S IS INITIAL.

      <LFS_ITEM>-HSL_S = '0.00'.

    ENDIF.
  ENDLOOP.


ENDFORM.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值