*&---------------------------------------------------------------------*
*& 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 -确定