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

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

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

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-ANSWL,
     NETVL LIKE ANLP-NAFAZ,
   END OF  GW_OUTDATA.
   TYPES:    BEGIN OF TP_RETURN,
       INDEX TYPE SY-INDEX,
       BUKRS TYPE ANLA-BUKRS,                       "公司代码
       ANLN1 TYPE ANLA-ANLN1,                       "资产号
       ANLHTXT TYPE ANLHTXT,                        "资产主号文本
       ANLN2 TYPE ANLA-ANLN2,                       "资产次级编号
       TXT50 TYPE ANLA-TXT50,                       "资产描述
       TXA50 TYPE ANLA-TXA50,                       "备注
       ANLKL TYPE ANLA-ANLKL,                       "类别
       INVNR TYPE ANLA-INVNR,                       "存货号
       SERNR TYPE ANLA-SERNR,                       "序列号
       IVDAT TYPE ANLA-IVDAT,                       "最后库存日
       INVZU TYPE ANLA-INVZU,                       "库存注记
       ZSKZC TYPE CHAR50,                            "数控资产
       ZYYRJ TYPE CHAR50,                            "应用软件
       ZHTH  TYPE CHAR50,                            "合同号
       ZSBGL TYPE CHAR50,                            "设备功率
       LIFNR TYPE ANLA-LIFNR,                       "供应商
       NAME1 TYPE LFA1-NAME1,
       HERST TYPE ANLA-HERST,
       LEART TYPE ANLA-LEART,                       "租赁类型
       ORD41 TYPE ANLA-ORD41,                       "资产状态
       ORDTX TYPE T087T-ORDTX,                       "资产状态描述
       AEDAT TYPE ANLA-AEDAT,                       "资产状态变更时间
       ZUGDT TYPE ANLA-ZUGDT,                       "首次购置日
       AKTIV TYPE ANLA-AKTIV,                       "资本化日期
       KOSTL TYPE ANLZ-KOSTL ,                      "成本中心
       KTEXT TYPE CSKT-KTEXT,                       "成本中心
       AFASL TYPE ANLB-AFASL,                       "折旧方法
       MEINS TYPE ANLA-MEINS,                       "单位
       MENGE TYPE ANLA-MENGE,                       "数量
       ANSWL TYPE ANLC-ANSWL,                       "原值
       NASUM TYPE ANLP-NAFAZ,                       "累计折旧
       NAFAZ TYPE ANLP-NAFAZ,                       "本期折旧
       NAFAG TYPE ANLC-NAFAG,                       "本年折旧
       NETVL TYPE ANLP-NAFAZ,                       "净值
       TOTAL TYPE STRING,                            "使用寿命
       DEAKT TYPE ANLA-DEAKT,                        "报废日期
       RMAIN TYPE STRING,                            "剩余寿命
       W_TAL TYPE I,
       W_RES TYPE I,
       ANLN3 TYPE ANEK-ANLN1,                        "调出资产号
       BUKRS1 TYPE ANEK-BUKRS,                        "调入资产号
       BZDAT TYPE ANEP-BZDAT,                        "原资产价值日期
       JISHU TYPE SY-INDEX,                           "计数

     END OF TP_RETURN.
  DATA: LT_RETURN TYPE STANDARD TABLE OF  TP_RETURN .

  DATA:GT_OUTDATA LIKE TABLE OF  GW_OUTDATA.
  DATA: CL_DATA TYPE REF TO DATA.
  FIELD-SYMBOLS: <F_OUTTAB> LIKE LT_RETURN.
  FIELD-SYMBOLS: <F_LINE> TYPE TP_RETURN.
  FIELD-SYMBOLS: <F_FIELD> TYPE ANY.

  " Start it by jinggl 20220322

 DATA: L_YEAR TYPE CHAR4.
  CLEAR: L_YEAR.
  L_YEAR = SY-DATUM+0(4).
  DATA: G_DATUM TYPE SY-DATUM.
  DATA L_ZUPER TYPE CHAR2 .
  L_ZUPER = SY-DATUM+4(2).


  TRY.


  CHECK IJSON IS NOT INITIAL.
  ZCL_JSON=>DESERIALIZE( EXPORTING JSON = IJSON PRETTY_NAME = ZCL_JSON=>PRETTY_MODE-CAMEL_CASE CHANGING DATA = GW_DATA ).

      IF GW_DATA IS INITIAL.
        ESIGN = 'E'.
        EMESSAGE = '传输数据为空,或JSON数据解析出错,请检查!'.
        EXIT.
      ENDIF.





  CL_SALV_BS_RUNTIME_INFO=>SET(
     DISPLAY  = ABAP_FALSE
     METADATA = ABAP_FALSE
     DATA     = ABAP_TRUE
  ).





  SUBMIT ZFI_R_014_C_NO1 USING SELECTION-SCREEN '1000'
                       WITH P_BUKRS =  GW_DATA-BUKRS

                       WITH P_ANLN1 EQ GW_DATA-ANLN1
                       WITH P_ZUJHR EQ L_YEAR
                       WITH P_ZUPER EQ L_ZUPER

                       AND RETURN.

  TRY.
      CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF(
            IMPORTING
              R_DATA = CL_DATA
      ).

    CATCH CX_SALV_BS_SC_RUNTIME_INFO.
      MESSAGE 'ZFIR014C无返回数据' TYPE 'E'.
  ENDTRY.
  CHECK CL_DATA IS NOT INITIAL.
    CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).
    ASSIGN CL_DATA->* TO <F_OUTTAB>.
    CHECK <F_OUTTAB> IS NOT INITIAL.
      LOOP AT <F_OUTTAB> ASSIGNING <F_LINE>.
        ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-BUKRS = <F_FIELD>.
          ASSIGN COMPONENT 'ANLN1' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-ANLN1 = <F_FIELD>.
        ASSIGN COMPONENT 'TXT50' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-TXT50 = <F_FIELD>.
        ASSIGN COMPONENT 'TXA50' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-TXA50 = <F_FIELD>.
        ASSIGN COMPONENT 'INVNR' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-INVNR = <F_FIELD>.
        ASSIGN COMPONENT 'AKTIV' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-AKTIV = <F_FIELD>.
        ASSIGN COMPONENT 'RMAIN' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-RMAIN = <F_FIELD>.
         ASSIGN COMPONENT 'MENGE' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-MENGE = <F_FIELD>.
        ASSIGN COMPONENT 'ANSWL' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-ANSWL = <F_FIELD>.
          ASSIGN COMPONENT ' NETVL' OF STRUCTURE <F_LINE> TO <F_FIELD>.
        GW_OUTDATA-NETVL = <F_FIELD>.
        MOVE-CORRESPONDING GW_OUTDATA TO GW_ZTFI084.

        APPEND GW_OUTDATA TO GT_OUTDATA.
        APPEND GW_ZTFI084 TO GT_ZTFI084.

        CLEAR: GW_OUTDATA,GW_ZTFI084.

      ENDLOOP.




      MODIFY ZTFI084 FROM TABLE GT_ZTFI084.
      IF SY-SUBRC = 0.
        COMMIT WORK.
      ENDIF.


      " End it by jinggl 20220322


      CLEAR:EJSON.
      EJSON = ZCL_JSON=>SERIALIZE( DATA = GT_OUTDATA[]
                     COMPRESS = ABAP_FALSE PRETTY_NAME =
                     ZCL_JSON=>PRETTY_MODE-EXTENDED ).

    CATCH CX_ROOT INTO LO_EXCEPTION.
      ESIGN = 'E'.
      EMESSAGE =  LO_EXCEPTION->GET_TEXT( ).
  ENDTRY.

