smartform(一)

*&---------------------------------------------------------------------*
*& Report  ZMMFPOPRINT
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZMMFPOPRINT.
TYPE-POOLS:SLIS.
TABLES:EKKO,EKPO,MAKT,LFA1.

*DATA: ES_EXCLUDING   TYPE SLIS_T_EXTAB.
*----------------------------------------------------------------------*
*                  Variables
*----------------------------------------------------------------------*
*SMARTFORMS(TOP中的定义开始)
DATA: F_FORMNAME TYPE TDSFNAME.      "Smart form formname
DATA: F_FUNCNAME TYPE RS38L_FNAM.                     "Smart form function name

DATA:OUTPUT TYPE SSFCOMPOP.
DATA:CONTROL_PARAMETERS TYPE SSFCTRLOP.
DATA:ERRTAB TYPE TSFERROR.                         "固定部分,可直接拷贝
*SMARTFORMS(TOP中的定义结束)

DATA:LAYOUT TYPE SLIS_LAYOUT_ALV,
      IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
      W_REPID LIKE SY-REPID.
DATA:BEGIN OF IT_OUTPUT OCCURS 0,
  SEL,
  EBELN LIKE EKKO-EBELN,"采购凭证号
  LIFNR LIKE EKKO-LIFNR,"供应商编号
  NAME1 LIKE LFA1-NAME1,"供应商名称
  ERNAM LIKE EKKO-ERNAM,"创建人
  BEDAT LIKE EKKO-BEDAT,"采购凭证日期
  MATNR LIKE EKPO-MATNR,"物料编号
  MAKTX LIKE MAKT-MAKTX,"物料描述
  MENGE LIKE EKPO-MENGE,"数量
  MEINS LIKE EKPO-MEINS,"单位
  END OF IT_OUTPUT.

DATA:WA_HEAD LIKE ZMMFPOHEAD,
     IT_HEAD LIKE ZMMFPOHEAD OCCURS 0 WITH HEADER LINE,
     IT_BODY LIKE ZMMFPOBODY OCCURS 0 WITH HEADER LINE.
SELECTION-SCREEN:BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001.
PARAMETERS:S_WERKS LIKE EKPO-WERKS OBLIGATORY.
SELECT-OPTIONS:EBELN FOR EKKO-EBELN.
SELECTION-SCREEN END OF BLOCK BLOCK1.

INITIALIZATION.

START-OF-SELECTION.
*---程序逻辑-------*
  PERFORM GETDATA.
*---ALV格式和显示设置---*
  PERFORM CATALOG.
  PERFORM ALVSHOW.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  GETDATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GETDATA.
  SELECT
    EKKO~EBELN
    EKKO~LIFNR
    EKKO~ERNAM
    EKKO~BEDAT
    EKPO~MATNR
    EKPO~MENGE
    EKPO~MEINS
    INTO CORRESPONDING FIELDS OF TABLE IT_OUTPUT
  FROM EKKO
  INNER JOIN EKPO ON EKKO~EBELN = EKPO~EBELN
    WHERE  EKPO~WERKS = S_WERKS AND
           EKKO~EBELN  IN EBELN  AND
           EKKO~MEMORY <> 'X' AND
           EKPO~LOEKZ <> 'L' .
  LOOP AT IT_OUTPUT.
    SELECT SINGLE NAME1 INTO IT_OUTPUT-NAME1 FROM LFA1 WHERE LIFNR = IT_OUTPUT-LIFNR.
    SELECT SINGLE MAKTX INTO IT_OUTPUT-MAKTX FROM MAKT WHERE MATNR = IT_OUTPUT-MATNR.
    IT_HEAD-EBELN = IT_OUTPUT-EBELN.
    IT_HEAD-LIFNR = IT_OUTPUT-LIFNR.
    IT_HEAD-NAME1 = IT_OUTPUT-NAME1.
    IT_HEAD-ERNAM = IT_OUTPUT-ERNAM.
    IT_HEAD-BEDAT = IT_OUTPUT-BEDAT.
    APPEND IT_HEAD.
    MODIFY IT_OUTPUT.
  ENDLOOP.
