首页 > 其他分享 >可编辑的 SALV 模型(克服 SALV 模型的限制)

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

时间:2024-11-19 17:44:08浏览次数:3  
标签:lo 模型 克服 SALV ALV model MODEL 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 的这种无法实现的功能,我使用 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_model
        IMPORTING
          io_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_events
        IMPORTING 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 data
    SELECT * FROM sflights
           INTO TABLE me->t_data
           UP TO 30 ROWS.
  ENDMETHOD.                    "get_data
  METHOD generate_output.
*...New ALV Instance ...............................................
    TRY.
        cl_salv_table=>factory(
           EXPORTING
*             r_container    = w_alv1
             list_display = abap_false
           IMPORTING
             r_salv_table = o_salv
           CHANGING
             t_table      = t_data ).
      CATCH cx_salv_msg.                                "#EC NO_HANDLER
    ENDTRY.
*...PF Status.......................................................
*   Add MYFUNCTION from the report SALV_DEMO_TABLE_EVENTS
    o_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 object
    lo_events = o_salv->get_event( ).
* event handler
    CREATE OBJECT lo_event_h.
* setting up the event handler
    SET HANDLER lo_event_h->on_user_command FOR lo_events.
*...Get Model Object ...............................................
    DATA: lo_alv_mod TYPE REF TO cl_salv_model.
*   Narrow casting
    lo_alv_mod ?= o_salv.
*   object for the local inherited class from the CL_SALV_MODEL_LIST
    CREATE OBJECT o_salv_model.
*   grabe model to use it later
    CALL METHOD o_salv_model->grabe_model
      EXPORTING
        io_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 model
    lo_model = io_model.
  ENDMETHOD.                    "grabe_model
  METHOD grabe_controller.
*   save the controller
    o_control = lo_model->r_controller.
  ENDMETHOD.                    "grabe_controller
  METHOD grabe_adapter.
*   save the adapter from controller
    o_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 ALV
      WHEN 'MYFUNCTION'.
*       Contorller
        CALL METHOD lo_report->o_salv_model->grabe_controller.
*       Adapter
        CALL METHOD lo_report->o_salv_model->grabe_adapter.
*       Fullscreen Adapter (Down Casting)
        lo_full_adap ?= lo_report->o_salv_model->o_adapter.
*       Get the Grid
        lo_grid = lo_full_adap->get_grid( ).
*       Got the Grid .. ?
        IF lo_grid IS BOUND.
*         Editable ALV
          ls_layout-edit = 'X'.
*         Set the front layout of ALV
          CALL METHOD lo_grid->set_frontend_layout
            EXPORTING
              is_layout = ls_layout.
*         refresh the table
          CALL METHOD lo_grid->refresh_table_display.
        ENDIF.
    ENDCASE.
  ENDMETHOD.                    "on_user_command
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION

标签:lo,模型,克服,SALV,ALV,model,MODEL,salv
From: https://blog.csdn.net/SAP_yu/article/details/143715018

相关文章

  • OpenCompass使用LawBench数据测评本地Qwen大模型
    一、思维导图展示 二、OpenCompass简介OpenCompass是一个大模型测评体系,开源、高效。同时集成CompassKit测评工具、CompassHub测评集社区,CompassRank测评榜单。官网地址:https://opencompass.org.cn/home三、OpenCompass安装3.1创建虚拟环境condacreat......
  • (12-3-02)使用YOLOv8识别检测交通标志:基于YOLOv8的交通标志检测模型(2)验证步骤
    1.5.3 验证步骤(1)下面代码定义了一个函数,用于读取并显示指定文件夹中的一组图像文件。图像列表包括混淆矩阵和各类曲线图,函数会将每张图像转换为RGB格式,并以固定尺寸显示,为模型训练的可视化提供直观效果。importosimportcv2importmatplotlib.pyplotaspltdefdispl......
  • 大模型新手指南:刷到让你少走三年弯路!_大模型入场
    这篇文章,我将结合自己在大模型领域的经验,给大家详细聊聊新人应该如何转行大模型赛道?比如大模型都有哪些方向?各方向的能力要求和岗位匹配?新手转行大模型常踩的坑和常见的误区?以及入行大模型最顺滑的路径?如果你是正打算入行大模型的校招/社招同学,请一定看完,可能会让你在入行......
  • AI大模型探索之路-训练篇13:大语言模型Transformer库-Evaluate组件实践_transformer库
    目录系列篇章......
  • 财务机器人进化:从 RPA 到结合大模型的智能变革,你知道多少?
        在当今数字化飞速发展的时代,财务领域正经历着一场前所未有的变革。从传统的财务处理方式到流程自动化机器人(RPA)的应用,再到如今与大模型相结合的智能进化,每一步都深刻地影响着财务工作的模式。 一、RPA时代的财务自动化回顾    在财务机器人发展的早期,RPA......
  • AI大模型实现图片OCR识别
    背景    OCR(OpticalCharacterRecognition,光学字符识别)是一种将图像中的文字转换为机器编码文本的技术。这项技术可以自动读取纸质文档上的文字信息,并将其转换成电子格式,便于编辑、存储和检索。OCR技术在很多领域都有广泛应用,比如数据录入、文献数字化、辅助阅读设备等......
  • 使用Ollama和Open WebUI管理本地开源大模型
    OpenWebUI和Ollama介绍OpenWebUI是一个功能丰富且用户友好的自托管Web用户界面(WebUI),它被设计用于与大型语言模型(LLMs)进行交互,特别是那些由Ollama或与OpenAIAPI兼容的服务所支持的模型。OpenWebUI提供了完全离线运行的能力,这意味着用户可以在没有互联网连接的情况下与......
  • Ollama、轻量级AI 模型,Windows本地部署
    Windows下载部署Ollama什么是OllamaOllama是一个轻量级的本地推理工具,主要用于运行AI模型。它允许用户在本地设备上运行和交互基于大语言模型(LLM)的应用,而无需依赖云服务。这种工具的主要优势是隐私保护和低延迟,尤其适合那些需要处理敏感数据或希望脱离互联网的场景。......
  • CSS盒子模型的外边距详解
    CSS盒子模型的外边距(margin)是控制元素之间间距的重要属性。以下是与CSS盒子模型外边距相关的所有重要知识点:一、外边距的概念外边距是指盒子边框与其他元素边框之间的空白区域。它用于控制元素之间的距离,从而调整页面布局。二、外边距的设置在CSS中,可以使用margin属性......
  • 【FreedomMan原创】本地离线部署通义千问2-VL多模态大模型推理【图生文】
    开发环境、工具windows10专业版idea2020.1.4、anaconda3、python3.11.10机器配置I5-1240P、16GRAM模型名称通义千问Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8代码调用示例本机无cudn显卡,使用cpu推理调用fromtransformersimportQwen2VLForConditionalGeneration,Auto......