APAP ALV写法优化
百里落云 人气:0先导
上一期讲了在ABAP中,ALV的普通写法,流程以及相关属性,还讲了基本DEMO ,但是在真正开发中,不会写这么多的代码.原则上是一切从简. o( ̄︶ ̄)oo( ̄︶ ̄)o.今天讲下如何用少的代码,标准套路,实现ALV基本功能,满足开发生产需求.
流程搭建
万变不离其宗,首先书写的还是流程,比如让你写一个某某查询报表. 上来啥都不用想你先这么写
*数据准备 *常规定义变量,内表结构,工作区,内表,包。。。。 你的代码 *系统变量准备 *如layout,fieldcat 等 系统变量 你的代码 *选择屏幕 你的代码 *INITIALIZATION *at SELECTION-SCREEN . "START-OF-SELECTION "End-OF-SELECTION . “子例程及自定义宏
流程讲解
INITIALIZATION.
该事件在屏幕未显示之前执行,对程序设置值及屏幕元素进行初始化赋值。一般作用就是初始值设定,如选择屏幕的数据赋值,默认参数赋值等。
at SELECTION-SCREEN!
1:选择屏幕事件,有很多参数,代表不同的扩展信息
2:在这个事件响应中,可以对屏幕字段进行有效性检验,控制屏幕元素的属性等。
START-OF-SELECTION
该事件在单击按钮后触发,一般是数据初始化,数据处理操作的地方
End-OF-SELECTION .
该事件应用于所有数据选择处理完成,
即START-OF-SELECTION相关执行事件执行完成,
但输出屏幕还未显示之前 在实际的应用于一些执行结果的检验等。
一般做为ALV展示及用户操作按钮事件等。
演练
这里写一个简单的物料明细查询报表 ,知识点用到了,宏,循环,opensql,用户事件等内容。
数据准备
TABLES : MARA . *数据准备 "定义结构 TYPES : BEGIN OF gw_Data , MATNR TYPE MATNR , MEINS TYPE MEINS , MAKTX TYPE MAKTX , end of gw_Data . "定义工作区及内表 data : gs_data TYPE gw_Data . data :gt_data TYPE table of gw_Data . "alv 数据 *--------------------------------------------------------------------* * 通用ALV变量 *--------------------------------------------------------------------* DATA: wa_layout TYPE lvc_s_layo. DATA:wa_fieldcat TYPE lvc_s_fcat, gt_fieldcat TYPE lvc_t_fcat. DATA:gs_glay TYPE lvc_s_glay. DATA : gv_error TYPE c. DATA : BS1 TYPE C.
选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK BLOCK WITH FRAME TITLE TEXT-001 . PARAMETERS p_p1 TYPE mara-matnr OBLIGATORY. "料号 SELECTION-SCREEN END OF BLOCK BLOCK .
INITIALIZATION .
INITIALIZATION . %_p_p1_%_app_%-text = '物料号'. "设定选择屏幕初始化名称
at SELECTION-SCREEN .
at SELECTION-SCREEN . PERFORM check_auth . "权限检查
START-OF-SELECTION .
START-OF-SELECTION . PERFORM get_DAta . "获取数据属性
END-OF-SELECTION .
End-OF-SELECTION . PERFORM diaplay_data. "展示alv
子程序和宏
以下程序都使用新语法.不懂新语法后续会出相关内容
"获取数据子程序 FORM get_DAta . select a~matnr,a~MEINS,b~maktx from mara as a inner join makt as b on a~matnr = b~MATNR where a~ZMATNR = @p_p1 into table @data(lt_outdata) . ENDFORM . *展示alv 子程序 直接复制 FORM diaplay_data . PERFORM set_alv_layout. "样式设定 PERFORM bulid_fieldcat. "格式设定 PERFORM call_alv_func. "alv 函数 ENDFORM. "样式设定 直接复制 FORM set_alv_layout . CLEAR: wa_layout. wa_layout-zebra = 'X'. "斑马线 wa_layout-cwidth_opt = 'X'. "自动列宽 ENDFORM. "格式设定 固定换数 FORM bulid_fieldcat . DEFINE add_col. * ADD 1 TO pos. * lw_fieldcat-col_pos = pos. wa_fieldcat-fieldname = &1. wa_fieldcat-ref_field = &2. wa_fieldcat-ref_table = &3. wa_fieldcat-scrtext_l = &4. wa_fieldcat-outputlen = &5. wa_fieldcat-no_zero = &6. wa_fieldcat-edit = &7. wa_fieldcat-edit_mask = &8. wa_fieldcat-key = &9. CASE wa_fieldcat-fieldname. WHEN 'slbox'. wa_fieldcat-checkbox = 'X' . wa_fieldcat-edit = 'X' . wa_fieldcat-edit_mask = 'X'. WHEN OTHERS. ENDCASE . APPEND wa_fieldcat TO gt_fieldcat. CLEAR : wa_fieldcat. END-OF-DEFINITION. REFRESH: gt_fieldcat. "add_col 'matnr' space space '物料号' space space space space space. add_col 'MEINS' space space '单位' space space space space space. add_col 'maktx' space space '物料名' space space space space space. ENDFORM. "刷新 固定复制 FORM refresh_alv . DATA: lo_grid TYPE REF TO cl_gui_alv_grid, lw_stable TYPE lvc_s_stbl. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lo_grid. lw_stable-row = 'X'. lw_stable-col = 'X'. lo_grid->refresh_table_display( EXPORTING is_stable = lw_stable EXCEPTIONS finished = 1 OTHERS = 2 ). ENDFORM. "固定,只需要传内表就行 FORM call_alv_func . gs_glay-edt_cll_cb = abap_true. " 选中复选款,立刻触发data changed 事件 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid "回调程序 i_callback_pf_status_set = 'SET_PF_STATUS' i_callback_user_command = 'USER_COMMAND' i_grid_settings = gs_glay is_layout_lvc = wa_layout it_fieldcat_lvc = gt_fieldcat "需要显示的内表的列 i_save = 'A' TABLES t_outtab = lt_outdata "需要显示的数据 EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. ENDIF. ENDFORM. "staus 工具栏 直接复制 FORM set_pf_status USING rt_extab TYPE slis_t_extab. DATA : lw_tab LIKE LINE OF rt_extab. REFRESH rt_extab. SET PF-STATUS 'STD' EXCLUDING rt_extab. ENDFORM. "用户事件 ,这里没写. 但是如果设定函数双击会apap dump FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE r_ucomm. * 导入 WHEN '&IMPLE'. ENDCASE. ENDFORM. "权限检查,按照不同的情况调用不同的函数,这里需要更换. *&---------------------------------------------------------------------* *& Form check_auth *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM check_auth . "select SINGLE WERKS, KUNNR into @data(ls_t001w) from t001w WHERE WERKS = @p_p1 . AUTHORITY-CHECK OBJECT 'M_MSEG_WMB' ID 'ACTVT' DUMMY ID 'WERKS' FIELD p_p1 . IF sy-subrc <> 0. * Implement a suitable exception handling here ENDIF. ENDFORM.
以上就为一个alv 的写法 ,其中 70%以上的代码是固定的.
自己需要写的地方, 选择屏幕,获取数据 ,数据处理,用户事件,权限. 这四个地方.
总结
相比较上一个demo 这个例子代码少了很多, 但是比其他语言来讲还是太复杂了.
大部分还是套路,固定这么写,就可以. 主要还是在程序及逻辑操作上.
使用新语法可以减少很多不必要的操作,比如定义结构,内表,关联等.
加载全部内容