【修正】SAP 调用外部程序的方法

在 SAP 中一个程序调用外部程序有两种方式:
 
1. Call transaction <tcode>
常见于 BDC 程式中.
  CALL TRANSACTION tcode
        USING bdcdata
        MODE  p_mode
        UPDATE c_update
        MESSAGES INTO messtab.
mode有以下的可选值.

执行

模式  

作用

"A"

显示所有输入屏幕,如果在 bdc_tab 中包含该屏幕的功能码,则会出现小窗口显示这个功能码。它也是默认值,如果指定不是下面的值,则都认为是 A。

"E"

只有在出现错误时才显示屏幕,用户可以修正数据,修正后程序可以继续处理。

"N"

不显示屏幕的静默模式。如果到达被调用事务的断点,则系统处理终止,并设置一些系统字段。sy-subrc 为1001,sy-msgty 为 "S"、sy-msgid 为 "00"、sy-msgno 为 "344"、sy-msgv1 为 "SAPMSSY3"、sy-msgv2 为 "0131"。

"P"

不显示屏幕的调试模式。如果到达被调用事务的断点,则系统自动转到 ABAP 调试器,这种方式主要用于调试过程。

update有以下可选值:

更新模式

作用

"A"

异步更新。被调用程序的更新按照没有指定 COMMIT WORK 语句和 AND WAIT 附加的方式执行。也就是说,数据更新被放到更新队列里,由另一个专门的更新进程执行,主程序一旦提交数据就继续执行,而不管提交的更新是否执行完成。这种方式比较适合于用一个事务码大量更新指定数据,比如维护主数据等。

"S"

同步更新。被调用程序的更新按照指定了 COMMIT WORK 语句和 AND WAIT 附加的方式执行。也就是说,数据更新被放到更新队列里,由专门的更新进程执行,但是主程序会等到数据提交完成,返回结果信息后才继续执行。这种方式比较适合于数据一致性要求比较高,多个不同事务码的连续处理。

"L"

本地更新。被调用程序的更新按照执行 SET UPDATE TASK LOCAL 语句的方式执行。也就是说,数据更新在主程序所在的进程中完成,主程序必定等到被调用事务完成才继续执行。

 
2. Submit <program> and return
调用程式:
REPORT  ZTEST_CALL_PROG.
DATA: BEGIN OF w_data,
  fid1 TYPE string,
  num1 type i,
  num2 type i,
END OF w_data.
DATA: T_OUT LIKE W_DATA OCCURS 0 WITH HEADER LINE.
Do 10 TIMES.
  if sy-index < 4.
    t_out-fid1 = 'A'.
    t_out-num1 = sy-index.
    t_out-num2 = sy-index + 1.
  elseif sy-index < 7.
    t_out-fid1 = 'B'.
    t_out-num1 = sy-index + 1.
    t_out-num2 = sy-index + 2.
  else.
    t_out-fid1 = 'C'.
    t_out-num1 = sy-index.
    t_out-num2 = sy-index - 1.
  ENDIF.
  append t_out.
  ENDDO.
  export t_out to MEMORY id 'T_OUT'. "内表t_out的内存id为'T_OUT',被调用程式从这里取得数据.
  SUBMIT zwrite_date and RETURN.     "这里也可以用 submit zwrite_data with WITH s_aufnr = p_aufnr
                                     "WITH s_mode = 'N 给被调用程序传值.
  write: / 'justin'.
 
 
被调用程式,从调用程序存储在ABAP内存中取得要处理的数据.
REPORT  ZWRITE_DATE.
data: BEGIN OF w_data,
  fid1 type string,
  num1 type i,
  num2 type i,
 END OF w_data.
 data: t_out LIKE w_data OCCURS 0 WITH HEADER LINE.
 import t_out from MEMORY id 'T_OUT'.
 FREE MEMORY ID 'T_OUT'.        "清除MEMORY ID 为'T_OUT'的内容.
 loop at t_out.
   write: / ' ', t_out-fid1, t_out-num1, t_out-num2.
 ENDLOOP.
 write: sy-uline.
 
 
Other example:
   EXPORT rm16_lgort  FROM l_lgort

          rm16_werks  FROM p_plwrk
          rm16_matnr  FROM p_matnr  TO  MEMORY ID 'ZPHRRM13'.
  SUBMIT zphrrm13 AND RETURN.
  IMPORT mdezx mdpsx mdkp mdsta mdstal FROM MEMORY ID 'ZPHRRM13'

 
发布了2018 篇原创文章 · 获赞 3957 · 访问量 1035万+

猜你喜欢

转载自blog.csdn.net/zhongguomao/article/details/46827099
今日推荐