可编辑的 SALV 模型(克服 SALV 模型的限制)

我们都知道 ABAP Object 比传统的 ABAP 非常强大。在这里,我想分享我使用 ABAP 对象克服 SALV mdoel 限制的最佳实验之一。

起源

最初,我在 SCN 上发布了这篇文章 – ABAP 对象的强大功能:克服 SALV 模型的限制,它也受到了很多批评和赞扬。当 SCN 迁移到新系统时,代码片段格式丢失。所以,我决定将其与格式一起移动到此处。

背景

我正在阅读 CL_SALV_TABLE 上的帮助,以更深入地了解如何有效地使用这个新的 SALV 模型。当我看到 Recommendation and Restriction 部分时,我惊讶地读到“Tables displayed with ALV are not ready for input”。

在这里插入图片描述
我很难理解这个限制,因为:新的 SALV 模型是统一的面向对象模型,它有某种包装类,最终将 FM 称为 REUSE_ALV_GRID_DISPLAYREUSE_ALV_LIST_DISPLAY;类 GL_GUI_ALV_GRID 等。那么,如果使用 CL_GUI_ALV_GRID 创建的 ALV 可以准备好输入,为什么使用 SALV 模型创建的 ALV 不能是“准备好输入”呢?这促使我分析如何将 ALV 全屏设置为“Set ready for Input”。

寻找解决方案的旅程

通过设置断点和调试,我了解到,当我尝试生成全屏 ALV 时,它会调用 FM REUSE_ALV_GRID_DISPLAY,而该 FM 反过来使用类 CL_GUI_ALV_GRID 来生成 ALV。

几个月前,我遇到了一个非常强大的函数模块 GET_GLOBALS_FROM_SLVC_FULLSCR 它为我们提供了 GL_GUI_ALV_GRID 类型的对象,该对象是为了生成全屏 ALV 而创建的。我已经在几个程序中使用了这个 FM 来实现一些使用 FM REUSE_ALV_GRID_DISPLAY 无法实现的功能。包括了如下这些:

  • 通过在全屏 ALV 中按 Enter 键将光标移动到下一行
  • 全屏 ALV:禁用键盘的 DELTE 键
  • 全屏 ALV:更改小计
  • 回复:我们可以滚动到 alv 网格的最后一页吗?

基本上,为了实现全屏 ALV 的这种无法实现的功能,我使用 FM GET_GLOBALS_FROM_SLVC_FULLSCR 获取对象,并使用 CL_GUI_GRID_DISPLAY 中可用的方法,然后使用 refresh 方法来刷新 ALV。

基于假设 – 如果我从 SALV 模型获取 ALV 对象,那么我可以将 SALV 模型 ALV 设置为“Set Ready for input” – 我已开始在 SALV 模型中搜索 ALV 对象。在 SALV 模型 CL_SALV_MODEL 的最顶层节点,我得到了可以为我提供 ALV Grid 对象的方法 (GET_GRID)。

UML 图包含 SALV 层次结构和R_CONTROLLER的可见性:

在这里插入图片描述
CL_SALV_MODEL 有一个 protected 属性 R_CONTROLLER 它包含我访问 GRID 对象所需的一切。所以,我尝试直接访问该属性,但显然我没有工作,因为我没有 CL_SALV_MODEL 的对象引用。到这个时候,我已经尝试了所有正常的方法来访问R_CONTROLLER - 比如 Feild 符号从内存中访问对象,但这也不起作用。

解决方法

我知道我必须以不同的方式思考,我尝试从 CL_SALV_MODEL_LIST 类继承该类,将 ALV 模型传递给该类,并尝试访问 R_CONTROLLERBINGO——我能够访问我继承的类中的 R_CONTROLLER

UML 图显示了 iherited 类以及现有的 SALV 模型:

在这里插入图片描述

要遵循的步骤:

  1. CL_SALV_MODEL_LIST 继承到本地类 LCL_SALV_MODEL
  2. 生成 SALV 模型以生成 ALV 对象
  3. 使 narrow casting 从 ALV 对象获取 CL_SALV_MODEL 对象
  4. 将此 CL_SALV_MODEL 对象传递给继承的类 LCL_SALV_MODEL。由于 LCL_SALV_MODEL 是从 CL_SALV_MODEL_LIST 继承的,因此它允许我访问 CL_SALV_MODELR_CONTROLLER
  5. 从对象 MODEL -> Controller -> Adapter -> Grid 获取 GRID 对象。
  6. 为 EDIT 设置布局并刷新 ALV。

