登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

忆风的博客

http://www.cnblogs.com/dhjdhja

 
 
 

日志

 
 
 
 

ALV事件打印弹出窗体  

2011-06-11 16:45:01|  分类: SAP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

给ALV加工具栏和按钮。

先添加一个GUI状态,点击工具栏的“显示对象清单”,右键菜单“Create->GUI Status”,新建一个工具栏。
或在系统自带的ALV中COPY一个,/ose38 然后输入“BCALV*”按F4,然后找一个COPY。
工具栏的“菜单栏”或“应用工具条”中添加按钮。

显示工具栏
在ALV中设置  i_callback_pf_status_set    = 'PF_STATUS_SET' 
  *工具栏
FORM pf_status_set USING pt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STATUS002'.
ENDFORM.   

添加按钮事件  i_callback_user_command     = 'PROCESS_USER_COMMAND'

  *按钮事件
FORM process_user_command USING pr_ucomm LIKE sy-ucomm
                            ps_selfield TYPE slis_selfield.
*  屏幕自动刷新
  DATA: lob_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lob_grid.
  CALL METHOD lob_grid->check_changed_data.
  ps_selfield-refresh = 'X'.
  CASE pr_ucomm.
    WHEN '&IC1'."双击事件。
      CLEAR w_loop.
      w_loop = ps_selfield-tabindex.
      READ TABLE my_makt INDEX ps_selfield-tabindex INTO wa_makt.
      PERFORM double_click.
    WHEN 'SEL'.
      LOOP AT my_makt.
        my_makt-checkbox = 'X'.
        MODIFY my_makt.
      ENDLOOP.
    WHEN 'UNSEL'.
      LOOP AT my_makt.
        my_makt-checkbox = ' '.
        MODIFY my_makt.
      ENDLOOP.
    WHEN 'SAVE'.
      PERFORM save_click.
    WHEN 'PRINT'.
      PERFORM display_form.
  ENDCASE.
  CLEAR: pr_ucomm.
*  屏幕自动刷新
  ps_selfield-refresh = 'X'.
ENDFORM.                    "process_user_command

 

添加窗体
se51
输入和se38一样的程序名,输入屏幕编号点创建。
点击“格式”进入设计页面。
文本框之类在名称中输入ALV中的变量或内表字段,就可以把值直接显示过来。
按钮中输入“功能码”,用于按钮事件中判断哪个按钮点击,程序中功能码注意大写。保存激活。
在元素清单中为“OK”添加名称“OK_CODE”。
在逻辑流中去掉PBO和PAI的注释,双击在主程序中生成PBO和PAI的代码。
PROCESS BEFORE OUTPUT.
MODULE STATUS_1001.“LOAD
PROCESS AFTER INPUT.
MODULE USER_COMMAND_1001."按钮事件

用代码  CALL SCREEN 1001 STARTING AT 27 5
                    ENDING AT 60 12. 调用窗体。
默认会显示ALV中的工具栏,需要为窗体建自己的工具栏(同上),可将“应用工具栏”中的按钮都删除。在窗体LOAD中加入设置工具栏代码。窗体属性中需选中“Withou application toolbar”。

 

创建打印报表smartforms
事件代码smartforms
选择表格输入报表名创建。
“表格接口”用于接收程序中的变量或内表。建好中字段列表中可看到。
在新页面中新建窗体,在新窗体中新建文本设置报表表头。
在MAIN主窗口中新建表格显示数据。
选择新建的表,在右面的表中点细节设置表列。
在表头中新建表行,选择刚才建的表列,在每列中设置列名。
在主要区域中新建表行,每列中新建文本。将字段列表中的字段拖到文本中。
保存激活。
不能拖动的解决方法
在se38中运行“RSCPSETEDITOR”去掉“SAPscript”和"Smart Forms"的打钩,点击“Activate”即可。
程序中调用

     DATA: fm_name TYPE rs38l_fnam.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname                 = 'ZDTFORMTEST1'   "报表名
*   VARIANT                  = ' '
*   DIRECT_CALL              = ' '
   IMPORTING
     fm_name                  = fm_name
* EXCEPTIONS
*   NO_FORM                  = 1
*   NO_FUNCTION_MODULE       = 2
*   OTHERS                   = 3
            .
  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 fm_name
    EXPORTING
      title             = '练习'  "表格接口变量
    TABLES
      my_makt           = my_makt   "表格接口内表
    EXCEPTIONS
      formamtting_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.

 

 

以下是完整的程序代码

