smartform实例程序
*&---------------------------------------------------------------------*
*& Report ZLS_12
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zls_12.
TYPE-POOLS: slis.
TABLES: ekko,ekpo,eket.
*--------定义变量-----------*
TYPES: BEGIN OF ty_alv,
ebeln TYPE ekko-ebeln, "订单编号
werks TYPE ekpo-werks, "退货门店
eindt TYPE eket-eindt, "交货日期
ekorg TYPE ekko-ekorg, "采购组织
ekgrp TYPE ekko-ekgrp, "采购组
lifnr TYPE ekko-lifnr, "供应商
ebelp TYPE ekpo-ebelp, "项目编号
bsart TYPE ekko-bsart, "订单类型
matnr TYPE ekpo-matnr, "商品编号
txz01 TYPE ekpo-txz01, "商品描述
bedat TYPE ekko-bedat, "订单日期
menge TYPE ekpo-menge, "退货数量
meins TYPE ekpo-meins, "单位
ernam TYPE ekko-ernam, "制单人
sel TYPE char1, "选择标识
END OF ty_alv.
DATA: lt_alv TYPE TABLE OF ty_alv.
DATA: lt_alv_sel TYPE TABLE OF ty_alv.
DATA: wa_alv TYPE ty_alv.
TYPES: BEGIN OF ty_eket,
ebeln TYPE eket-ebeln,
ebelp TYPE eket-ebelp,
eindt TYPE eket-eindt,
END OF ty_eket.
DATA: lt_eket TYPE TABLE OF ty_eket,
wa_eket TYPE ty_eket.
DATA: fieldcat TYPE slis_t_fieldcat_alv,
fieldcat_ln LIKE LINE OF fieldcat,
layout TYPE slis_layout_alv.
DATA: col_pos TYPE int2.
DATA: lv_string TYPE string.
*--------选择屏幕-----------*
PARAMETERS p_ekorg TYPE ekko-ekorg.
SELECT-OPTIONS: s_ekgrp FOR ekko-ekgrp ,
s_lifnr FOR ekko-lifnr ,
s_ebeln FOR ekko-ebeln ,
s_bsart FOR ekko-bsart ,
s_werks FOR ekpo-werks ,
s_matnr FOR ekpo-matnr ,
s_txz01 FOR ekpo-txz01 .
START-OF-SELECTION.
CONCATENATE 'ekorg IN s_ekgrp' 'lifnr IN s_lifnr' ' a~ebeln IN s_ebeln' 'bsart IN s_bsart' 'werks IN s_werks' 'matnr IN s_matnr' 'txz01 IN s_txz01' INTO lv_string SEPARATED BY ' and '.
IF p_ekorg IS NOT INITIAL.
CONCATENATE lv_string 'and a~ekorg = p_ekorg' INTO lv_string SEPARATED BY space.
ENDIF.
SELECT a~ebeln ekorg ekgrp lifnr bsart matnr txz01 bedat ernam b~ebelp werks menge meins
FROM ekko AS a INNER JOIN ekpo AS b ON a~ebeln = b~ebeln
INTO CORRESPONDING FIELDS OF TABLE lt_alv
WHERE (lv_string).
IF lt_alv IS NOT INITIAL.
SELECT ebeln ebelp eindt FROM eket INTO TABLE lt_eket FOR ALL ENTRIES IN lt_alv
WHERE ebeln = lt_alv-ebeln
AND ebelp = lt_alv-ebelp.
ENDIF.
LOOP AT lt_alv INTO wa_alv.
READ TABLE lt_eket INTO wa_eket WITH KEY ebeln = wa_alv ebelp = wa_alv-ebelp.
IF sy-subrc = 0.
wa_alv-eindt = wa_eket-eindt.
MODIFY lt_alv FROM wa_alv.
ENDIF.
CLEAR wa_alv.
CLEAR wa_eket.
ENDLOOP.
*---------显示ALV-----------*
layout-zebra = 'X'.
layout-detail_popup = 'X'.
layout-f2code = 'X'.
layout-no_vline = 'X'.
layout-colwidth_optimize = 'X'.
layout-detail_initial_lines = 'X'.
layout-detail_titlebar = '详细内容'.
layout-box_fieldname = 'SEL'.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'EKORG'.
fieldcat_ln-ref_tabname = 'EKKO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '采购组织'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'EKGRP'.
fieldcat_ln-ref_tabname = 'EKKO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '采购组'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'LIFNR'.
fieldcat_ln-ref_tabname = 'EKKO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '供应商'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'BEDAT'.
fieldcat_ln-ref_tabname = 'EKKO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '订单日期'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'EINDT'.
fieldcat_ln-ref_tabname = 'EKET'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '交货日期'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'EBELN'.
fieldcat_ln-ref_tabname = 'EKKO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '订单编号'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'BSART'.
fieldcat_ln-ref_tabname = 'EKKO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '订单类型'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'WERKS'.
fieldcat_ln-ref_tabname = 'EKPO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '退货门店'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'MATNR'.
fieldcat_ln-ref_tabname = 'EKPO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '商品编号'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'TXZ01'.
fieldcat_ln-ref_tabname = 'EKPO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '商品描述'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'MENGE'.
fieldcat_ln-ref_tabname = 'EKPO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '退货数量'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'MEINS'.
fieldcat_ln-ref_tabname = 'EKPO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '单位'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
col_pos = col_pos + 1.
fieldcat_ln-fieldname = 'ERNAM'.
fieldcat_ln-ref_tabname = 'EKKO'.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-seltext_m = '制单人'.
APPEND fieldcat_ln TO fieldcat.
CLEAR fieldcat_ln.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = sy-repid
i_callback_pf_status_set = 'FORM_PF_STATUS_SET'
i_callback_user_command = 'FORM_USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = layout
it_fieldcat = fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* O_PREVIOUS_SRAL_HANDLER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = lt_alv
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
FORM form_pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'.
ENDFORM.
FORM form_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA flag_error TYPE sap_bool.
REFRESH lt_alv_sel.
CASE r_ucomm.
WHEN 'ZPRI'.
DATA lr_alv_grid TYPE REF TO cl_gui_alv_grid.
IF lr_alv_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
* EXPORTING
* IR_SALV_FULLSCREEN_ADAPTER =
IMPORTING
* ET_EXCLUDING =
* E_REPID =
* E_CALLBACK_PROGRAM =
* E_CALLBACK_ROUTINE =
e_grid = lr_alv_grid
* ET_FIELDCAT_LVC =
* ER_TRACE =
* E_FLG_NO_HTML =
* ES_LAYOUT_KKBLO =
* ES_SEL_HIDE =
* ET_EVENT_EXIT =
* ER_FORM_TOL =
* ER_FORM_EOL =
.
ENDIF.
DATA lt_row_id TYPE lvc_t_roid.
CALL METHOD lr_alv_grid->get_selected_rows
IMPORTING
* et_index_rows =
et_row_no = lt_row_id.
if lt_row_id is INITIAL.
MESSAGE '请选择打印数据' TYPE 'I'.
exit.
ENDIF.
LOOP AT lt_row_id INTO DATA(wa_row_id).
READ TABLE lt_alv INTO wa_alv INDEX wa_row_id-row_id.
IF sy-subrc = 0.
APPEND wa_alv TO lt_alv_sel.
ENDIF.
CLEAR wa_alv.
CLEAR wa_row_id.
ENDLOOP.
*处理选择数据,相同订单、门店、退货日期才可以打印
SORT lt_alv_sel BY ebeln werks eindt.
DATA lv_tabix LIKE sy-tabix.
LOOP AT lt_alv_sel INTO wa_alv.
lv_tabix = sy-tabix.
IF lv_tabix <> 1.
lv_tabix = lv_tabix - 1.
READ TABLE lt_alv_sel INTO DATA(wa_alv_sel) INDEX lv_tabix.
IF NOT ( wa_alv_sel-ebeln = wa_alv-ebeln AND wa_alv_sel-werks = wa_alv-werks AND wa_alv_sel-eindt = wa_alv-eindt ).
flag_error = 'X'.
MESSAGE '导出数据维度不一致' TYPE 'I'.
EXIT.
ENDIF.
ENDIF.
ENDLOOP.
*组装smartform参数,调用smartform
IF flag_error <> 'X'.
DATA lv_head TYPE zspurchase_head.
DATA lt_item TYPE TABLE OF zspurchase_item.
DATA wa_item TYPE zspurchase_item.
READ TABLE lt_alv_sel INTO wa_alv INDEX 1.
IF sy-subrc = 0.
MOVE-CORRESPONDING wa_alv TO lv_head.
ENDIF.
CLEAR wa_alv.
LOOP AT lt_alv_sel INTO wa_alv.
MOVE-CORRESPONDING wa_alv TO wa_item.
wa_item-idx = sy-tabix.
APPEND wa_item TO lt_item.
CLEAR wa_alv.
CLEAR wa_item.
ENDLOOP.
DATA lv_fm_name TYPE rs38l_fnam.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZSMART_F02'
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
fm_name = lv_fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION lv_fm_name
EXPORTING
* ARCHIVE_INDEX =
* ARCHIVE_INDEX_TAB =
* ARCHIVE_PARAMETERS =
* CONTROL_PARAMETERS =
* MAIL_APPL_OBJ =
* MAIL_RECIPIENT =
* MAIL_SENDER =
* OUTPUT_OPTIONS =
* USER_SETTINGS = 'X'
i_head = lv_head
* IMPORTING
* DOCUMENT_OUTPUT_INFO =
* JOB_OUTPUT_INFO =
* JOB_OUTPUT_OPTIONS =
TABLES
t_item = lt_item
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDCASE.
ENDFORM.