ABAP程序互调用:SUBMIT、CALL TRANSACTION、LEAVE TO TRANSACTION

Calling Executable Programs(SUBMIT)... 343

设置选择屏幕参数值(SUBMIT...WITH)... 343

实例一:参数传递... 345

实例二:参数传递及返回值接收... 346

控制Called Programs中LISTS输出... 348

修改输出LISTS行列数... 348

将被调程序的输出列表打印到spool system.. 349

将输出列表保存到ABAP memory. 349

使用LEAVE语句退出被调程序... 350

CALL TRANSACTION、LEAVE TO TRANSACTION.. 351

退出程序 Leave Program.. 351

Passing Data Between Programs

Calling Programs

下面ABAP语句允许你调用一个可执行程序或者事务码,调用后你可以直接退出主调程序,或者返回到调用被调程序的地方继续后继代码的执行:

可执行Program                     Transaction

Call (without returning)  SUBMIT                              LEAVE TO TRANSACTION

Call and return             SUBMIT AND RETURN         CALL TRANSACTION

Calling Executable Programs(SUBMIT)

SUBMIT<rep>|(<field>) [AND RETURN] [<options>].

如果省略AND RETURN选项,主调程序的所有数据与所有级别的List都会从 internal session 中删除。在被调程序执行完后,会返回到主调程序启动的地方。

如果带AND RETURN选项,系统将会保持主调程序的所有数,并在被调程序执行完后返回到主调程序调用处(SUBMIT…AND RETURN语句调用处),然后系统会继续执行主调程序SUBMIT…AND RETURN后面的语句。

<options>用来将数据传递给被调程序,有以下方式:

设置选择屏幕参数值(SUBMIT...WITH)

当正常执行一个报表程序时,标准的选择屏幕会显示,这些屏幕选择条件可以是程序自己本身的,也可以是绑定的LDB的屏幕字段。当使用SUBMIT调用时,可以通过各种参数选项来给这些屏幕选择条件填充值:

SUBMIT... [VIA SELECTION-SCREEN]

[USING SELECTION-SET <var>]

[WITH <sel><criterion>]

[WITH FREE SELECTIONS <freesel>]

[WITH SELECTION-TABLE <rspar>].

VIA SELECTION-SCREEN

被调报表程序的选择屏幕会显示。如果此选择打开,并且还使用了其他参数选项来传输值时,这些值也会显示在屏幕中相应的输入框中,并且用户可以进一步修改这些值。在默认的情况下,通过SUBMIT调用时是不会显示可执行程序的选择屏幕的。

USING SELECTION-SET <var>

使用变式<var>。This option tells the system to start the called program with the variant <var>.

WITH <sel><criterion>

使用此选择可以对选择屏幕的某个选择条件<sel>进行单独的赋值,并通过<criterion>部分来具体来决定是SELECT-OPTIONS还是PARAMETERS,<criterion>部分可以为以下三种情况:

l  <op><f> [SIGN <s>], 用来传输屏幕选择条件的单个值

如果<sel>为SELECT-OPTIONS类型的屏幕选择条件,则使用<op>去填充选择内表<sel>的OPTION字段,<f>去填充选择内表<sel>的LOW字段,<s>去填充选择内表<sel>的SIGN字段(注:如果屏幕条件取值为某个范围,则这里<op>不用BT与NB,则使用下面的[NOT] BETWEEN来单独传递)

如果<sel>为PARAMETERS类型的屏幕字段,<op>的值只能是“=”,并将<f>的值赋值给相应屏幕字段<sel>

l  [NOT] BETWEEN <f1> AND <f2> [SIGN <s>], 用来传递范围取值

<f1>会传递给LOW字段,<f2>会传递给HIGH字段,<s>会传递给选择内表<sel>的SIGN字段。如果省略了NOT选项,系统会将OPTION字段设置为BT,如果使用了NOT选项,系统会将OPTION设置为NB。

l  IN <seltab>, 通过条件选择内表(行结构类型与SELECT-OPTION选择条内表行结构相同)传递屏幕参数

该选项会将主调程序中的条件内表<seltab>赋值给被调用程序的条件选择内表<sel>。<seltab>必须是一个条件内表,可以使用RANGES语句来创建。

WITH FREE SELECTION <freesel>, user dialog for dynamic selections动态选择的用户对话

To use this option, both calling and called programs must be connected to a logical

database that supports dynamic selections. In the calling program, use the function

modules FREE_SELECTIONS_INIT and FREE_SELECTIONS_DIALOG. They allow the

user to enter dynamic selections on a selection screen. One export parameter of these