当我们运行报告时,ALV 不会直接进入输入模式:

在这里插入图片描述
一旦我们按下“My Function”按钮,ALV 就会变成可编辑的 ALV。此 ALV 将具有其单独的 GUI 状态,其中包含可编辑 ALV 所需的所有按钮。

在这里插入图片描述

UML 图

代码片段的 UML 图:

在这里插入图片描述
以下是我用于从 SALV 模型获取 GRID 对象访问权限并使 ALV 可编辑的代码。在这里,我使用了报告程序 SALV_DEMO_TABLE_EVENTS 中提供的 PF-STATUS,以便轻松运行此演示报表。

*&---------------------------------------------------------------------*
*& Report  ZTEST_NP_EDIT_SALV
*& Overcome the restriction of the SALV model using the power of the
*&   Object Oriented ABAP
*&---------------------------------------------------------------------*
REPORT  ztest_np_edit_salv.
*----------------------------------------------------------------------*
*  Define the Local class inheriting from the CL_SALV_MODEL_LIST
*  to get an access of the model, controller and adapter which inturn
*  provides the Grid Object
*----------------------------------------------------------------------*
CLASS lcl_salv_model DEFINITION INHERITING FROM cl_salv_model_list.PUBLIC SECTION.DATA: o_control TYPE REF TO cl_salv_controller_model,o_adapter TYPE REF TO cl_salv_adapter.METHODS:grabe_modelIMPORTINGio_model TYPE REF TO cl_salv_model,grabe_controller,grabe_adapter.PRIVATE SECTION.DATA: lo_model TYPE REF TO cl_salv_model.
ENDCLASS.                    "LCL_SALV_MODEL DEFINITION
*----------------------------------------------------------------------*
* Event handler for the added buttons
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.PUBLIC SECTION.METHODS:on_user_command FOR EVENT added_function OF cl_salv_eventsIMPORTING e_salv_function.
ENDCLASS.                    "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* Local Report class - Definition
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.PUBLIC SECTION.TYPES: ty_t_sflights TYPE STANDARD TABLE OF sflights.DATA: t_data TYPE ty_t_sflights.DATA: o_salv       TYPE REF TO cl_salv_table.DATA: o_salv_model TYPE REF TO lcl_salv_model.METHODS:get_data,generate_output.
ENDCLASS.                    "lcl_report DEFINITION
*----------------------------------------------------------------------*
* Global data
*----------------------------------------------------------------------*
DATA: lo_report TYPE REF TO lcl_report.
*----------------------------------------------------------------------*
* Start of selection
*----------------------------------------------------------------------*
START-OF-SELECTION.CREATE OBJECT lo_report.lo_report->get_data( ).lo_report->generate_output( ).
*----------------------------------------------------------------------*
* Local Report class - Implementation
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.METHOD get_data.
*   test dataSELECT * FROM sflightsINTO TABLE me->t_dataUP TO 30 ROWS.ENDMETHOD.                    "get_dataMETHOD generate_output.
*...New ALV Instance ...............................................TRY.cl_salv_table=>factory(EXPORTING
*             r_container    = w_alv1list_display = abap_falseIMPORTINGr_salv_table = o_salvCHANGINGt_table      = t_data ).CATCH cx_salv_msg.                                "#EC NO_HANDLERENDTRY.
*...PF Status.......................................................
*   Add MYFUNCTION from the report SALV_DEMO_TABLE_EVENTSo_salv->set_screen_status(pfstatus      =  'SALV_STANDARD'report        =  'SALV_DEMO_TABLE_EVENTS'set_functions = o_salv->c_functions_all ).
*...Event handler for the button.....................................DATA: lo_events TYPE REF TO cl_salv_events_table,lo_event_h TYPE REF TO lcl_event_handler.
* event objectlo_events = o_salv->get_event( ).
* event handlerCREATE OBJECT lo_event_h.
* setting up the event handlerSET HANDLER lo_event_h->on_user_command FOR lo_events.
*...Get Model Object ...............................................DATA: lo_alv_mod TYPE REF TO cl_salv_model.
*   Narrow castinglo_alv_mod ?= o_salv.
*   object for the local inherited class from the CL_SALV_MODEL_LISTCREATE OBJECT o_salv_model.
*   grabe model to use it laterCALL METHOD o_salv_model->grabe_modelEXPORTINGio_model = lo_alv_mod.
*...Generate ALV output ...............................................o_salv->display( ).ENDMETHOD.                    "generate_output
ENDCLASS.                    "lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
* LCL_SALV_MODEL implementation
*----------------------------------------------------------------------*
CLASS lcl_salv_model IMPLEMENTATION.METHOD grabe_model.
*   save the modello_model = io_model.ENDMETHOD.                    "grabe_modelMETHOD grabe_controller.
*   save the controllero_control = lo_model->r_controller.ENDMETHOD.                    "grabe_controllerMETHOD grabe_adapter.
*   save the adapter from controllero_adapter ?= lo_model->r_controller->r_adapter.ENDMETHOD.                    "grabe_adapter
ENDCLASS.                    "LCL_SALV_MODEL IMPLEMENTATION
*----------------------------------------------------------------------*
* Event Handler for the SALV
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.METHOD on_user_command.DATA: lo_grid TYPE REF TO cl_gui_alv_grid,lo_full_adap TYPE REF TO cl_salv_fullscreen_adapter.DATA: ls_layout TYPE lvc_s_layo.CASE e_salv_function.
*     Make ALV as Editable ALVWHEN 'MYFUNCTION'.
*       ContorllerCALL METHOD lo_report->o_salv_model->grabe_controller.
*       AdapterCALL METHOD lo_report->o_salv_model->grabe_adapter.
*       Fullscreen Adapter (Down Casting)lo_full_adap ?= lo_report->o_salv_model->o_adapter.
*       Get the Gridlo_grid = lo_full_adap->get_grid( ).
*       Got the Grid .. ?IF lo_grid IS BOUND.
*         Editable ALVls_layout-edit = 'X'.
*         Set the front layout of ALVCALL METHOD lo_grid->set_frontend_layoutEXPORTINGis_layout = ls_layout.
*         refresh the tableCALL METHOD lo_grid->refresh_table_display.ENDIF.ENDCASE.ENDMETHOD.                    "on_user_command
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/20191.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