<think>好的,我现在要在ABAP中提交某个程序并在其界面中调用上方的按钮。首先,我需要理解用户的需求是什么。用户想在ABAP环境中运行一个程序,然后自动触发该程序界面上的按钮操作,比如点击工具栏上的某个按钮。 首先,我需要回忆ABAP中如何提交程序。通常,可以使用SUBMIT语句来运行一个ABAP程序。例如,SUBMIT program_name. 这会执行该程序,但默认情况下可能不会显示界面,特别是如果程序是对话类型的。所以可能需要加上选项,比如VIA SELECTION-SCREEN来显示选择屏幕,或者AND RETURN来返回到原程序。但用户需要的是在提交程序后,操作其界面上的按钮,这可能需要更深入的控制。 接下来,如何触发程序界面上的按钮。在ABAP中,用户界面通常是通过屏幕(Screen)和模块(Module)处理的。每个按钮对应一个功能码(Function Code),当按钮被点击时,系统会调用相应的PAI(Process After Input)逻辑流,并执行对应的模块。但问题是,如何在外部触发这个按钮的功能,而不需要用户手动点击? 我记得ABAP中有一种方法可以通过设置OK_CODE字段来模拟用户输入的功能码。当程序运行时,如果设置OK_CODE为按钮的功能码,然后在PAI事件中处理该功能码,就可以触发相应的动作。但是,这需要在程序的上下文中设置OK_CODE,可能需要通过内存共享或者外部断点调试的方式。 但是,用户可能没有权限修改目标程序的代码,所以需要考虑外部触发的方法。这时候,可能需要使用外部断点或者调试技术。例如,设置外部断点,在程序运行到特定点时修改变量值,比如将OK_CODE设置为所需的功能码,从而触发按钮对应的模块。 参考引用[3]提到,设置外部断点,当外部系统使用特定账号调用SAP接口时,会命中断点,便于调试。这可能是一个可行的方法。用户可以在目标程序的PAI事件中设置外部断点,当程序运行时,通过调试器修改OK_CODE的值,模拟按钮点击。 外,引用[2]提到,在ABAP屏幕设计中,逻辑流中的PAI使用模块来处理不同按钮的动作。因此,按钮的功能码需要在PAI处理中被捕获,并调用相应的模块。如果用户能够获取到目标程序按钮对应的功能码,可能可以通过SUBMIT语句传递参数,或者在调用时设置相应的内存变量,来触发按钮动作。 但是,标准SUBMIT语句可能无法直接传递功能码。这时候,可能需要使用内存ID(SET PARAMETER ID)或者通过ABAP内存(EXPORT TO MEMORY)来传递数据。例如,在提交程序之前,使用EXPORT将功能码存储到ABAP内存中,然后在目标程序的初始化过程中IMPORT该值,并设置到OK_CODE中。不过,这需要目标程序有相应的处理逻辑,否则可能无法生效。 如果目标程序没有这样的逻辑,可能需要更复杂的方法,比如使用SAP GUI脚本。通过SAP的脚本API,可以自动化操作界面元素,比如点击按钮。这涉及到编写脚本代码,可能使用VBScript或者其他支持COM自动化的语言,但这超出了纯ABAP的范围。 总结可能的步骤: 1. 使用SUBMIT语句运行目标程序,可能需要添加选项如AND RETURN,以便程序界面保持。 2. 获取目标程序按钮对应的功能码,这可能需要查阅程序文档或屏幕分析。 3. 在目标程序的PAI事件中,设置外部断点,当程序运行时进入调试模式,手动设置OK_CODE为功能码,继续执行触发按钮动作。 或者,如果允许修改目标程序,可以在程序中添加代码,检查某个内存变量或参数,自动触发按钮动作。 例如,在目标程序的PAI模块中,添加: IF ok_code = 'BUTTON1'. "执行按钮操作 ENDIF. 然后在调用程序中: EXPORT ok_code TO MEMORY ID 'Z_BUTTON_TRIGGER'. SUBMIT target_program. 在目标程序的初始化中: IMPORT ok_code FROM MEMORY ID 'Z_BUTTON_TRIGGER'. IF sy-subrc = 0. SET PARAMETER ID 'OK_CODE' FIELD ok_code. ENDIF. 不过,这可能需要在目标程序中进行定制,而这可能不可行。 因此,可能更实际的方法是使用外部断点和调试技术,在程序运行时动态修改OK_CODE的值。这需要用户有调试权限,并且手动操作,但如果是自动化测试,可能不可行。 一种方法是使用SAP的RFC(Remote Function Call)或事务码调用,但通常事务码调用会绕过界面直接执行后台任务,可能无法触发界面按钮的逻辑。 因此,可能需要结合SUBMIT语句和内存设置,或者在程序中模拟用户输入。不过,这些方法都有一定的限制,可能需要具体情况具体分析。 最后,可能需要向用户说明,如果没有目标程序的修改权限,完全自动化触发界面按钮可能较为困难,建议使用调试方法或联系程序开发者添加相应功能。</think>在ABAP中提交程序并触发其界面按钮的操作需要结合程序调用和功能码模拟。以下是具体步骤: ### 1. **提交程序并显示界面** 使用`SUBMIT`语句运行目标程序,并通过`WITH SELECTION-TABLE`传递参数(如有),添加`AND RETURN`保持界面: ```abap SUBMIT your_program VIA SELECTION-SCREEN AND RETURN. ``` ### 2. **模拟按钮功能码** 按钮操作对应PAI事件中的功能码(如`'PRINT'`)。需在目标程序中找到对应的模块: ```abap MODULE user_command_9000 INPUT. CASE ok_code. WHEN 'PRINT'. "执行打印逻辑 ENDCASE. ENDMODULE. ``` ### 3. **通过外部断点动态触发** 若无法修改目标程序代码,可设置外部断点[^3]: 1. 在SE80中找到目标程序的PAI事件。 2. 设置外部断点,指定调试用户。 3. 执行`SUBMIT`后进入调试模式,手动修改`OK_CODE`为按钮功能码(如`'PRINT'`)。 4. 继续运行程序以触发按钮逻辑。 ### 4. **通过内存传递功能码(需代码适配)** 若可修改目标程序,在PAI模块前读取内存: ```abap "调用方程序 EXPORT ok_code = 'PRINT' TO MEMORY ID 'Z_TRIGGER'. SUBMIT your_program. "目标程序(在PAI事件前) IMPORT ok_code FROM MEMORY ID 'Z_TRIGGER'. IF sy-subrc = 0. "处理功能码 ENDIF. ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值