ENDFORM.                    "GETDATA
*&---------------------------------------------------------------------*
*&      Form  CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM CATALOG.
  W_REPID = SY-REPID.
  CLEAR IT_FIELDCAT.
  DEFINE FIELDCATSET.
    WA_FIELDCAT-FIELDNAME = &1.
    WA_FIELDCAT-SELTEXT_L = &2.
    WA_FIELDCAT-NO_ZERO = &3.
    WA_FIELDCAT-FIX_COLUMN = &4.
    WA_FIELDCAT-CHECKBOX = &5.
    WA_FIELDCAT-EDIT = &6.
    APPEND WA_FIELDCAT TO IT_FIELDCAT.
  END-OF-DEFINITION.
  FIELDCATSET 'SEL' '选择' '' '' 'X' 'X'.
  FIELDCATSET 'EBELN' '采购订单号' 'X' '' '' ''.
  FIELDCATSET 'LIFNR' '供应商编号' 'X' '' '' ''.
  FIELDCATSET 'NAME1' '供应商名称' 'X' '' '' ''.
  FIELDCATSET 'ERNAM' '创建人' 'X' '' '' ''.
  FIELDCATSET 'BEDAT' '采购订单日期' 'X' '' '' ''.

ENDFORM.                    "CATALOG

*&---------------------------------------------------------------------*
*&      Form  ALVSHOW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM ALVSHOW.
  PERFORM LAYOUT_INIT USING LAYOUT.
*  LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = W_REPID
      I_GRID_TITLE             = ''
      IS_LAYOUT                = LAYOUT
      IT_FIELDCAT              = IT_FIELDCAT[]
      I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'"自定义ALV工具栏
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'"定义ALV工具栏自定义按钮事件
    TABLES
      T_OUTTAB                 = IT_HEAD
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.                   "ALVSHOW

*------------------------------
*自定义ALV工具栏函数
*------------------------------
FORM SET_PF_STATUS USING EXTAB TYPE SLIS_T_EXTAB.
  DATA:R_UCOMM LIKE SY-UCOMM.
  SET PF-STATUS 'ZSTANDARD_FULLSCREEN'.
ENDFORM.                    "SET_PF_STATUS
*-----------------------------------
*ALV事件
*-----------------------------------
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.
***开始***********  这段代码加上之后,才能对数据进行实时更新
  DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.
  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
  RS_SELFIELD-REFRESH = 'X'.
  RS_SELFIELD-COL_STABLE = 'X'.
  RS_SELFIELD-ROW_STABLE = 'X'.
***结束***********  这段代码加上之后,才能对数据进行实时更新
  CASE R_UCOMM.
    WHEN 'ALL'.
      LOOP AT IT_HEAD.
        IT_HEAD-SEL = 'X'.
        MODIFY IT_HEAD.
      ENDLOOP.
    WHEN 'SAL'.
      LOOP AT IT_HEAD.
        IT_HEAD-SEL = ''.
        MODIFY IT_HEAD.
      ENDLOOP.
    WHEN 'PRIT'.
      CLEAR IT_BODY.
      CLEAR IT_BODY[].
      CLEAR WA_HEAD.
      READ TABLE IT_HEAD WITH KEY SEL = 'X'."防止没有选择就打印
      IF SY-SUBRC = 0.
        PERFORM PRINT_DATA.
      ENDIF.

  ENDCASE.
ENDFORM.                    "USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  PRINT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM PRINT_DATA.
  PERFORM SMARTFORM_BEGIN.
  LOOP AT IT_HEAD WHERE SEL = 'X'.
    CLEAR IT_BODY.
    CLEAR IT_BODY[].
    CLEAR WA_HEAD.
    MOVE-CORRESPONDING IT_HEAD TO WA_HEAD.
    LOOP AT IT_OUTPUT WHERE EBELN = IT_HEAD-EBELN.
      MOVE-CORRESPONDING IT_OUTPUT TO IT_BODY.
      APPEND IT_BODY.
      CLEAR IT_BODY.
    ENDLOOP.
    SORT IT_BODY BY EBELN.
    CALL FUNCTION F_FUNCNAME
      EXPORTING
        CONTROL_PARAMETERS = CONTROL_PARAMETERS
        OUTPUT_OPTIONS     = OUTPUT
        WA_HEAD            = WA_HEAD
      TABLES
        IT_BODY            = IT_BODY
      EXCEPTIONS
        FORMATTING_ERROR   = 1
        INTERNAL_ERROR     = 2
        SEND_ERROR         = 3
        USER_CANCELED      = 4.
  ENDLOOP.

  PERFORM SMARTFORM_END.
