SAP-SD-废品销售发货报表+smartforms打印

本文介绍了如何在SAP系统中使用ALV(AdvancedListView)和Smartforms进行物料发货数据的筛选、计算及打印,包括数据表定义、用户选择参数、事件处理以及与Smartforms的交互过程。
摘要由CSDN通过智能技术生成

REPORT ZMM025.

TYPE-POOLS: SLIS. "ALV显示使用到的共享池

TABLES: LIPS, MSEG, EKPO, T001W, LIKP, LFA1,KNA1.
*---------------------------------------------------------------------*
* 内表定义
*---------------------------------------------------------------------*
DATA: BEGIN OF TEST,

        SEL_COL    TYPE CHAR1,                "选择框
        NUM        TYPE I,                    "序号
        VBELN      LIKE LIPS-VBELN,           "发货单号
        MATNR      LIKE LIPS-MATNR,           "物料号
        ARKTX      LIKE LIPS-ARKTX,           "物料描述
        MBLNR      LIKE MSEG-MBLNR,           "物料凭证
        CPUDT_MKPF LIKE MSEG-CPUDT_MKPF,      "凭证日期
        LFIMG      LIKE LIPS-LFIMG,           "发货数量
        MEINS      LIKE MSEG-MEINS,           "单位
        LGORT      LIKE LIPS-LGORT,           "发货仓库
        WERKS      LIKE LIPS-WERKS,           "发货工厂
        LFDAT      LIKE LIKP-LFDAT,           "发货日期
        ERNAM      LIKE LIKP-ERNAM,           "发货人
        KBETR      LIKE KONV-KBETR,           "单价
        KBETR_S    LIKE KONV-KBETR,           "服务费
        DMBTR      LIKE MSEG-DMBTR,           "金额
        NAME1      LIKE KNA1-NAME1,           "客户
        SGTXT      LIKE MSEG-SGTXT,           "备注

      END OF TEST.

DATA: IT_TEST     LIKE TABLE OF TEST WITH HEADER LINE, "数据表
      IT_SELECTED LIKE TABLE OF TEST WITH HEADER LINE, "要打印的表项
      IT_SFTAB    LIKE TABLE OF TEST WITH HEADER LINE. "零时处理表

DATA: BEGIN OF IT_TEST1 OCCURS 0,

        VBELN TYPE VBELN_VL,           "交货单号,
        KNUMV TYPE KNUMV,              "单据条件数
        KSCHL TYPE KSCHA,              "条件类型
        KBETR TYPE KBETR,              "单价或服务费

      END OF IT_TEST1.

DATA: BEGIN OF STUR_HELP ,    "定义一个结构,加OCCURS 0 表示内表

        KUNNR TYPE KUNNR,
        NAME1 TYPE NAME1_GP,

      END OF STUR_HELP.

DATA: IT_HELP LIKE TABLE OF STUR_HELP.                        "定义一个没有工作区的搜索帮助内表
DATA: IT_RETURN LIKE TABLE OF DDSHRETVAL WITH HEADER LINE.    "定义一同名内表与工作区的返回信息内表

DATA: IT_SFTAB_OUT LIKE TABLE OF ZMMS025 WITH HEADER LINE.        "传入Smartforms的表

DATA: LINE_ID  TYPE I,
      LINE_ID1 TYPE I.

*---------------------------------------------------------------------*
* ALV层级关系定义
*---------------------------------------------------------------------*
DATA: WT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      WT_LAYOUT   TYPE SLIS_LAYOUT_ALV,
      WT_EVENTS   TYPE SLIS_T_EVENT.

DATA: REF_GRID TYPE REF TO CL_GUI_ALV_GRID.

*---------------------------------------------------------------------*
* 用户选择屏幕
*---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK01 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS: S_WERKS FOR LIPS-WERKS OBLIGATORY NO INTERVALS DEFAULT '1000' NO-EXTENSION.    "发货工厂
SELECT-OPTIONS: S_NAME1 FOR KNA1-NAME1.                                                        "客户
SELECT-OPTIONS: S_LFDAT FOR LIKP-LFDAT.                                                        "发货日期
SELECT-OPTIONS: S_MATNR FOR LIPS-MATNR.                                                        "物料号
SELECT-OPTIONS: S_VBELN FOR LIPS-VBELN.                                                        "发货单号

