APAP ALV进阶写法及优化详解
作者:百里落云 发布时间:2023-11-21 19:41:07
标签:APAP,ALV,写法优化,进阶
先导
上一期讲了在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%以上的代码是固定的.
自己需要写的地方, 选择屏幕,获取数据 ,数据处理,用户事件,权限. 这四个地方.
来源:https://juejin.cn/post/7140904450901671949


猜你喜欢
- 在使用柱状图时,经常遇到需要多组数据进行比较的情况。绘制单个数据系列的柱形图比较简单,多组数据柱状图绘制的关键有三点:多次调用bar()函数
- 最近在使用tensorflow进行网络训练的时候,需要提取出别人训练好的卷积核的部分层的数据。由于tensorflow中的tensor和py
- 1. sys_getloadavg()sys_getloadavt()可以获得系 统负载情况。该函数返回一个包含三个元素的数组,每个元素分别
- pytorch retain_graph==True的作用说明总的来说进行一次backward之后,各个节点的值会清除,这样进行第二次bac
- 1.第一种就是直接调用 window.print()方法这种方法的坏处就是 默认打印整个页面,不能打印局部页面。2.第二种使用v-print
- 本文实例讲述了Python面向对象程序设计类的封装与继承用法。分享给大家供大家参考,具体如下:访问限制(封装)1、概念面向对象语言的三大特征
- Pycharm要激活至2099年,首先必须要先找到这个东西:JetbrainsCrack-2.6.10-release-enc.jar,我上
- 下面我挑选出的这几个技巧常常会被人们忽略,但它们在日常编程中能真正的给我们带来不少帮助。1. 字典推导(Dictionary compreh
- import timedef block(file,size=65536): while True:&n
- 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列(的一种结构
- pyecharts显示数据为百分比的柱状图pyecharts是做数据分析的好帮手,柱状图比较简单,网站例子不够多,一般柱状图就是直接传两组数
- 本文实例讲述了Python使用sorted排序的方法。分享给大家供大家参考,具体如下:# 例1. 按照元素出现的次数来排序seq = [2,
- 除了常用的csv文件和excel文件之外,我们还可以通过PY把数据保存文npy文件格式和mat文件格式。1. npy文件npy即numpy对
- inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换,而且inet_pton和inet_nto
- 输出用print加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world',用代码实现如下:>&g
- 前言最近在功能性测试的过程中,需要在Python环境下用OpenCV读取网络摄像头的视频流,接着用目标检测器进行视屏帧的后续处理。在测试过程
- 空mysqll表内容常见的有两种方法:一种delete,一种是truncate 。 不带where参数的delete语句可以删除mysql表
- 本文实例为大家分享了js实现简单放大镜特效的具体代码,供大家参考,具体内容如下先来看看效果:写放大镜之前我们先来了解一下定位:通常子绝父相
- 今天帮朋友做个python的小工具,发现系统上缺少ptyhon的支持库,返回如下信息ImportError: No module named
- 前言本文主要给大家介绍了关于Golang map生成有序json数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:先来看一段