ENDFORM.                    "PRINT_DATA

*&---------------------------------------------------------------------*
*&      Form  SMARTFORM_BEGIN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SMARTFORM_BEGIN .

  CASE S_WERKS.
    WHEN '9000'.
      F_FORMNAME = 'ZMMFPOPRINT'.
    WHEN '8000'.
      F_FORMNAME = 'ZMMF01WT'.
    WHEN '7000'.
      F_FORMNAME = 'ZMMF01W_WX'.
*           WHEN '6000'.
*             F_FORMNAME = 'ZMMF01W_TZ'.
    WHEN '5000'.
      F_FORMNAME = 'ZMMF01W_DG'.
*          WHEN OTHERS.
  ENDCASE.

  CLEAR:OUTPUT,CONTROL_PARAMETERS.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME = F_FORMNAME
    IMPORTING
      FM_NAME  = F_FUNCNAME.

*  CONTROL_PARAMETERS-PREVIEW   = 'X'.
  CONTROL_PARAMETERS-NO_OPEN   = 'X'.
  CONTROL_PARAMETERS-NO_CLOSE  = 'X'.
*  CONTROL_PARAMETERS-NO_DIALOG = 'X'.


*  OUTPUT-TDDEST = 'LP01'.
*  OUTPUT-TDPRINTER = 'Microsoft Office Document Image Writer'.
  OUTPUT-RQPOSNAME = ''.
  OUTPUT-TDDATASET = ''.
  OUTPUT-TDSUFFIX1 = ''.
  OUTPUT-TDSUFFIX2 = ''.
  OUTPUT-TDIMMED = 'X'.
  OUTPUT-TDDELETE = 'X'.


  CALL FUNCTION 'SSF_OPEN'
    EXPORTING
      CONTROL_PARAMETERS = CONTROL_PARAMETERS
      OUTPUT_OPTIONS     = OUTPUT
    EXCEPTIONS
      FORMATTING_ERROR   = 1
      INTERNAL_ERROR     = 2
      SEND_ERROR         = 3
      USER_CANCELED      = 4
      OTHERS             = 5.

ENDFORM.                    " SMARTFORM_BEGIN

*&---------------------------------------------------------------------*
*&      Form  SMARTFORM_END
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SMARTFORM_END .
  CALL FUNCTION 'SSF_CLOSE'
* IMPORTING
*   JOB_OUTPUT_INFO        =
    EXCEPTIONS
    FORMATTING_ERROR       = 1
    INTERNAL_ERROR         = 2
    SEND_ERROR             = 3
    OTHERS                 = 4
       .
  IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  CALL FUNCTION 'SSF_READ_ERRORS'
    IMPORTING
      ERRORTAB = ERRTAB.
ENDFORM.                    " SMARTFORM_END


*&--------------------------------------------------------------------*
*&      Form  LAYOUT_INIT
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->RS_LAYOUT  text
*---------------------------------------------------------------------*
FORM LAYOUT_INIT USING RS_LAYOUT TYPE SLIS_LAYOUT_ALV.
*"Build layout for list display
  RS_LAYOUT-DETAIL_POPUP      = 'X'.
*  RS_LAYOUT-BOX_FIELDNAME  = 'BOX'.
  RS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'."自动根据内容调整宽度
ENDFORM.                    "LAYOUT_INIT


程序中创建的结构

ZMMFPOHEAD,ZMMFPOBOYD 如下图:




在做这个smartform过程中遇到问题有:
1.打印内容头.尾.内容如何网格显示
2.内表有数据 但是不显示数据
3.如何拷贝标准的GUI STATUS.
解决:
1
.
点击上图红色框 在里面可以表格显示,至于内容循环表格显示,我是通过建立一个和MAIN窗体一样大小的窗口 在里面画好表来解决.
2.内容没显示出来 发现是因为 打印的数据是数量时候 要在全局定义-货币/数量页签里面把要打印的数量定义成QUAN如下图


3.拷贝标准的GUI STATUS:SE80 进去后选择程序 右击创建GUI STATUS 创建完成后 菜单EXTRAS-Adjust template-list status -确定


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值