SELECTION-SCREEN END OF BLOCK BLK01.

*--------------------------------------------------------------------*
*初始化事件                                                           *
*--------------------------------------------------------------------*
INITIALIZATION.

  CLEAR:IT_HELP,STUR_HELP.
  SELECT KUNNR NAME1
    INTO TABLE IT_HELP
    FROM KNA1
    UP TO 200 ROWS.

*--------------------------------------------------------------------*
*屏幕执行之前事件                                                     *
*--------------------------------------------------------------------*
AT SELECTION-SCREEN.

*---------------------------------------------------------------------------------------------------
*输入帮助
*---------------------------------------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_NAME1-LOW.      "输入帮助,字段S_NAME1_LOW表示前一个

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'         "调用帮助函数F4IF_INT_TABLE_VALUE_REQUEST
    EXPORTING
      RETFIELD        = 'NAME1'
      VALUE_ORG       = 'S'
    TABLES
      VALUE_TAB       = IT_HELP
      RETURN_TAB      = IT_RETURN
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.

  IF IT_RETURN[] IS NOT INITIAL.           "内表IT_RETURN不为空

    READ TABLE IT_RETURN INDEX 1.          "读内表IT_RETURN第一行

    IF SY-SUBRC = 0.                      "IT_RETURN读取成功:0表示成功
      S_NAME1-LOW = IT_RETURN-FIELDVAL .   "S_NAME1-LOW 等于 内表IT_RETURN中的字段FIELDVAL

    ENDIF.

  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_NAME1-HIGH.      "输入帮助,字段S_VBELMN_HIGH表示前一个

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'        "调用帮助函数F4IF_INT_TABLE_VALUE_REQUEST
    EXPORTING
      RETFIELD        = 'NAME1'           "选择搜索帮助字段中的VBELN字段
      VALUE_ORG       = 'S'
    TABLES
      VALUE_TAB       = IT_HELP       "VALUE_TAB参数赋值
      RETURN_TAB      = IT_RETURN      "参数返回值
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.

  IF IT_RETURN[] IS NOT INITIAL.           "内表IT_RETURN不为空

    READ TABLE IT_RETURN INDEX 1.          "读内表IT_RETURN第一行

    IF SY-SUBRC = 0.                       "IT_RETURN读取成功:0表示成功
      S_NAME1-HIGH = IT_RETURN-FIELDVAL .  "S_NAME1-HIGH 等于 内表IT_RETURN中的字段FIELDVAL

    ENDIF.

  ENDIF.

*---------------------------------------------------------------------*
* 执行操作
*---------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM GET_DATA.

FORM GET_DATA.

  SELECT A~VBELN
         A~MATNR
         A~ARKTX
         B~MBLNR
         B~CPUDT_MKPF
         A~LFIMG
         B~MEINS
         A~LGORT
         A~WERKS
         C~LFDAT
         C~ERNAM
         D~NAME1
         B~SGTXT
      INTO CORRESPONDING FIELDS OF TABLE IT_TEST
        FROM LIPS AS A INNER JOIN
             MSEG AS B ON A~VBELN = B~VBELN_IM AND A~POSNR = B~VBELP_IM INNER JOIN
             LIKP AS C ON A~VBELN = C~VBELN INNER JOIN
             KNA1 AS D ON C~KUNNR = D~KUNNR
          WHERE A~WERKS IN S_WERKS
            AND D~NAME1 IN S_NAME1
            AND C~LFDAT IN S_LFDAT
            AND A~MATNR IN S_MATNR
            AND A~VBELN IN S_VBELN.

  SELECT A~VBELV
         A~VBELN
         B~KNUMV
         C~KSCHL
         C~KBETR
    INTO CORRESPONDING FIELDS OF TABLE IT_TEST1
      FROM VBFA AS A INNER JOIN
           VBAK AS B ON A~VBELV = B~VBELN INNER JOIN
           KONV AS C ON B~KNUMV = C~KNUMV
      FOR ALL ENTRIES IN IT_TEST
      WHERE A~VBELN = IT_TEST-VBELN.

  IF SY-SUBRC = 0.

    LOOP AT IT_TEST.

      READ TABLE IT_TEST1 WITH KEY VBELN = IT_TEST-VBELN KSCHL = 'ZP0D'.
      IF SY-SUBRC = 0.
        IT_TEST-KBETR = IT_TEST1-KBETR.
      ENDIF.
      READ TABLE IT_TEST1 WITH KEY VBELN = IT_TEST-VBELN KSCHL = 'ZFWF'.
      IF SY-SUBRC = 0.
        IT_TEST-KBETR_S = IT_TEST1-KBETR.
      ENDIF.

      LINE_ID = LINE_ID + 1.    "IT_DATA编号
      IT_TEST-NUM = LINE_ID.

      IF IT_TEST-KBETR <> 0 AND IT_TEST-LFIMG <> 0.
        IT_TEST-DMBTR = IT_TEST-KBETR * IT_TEST-LFIMG + IT_TEST-KBETR_S.
      ENDIF.

      MODIFY IT_TEST.

    ENDLOOP.

  ENDIF.