function modules has structure RSDS_TEXPR from the RSDS type group. Transfer the

values of this export parameter by means of the internal table <freesel> of the same

structure to the called report.

要使用此选项,必须将调用报表和被调用报表都连接到支持动态选择的逻辑数据库。在调用报表中,使用功能模块 FREE-SELECTIONS_INIT 和 FREE_SELECTIONS_DIALOG,它们允许用户在选择屏幕上输入动态选择。这些功能块的一个输出参数有 RSDS 类型组中的 RSDS_TEXPR 结构。通过相同结构的内部表<freesel>将此输出参数的值传送到被调用报表。

WITH SELECTION-TABLE <rspar>, dynamic transfer of values

<rspar>内表必须是行结构必须是RSPARAMS结构类型的类型,该结构包含以下字段:

SELNAME:SELECT-OPTION 或者 PARAMETER屏幕字段名称

KIND:如果是SELECT-OPTION时,取值为S,如果PARAMETER时,取值为P。

其他字段与SELECT-OPTION选择条内表行结构相同。

除了WITH SELECTION-TABLE以外,WITH <sel>选项你可以多次使用。在实际应用中,你可以对某个SELECT-OPTION选择条件<sel>使用WITH <sel>选项多次,在被调用程序中,系统会将这些行append到selection tables<sel>中,但如果对某个PARAMETER条件使用多次,则会使用最后一次的值。

实例一:参数传递

REPORT  zjzj_rep2 NO STANDARD PAGE HEADING.
DATA: int TYPE i,
      rspar LIKE rsparams OCCURS 10 WITH HEADER LINE.
RANGES seltab FOR int.
WRITE: ‘Select a Selection!‘,
      / ‘--------------------‘.
SKIP.
FORMAT HOTSPOT COLOR 5 INVERSE ON.
WRITE: ‘Selection 1‘,
      / ‘Selection 2‘.
AT LINE-SELECTION.
  CASE sy-lilli."选中的行号
    WHEN 4.
      seltab-sign = ‘I‘.
      seltab-option = ‘BT‘.
      seltab-low = 1.
      seltab-high = 5.
      APPEND seltab.
      SUBMIT zjzj_rep1 VIA SELECTION-SCREEN
        WITH paramet EQ ‘Selection 1‘
        WITH selecto IN seltab
        WITH selecto NE 3
        AND RETURN.
    WHEN 5.
      rspar-selname = ‘SELECTO‘.
      rspar-kind = ‘S‘.
      rspar-sign = ‘E‘.
      rspar-option = ‘BT‘.
      rspar-low = 14.
      rspar-high = 17.
      APPEND rspar.
      rspar-selname = ‘PARAMET‘.
      rspar-kind = ‘P‘.
      rspar-low = ‘Selection 2‘.
      APPEND rspar.
      rspar-selname = ‘SELECTO‘.
      rspar-kind = ‘S‘.
      rspar-sign = ‘I‘.
      rspar-option = ‘GT‘.
      rspar-low = 10.
      APPEND rspar.
      SUBMIT zjzj_rep1 VIA SELECTION-SCREEN
        WITH SELECTION-TABLE rspar
        AND RETURN.
  ENDCASE.

REPORT  ZJZJ_REP1.
DATA number TYPE i.
PARAMETERS paramet(14).
SELECT-OPTIONS selecto FOR number.

实例二:参数传递及返回值接收

REPORT  yjzj_call_prog_9_6_2.
TABLES: mard.
DATA: BEGIN OF gx_mard OCCURS 0,
      matnr LIKE mard-matnr,
      werks LIKE mard-werks,
      lgort LIKE mard-lgort,
      labst LIKE mard-labst,
      insme LIKE mard-insme,
END OF gx_mard,
gt_mard LIKE TABLE OF gx_mard.
CONSTANTS: g_memory(30) VALUE ‘JACKYTEST‘.

PARAMETERS: p_werks LIKE mard-werks OBLIGATORY.
SELECT-OPTIONS: s_matnr FOR mard-matnr.
PARAMETERS: p_qty AS CHECKBOX.
PARAMETERS: p_type NO-DISPLAY DEFAULT ‘1‘.

