[abap] 通过动态参数获取字段数据

这篇博客介绍如何在ABAP中通过动态参数获取透明表FAGLFLEXT中的字段数据,特别是针对有规则的列如TSL01到TSL16。程序展示了如何循环遍历数据,根据借贷标识提取当月的增减额,并计算期末账面余额。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明: 通过动态参数获取字段数据,抓取有规则列的字段值

      在程序开发中,可能会遇到一些规则的字段名,在数据传递中通常需要对这些字段逐个赋值,以下报表是通过动态参数从数据表(结构体)中获取数据。

     在透明表 FAGLFLEXT中,用于总账总计,每个月的增加减少额都分别用TSL01,TSL02…… TSL16(16列)记录下来,这些字段是有规则的,可以通过动态字段方便的获取其数据。 

例子:

 FIELD-SYMBOLS:   <DYN_FIELD_C> TYPE ANY.

 DATA:  FIELDNAME TYPE STRING.   " 定义变量用于保存字段名

 " 每月数据——专用
DATA: BEGIN OF it_month OCCURS 0,
      RYEAR  LIKE FAGLFLEXT-RYEAR,    " 会计年度
      RACCT  LIKE FAGLFLEXT-RACCT,    " 会计科目
      RBUKRS LIKE FAGLFLEXT-RBUKRS,   " 公司代码
      RTCUR  LIKE FAGLFLEXT-RTCUR,    " 货币
      DRCRK  LIKE F

