前言
对于程序直接互相传值,大家常用的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 1297行
cl_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.
————————————————