ABAP 通过SUBMIT获取另一个程序里的数据

本文介绍了一个使用SAP ABAP编程语言从报告ZFI_R_014_C_NO1中获取并处理数据的例子。该过程涉及JSON序列化与反序列化,通过定义数据结构、提交报告并读取返回的数据到指定的表格结构中。

1. Introduction

In the code we will demostrate that how get data in the other report. The other
report is ZFI_R_014_C_NO1

2. Code Example

 DATA:LO_EXCEPTION TYPE REF TO CX_ROOT,
       ZTREXJSON    TYPE REF TO CL_TREX_JSON_SERIALIZER,
       ZTREXJSONRET TYPE REF TO ZCL_TREX_JSON_DESERIALIZER,
       HTTP_CLIENT  TYPE REF TO IF_HTTP_CLIENT.

  DATA : GT_ZTFI084 LIKE TABLE OF ZTFI084,
        GW_ZTFI084 LIKE LINE OF GT_ZTFI084.



*------------------->增加前导零
  DEFINE REF_ADD_ZERO.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = &1
      IMPORTING
        OUTPUT = &1.
  END-OF-DEFINITION.
*------------------->除去前导零
  DEFINE REF_DELETE_ZERO.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        INPUT  = &1
      IMPORTING
        OUTPUT = &1.
  END-OF-DEFINITION.

*  DATA: LS_WERKS TYPE CHAR10.

  DATA:BEGIN OF  GW_DATA,
    BUKRS  LIKE  AUFK-BUKRS,
    ANLN1  LIKE  ANLA-ANLN1,
    END OF GW_DATA.
  DATA: GT_DATA LIKE TABLE OF GW_DATA .

  DATA: BEGIN OF GW_OUTDATA,
     BUKRS LIKE ANLA-BUKRS,
     ANLN1 LIKE ANLA-ANLN1,
     TXT50 LIKE ANLA-TXT50,
     TXA50 LIKE ANLA-TXA50,
     INVNR LIKE ANLA-INVNR,
     AKTIV LIKE ANLA-AKTIV,
     RMAIN TYPE STRING,
     MENGE LIKE ANLA-MENGE,
     ANSWL LIKE ANLC
<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. **数据库直接读取** 若数据来源明确,直接读取底层数据库
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值