*&---------------------------------------------------------------------*
*& Report  ZDTALVTEST1
*&
*&---------------------------------------------------------------------*
*&练习
*&dhj
*&---------------------------------------------------------------------*
REPORT  zdtalvtest1.
*变量定义
TABLES: makt.
DATA: BEGIN OF my_makt OCCURS 0.
        INCLUDE STRUCTURE makt.
        DATA: checkbox(01).
DATA: END OF my_makt.
DATA: it_makt LIKE TABLE OF makt WITH HEADER LINE.
DATA: w_loop LIKE sy-tabix.
DATA: wa_makt LIKE LINE OF my_makt.
DATA: ok_code LIKE sy-ucomm.
* ALV stuff 定义--通用
TYPE-POOLS: slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
      gs_layout   TYPE slis_layout_alv,
      gt_sort     TYPE slis_t_sortinfo_alv,
      gt_list_top_of_page TYPE slis_t_listheader.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
*用户输入框
SELECT-OPTIONS: s_matnr FOR makt-matnr.
*初始值
INITIALIZATION.
  s_matnr-sign = 'I'.
  s_matnr-option = 'BT'.
  s_matnr-low = 'AS-10'.
  s_matnr-high = 'AS-30'.
  APPEND s_matnr.
*主程序逻辑开始
START-OF-SELECTION.
  PERFORM read_data.
  PERFORM alv_grid.
*  PERFORM display_form.
*主程序逻辑结束
END-OF-SELECTION.
*过程定义
FORM read_data .
  SELECT *
    UP TO 20 ROWS
    INTO CORRESPONDING FIELDS OF TABLE my_makt
    FROM makt
    WHERE makt~matnr IN s_matnr.
*表操作
*  CLEAR it_makt.
*  REFRESH it_makt[].
*  LOOP AT my_makt.
*    MOVE-CORRESPONDING my_makt TO it_makt.
*    APPEND it_makt.
*  ENDLOOP.
*  APPEND LINES OF my_makt to it_makt.
ENDFORM.                    " READ_DATA
*---------------------------------------------------------------
* FORM alv_grid
*---------------------------------------------------------------
FORM alv_grid.
  IF gt_fieldcat[] IS INITIAL.
    PERFORM fieldcat_init.
    PERFORM layout_init.
  ENDIF.
  PERFORM grid_display.
ENDFORM.                    "alv_grid
*---------------------------------------------------------------
* FORM fieldcat_init 显示字段 字段必须大写
*---------------------------------------------------------------
FORM fieldcat_init.
  PERFORM append_fc_alv USING: 'MATNR' 'X' '物料号'  20 'N' 1 '' '',
                               'SPRAS' 'X'  '语言'  10  '' 2 '' '',
                               'MAKTX' ''  '描述1'      10  '' 4 '' '',
                               'MAKTG' ''  '描述2'      10  '' 3 '' '',
                               'CHECKBOX' ''  '选择'      10  '' 10 'X' 'X'.
ENDFORM.                    "fieldcat_init
*---------------------------------------------------------------
* FORM append_fc_alv  显示字段参数
*---------------------------------------------------------------
FORM append_fc_alv  USING    fieldname    TYPE slis_fieldcat_alv-fieldname
                             key          TYPE slis_fieldcat_alv-key
                             reptext_ddic TYPE slis_fieldcat_alv-reptext_ddic
                             outputlen    TYPE slis_fieldcat_alv-outputlen
                             inttype      TYPE slis_fieldcat_alv-inttype
                             col_pos      TYPE sy-cucol
                             checkbox     TYPE slis_fieldcat_alv-checkbox
                             edit         TYPE slis_fieldcat_alv-edit.
  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = fieldname.
  ls_fieldcat-key          = key.   "程序中打“X”就是主键
  ls_fieldcat-reptext_ddic = reptext_ddic.
  ls_fieldcat-outputlen    = outputlen.
  ls_fieldcat-inttype      = inttype.
  ls_fieldcat-col_pos      = col_pos.
  ls_fieldcat-checkbox      = checkbox.
  ls_fieldcat-edit      = edit.
  APPEND ls_fieldcat TO gt_fieldcat.
ENDFORM.                    " append_fc_alv
*---------------------------------------------------------------
* FORM layout_init
*---------------------------------------------------------------
FORM layout_init.
  gs_layout-zebra             = 'X'.
  gs_layout-cell_merge        = 'X'.
  gs_layout-colwidth_optimize = 'X'.
  gs_layout-no_vline          = ' '.
  gs_layout-totals_before_items = ' '.
