ABAP 互相调用传值 (SUBMIT,MEMORY,获取ALV报表数据,获取内表数据,)


前言

对于程序直接互相传值,大家常用的SUBMIT 也是一种调用程序传值的方法,也是配合传值工作的一个很重要的语法,对于一些标准程序就要用到BDC了。 那为什么要用BDC 跟SUBMIT 呢,因为要让你获取的那个程序跑起来,执行到传出值的那一段代码才行,SUBMIT 和BDC 就不进行介绍了,着重介绍一下

一、MEMORY ID

1、External Session 和Internal Session区别:

External Session:

当用户登陆SAP后, 就开启了一个userlogon session。当user退出所有sap window, 就结束了这个user logon session。一个userlogon session最多有6个external session(即main session,对应有6个窗口).

Internal Session:

在一个external session内调用其它程序将会生成新的internal session, 比如call FM, call transaction或是submit*** and return等方式。 当关掉这个external session时,也就结束了external session下的所有internal session。一个External session最多有20个 Internal session.

层级关系
User session > external session > internal session。
也可以用大白话来说,当登录了GUI界面产生一个User session,同时会有一个窗口,窗口就是external session(最少一个窗口,最多6个),然后在这个窗口中,如果执行了其他程序(例如SUBMIT,BDC)就会产生internal session

2.ABAP memory类似于局部变量,用于同一externalsession下internalsession间的通信,不同的externalsession有不同的ABAPmemory,同一个externalsession里的internalsession只能访问相应session的ABAP memory。

运用 MERMORY ID 很简单

在被调用程序中(就是想要获得数据的程序中)
EXPORT A = TABLE B = 变量 TO MEMORY ID ‘XXX’.

在执行程序中 (要用到这些数据的程序中)
IMPORT A = TABLE B = 变量 FROM MEMORY ID ‘XXX’.

具体怎么调用,具体分析(一般标准程序可以找增强或者隐式增强到合适的位置去加EXPORT 输出内表及数据,然后执行程序中用BDC来触发,再IMPORT写入内表和数据,

自开发的SE38一类,直接在程序中加代码,用SUBMIT 去调用)

用完了 ID 记得清空,就像清空工作区一样
FREE MEMORY ID ‘ZTESTMAT’.
清空指定的ABAPmemory

FREE MEMORY.
清空externalsession内的所有ABAPmemory

二、类方法的调用

第二种,当你要获得的数据不管是标准还是自开发的,如果是ALV 一类的报表展示数据,就可以使用SAP 标准的一个类来获得。如何调用程序可以参照第一章MEMORY ID

DATA: lr_alv_data TYPE REF TO data,
FIELD-SYMBOLS: <fs_alv_data>   TYPE ANY TABLE,
constants:
  abap_true      type abap_bool value 'X',
  abap_false     type abap_bool value ' ',
  abap_undefined type abap_bool value '-',
  abap_on        type abap_bool value 'X',
  abap_off       type abap_bool value ' '.

Z06FIX200203T      1297cl_salv_bs_runtime_info=>set(
    EXPORTING display  = abap_false
              metadata = abap_false
              data     = abap_true ).

* Submit Z06FIR0271 and get ALV output
  SUBMIT z06fir0271
    WITH SELECTION-TABLE gt_selscreen
    AND RETURN.

  TRY.
      cl_salv_bs_runtime_info=>get_data_ref(
        IMPORTING r_data = lr_alv_data ).
      ASSIGN lr_alv_data->* TO <fs_alv_data>.
    CATCH cx_salv_bs_sc_runtime_info.  "获取不到
      MESSAGE text-z13 TYPE 'E'.
  ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).

一个完整程序调用代码如下(示例):

*&---------------------------------------------------------------------*
*& Report ZTST01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztst01a.

TABLES : makt .

PARAMETERS: p_matnr TYPE makt-matnr .


DATA : BEGIN OF gs_out,
         matnr LIKE makt-matnr,
         maktx LIKE makt-maktx,
         ersda LIKE mara-ersda,
       END OF gs_out .