** 填入批次属性 ********
*    "数值型特性值
*    DATA BEGIN OF IT_NUM OCCURS 0.
*            INCLUDE STRUCTURE BAPI1003_ALLOC_VALUES_NUM.
*    DATA END OF IT_NUM.
*    "字符型特性值
*    DATA BEGIN OF IT_CHAR OCCURS 0.
*            INCLUDE STRUCTURE  BAPI1003_ALLOC_VALUES_CHAR.
*    DATA END OF IT_CHAR.
*    "货币型特性值
*    DATA BEGIN OF IT_CURR OCCURS 0.
*            INCLUDE STRUCTURE  BAPI1003_ALLOC_VALUES_CURR.
*    DATA END OF IT_CURR.
*    "返回值
*    DATA BEGIN OF BAPI_RETURN OCCURS 0.
*            INCLUDE STRUCTURE BAPIRET2.
*    DATA END OF BAPI_RETURN.
*
*    CLEAR:IT_NUM[], IT_CHAR[], IT_CURR[], BAPI_RETURN[].
*
*    IF IT_TEST-CHARG IS NOT INITIAL.
*
*      CALL FUNCTION 'ZMM_F002'
*        EXPORTING
*          I_MATNR         = IT_TEST-MATNR        "物料号
*          I_CHARG         = IT_TEST-CHARG        "批次号
*          "I_WERKS         = IT_TEST-WERKS       "工厂
*        TABLES
*          ALLOCVALUESNUM  = IT_NUM          "数值型特性值
*          ALLOCVALUESCHAR = IT_CHAR         "字符型特性值
*          ALLOCVALUESCURR = IT_CURR         "货币型特性值
*          RETURN          = BAPI_RETURN.    "返回值
*
*    ENDIF.
ENDFORM.

*--------------------------------------------------------------------*
*屏幕结束执行事件                                                     *
*--------------------------------------------------------------------*
END-OF-SELECTION.

  PERFORM SHOW_ALV.

*--------------------------------------------------------------------*
*子例程                                                              *
*--------------------------------------------------------------------*
FORM SHOW_ALV.
* 定义ALV显示的具体格式
  DATA:  WLT_FIELDCAT LIKE LINE OF WT_FIELDCAT.

*ALV显示宏定义
  DEFINE ALV_TEMP.

    CLEAR WLT_FIELDCAT.
    WLT_FIELDCAT-FIELDNAME    = &1.
    WLT_FIELDCAT-TABNAME      = 'IT_TEST'.
    WLT_FIELDCAT-NO_OUT       = ' '.
    WLT_FIELDCAT-SELTEXT_L    = &2.
    WLT_FIELDCAT-NO_ZERO      = 'X'.
    APPEND WLT_FIELDCAT TO WT_FIELDCAT.

  END-OF-DEFINITION.

* 以下每一段为定义的一列
  CLEAR: WT_FIELDCAT[].