START-OF-SELECTION.
  DATA: gt_tabsel LIKE rsparams OCCURS 10 WITH HEADER LINE.
  IF NOT s_matnr[] IS INITIAL.
    LOOP AT s_matnr.
      "selection类型参数需要封装到rsparams类型的内表中才能传递
      MOVE-CORRESPONDING s_matnr TO gt_tabsel.
      "被调用程序中的selection-option参数
      gt_tabsel-selname = ‘S_MATNR‘.
      gt_tabsel-kind = ‘S‘.
      APPEND gt_tabsel.
      CLEAR gt_tabsel.
    ENDLOOP.
  ENDIF.
  SUBMIT yjzj_call_prog_9_6 WITH p_werks = p_werks
                          WITH p_qty = p_qty
                          WITH p_type = ‘X‘
                          "传递selection类型的参数到被调用程序中
                          WITH SELECTION-TABLE gt_tabsel
                          AND RETURN.
  "从被调用程序中导入结果
  IMPORT gt_mard TO gt_mard FROM MEMORY ID g_memory.
  FREE MEMORY ID g_memory.
  LOOP AT gt_mard INTO gx_mard.
    WRITE:/02 gx_mard-matnr,
              gx_mard-werks,
              gx_mard-lgort,
              gx_mard-labst,
              gx_mard-insme.
  ENDLOOP.

REPORT  yjzj_call_prog_9_6.
TABLES: mard.
DATA: BEGIN OF gx_mard OCCURS 0,
      matnr LIKE mard-matnr,
      werks LIKE mard-werks,
      lgort LIKE mard-lgort,
      labst LIKE mard-labst,
      insme LIKE mard-insme,
END OF gx_mard,
gt_mard LIKE TABLE OF gx_mard.
CONSTANTS: g_memory(30) VALUE ‘JACKYTEST‘.

PARAMETERS: p_werks LIKE mard-werks OBLIGATORY.
SELECT-OPTIONS: s_matnr FOR mard-matnr.
PARAMETERS: p_qty AS CHECKBOX.
PARAMETERS: p_type NO-DISPLAY.

START-OF-SELECTION.
  SELECT matnr werks lgort labst insme
         INTO CORRESPONDING FIELDS OF TABLE gt_mard FROM mard WHERE
         matnr IN s_matnr AND
         werks EQ p_werks.
  DATA: g_tabix TYPE i.
  IF p_qty NE space.
    LOOP AT gt_mard INTO gx_mard.
      g_tabix = sy-tabix.
      gx_mard-labst = gx_mard-labst + gx_mard-insme.
      IF gx_mard-labst <= 0.
        DELETE gt_mard INDEX g_tabix.
        CONTINUE.
      ENDIF.
    ENDLOOP.
  ENDIF.
  IF p_type NE space.
    FREE MEMORY ID g_memory.
    "将结果导出到主调用程序
    EXPORT gt_mard FROM gt_mard TO MEMORY ID g_memory.
  ELSE.
    LOOP AT gt_mard INTO gx_mard.
      WRITE:/02 gx_mard-matnr,
                gx_mard-werks,
                gx_mard-lgort,
                gx_mard-labst,
                gx_mard-insme.
    ENDLOOP.
  ENDIF.

控制Called Programs中LISTS输出

当你使用SUBMIT提交一个ABAP program时,你可以控制这个被调程序的输出列表:修改输出行列长度格式、输出到spool file来代替输出到屏幕、或者是将输出列表存储到ABAP memory中。

修改输出LISTS行列数

SUBMIT... [LINE-SIZE<width>] [LINE-COUNT<length>].

如果被调程序的REPORT语句后面没有这LINE-SIZE与LINE-COUNT两个选项,系统将会使用SUBMIT语句后面的这两个选项来格式化输出列表。

REPORT  zjzj_rep2 NO STANDARD PAGE HEADING.
DATA: NAME(9) VALUE ‘ZJZJ_REP1‘,
      WID TYPE I VALUE 80,
      LEN TYPE I VALUE 0.
SET PF-STATUS ‘SELECT‘.
WRITE: ‘Select a report and its list format:‘,
      / ‘-------------------------------------‘.
SKIP.
WRITE: ‘Report ‘, NAME INPUT ON,
        / ‘Line size ‘, WID INPUT ON,
        / ‘Page length‘, LEN INPUT ON.

AT USER-COMMAND.
CASE SY-UCOMM.
WHEN ‘SELE‘.
READ LINE: 4 FIELD VALUE NAME,
5 FIELD VALUE WID,
6 FIELD VALUE LEN.
SUBMIT (NAME) LINE-SIZE WID LINE-COUNT LEN AND RETURN.
ENDCASE.

将被调程序的输出列表打印到spool system

SUBMIT... TO SAP-SPOOL<print-parameters>.

可以将被调程序的输出列表直接输出到spool system,而不是显示在屏幕上。

将输出列表保存到ABAP memory

可以使用EXPORTING LIST TO MEMORY选项将被调程序输出列表保存到ABAP内存中(而不是直接显示在屏幕上),供被调程序执行完后,主调程序来使用输出列表:

