dewly_tg 发表于 2015-9-17 13:28:15

SAP 练习alv调用smartforms

   *&---------------------------------------------------------------------*
*& ReportZTEST_ALV_02
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORTZTEST_ALV_02.
INCLUDE ZINC_SF_HELPER .
TABLES:SFLIGHT.
TYPE-POOLS:SLIS.
data:e04_lt_top_of_page type slis_t_listheader.
TYPES:
BEGIN OF IT_OUT,
    CARRID      LIKE   SFLIGHT-CARRID,
    CONNID      LIKE   SFLIGHT-CONNID,
    FLDATE      LIKE   SFLIGHT-FLDATE,
    PRICE         LIKE   SFLIGHT-PRICE,
    SEATSMAX      LIKE   SFLIGHT-SEATSMAX,
END OF IT_OUT.
DATA:
      G_AUDAT(30)   TYPE c,
      G_TITLE(30)   TYPE c.

DATA:
GT_OUT TYPE TABLE OF IT_OUT,
GS_OUT TYPE IT_OUT,
TD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
TH_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
CONTROLS TABCONCTROL TYPE TABLEVIEW USING SCREEN 9000.
PARAMETERS:
P_PRICE TYPE SFLIGHT-PRICE DEFAULT '500'.
SELECT-OPTIONS:
S_FLDATE FOR SFLIGHT-FLDATE.
PARAMETERS:
P1 TYPE C RADIOBUTTON GROUP P_RD,
P2 TYPE C RADIOBUTTON GROUP P_RD.
INITIALIZATION.
S_FLDATE-SIGN = 'I'.
S_FLDATE-OPTION = 'BT'.
S_FLDATE-LOW = '19950228'.
S_FLDATE-HIGH = '20070630'.
APPEND S_FLDATE.
START-OF-SELECTION.
perform frm_get_head_rtn.
PERFORM FRM_SET_FIELDCAT.
PERFORM FRM_GET_DATA.

IF GT_OUT IS INITIAL.
    MESSAGE S888(SABAPDOCU) DISPLAY LIKE 'E' WITH '没有符合条件的数据!'.
    LEAVE LIST-PROCESSING.
ELSE.
    IF P1 = 'X'.
      PERFORM FRM_DISPLAY_ALV.
    ELSEIF P2 = 'X'.
      PERFORM FRM_WRITE_DATA.
    ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*&      Formfrm_get_head_rtn
*&---------------------------------------------------------------------*
FORM frm_get_head_rtn .
G_TITLE = '航班计划表'.
concatenate S_FLDATE-low+0(4)'年'
            S_FLDATE-low+4(2)'月'
            S_FLDATE-low+6(2)'日至'
            S_FLDATE-high+0(4) '年'
            S_FLDATE-high+4(2) '月'
            S_FLDATE-high+6(2) '日'
into G_AUDAT.
ENDFORM.                  " frm_get_head_rtn
*表头页的数据
form TOP_OF_PAGE.
data: ls_line type slis_listheader.
   clear e04_lt_top_of_page.   "清空ALV抬头
   clear e04_lt_top_of_page[].
clear ls_line.
ls_line-typ    = 'S'.
ls_line-info   = G_TITLE.
append ls_line to e04_lt_top_of_page.
call function 'REUSE_ALV_COMMENTARY_WRITE'
         EXPORTING
      it_list_commentary = e04_lt_top_of_page.
endform.                  "top_of_page
*&---------------------------------------------------------------------*
*&      FormFRM_GET_DATA
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
SELECT CARRID CONNID FLDATE PRICE SEATSMAX FROM SFLIGHT INTO TABLE
GT_OUT
    WHERE PRICE > P_PRICE
      AND FLDATE IN S_FLDATE.
ENDFORM.                  " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      FormFRM_WRITE_DATA
*&---------------------------------------------------------------------*
FORM FRM_WRITE_DATA .
WRITE / '航班表'.
ULINE.
WRITE : / '航班价格 > :', P_PRICE.
WRITE: / '时间范围:',S_FLDATE-LOW ,'---',S_FLDATE-HIGH.
ULINE.
WRITE:/5(15)'航线承运人ID' no-gap,
         20(15)'航班连接 Id' no-gap,
         35(10)'航班日期' no-gap,
         50(10)'航空运费' no-gap,
         75(10)'最大容量' no-gap.
LOOP AT GT_OUT INTO GS_OUT.
    WRITE:/5(15)GS_OUT-CARRID,    "航线承运人ID
         20(15) GS_OUT-CONNID,    "航班连接 Id
         35(10) GS_OUT-FLDATE,    "航班日期
         50(10) GS_OUT-PRICE,   "航空运费
         75(10) GS_OUT-SEATSMAX."最大容量
ENDLOOP.
ENDFORM.                  " FRM_WRITE_DATA
*&---------------------------------------------------------------------*
*&      FormFRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
data: ls_event type slis_alv_event.
data: e03_lt_events type slis_t_event.
*显示ALV抬头
call function 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      i_list_type = 0
    IMPORTING
      et_events   = e03_lt_events.