* 勾选框
  CLEAR WLT_FIELDCAT.
  WLT_FIELDCAT-TABNAME   = 'IT_TEST'.
  WLT_FIELDCAT-FIELDNAME = 'SEL_COL'.
  WLT_FIELDCAT-SELTEXT_L = '勾选框'.
  WLT_FIELDCAT-CHECKBOX = 'X'.
  WLT_FIELDCAT-EDIT = 'X'.
  APPEND WLT_FIELDCAT TO WT_FIELDCAT.

  ALV_TEMP 'NUM'   '序号'.
  ALV_TEMP 'WERKS' '发货工厂'.
  ALV_TEMP 'LFDAT' '发货日期'.
  ALV_TEMP 'VBELN' '发货单号'.
  ALV_TEMP 'NAME1' '客户'.
  ALV_TEMP 'MATNR' '物料号'.
  ALV_TEMP 'ARKTX' '物料描述'.
  ALV_TEMP 'LFIMG' '发货数量'.
  ALV_TEMP 'MEINS' '单位'.
  ALV_TEMP 'KBETR' '单价'.
  ALV_TEMP 'KBETR_S' '服务费'.
  ALV_TEMP 'DMBTR' '金额'.
  ALV_TEMP 'LGORT' '发货仓库'.
  ALV_TEMP 'SGTXT' '备注'.

  WT_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.    "根据内容调整ALV显示的栏目宽度

* 调用系统函数将ALV呈现在接口上, 其显示的内容,为指定的内表

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-CPROG
      IS_LAYOUT                = WT_LAYOUT
      IT_FIELDCAT              = WT_FIELDCAT[]
      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
    TABLES
      T_OUTTAB                 = IT_TEST
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
ENDFORM.

*GUI状态(ZFIRP0220_PF添加应用程序图标---打印按钮)
FORM PF_STATUS_SET USING P_EXTAB TYPE SLIS_T_EXTAB..
  "Set the Button using the staus
  "Copy the Standard status from the program SAPLKKBL status
  " STANDARD using SE41, and use that here.
  "Pf status
  SET PF-STATUS 'ZMM025_PF'.

ENDFORM.

*用户命令
FORM USER_COMMAND USING R_UCOMM     LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.
  IF REF_GRID IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        E_GRID = REF_GRID.
  ENDIF.
  IF NOT REF_GRID IS INITIAL.
    CALL METHOD REF_GRID->CHECK_CHANGED_DATA .
  ENDIF.

  CASE R_UCOMM.

    WHEN 'B_PRINT'.                                "打印
      PERFORM GET_PRINT.

    WHEN 'ALLCHOOSE'.                              "全选
      LOOP AT IT_TEST.
        IT_TEST-SEL_COL = 'X'.
        MODIFY IT_TEST.
      ENDLOOP.

    WHEN 'RECHOOSE'.                               "反选
      LOOP AT IT_TEST.
        IF IT_TEST-SEL_COL = 'X'.
          IT_TEST-SEL_COL = ''.
        ELSE.
          IT_TEST-SEL_COL = 'X'.
        ENDIF.
        MODIFY IT_TEST.
      ENDLOOP.

    WHEN OTHERS.

  ENDCASE.

  RS_SELFIELD-REFRESH = 'X'.                           "刷新

ENDFORM.

*-------------------------------------
*   打印功能代码   调用smartforms
*-------------------------------------
FORM GET_PRINT.
  DATA:
    LW_PATH              TYPE RSPOPNAME,
    LW_FUNC_NAME         TYPE RS38L_FNAM,
    T_CONTROL_PARAMETERS TYPE SSFCTRLOP,
    T_OUTPUT_OPTIONS     TYPE SSFCOMPOP.

***获取SMARTFORMS的Function Module***
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME           = 'ZMMSF025'                    "SMARTFORMS表格设计器的表名
    IMPORTING
      FM_NAME            = LW_FUNC_NAME                       "功能名称
    EXCEPTIONS
      NO_FORM            = 1
      NO_FUNCTION_MODULE = 2
      OTHERS             = 3.

  CLEAR:T_CONTROL_PARAMETERS,T_OUTPUT_OPTIONS.

***Smart Forms: 控制结构*****
  T_CONTROL_PARAMETERS-PREVIEW       = 'X'.             "不打印预览,X 则打印预览
  T_CONTROL_PARAMETERS-NO_OPEN       = 'X'.             "新的假脱机请求(必写)
  T_CONTROL_PARAMETERS-NO_CLOSE      = 'X'.             "不关闭新的假脱机请求(必写)
  T_CONTROL_PARAMETERS-NO_DIALOG     = ' '.             "弹出打印设置的对话框,X 则不显示框
  T_CONTROL_PARAMETERS-DEVICE        = 'PRINTER'.       "PRINTER\MAIL\TELEFAX,缺省是PRINTER