<think>我们正在处理一个ABAP编程问题:如何通过SUBMIT调用其他程序并获取其ALV显示的数据。 根据提供的引用内容,我们可以使用类`CL_SALV_BS_RUNTIME_INFO`来捕获目标程序运行时产生的ALV数据。 步骤概述: 1. 设置`CL_SALV_BS_RUNTIME_INFO`,使其不显示ALV,而是捕获数据。 2. 使用SUBMIT语句调用目标程序,并传递必要的选择屏幕参。 3. 从`CL_SALV_BS_RUNTIME_INFO`中获取数据引用。 4. 将获取数据引用分配给字段符号,然后可以处理这些数据。 5. 清理`CL_SALV_BS_RUNTIME_INFO`的设置。 注意:目标程序必须使用SALV(ABAP List Viewer)来显示数据,因为这种方法依赖于SALV的运行时信息。 详细步骤: 1. 设置运行时信息:告诉系统我们想要捕获数据(而不是显示)。 使用`cl_salv_bs_runtime_info=>set`方法,设置参: display = abap_false (不显示ALV) metadata = abap_false (不需要元数据,除非你需要) data = abap_true (需要数据) 2. 准备选择屏幕参(如果需要)。我们可以通过内来传递选择屏幕参,内的类型为`RSPARAMS`(或者使用RANGES,但最终要转换成RSPARAMS格式)。 3. 使用SUBMIT语句调用目标程序,并传递选择屏幕参(使用WITH SELECTION-TABLE)。 4. 获取数据引用:调用`cl_salv_bs_runtime_info=>get_data_ref`,该方法返回一个数据引用,指向目标程序ALV所显示的内。 5. 将数据引用分配给字段符号(FIELD-SYMBOL),这样就可以访问内数据了。 6. 最后,清除`CL_SALV_BS_RUNTIME_INFO`的设置,以免影响后续的ALV显示。 但是,需要注意的是,如果目标程序没有使用SALV来显示数据,或者使用了传统的WRITE语句,则此方法无效。 代码示例(参考引用内容): ```abap DATA: lt_selscreen TYPE TABLE OF rsparams. "选择屏幕参 DATA: lr_data TYPE REF TO data. FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE. " 设置运行时信息:捕获数据 cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false metadata = abap_false data = abap_true ). " 填充选择屏幕参(如果需要) " 例如:APPEND VALUE #( kind = 'S' selname = 'S_MATNR' sign = 'I' option = 'EQ' low = '1000' ) TO lt_selscreen. " 调用目标程序 SUBMIT program_name WITH SELECTION-TABLE lt_selscreen AND RETURN. TRY. " 获取数据引用 cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_data ). " 将数据引用分配给字段符号 ASSIGN lr_data->* TO <lt_data>. CATCH cx_salv_bs_sc_runtime_info. " 处理异常,例如显示错误消息 MESSAGE '无法获取ALV数据' TYPE 'E'. ENDTRY. " 清除设置,避免影响后续ALV显示 cl_salv_bs_runtime_info=>clear_all( ). " 现在,<lt_data>就是目标程序ALV显示的内数据,可以对其进行处理 ``` 注意事项: - 目标程序必须使用SALV(CL_SALV_TABLE)来显示数据。 - 如果目标程序有多个ALV列,此方法只能获取最后一个ALV的数据。 - 在调用SUBMIT之前,确保选择屏幕参正确传递,否则可能无法获取到预期的数据。 如果目标程序不是使用SALV显示,那么可能需要其他方法,例如使用内存共享(EXPORT/IMPORT)或调用函模块,但这需要修改目标程序。 相关问题: 1. 如果目标程序没有使用SALV显示数据,如何获取其输出数据? 2. 如何传递复杂的选择屏幕参(如多行选择)? 3. 获取到的内字段结构未知,如何处理?</think>### ABAP 通过 SUBMIT 获取 ALV 数据的实现方法 在 ABAP 中通过 `SUBMIT` 调用其他程序并获取其 ALV 数据,需使用运行时信息类 `CL_SALV_BS_RUNTIME_INFO` 捕获数据流。以下是详细步骤和示例代码: #### 核心步骤 1. **禁用 ALV 显示** 设置运行时信息类,阻止目标程序直接显示 ALV: ```abap cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false " 关闭显示 metadata = abap_false " 关闭元数据 data = abap_true " 启用数据捕获 ). ``` 2. **调用目标程序** 使用 `SUBMIT` 传递选择屏幕参: ```abap SUBMIT ztarget_program " 目标程序名 WITH s_field IN @r_field " 选择屏幕参 AND RETURN. " 控制权返回 ``` 3. **获取数据引用** 将 ALV 数据到引用变量: ```abap DATA(lr_data) = REF #( ). TRY. cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_data " 数据引用 ). CATCH cx_salv_bs_sc_runtime_info. MESSAGE 'ALV数据获取失败' TYPE 'E'. ENDTRY. ``` 4. **转换为内** 通过字段符号访问数据: ```abap FIELD-SYMBOLS <lt_data> TYPE ANY TABLE. ASSIGN lr_data->* TO <lt_data>. " 绑定到字段符号 ``` 5. **清理运行时信息** ```abap cl_salv_bs_runtime_info=>clear_all( ). ``` #### 完整示例 ```abap DATA: lt_selscreen TYPE TABLE OF rsparams, lr_data TYPE REF TO data. FIELD-SYMBOLS: <lt_alv_data> TYPE ANY TABLE. " 1. 设置运行时参 cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false metadata = abap_false data = abap_true ). " 2. 填充选择屏幕参 APPEND VALUE #( kind = 'S' selname = 'S_MATNR' sign = 'I' option = 'EQ' low = '1000' ) TO lt_selscreen. " 3. 调用目标程序 SUBMIT zmmr_po_report WITH SELECTION-TABLE lt_selscreen AND RETURN. " 4. 获取数据 TRY. cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_data ). ASSIGN lr_data->* TO <lt_alv_data>. CATCH cx_salv_bs_sc_runtime_info. MESSAGE 'ALV数据失败' TYPE 'E'. ENDTRY. " 5. 清理环境 cl_salv_bs_runtime_info=>clear_all( ). " 6. 使用数据(示例循环) LOOP AT <lt_alv_data> ASSIGNING FIELD-SYMBOL(<ls_line>). " 处理每行数据 ENDLOOP. ``` #### 关键注意事项 1. **目标程序要求** - 仅适用于使用 `CL_SALV_TABLE` 显示 ALV 的程序 - 传统 `WRITE` 列或 `REUSE_ALV_GRID_DISPLAY` 无法捕获[^1] 2. **数据限制** - 仅获取最后显示的 ALV 数据(多 ALV 时需特殊处理) - 字段结构需通过动态方式处理(如 `ASSIGN COMPONENT`) 3. **权限检查** - 确保用户有目标程序的执行权限 - 选择屏幕参需合法,否则触发 `SUBMIT` 异常 4. **调试影响** - 在调试模式下运行时可能无法捕获数据 #### 替代方案 若目标程序不支持 SALV: 1. **内存 ID 共享** 在目标程序中添加: ```abap EXPORT lt_data TO MEMORY ID 'ZDATA'. ``` 调用程序通过: ```abap IMPORT lt_data FROM MEMORY ID 'ZDATA'. ``` 2. **数据库直接读** 若数据来源明确,直接读底层数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值