通过shell脚本分析部署nginx网络服务(详细易懂)

通过shell脚本分析部署nginx网络服务 要求: 接收用户部署的服务名称判断服务是否安装 已安装;自定义网站配置路径为/www;并创建共享目录和网页文件;重启服务 没有安装;安装对应的软件包测试: 判断服务是否…

H.265流媒体播放器EasyPlayer.js H5流媒体播放器如何验证视频播放是否走硬解

随着技术的不断进步和5G网络的推广,中国流媒体播放器行业市场规模以及未来发展趋势都将持续保持稳定的增长,并将在未来几年迎来新的发展机遇。流媒体播放器将继续作为连接内容创作者和观众的重要桥梁,推动数字媒体产业的创新和发展。 EasyPla…

【 LVGL】用外部FLASH存储字库并显示

LVGL–用外部FLASH存储字库并显示 应用场景 由于使用的芯片内部FLASH空间有限,如果仅使用英文字库并用不了多少空间,但是项目需要支持中英文字库,中文字库添加2w字左右,10px大小就要1M多了,内部空间根本不够用&#…

含284个数据集,覆盖18项临床任务,上海AI Lab等发布多模态医疗基准GMAI-MMBench

「有这样一台智能医疗设备,患者只需躺在智能医疗设备上便可完成从扫描、诊断、治疗、修复的全过程,实现健康的重启」。这是 2013 年上映的科幻电影「极乐空间」中的一个情节。 电影《极乐空间》场景 如今,随着人工智能技术的飞速发展&#xf…

Java-04

目录 Redis如何实现延时队列 延时队列的组成 生产消息 消费消息 实现细节 Redis集群 Integer.compare(a[1], b[1]))与a[1] - b[1]) 设计模式​编辑 算法 Redis如何实现延时队列 使用 sortedset ,拿时间戳作为 score ,消息内容作为 key 调用 zad…

【C++】— 掌握STL vector 类:“Vector简介:动态数组的高效应用”

文章目录 1.vector的介绍和使用1.1vector的介绍1.2 vector的特点1.3vector的使用1.3.1vector的定义1.3.2vector iterator的使用1.3.3vector 的空间增长问题1.3.4 vector 的增删查改1.3.5vector 迭代器失效问题 1.vector的介绍和使用 1.1vector的介绍 vector是一个顺序容器&am…

CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow

简介: 1.伸缩盒模型简介 2.伸缩容器、伸缩项目 3-4.主轴方向 5.主轴换行方式 6.复合属性flex-flow 7.主轴的对齐方式

互联网数字化商品管理浪潮思考:从信息化到精准运营

目录 一、商品数字化转型面临的现状分析 (一)运营方向分析 (二)商品归类分析 二、商品数字化管理建设分析 三、基础建设——商品信息数字化 (一)商品信息质量数字化的目的 (二&#xff0…

STL关联式容器之RB-tree(红黑树)

AVL-tree之外,另一个颇具历史并被广泛运用的平衡二叉搜索树是RB-tree(红黑树)。所谓RB-tree,不仅是一颗二叉搜索树,而且必须满足一下规则: 1:每个节点不是红色就是黑色 2:根节点为…

电脑系统重装小白教程

​对于很多电脑用户来说,系统出现故障或者需要清理时,重装系统是一项不可避免的操作。但是,对于没有技术基础的小白用户而言,重装系统可能会显得复杂且困难。本文将为您提供一份简洁易懂的电脑系统重装教程,帮助您顺利…

使用Ollama和Open WebUI管理本地开源大模型

Open WebUI和Ollama介绍 Open WebUI 是一个功能丰富且用户友好的自托管 Web 用户界面(WebUI),它被设计用于与大型语言模型(LLMs)进行交互,特别是那些由 Ollama 或与 OpenAI API 兼容的服务所支持的模型。O…

Nmap识别MongoDB 6.0指纹

Nmap识别MongoDB 6.0指纹 朋友反馈一个问题,说使用Nmap扫描MongoDB服务时对于6.0以上的版本默认无法识别到服务版本信息。 如上图所示,对应的VERSION信息是空的,在提示信息中可以看到,官方推荐将指纹信息上传以帮助更新服务指纹&…

向量搜索工具之 Milvus vs. Elastic

在当今数据驱动的世界中,向量数据库因其在处理大规模非结构化数据方面的卓越能力而变得越来越重要。随着数据量的爆炸性增长,如何确保这些数据库在存储和检索数十亿数据点时仍能保持高性能,成为了一个关键挑战。 Milvus和Elasticsearch都是管…

Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集 日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故…

每日学习记录003:(C++)unique_ptr和shared_ptr

每日学习记录003:(C)unique_ptr和shared_ptr 在C中,unique_ptr和shared_ptr都是智能指针,它们为动态内存管理提供了更安全、更方便的方式。 一、unique_ptr的特点 (一)独占所有权 unique_pt…

免费实用的图片加水印工具

高度自定义的图片加水印工具 因工作需要和朋友的需求,我基于canvas开发了这款图片加水印工具。 地址:https://potatotools.top/toolsEntrance/pic/ImageWatermark.vue.html 功能亮点 尺寸定制 ,轻松调整水印宽高,精准适配每张图…

数字化工厂 MES 成功之艰:深度剖析与探究

系统集成的复杂性 多源异构系统对接难题 在数字化工厂的建设进程中,MES(制造执行系统)处于核心枢纽地位,需与众多不同来源、不同架构的系统进行集成。企业内部往往早已部署了诸如企业资源计划(ERP)系统、…

kimi 大模型 API 接口实现大模型对话 - python 实现

kimi API接口实现大模型对话 - python 实现,具体代码如下: 注意:api_key 需要kimi官网注册后创建。 from openai import OpenAI if __name__ __main__:client OpenAI(api_key "sk-***********", # $MOONSHOT_API_KEY 官网注册…

服务器被隔离导致无法登录

现象描述 云服务器可能会因安全违规(内容或行为违规)或因 DDoS 攻击被封堵隔离,被隔离的云服务器在控制台显示为 “BANNING” 状态。 云服务器被隔离可能由于该台服务器违反了当前法律法规的要求。您可以通过以下方式查看该台服务器是否处于…

PaddleNLP的环境配置:

PaddleNLP的环境配置: conda create -n paddle—test python3.9conda activate paddle—testpython -m pip install paddlepaddle-gpu2.6.1.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html(paddle—test) (venv) PS D:\work\论文写…