SUBMIT... AND RETURN EXPORTING LIST TO MEMORY.

将被调程序的输出列表存储到ABAP内存中,可以在被调程序执行完后,主调程序还可以访问它。EXPORTING LIST TO MEMORY选项需要与AND RETURN选项一起使用。并且不能将EXPORTING LIST TO MEMORY选项与TO SAP-SPOOL选项一起使用。

输出列表存到内存里时,会以行类型为ABAPLIST的内表形式保存,可以使用下面这几个Function来访问ABAP内在中保存的输出列表(这些函数都是属于function group SLST):

LIST_FROM_MEMORY:从ABAP Memory中将ListsLoad到row type ABAPLIST的内表中

WRITE_LIST:将行类型为ABAPLIST 的内表中的内容插入到当前输出列表中.

DISPLAY_LIST:将行类型为ABAPLIST 的内表中的内容显示在独立的list screen中

LIST_TO_ASCI:将行类型为ABAPLIST 的内表中的内容转换ASCII形式

DATA list_tab TYPE TABLE OF abaplist.
SUBMIT report EXPORTING LIST TO MEMORY
              AND RETURN.
"从ABAP内存中加载缓存的LIST
CALL FUNCTION ‘LIST_FROM_MEMORY‘
  TABLES
    listobject = list_tab
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2.
"在当前屏幕中显示上面加载的LIST
IF sy-subrc = 0.
  CALL FUNCTION ‘WRITE_LIST‘
    TABLES
      listobject = list_tab.
ENDIF.

使用LEAVE语句退出被调程序

在通常情况下,我们在被调程序的基础输出列表(Level为0的List屏幕)按F3就会退出该程序。但是,在返回到主调程序之前,在被调程序里需要执行更多的语句,比如需要使用EXPORT语句将被调程序中的数据存储到ABAP memory中便于主调程序使用时,像这样,你可以为Back Function自定义Function Code(不要使用默认的BACK,即要自己重写默认的BACK Function Code),并且在AT USER-COMMAND事件块里对相应的Function Code进行处理,当你将数据存储起来之后,就可以使用LEAVE(因为重写了默认的BACK Function Code,所以需要使用LEAVE语句来以编程方式退出程序)语句来退出当前被调用的程序了:

REPORT  ZJZJ1 NO STANDARD PAGE HEADING.
DATA: ITAB TYPE I OCCURS 10,
NUM TYPE I.
SUBMIT zjzj2 AND RETURN.
IMPORT ITAB FROM MEMORY ID ‘HK‘.
LOOP AT ITAB INTO NUM.
  WRITE / NUM.
ENDLOOP.
TOP-OF-PAGE.
  WRITE ‘Report 1‘.
  ULINE.

注:不要将Function定义成默认的BACK了,否则不会被AT USER-COMMAND事件块捕获到,会使用默认的回退功能。

REPORT  ZJZJ2 NO STANDARD PAGE HEADING.
DATA: NUMBER TYPE I,
ITAB TYPE I OCCURS 10.
SET PF-STATUS ‘MYBACK‘.
DO 5 TIMES.
  NUMBER = SY-INDEX.
  APPEND NUMBER TO ITAB.
  WRITE / NUMBER.
ENDDO.
TOP-OF-PAGE.
  WRITE ‘Report 2‘.
  ULINE.
AT USER-COMMAND.
  CASE SY-UCOMM.
    WHEN ‘MBCK‘.
     EXPORT ITAB TO MEMORY ID ‘HK‘."退出前执行一些语句
      LEAVE."离开当前被调程序,返回到主调程序
  ENDCASE.

CALL TRANSACTION、LEAVE TO TRANSACTION

二种方法调用Tcode:

1、 如果调用后不需要返回到主调程序,则可以使用下面这种方式:

LEAVE TO TRANSACTION <tcod>|(<tcod>)[AND SKIP FIRST SCREEN].

该语句会结束当前主调程序去执行事务码<tcod>,并且会将主调程序从internal sessions中删除,而被调用Tcode将会在该external session中新开一个internal session再运行,并且被调程序执行后,并不会回到主调程序调用处继续往下执行,而是the system returns tothe area menu from which the original program in the call stack was started.

2、 如果调用后还要返回到主调程序,则使用下面这种方式:

CALL TRANSACTION <tcod>|(<tcod>)  [AND SKIP FIRST SCREEN] [USING <bdc_tab >].

系统会重新开启一个internal session,当被调程序结束后,被调Tcode所在的这个internal session会被delete掉,然后返回到主调程序调用处,继续运行主调程序后面的语句

