ABAP如何在调试查看EXPORT/IMPORT 内存数据

本文介绍如何在新调试器中查看活动内存ID及其十六进制值,并提供了切换到经典调试器的方法。此外,还说明了如何查看设置的参数。

These memory IDs can be accessed in the debugger, but the option isn't accessible by default in the "new" Debugger. To display them you have two options:

  • In the new Debugger, change one of the tools you're using. Do this by clicking the "New Tool" or "Replace Tool" that you can see at the top of the vertical button column on the right of each subwindow. Open the Special Tools folder in the tree and select "System Areas (Internal Only)". In the second tab of this tool you can now see a list of areas. Double-click the MEMORIES("EXPORT/IMPORT memories") area or manually enter it in the Area input field to open the list of active memory IDs. Click through on any one to see its hexadecimal value.
  •  
  • In the menu bar, open Debugger and select "Switch to Classic Debugger". Once it opens, find the following in the menu bar: Goto, System Areas, ABAP Memory. The system areas will be displayed with the MEMORIES area selected by default.

 

 

Parameters

If you want to view the PARAMETERs that were set instead of memory IDs, the procedure is almost exactly the same. However, instead of opening the MEMORIES system area, open the SMEM ("SAP memory (SPA-GPA)") area.

  

<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、付费专栏及课程。

余额充值