ENDFORM.                    " layout_init
*---------------------------------------------------------------
* FORM grid_display 显示数据
*---------------------------------------------------------------
FORM grid_display.
  DATA : l_funame TYPE rs38l_fnam.  " LIKE HEADER_FB-NAME.
  l_funame = 'REUSE_ALV_GRID_DISPLAY'.
  CALL FUNCTION l_funame
    EXPORTING
      is_layout                   = gs_layout
      it_fieldcat                 = gt_fieldcat
      i_callback_program          = sy-repid
      i_callback_pf_status_set    = 'PF_STATUS_SET'
*      i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
      i_callback_user_command     = 'PROCESS_USER_COMMAND'
      i_default                   = ' '
      i_save                      = 'X'
    TABLES
      t_outtab                    = my_makt
    EXCEPTIONS
      program_error               = 1
      OTHERS                      = 2.
*  CLEAR: my_makt.
*  REFRESH: my_makt[].
ENDFORM.                    "grid_display
*工具栏
FORM pf_status_set USING pt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STATUS002'.
ENDFORM.                    "pf_status_set
*按钮事件
FORM process_user_command USING pr_ucomm LIKE sy-ucomm
                            ps_selfield TYPE slis_selfield.
*  屏幕自动刷新
  DATA: lob_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lob_grid.
  CALL METHOD lob_grid->check_changed_data.
  ps_selfield-refresh = 'X'.
  CASE pr_ucomm.
    WHEN '&IC1'.
      CLEAR w_loop.
      w_loop = ps_selfield-tabindex.
      READ TABLE my_makt INDEX ps_selfield-tabindex INTO wa_makt.
      PERFORM double_click.
    WHEN 'SEL'.
      LOOP AT my_makt.
        my_makt-checkbox = 'X'.
        MODIFY my_makt.
      ENDLOOP.
    WHEN 'UNSEL'.
      LOOP AT my_makt.
        my_makt-checkbox = ' '.
        MODIFY my_makt.
      ENDLOOP.
    WHEN 'SAVE'.
      PERFORM save_click.
    WHEN 'PRINT'.
      PERFORM display_form.
  ENDCASE.
  CLEAR: pr_ucomm.
*  屏幕自动刷新
  ps_selfield-refresh = 'X'.
ENDFORM.                    "process_user_command
*调用打印的smartforms中的ZDTFORMTEST1
FORM display_form.
  DATA: fm_name TYPE rs38l_fnam.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname                 = 'ZDTFORMTEST1'
*   VARIANT                  = ' '
*   DIRECT_CALL              = ' '
   IMPORTING
     fm_name                  = fm_name
* EXCEPTIONS
*   NO_FORM                  = 1
*   NO_FUNCTION_MODULE       = 2
*   OTHERS                   = 3
            .
  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 fm_name
    EXPORTING
      title             = '练习'
    TABLES
      my_makt           = my_makt
    EXCEPTIONS
      formamtting_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.                    "display_form
*保存事件
FORM save_click.
*    UPDATE makt FROM TABLE my_makt.
  CLEAR it_makt.
  REFRESH it_makt[].
  LOOP AT my_makt WHERE checkbox = 'X'.
      MOVE-CORRESPONDING my_makt TO it_makt.
      APPEND it_makt.
  ENDLOOP.
  UPDATE makt FROM TABLE it_makt.
*  read table my_makt into it_makt with key checkbox = 'X'."只复制表头
*  CLEAR it_makt.
*  REFRESH it_makt[].
*  LOOP AT my_makt.
*    IF my_makt-checkbox = 'X'.
*      MOVE-CORRESPONDING my_makt TO it_makt.
*      APPEND it_makt.
*    ENDIF.
*  ENDLOOP.
*  UPDATE makt FROM TABLE it_makt.
*  APPEND LINES OF my_makt to it_makt.
ENDFORM.
*调用窗体
FORM double_click.
  CALL SCREEN 1001 STARTING AT 27 5
                    ENDING AT 60 12.
*  CALL SCREEN 1001.
ENDFORM.                    "double_click
*窗体初始化
MODULE status_1001 OUTPUT.
  SET PF-STATUS '001'.
*  SET TITLEBAR 'xxx'.
ENDMODULE.                 " STATUS_1001  OUTPUT
*----------------------------------------------------------------------*
*  MODULE USER_COMMAND_1001 INPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
*  BREAK-POINT.
  CASE ok_code.
    WHEN 'BTNOK'.
      wa_makt-checkbox = 'X'.
      MODIFY my_makt FROM wa_makt INDEX w_loop.
      LEAVE TO SCREEN 0.
    WHEN 'NO' OR '&F12' OR '&F03' OR 'BACK' OR 'EXIT' OR 'CANCEL' OR 'BTNC'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_1001  INPUT

  评论这张
 
阅读(853)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018