DATA :gt_out LIKE TABLE OF gs_out .

FIELD-SYMBOLS: <lt_pay_data> TYPE ANY TABLE,
               <lt_temp>     TYPE ANY TABLE,
               <ls_data>.

DATA : lr_pay_data              TYPE REF TO data.



SELECT matnr maktx
  INTO TABLE gt_out
  FROM makt
  WHERE matnr = p_matnr.


LOOP  AT gt_out INTO gs_out .
  cl_salv_bs_runtime_info=>set( EXPORTING     display  = abap_false
                                       metadata = abap_false
                                       data     = abap_true ).

  SUBMIT ztst01       "程序间互相调用用SUBMIT方便快捷
  WITH p_matnr    =  gs_out-matnr "年份

  AND RETURN.


  CLEAR lr_pay_data.
  UNASSIGN <lt_pay_data>.

  TRY.
      cl_salv_bs_runtime_info=>get_data_ref(
        IMPORTING r_data = lr_pay_data ).
      ASSIGN lr_pay_data->* TO <lt_pay_data>.

    CATCH cx_salv_bs_sc_runtime_info.
  ENDTRY.


  cl_salv_bs_runtime_info=>clear_all( ).

  IF <lt_pay_data> IS ASSIGNED.
    LOOP AT <lt_pay_data> ASSIGNING <ls_data>.
      MOVE-CORRESPONDING <ls_data> TO gs_out .
    ENDLOOP .
  ENDIF .

  MODIFY GT_out from gs_out .
ENDLOOP .


DATA : c .
c = '1' .

 
*&---------------------------------------------------------------------*
*& Report ZTST01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTST01.

TABLES : mara .

PARAMETERS: p_matnr TYPE mara-matnr .


DATA : BEGIN OF gs_out,
     matnr like mara-matnr,
     ersda like mara-ersda ,
 END OF gs_out .

 DATA :gt_out like TABLE OF gs_out .



DATA: gt_fieldcat TYPE   lvc_t_fcat .
DATA: gs_fieldcat TYPE   lvc_s_fcat .
DATA: gs_layout   TYPE   lvc_s_layo .


 SELECT matnr ersda
   into TABLE gt_out
   from mara
   where matnr = p_matnr.


  DEFINE append_field.
  gs_fieldcat-fieldname = &1.
  gs_fieldcat-coltext = &2.
  gs_fieldcat-ref_field = &3.
  gs_fieldcat-ref_table =  &4.
  gs_fieldcat-no_zero = 'X'.  "去0

  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR: gs_fieldcat.
END-OF-DEFINITION.





*    gs_layout-box_fname = 'MARK'.
*  gs_layout-coltab_fieldname = 'CLR' . "列颜色
*gs_layout-ctab_fname = 'CELLCOLOR' .   "单元格颜色
gs_layout-cwidth_opt = 'X'.   "列宽自适应
gs_layout-zebra      = 'X'.      "斑马线


  append_field: 'MATNR' '物料编码'  '' '' .

  append_field: 'ERSDA' '日期'  '' '' .


CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program = sy-repid
*   i_callback_pf_status_set = 'FRM_STATUS_SET'
*   i_callback_user_command  = 'FRM_USER_COMMAND'
**
*   I_GRID_SETTINGS    =
    is_layout_lvc      = gs_layout
    it_fieldcat_lvc    = gt_fieldcat
    i_save             = 'A'
*   i_grid_settings    = ls_grid_settings
*   it_events          = lt_events
*   is_variant         = ls_variant
*   ES_EXIT_CAUSED_BY_USER   =
  TABLES
    t_outtab           = gt_out
  EXCEPTIONS
    program_error      = 1
    OTHERS             = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
————————————————

总结

程序直接互相传值就这些,一个是用 MEMORY ID 传值,一个是类 方法。因为还没用过SAP 内存,网上也有很多区分ABAP 与SAP 内存的文章。
  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abap帅哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值