<bdc_tab>用在BDC调用输入参数传递,具体请参考ABAP Practical Example App.docx文档

退出程序 Leave Program

LEAVE PROGRAM.

退出整个程序,并删除所在内部会话、包括加载的程序、实例、数据。

Passing Data Between Programs

请参考以下文档:

《数据共享与传递.docx》

《ABAP BC Programming.docx》的程序间数据共享与传递章节

时间: 02-12

ABAP程序互调用:SUBMIT、CALL TRANSACTION、LEAVE TO TRANSACTION的相关文章

[SAP ABAP开发技术总结]ABAP程序之间数据共享与传递

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 19.             数据共享与传递... 222 19.1.         程序调用.会话.SAP/ABAP内存 关系... 222 19.2.         ABAP Memory数据共享... 224 19.2.1.     EXPORT. 224 19.2.2.     IMPORT. 226 19.2.3.     DELETE. 227 19.3

sap abap程序之间的调用

一,同步调用从一个程序同步调用其他的ABAP程序,有2种方式: 1,调用程序被打断,当被调用程序执行完毕之后,调用程序继续执行.如:CALL FUNCTION <function>SUBMIT <program> AND RETURNCALL TRANSACTION <tcode> 使用CALL FUNCTION 'AAA'调用FM的时候,相应的FUNCTION GROUP被加载到调用程序所在的internal session.当FM执行完毕,接着执行调用程序.FUNC

JAVA和.NET互调用

通过接口实现JAVA和.NET互调用-JNInterface 使用C#编程多年,也十分感激微软在语言架构.语法糖.编辑器等方面给自己带来的便利.但因为最近工作中有接触到JAVA,渐渐地发现的确像大家说的那样,JAVA的生态很好,要找点什么几乎都有现成的,于是自然就想到了能不能用.NET来调用JAVA. 具了解,有个JNBridge的软件,可以"Bridge any Java with any .NET, anywhere",也许很好用,但是付费的,不喜欢. 又了解了一下其他的方法,都不

第一个go的web程序;调用七牛云存储的音频api问题解决;条件搜寻文件里的内容

package main import ( "html/template" "io" "io/ioutil" "log" "net/http" "os" "path" "runtime/debug" ) const ( ListDir      = 0x0001 UPLOAD_DIR   = "./uploads" TEMPLA

ABAP程序编写过程中怎么提高程序执行效率一

影响ABAP程序的运行效率主要是在程序中大量数据的取得,如果取数不得方法,很影响报表的运行效率,所有优化ABAP程序主要是优化数据取数的方法.下面这几点可以有效的提高取数的效率,从而来提高程序的运行效率. 1.选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 drivingtable)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连

C++、C#互调用之C++ 调用C# dll (转载)

1.c# 创建dll 建立C#编写的DLL程序AddDll,项目类型为:类库 程序代码: using System; using System.Collections.Generic; using System.Text; namespace AddDll { public class Add { public int iadd(int a, int b) { int c = a + b; return c; } } } 2.C++编写调用程序 建立C++的Win32控制台应用程序UseDll,

在android程序中调用shell命令与脚本

最近做android的一个功能就是调用shell命令来进行一些系统级别的操作,比如说是关机开机之类的,现在总结一下具体的用法以及遇到的坑(基于我所用到的,没用到的我就不说了) (1) Runtime.getRuntime().exec("ls"); 这是最简单的一种,你输入后就能就会执行ls命令,如果要获得输出的话可以这样写 Process p = Runtime.getRuntime().exec("ls"); String data = null; Buffer

如何在程序中调用Caffe做图像分类

Caffe是目前深度学习比较优秀好用的一个开源库,采样c++和CUDA实现,具有速度快,模型定义方便等优点.学习了几天过后,发现也有一个不方便的地方,就是在我的程序中调用Caffe做图像分类没有直接的接口.Caffe的数据层可以从数据库(支持leveldb.lmdb.hdf5).图片.和内存中读入.我们要在程序中使用,当然得从内存中读入.参见http://caffe.berkeleyvision.org/tutorial/layers.html#data-layers和MemoryDataLay

Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?

本文使用工具和全部源码下载: http://download.csdn.net/detail/sunylat/8190765 为什么我们要在Delphi XE7的安卓程序调用Java的JAR,使用JAVA的类?如果能够这样做,那么就意味着我们把Delphi开发的安卓程序扩展到了一个更大的开发范围了,理论上可以调用任意JAVA编写的代码,对于同时精通Delphi和JAVA的程序员来说,简直如虎添翼!! 我差不多用了一天时间吧,最终在老猫的帮助下,成功实现了在Delphi XE7的安卓程序中调用JA