read table e03_lt_events with key name = slis_ev_top_of_page
                           into ls_event.
if sy-subrc = 0.
    move 'TOP_OF_PAGE' to ls_event-form.
    append ls_event to e03_lt_events.
endif.
DATA TH_LAYOUT TYPE SLIS_LAYOUT_ALV.
TH_LAYOUT-COLWIDTH_OPTIMIZE = 'X'."设置ALV表格输出的时候,列宽根据数据长度自动适应
TH_LAYOUT-ZEBRA             = 'X'."设置数据行背景颜色交替显示
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM                =SY-CPROG
      I_CALLBACK_PF_STATUS_SET          = 'FRM_SET_MENU'
      I_CALLBACK_USER_COMMAND         = 'FRM_USER_COMMAND'
      IS_LAYOUT                         = TH_LAYOUT
      IT_EVENTS                         = E03_LT_EVENTS[]
      IT_FIELDCAT                     = TD_FIELDCAT
    TABLES
      T_OUTTAB                        = GT_OUT
   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.                  " FRM_DISPLAY
*&---------------------------------------------------------------------*
*&      FormFRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .
    CLEAR TH_FIELDCAT.
    DEFINE ADDFIELDCAT.
      TH_FIELDCAT-COL_POS      = &1.
      TH_FIELDCAT-FIELDNAME    = &2.
      TH_FIELDCAT-SELTEXT_L    = &3.
      TH_FIELDCAT-JUST         = &4.
   APPEND TH_FIELDCAT TO TD_FIELDCAT.
    END-OF-DEFINITION.
    ADDFIELDCAT 1 'CARRID'    '航线承运人ID' 'L'.
    ADDFIELDCAT 2 'CONNID'    '航班连接ID'   'L'.
    ADDFIELDCAT 3 'FLDATE'    '航班日期'   'L'.
    ADDFIELDCAT 4 'PRICE'   '航空费用'   'L'.
    ADDFIELDCAT 5 'SEATSMAX''最大容量'   'L'.
ENDFORM.                  " FRM_SET_FIELDCAT
*&-------------------------------------------------------------*
*&      Formfrm_set_menu
*&-------------------------------------------------------------*
*       实现ALV自定义状态条的绑定处理
*--------------------------------------------------------------*
form FRM_SET_MENU using rt_extab type slis_t_extab.
set pf-status 'STANDARD'."引号内字符串为状态条对象的名称
endform.                  " FRM_SET_MENU
*&----------------------------------------------------------------*
*&      Formfrm_user_command
*&----------------------------------------------------------------*
*       实现对用户命令的响应
*-----------------------------------------------------------------*
*      -->R_UCOMM    text
*      -->RS_SELFIELD slis_selfield
*-----------------------------------------------------------------*
form FRM_USER_COMMAND using p_ucomm like sy-ucomm selfield type
slis_selfield.
case p_ucomm.
    when 'PRT'."响应自定义工具条中的自定义按钮事件
      if notGT_OUT[] is initial.
      perform frm_print_selected."调用打印输出子程序
      else.
      MESSAGE S888(SABAPDOCU) DISPLAY LIKE 'E' with '没有可打印的数据!'.
      endif.
    when 'BACK' OR 'EXIT' OR 'CANCEL'."返回 退出
      leave program.
endcase.
endform.                  "frm_user_command
*&-----------------------------------------------------------------*
*&      Formfrm_print_selected
*&-----------------------------------------------------------------*
*       实现对SmartForm的调用
*------------------------------------------------------------------*
form frm_print_selected .
*DATA: headername(18) TYPE c.
DATA: itemsname(30) TYPE c.
" 在句柄中加上服务器当前时间作为句柄名称,防止多人同时使用该程序,导致句柄名称相同
*   CONCATENATE 'ZSPMMF1002HD' SY-UZEIT INTO headername .
   CONCATENATE 'ZSPMMF1002IT' SY-UZEIT INTO itemsname.
*savebuffer ig_output_h[] headername. "ig_output_h是保存输出表单表头数据的内表
savebuffer GT_OUT itemsname.
"ig_output_d是保存输出数据明细的内表,与表头数据有关联字段

data: FM_NAME type rs38l_fnam.

call function 'SSF_FUNCTION_MODULE_NAME'
    exporting
      formname = 'ZSFTEST002'"参数传值为要调用的Form名称
    importing
      fm_name= FM_NAME.
if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.

*参数列表与Form中定义的接口对象需完全一致
call function FM_NAME
   exporting
   ptr_items                  = itemsname
   exceptions
   formatting_error         = 1
   internal_error             = 2
   send_error               = 3
   user_canceled            = 4
   others                     = 5.
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.                  " frm_print_selected
页: [1]
查看完整版本: SAP 练习alv调用smartforms