ABAP SALV实现弹出ALV选择

news2024/10/2 10:37:52

问题场景

需要弹出一个ALV并获取选择的数据

实现思路

  1. 跳转屏幕
  2. 弹出ALV(通过SALV
  3. 弹出ALV(通过REUSE_ALV_POPUP_TO_SELECT

实现效果

因为这里需要的是单选,所以没有多选列
在这里插入图片描述

实现代码

 MODULE sel_zfretype INPUT.

  DATA:lt_zmmt041 LIKE TABLE OF zmmt041,
       lt_twlad   LIKE TABLE OF twlad,
       lt_twlad01 LIKE TABLE OF twlad.
  DATA:lfdnr TYPE lfdnr_twlad.

  DATA: lt_msg TYPE rs_t_msg,
        ls_msg TYPE bal_s_msg.
  DATA: lf_one_msg_as_sys_msg TYPE flag.

  DATA go_alv TYPE REF TO cl_salv_table.
  DATA: go_functions  TYPE REF TO cl_salv_functions_list,
        go_selections TYPE REF TO cl_salv_selections,
        go_layout     TYPE REF TO cl_salv_layout,
        go_display    TYPE REF TO cl_salv_display_settings.
  DATA: gr_columns TYPE REF TO cl_salv_columns_table.
  DATA: gr_column TYPE REF TO cl_salv_column_table.
  DATA lt_rows TYPE salv_t_row.
  DATA:ls_row TYPE LINE OF salv_t_row.

  DATA:lv_wlzs LIKE zmmtydand-menge.

  DATA:BEGIN OF lt_sel OCCURS 1,
         zbjh       LIKE zmmt041-zbjh,
         zxmh       LIKE zmmt041-zxmh,
         zfylx      LIKE zmmt041-zfylx,
         zfylx_t    LIKE zmmt041-zfylx_t,
         zvendor    LIKE zmmt041-zvendor,
         name2      LIKE zmmt041-name2,
         zkunnr     LIKE zmmt041-zkunnr,
         name1      LIKE zmmt041-name1,
         zarea      LIKE zmmt041-zarea,
         zcity      LIKE zmmt041-zcity,
         zcountry   LIKE zmmt041-zcountry,
         zarea_t    LIKE zsdt010-zarea_t,
         zcity_t    LIKE zsdt010-zcity_t,
         zcountry_t LIKE zsdt010-zcounty_t,
         zdj        LIKE zmmt041-zdj,
         zdtszl     LIKE zmmt041-zdtszl,
         zsl        LIKE zmmt041-zsl,
         zbz        LIKE zmmt041-zbz.
  DATA:END OF lt_sel.
  DATA:lt_lfa1     LIKE TABLE OF lfa1 WITH HEADER LINE,
       lt_zsdt0101 TYPE TABLE OF zsdt010 WITH HEADER LINE.
  REFRESH:lt_zmmt041,lt_twlad,lt_twlad01.
  "校验供应商
  IF g_wa_data-lifnr IS INITIAL.
    REFRESH lt_msg.
    CLEAR ls_msg.
    ls_msg-msgty = 'E'.
    ls_msg-msgid = 'ZMM01'.
    ls_msg-msgno = '113'.

    APPEND ls_msg TO lt_msg.
    IF lt_msg IS NOT INITIAL.
      cl_epic_ui_services=>show_messages_with_alog(
             it_messages       = lt_msg
             iv_one_msg_direct = lf_one_msg_as_sys_msg ).
      CLEAR:g_wa_item_fre-zfretype.
      RETURN.
    ENDIF.
  ENDIF.

  "处理费用类型描述
  CHECK g_wa_item_fre-zfrename <> '运输费用'.
  IF g_wa_item_fre-zfrename EQ '运输费用'.
    RETURN.
  ELSE.
    SELECT SINGLE zfrename INTO g_wa_item_fre-zfrename
    FROM zmmt037
    WHERE zfretype  = g_wa_item_fre-zfretype.
  ENDIF.
  CLEAR:g_wa_item_fre-zfredj,g_wa_item_fre-zfresl,g_wa_item_fre-zfretax,g_wa_item_fre-zfrecefy,g_wa_item_fre-zfreje.
  "处理单价和税率
  SELECT * FROM zmmt041 INTO CORRESPONDING FIELDS OF TABLE lt_zmmt041
  WHERE zvendor =  g_wa_data-lifnr AND vstel = g_wa_data-vstel
  AND zwxp = g_wa_data-zwxp AND zfylx = g_wa_item_fre-zfretype
  AND zstatus = '3' AND zyxqc < sy-datum AND zyxqd > sy-datum
  AND zwzc = g_wa_data-zwzc.

  "modify by wangk at 20230214 其他费用选择逻辑变更
  "处理最小桶数/重量,过滤高于最小桶数/重量的
  lv_wlzs = 0.
  LOOP AT g_it_item.
    lv_wlzs = lv_wlzs + g_it_item-menge.
  ENDLOOP.

  DELETE lt_zmmt041[] WHERE zdtszl >= lv_wlzs.
  IF lt_zmmt041[] IS INITIAL.
    g_wa_item_fre-zfrejhw = 'X'.
    RETURN.
  ENDIF.
  "选择报价
  REFRESH:lt_sel,lt_lfa1,lt_zsdt0101.
  MOVE-CORRESPONDING lt_zmmt041[] TO lt_sel[].

  SELECT * FROM lfa1 INTO CORRESPONDING FIELDS OF TABLE lt_lfa1
  FOR ALL ENTRIES IN lt_sel
  WHERE lifnr = lt_sel-zvendor.
  SELECT * FROM zsdt010 INTO CORRESPONDING FIELDS OF TABLE lt_zsdt0101.

  LOOP AT lt_sel INTO DATA(ls_sel).
    "供应商
    READ TABLE lt_lfa1 WITH KEY lifnr = ls_sel-zvendor.
    IF sy-subrc = 0.
      ls_sel-name2 = lt_lfa1-sortl.
    ENDIF.
    "三级地址
    IF ls_sel-zarea IS NOT INITIAL.
      READ TABLE lt_zsdt0101 WITH KEY zarea = ls_sel-zarea.
      IF sy-subrc = 0.
        ls_sel-zarea_t = lt_zsdt0101-zarea_t.
      ENDIF.
    ENDIF.
    IF ls_sel-zcity IS NOT INITIAL.
      READ TABLE lt_zsdt0101 WITH KEY zcity = ls_sel-zcity zarea = ls_sel-zarea.
      IF sy-subrc = 0.
        ls_sel-zcity_t = lt_zsdt0101-zcity_t.
      ENDIF.
    ENDIF.
    IF ls_sel-zcountry IS NOT INITIAL.
      READ TABLE lt_zsdt0101 WITH KEY zcounty = ls_sel-zcountry  zcity = ls_sel-zcity zarea = ls_sel-zarea.
      IF sy-subrc = 0.
        ls_sel-zcountry_t = lt_zsdt0101-zcounty_t.
      ENDIF.
    ENDIF.
    MODIFY lt_sel FROM ls_sel.
    CLEAR:ls_sel.
  ENDLOOP.

  TRY.
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = go_alv"方法生成的ALV容器对象
        CHANGING
          t_table      = lt_sel[] )."alv展示的数据

    CATCH cx_salv_msg.
  ENDTRY.
  go_functions = go_alv->get_functions( ).
  go_functions->set_all( 'X' )."设置默认按键
  go_selections = go_alv->get_selections( ).
  go_selections->set_selection_mode( if_salv_c_selection_mode=>single )."设置选择模式
  go_display = go_alv->get_display_settings( ).
  go_display->set_fit_column_to_table_size( 'X' )."列自适应

  gr_columns = go_alv->get_columns( ).
  gr_columns->set_optimize( 'X' ).
  gr_column ?= gr_columns->get_column( 'ZBZ' )."需处理的列
  gr_column->set_long_text( '备注' ).
  gr_column->set_medium_text( '备注' ).
  gr_column->set_short_text( '备注' ).
*gr_column->set_output_length( 15 ).
  gr_column ?= gr_columns->get_column( 'NAME2' )."需处理的列
  gr_column->set_long_text( '分包方' ).
  gr_column->set_medium_text( '分包方' ).
  gr_column->set_short_text( '分包方' ).
  gr_column ?= gr_columns->get_column( 'NAME1' )."需处理的列
  gr_column->set_long_text( '送达方' ).
  gr_column->set_medium_text( '送达方' ).
  gr_column->set_short_text( '送达方' ).
  gr_column ?= gr_columns->get_column( 'ZAREA_T' )."需处理的列
  gr_column->set_long_text( '目的城市(省)' ).
  gr_column->set_medium_text( '目的城市(省)' ).
  gr_column->set_short_text( '省' ).
  gr_column ?= gr_columns->get_column( 'ZCITY_T' )."需处理的列
  gr_column->set_long_text( '目的城市(市)' ).
  gr_column->set_medium_text( '目的城市(市)' ).
  gr_column->set_short_text( '市' ).
  gr_column ?= gr_columns->get_column( 'ZCOUNTRY_T' )."需处理的列
  gr_column->set_long_text( '目的城市(县//镇)' ).
  gr_column->set_medium_text( '目的城市(县//镇)' ).
  gr_column->set_short_text( '县/区/镇' ).
  gr_column ?= gr_columns->get_column( 'ZDTSZL' )."需处理的列
  gr_column->set_long_text( '最低桶数/重量' ).
  gr_column->set_medium_text( '最低桶数/重量' ).
  gr_column->set_short_text( '最低桶数/重量' ).
  gr_column ?= gr_columns->get_column( 'ZDJ' )."需处理的列
  gr_column->set_long_text( '单价' ).
  gr_column->set_medium_text( '单价' ).
  gr_column->set_short_text( '单价' ).


  gr_column ?= gr_columns->get_column( 'ZAREA' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZCITY' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZCOUNTRY' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZFYLX' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZBJH' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZXMH' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZVENDOR' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZKUNNR' ).
  gr_column->set_visible( cl_salv_column_table=>false ).
  gr_column ?= gr_columns->get_column( 'ZSL' ).
  gr_column->set_visible( cl_salv_column_table=>false ).

  IF go_alv IS BOUND.
    go_alv->set_screen_popup(
      start_column = 10
      end_column  = 110
      start_line  = 5
      end_line    = 15 ).
    go_alv->display( ). "调用显示方法
  ENDIF.

  REFRESH:lt_rows.
  lt_rows = go_selections->get_selected_rows( ).
  IF lt_rows[] IS INITIAL.
    g_wa_item_fre-zfrejhw = 'X'.
    RETURN.
  ENDIF.
  LOOP AT lt_rows INTO ls_row.
    READ TABLE lt_sel INTO DATA(ls_zmmt041) INDEX ls_row.
    g_wa_item_fre-zfredj = ls_zmmt041-zdj.
    g_wa_item_fre-zfretax = ls_zmmt041-zsl.
    g_wa_item_fre-zfrejhw = ''.
    CLEAR:ls_row.
  ENDLOOP.
ENDMODULE.     

实现过程思路

  1. 因为屏幕这块做的比较多了,所以这次就想通过ALV实现,一开始使用的函数:REUSE_ALV_POPUP_TO_SELECT。使用这个函数遇到了1个问题:无法实现单选。一直没有找到解决方案,就放弃了。
  2. 采用SALV实现,系统提供了一个示例程序可以参考:SALV_TEST_TABLE_SELECTIONS
    使用这个方案也是需要解决几个问题:a.列的宽度自适应 b.隐藏列 c.实现单单选效果 d.修改列对应的描述 e.获取返回的数据
    问题a: 想通过下面这个方法实现
go_display = go_alv->get_display_settings( ).
go_display->set_fit_column_to_table_size( 'X' )."列自适应

但是调试一直不生效,没找到问题出在哪里。
后面通过另外一种方案实现:

gr_columns = go_alv->get_columns( ).
gr_columns->set_optimize( 'X' ).

成功达到了想要的效果。
问题b:
这里我想到了fieldcat,但是SALV的fieldcat是通过以下实现的

gr_column ?= gr_columns->get_column( 'ZAREA' ).
gr_column->set_visible( cl_salv_column_table=>false ).

问题c:

go_selections = go_alv->get_selections( ).
go_selections->set_selection_mode( if_salv_c_selection_mode=>single )."设置选择模式

这里有几种选择模式
在这里插入图片描述
问题d:

gr_columns = go_alv->get_columns( ).
gr_column ?= gr_columns->get_column( 'ZBZ' )."需处理的列
gr_column->set_long_text( '备注' ).
gr_column->set_medium_text( '备注' ).
gr_column->set_short_text( '备注' ).
*gr_column->set_output_length( 15 ).

gr_column下面有很多方法
在这里插入图片描述
这里面也有几个关于前导0的函数,我也是多次调试没有生效,截止到现在没有找到问题的原因,因为最近需求比较急,我就没花时间去深究。
问题e:
在display( )方法后面可以通过函数获取选择的行。

IF go_alv IS BOUND.
  go_alv->set_screen_popup(
    start_column = 10
    end_column  = 110
    start_line  = 5
    end_line    = 15 ).
  go_alv->display( ). "调用显示方法
ENDIF.

REFRESH:lt_rows.
lt_rows = go_selections->get_selected_rows( ).

LOOP AT lt_rows INTO ls_row.
  READ TABLE lt_sel INTO DATA(ls_zmmt041) INDEX ls_row.
ENDLOOP.

附加收获

下面是一段逻辑流,遇到的问题及解决方案:

  1. 编辑后保存不了——没有写FIELD
  2. 写了MODULE没有生效——需要计算的数据一定顺序一定在被计算的后面,比如下面的zfreje和zfrecefy是由zfredj和zfresl计算出来的,那么顺序上zfreje和zfrecefy要在上面
  3. 改了zfretype其他字段没有更新——因为zfretype的优先级最高,所以要放在最后,这样zfretype对应的MODULE才会覆盖前面的字段。
  LOOP AT g_it_item_fre.
    CHAIN.
      FIELD g_wa_item_fre-zno.
      FIELD g_wa_item_fre-zfreje.
      FIELD g_wa_item_fre-zfrecefy.
      FIELD g_wa_item_fre-zfredj MODULE js_zfreje ON REQUEST.
      FIELD g_wa_item_fre-zfresl MODULE js_zfreje ON REQUEST.
      FIELD g_wa_item_fre-zfretax.
      FIELD g_wa_item_fre-zfrejhw.
      FIELD g_wa_item_fre-zfretype MODULE sel_zfretype ON REQUEST.

      MODULE tab_item_fre_modify ON CHAIN-REQUEST.
    ENDCHAIN.

    FIELD g_wa_item_fre-box
      MODULE tab_item_fre_mark ON REQUEST.
  ENDLOOP.

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

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

相关文章

【代码随想录训练营】【Day15】第六章|二叉树|层序遍历|226.翻转二叉树|101.对称二叉树

层序遍历 题目详细&#xff1a;LeetCode.102 层序遍历与上一节讲的三种遍历方式有所不同&#xff0c;层序遍历是指按从上到下&#xff0c;从左到右的顺序&#xff0c;逐层地遍历二叉树的节点。 从其节点的遍历顺序上观察&#xff0c;我们可以发现其跟广度优先遍历&#xff0…

分布式事务理论基础

事务是数据库执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。 事务有四个特性&#xff0c;习惯上被称为 ACID 特性&#xff1a; Atomicity(原子性) Consistency(一致性) Isolation(隔离性) Durability(持久性) 本地事物 在系统发展初期&#xff0c…

17.微服务SpringCloud

一、基本概念 Spring Cloud 被称为构建分布式微服务系统的“全家桶”&#xff0c;它并不是某一门技术&#xff0c;而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来&#xff0c;并通过 Spring Boot 的思想进行再封装&#xff0c;屏蔽…

Composer: Unknown package has no name defined

安装chatGPT插件到项目&#xff0c;发现如下提示&#xff0c;更新也是提示&#xff1a; Unknown package has no name defined 目录 问题表现 解决未定义包装库 查看当前项目配置 重装本地类库 1.删除相关文件夹及文件 2.清除缓存 3.执行composer install 问题表现 执行…

SQL中的游标、异常处理、存储函数及总结

目录 一.游标 格式 操作 演示 二.异常处理—handler句柄 格式 演示 三.存储函数 格式 参数说明 演示 四.存储过程总结 一.游标 游标(cursor)是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、…

ThingsBoard-规则链-check relation

1、概述 今天我主要讲解【check relation】规则节点,顾名思义,这个节点就是检查消息的发起者与其他实体之间的关系是否存在。如果勾了“检查与特定实体的关系”,则必须指定相关实体。否则,规则节点检查是否存在与匹配方向和关系类型标准的任何实体的关系。一般情况,我们都…

C++递归算法回溯思想

文章目录一、最简单的递归问题&#xff08;调用函数后无其他代码、不涉及复杂的回溯思想&#xff09;二、递归函数中的return不是结束整个递归函数哦三、递归(涉及回溯)举例学生的年龄问题&#xff08;递归的执行过程&#xff09;四、涉及较复杂的回溯思想楼梯问题一、最简单的…

Zookeeper (更新中)

目录Zookeeper 概述Zookeeper 的特点Zookeeper 的应用场景Zookeeper的数据结构ZNode数据类型ZNode里面存储的信息Zookeeper的选举机制&#xff08;重要&#xff09;Zookeeper第一次启动选举机制Zookeeper非第一次启动选举机制Zookeeper 底层如何按照请求的先后顺序来处理的Zook…

计算机SCI期刊审稿人,一般关注论文的那些问题? - 易智编译EaseEditing

编辑主要关心&#xff1a; &#xff08;1&#xff09;文章内容是否具有足够的创新性&#xff1f; &#xff08;2&#xff09;文章主题是否符合期刊的受众读者&#xff1f; &#xff08;3&#xff09;文章方法学是否合理&#xff0c;数据处理是否充分&#xff1f; &#xff08;…

3|射频识别技术|第五讲:数据通信和编码技术|第九章:编码与调制|重点理解掌握传输介质中的有线传输介质

计算机网络部分&#xff1a;https://blog.csdn.net/m0_57656758/article/details/128943949传输介质分为有线传输介质和无线传输介质两大类&#xff1b;有线传输介质通常包含双绞线、同轴电缆和光导纤维&#xff1b;无线传输介质包含微波、红外线等。传输介质的选择和连接是网络…

02Hadoop环境搭建

版本 hadoop-3.1.3.tar.gz解压安装文件到/opt/module下面 [sarahhadoop102 software]$ tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/将Hadoop添加到环境变量 &#xff08;1&#xff09;获取Hadoop安装路径 [sarahhadoop102 hadoop-3.1.3]$ pwd /opt/module/hadoop-3.1.3&…

Toolformer: Language Models Can Teach Themselves to Use Tools

展示了LM可以通过简单的API教自己使用外部工具&#xff0c;并实现两个世界的最佳效果。我们介绍了Toolformer&#xff0c;这是一个经过训练的模型&#xff0c;可以决定调用哪些API&#xff0c;何时调用&#xff0c;传递哪些参数&#xff0c;以及如何将结果最好地纳入未来的标记…

Spring Cloud Alibaba环境搭建

环境依赖 SpringCloud Alibaba 依赖 Java环境来运行。还需要为此配置 Maven环境&#xff0c;请确保是在以下版本环境中安装使用: 1. 64 bit JDK 1.8&#xff1b;下载& 配置。 1.8.0_131 2. Maven 3.2.x&#xff1b;下载& 配置搭建微服务 1.建立微服务项目 1.idea通过…

yolov5编译安卓APP:解决图像上全是检测框

yolov5编译安卓APP&#xff1a;解决图像上全是检测框前言一、第一个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法二、第二个YOLOv5 APP1.参考链接2.详细说明3.APP检测时图像上全是框的解决方法三、其他1.APK打包2.修改APP图标与名字前言 YOLOv5编译安卓A…

【精选论文 | Capon算法与MUSIC算法性能的比较与分析】

本文编辑&#xff1a;调皮哥的小助理 【正文】 首先说结论&#xff1a; 当信噪比&#xff08;SNR&#xff09;足够大时&#xff0c;Capon算法和MUSIC算法的空间谱非常相似&#xff0c;因此在SNR比较大时它们的性能几乎一样&#xff0c;当不同信号源的入射角度比较接近时&…

蓝桥杯刷题024——天干地支

2020国赛 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个&#xff0c;分别为&#xff1a;甲&#xff08;jiǎ&#xff09;、乙&#xff08;yǐ&#xff09;、丙&#xff08;bǐng&#xff09;、丁&#xff08;dīng&#xff09;、戊&#xff08;w&#xff09…

IO知识整理

IO 面向系统IO page cache 程序虚拟内存到物理内存的转换依靠cpu中的mmu映射 物理内存以page&#xff08;4k&#xff09;为单位做分配 多个程序访问磁盘上同一个文件&#xff0c;步骤 kernel将文件内容加载到pagecache多个程序读取同一份文件指向的同一个pagecache多个程…

MySQL(五)

通过索引进行优化 索引基本知识 索引的优点 1、大大减少了服务器需要扫描的数据量2、帮助服务器避免排序和临时表3、将随机io变成顺序io 索引的用处 1、快速查找匹配WHERE子句的行2、从consideration中消除行,如果可以在多个索引之间进行选择&#xff0c;mysql通常会使用找到…

【Python爬虫案例教学】采集某网站壁纸,实现壁纸自由

前言 (&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨 大家好&#xff0c;这里是小圆 现在开始每天都给大家 分享些关于python爬虫的案例教学 从最简单的开始 — 采集图片壁纸 今天就来扒拉这个优质的壁纸网站~ 网址 &#x1f447; 顺便瞧一眼 这里的…

30 - 面向对象的其他语法

目录 一、本章重点 二、对象的分类 1、类对象 &#xff08;1&#xff09;理解 &#xff08;2&#xff09;作用 2、实例对象 &#xff08;1&#xff09;理解 三、属性的划分 1、实例属性 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;定义 &#xff08;3&#xff09…