***SAP Smart Forms: 智能写作器 (传输) 选项*****
  T_OUTPUT_OPTIONS-TDNOPREV  = ' '.                      "是否打印预览,X是不预览。
  T_OUTPUT_OPTIONS-TDNOPRINT = ' '.                      "没有打印预览的打印输出,设置X。
  T_OUTPUT_OPTIONS-TDIMMED   = ' '.                      "立即打印标志。
  T_OUTPUT_OPTIONS-TDDEST    = 'LP01'.                   "假脱机,输出设备。

***调用SSF_OPEN函数设置打印机,打开输出请求,使用用户打印设置必须调用SSF_OPEN***
  CALL FUNCTION 'SSF_OPEN'
    EXPORTING
      OUTPUT_OPTIONS     = T_OUTPUT_OPTIONS
      CONTROL_PARAMETERS = T_CONTROL_PARAMETERS
      USER_SETTINGS      = ' '
    EXCEPTIONS
      FORMATTING_ERROR   = 1
      INTERNAL_ERROR     = 2
      SEND_ERROR         = 3
      USER_CANCELED      = 4
      OTHERS             = 5.

  LOOP AT IT_TEST WHERE SEL_COL = 'X'.
    MOVE-CORRESPONDING IT_TEST TO IT_SELECTED.
    CLEAR IT_SELECTED-NUM.
    APPEND IT_SELECTED.
  ENDLOOP.
  LOOP AT IT_SELECTED.
    MOVE-CORRESPONDING IT_SELECTED TO IT_SFTAB.
    APPEND IT_SFTAB.
  ENDLOOP.
  SORT IT_SELECTED BY VBELN.
  DELETE ADJACENT DUPLICATES FROM IT_SELECTED COMPARING VBELN NAME1 LFDAT.

  LOOP AT IT_SELECTED.

    LOOP AT IT_SFTAB WHERE VBELN = IT_SELECTED-VBELN AND NAME1 = IT_SELECTED-NAME1 AND LFDAT = IT_SELECTED-LFDAT.
      MOVE-CORRESPONDING IT_SFTAB TO IT_SFTAB_OUT.
      LINE_ID1 = LINE_ID1 + 1.    "打印编号
      IT_SFTAB_OUT-NUM = LINE_ID1.
      APPEND IT_SFTAB_OUT.
    ENDLOOP.

***调用Smartforms的Function Module打印***
    CALL FUNCTION LW_FUNC_NAME
      EXPORTING
        CONTROL_PARAMETERS = T_CONTROL_PARAMETERS     "设置不显示打印确认对话框
        OUTPUT_OPTIONS     = T_OUTPUT_OPTIONS         "默认打印选项设置传输
        USER_SETTINGS      = SPACE
        VBELN              = IT_SELECTED-VBELN
        NAME1              = IT_SELECTED-NAME1
        LFDAT              = IT_SELECTED-LFDAT
        ERNAM              = IT_SELECTED-ERNAM
      TABLES
        IT_TAB             = IT_SFTAB_OUT                 "IT_TAB:SMARTFORMS中表格接口 -- 表 -- 参数名称
      EXCEPTIONS
        FORMATTING_ERROR   = 1
        INTERNAL_ERROR     = 2
        SEND_ERROR         = 3
        USER_CANCELED      = 4
        OTHERS             = 5.

    IF SY-SUBRC <> 0.
*    MESSAGE S008(ZHKTL1) WITH SY-SUBRC DISPLAY LIKE CNS_E.
*    LEAVE LIST-PROCESSING.
    ENDIF.
    CLEAR: IT_SFTAB_OUT[],IT_SFTAB_OUT,LINE_ID1.

  ENDLOOP.

  CLEAR: IT_SFTAB,IT_SFTAB[],IT_SELECTED,IT_SELECTED[].

***关闭打印机设置***
  CALL FUNCTION 'SSF_CLOSE'
*  IMPORTING
*    JOB_OUTPUT_INFO        =
    EXCEPTIONS
      FORMATTING_ERROR = 1
      INTERNAL_ERROR   = 2
      SEND_ERROR       = 3
      OTHERS           = 4.

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

ENDFORM.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值