APAP ALV进阶写法及优化详解

作者:百里落云 时间:2023-11-21 19:41:07 

先导

上一期讲了在ABAP中,ALV的普通写法,流程以及相关属性,还讲了基本DEMO ,但是在真正开发中,不会写这么多的代码.原则上是一切从简. o( ̄︶ ̄)oo( ̄︶ ̄)o.今天讲下如何用少的代码,标准套路,实现ALV基本功能,满足开发生产需求.

流程搭建

万变不离其宗,首先书写的还是流程,比如让你写一个某某查询报表. 上来啥都不用想你先这么写

*数据准备
*常规定义变量,内表结构,工作区,内表,包。。。。
你的代码
*系统变量准备
*如layout,fieldcat 等 系统变量
你的代码
*选择屏幕
你的代码
*INITIALIZATION
*at SELECTION-SCREEN .
"START-OF-SELECTION
"End-OF-SELECTION .
“子例程及自定义宏

流程讲解

APAP ALV进阶写法及优化详解

INITIALIZATION.

APAP ALV进阶写法及优化详解

该事件在屏幕未显示之前执行,对程序设置值及屏幕元素进行初始化赋值。一般作用就是初始值设定,如选择屏幕的数据赋值,默认参数赋值等。

at SELECTION-SCREEN!

APAP ALV进阶写法及优化详解

1:选择屏幕事件,有很多参数,代表不同的扩展信息

2:在这个事件响应中,可以对屏幕字段进行有效性检验,控制屏幕元素的属性等。

START-OF-SELECTION

该事件在单击按钮后触发,一般是数据初始化,数据处理操作的地方

APAP ALV进阶写法及优化详解

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

标签:APAP,ALV,写法优化,进阶
0
投稿

猜你喜欢

  • 分享unittest单元测试框架中几种常用的用例加载方法

    2023-04-25 06:53:34
  • Python用模块pytz来转换时区

    2021-05-27 20:09:32
  • python保存字典数据到csv文件的完整代码

    2023-04-09 17:02:02
  • 在ASP中连接使用数据库

    2007-09-22 10:46:00
  • SQLSERVER服务手工启动 批处理文件

    2024-01-13 00:37:18
  • python机器学习理论与实战(五)支持向量机

    2021-11-27 11:36:30
  • Go语言带缓冲的通道实现

    2024-02-08 18:34:13
  • python3使用diagrams绘制架构图的步骤

    2022-08-27 12:42:34
  • Python中import导入上一级目录模块及循环import问题的解决

    2021-09-16 00:53:44
  • PHP设计模式之观察者模式浅析

    2023-05-27 12:20:11
  • SQL Server中通过扩展存储过程实现数据库的远程备份与恢复

    2024-01-17 14:38:41
  • python 多进程并行编程 ProcessPoolExecutor的实现

    2023-10-23 14:41:56
  • Django + Uwsgi + Nginx 实现生产环境部署的方法

    2023-01-01 06:02:49
  • Python实现二维有序数组查找的方法

    2021-04-15 21:31:38
  • Python3中使用PyMongo的方法详解

    2023-08-19 16:00:58
  • VS Code安装go插件失败原因分析以及解决方案

    2024-04-26 17:24:08
  • PHP析构函数destruct与垃圾回收机制的讲解

    2023-07-11 21:05:36
  • 10分钟彻底搞懂Http的强制缓存和协商缓存(小结)

    2024-04-17 10:09:08
  • SpringBoot配置连接两个或多个数据库的实现

    2024-01-14 14:40:36
  • Python+Pygame实战之24点游戏的实现

    2023-11-07 21:14:12
  • asp之家 网络编程 m.aspxhome.com