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

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条件使用多次,则会使用最后一次的值。
实例一:参数传递
.
APPEND rspar.
SUBMIT zjzj_rep1 VIA SELECTION-SCREEN
WITH SELECTION-TABLE rspar
AND RETURN.
ENDCASE.
).
SELECT-OPTIONS selecto FOR number.

实例二:参数传递及返回值接收
) 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.
.
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语句后面的这两个选项来格式化输出列表。
.
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形式
.
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语句来以编程方式退出程序)语句来退出当前被调用的程序了:
,
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事件块捕获到,会使用默认的回退功能。
.
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》的程序间数据共享与传递章节
ABAP程序互调用:SUBMIT、CALL TRANSACTION、LEAVE TO TRANSACTION的更多相关文章
- ABAP程序相互调用--SUBMIT
(1) 调用其他程序: * Trigger the IDOC SUBMIT zpcppmd001_idoc AND RETURN. (2) 调用其他程序参数传递参数: *当被调用的程序的屏幕有输入参数 ...
- ABAP 程序/接口调用其他程序的数据
在ABAP遇到的业务场景中,可能会遇到一种情况,需要调用其他报表的数据来发送或者二次加工,这个时候又不想对源程序做大的改动.有以下几种思路解决. 1.修改源程序,将需要展示的数据存储到DB中,然后主程 ...
- [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- release,debug库互调用,32位,64位程序与库互调用
以下是基于visual studio 2015和cmake的实验 1,debug或release的应用程序都可以调用release的库2,win32和x64的应用和库无法互调用,在VS中链接时会有一堆 ...
- ABAP RFC远程调用
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- JAVA和.NET互调用
通过接口实现JAVA和.NET互调用-JNInterface 使用C#编程多年,也十分感激微软在语言架构.语法糖.编辑器等方面给自己带来的便利.但因为最近工作中有接触到JAVA,渐渐地发现的确像大家说 ...
- 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
最近Jerry在忙一个项目,技术栈换成了nodejs平台,语言换成了JavaScript,因为赶项目进度,一直没时间更新公众号.感谢大家的支持,关注人数还是慢慢地增长到了3000. 今天我们来聊聊一个 ...
- ABAP程序运行锁定
转自http://www.cnblogs.com/aBaoRong/archive/2012/06/15/2550458.html ABAP 程序运行锁 1. create a Table ZRUNN ...
- [AIR] AIR 应用程序的调用和终止
本节讨论几种对已安装的 Adobe® AIR® 应用程序进行调用的方法,以及关闭运行中的应用程序的选项和注意事项. 注: NativeApplication.InvokeEvent 和 Browser ...
随机推荐
- 【WP 8.1开发】如何动态生成Gif动画
相信如何为gif文件编码,很多朋友都会,而难点在于怎么让GIF文件中的帧动起来,也就是创建gif动画. Gif文件编码方法 先简单介绍一下编码的方法. 1.调用BitmapEncoder.Create ...
- 深入学习jQuery选择器系列第二篇——过滤选择器之子元素选择器
× 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 在上一篇中已经介绍过基础选择器和层级选择器,本文开始介绍过滤选择器.过滤选择器是jQuery选择器中最为庞大也是最为 ...
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
- Hibernate学习之——Hibernate环境搭建
之前在写关于安卓闹钟的教程,写了一半就没后一半了,其实自己也没做好,在校外实习,校内毕业实习又有任务,只能先放放了,等毕业实习结束之后,在继续安卓闹钟开发之旅,相信这个时间不会很久的.现在毕业实习用到 ...
- 深入理解 OWIN 中的 Host 和 Server
The Open Web Interface for .NET (OWIN),注意单词为大写,之前好像都写成了 Owin,但用于项目的时候,可以写成:Microsoft.Owin.*. OWIN 体系 ...
- Java-Spring:java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案
java.lang.ClassCastException: com.sun.proxy.$Proxy* cannot be cast to***问题解决方案 临床表现: 病例: 定义代理类: @Tra ...
- jquery实现分页功能
RT,不是很难,但是感觉代码一点都不简洁,就是多加点判断,直接上代码了. HTML部分: <div class = "container-fluid"> <div ...
- Java进击C#——项目开发环境
本章简言 上一章我们了解一下开发环境,知道了什么去新建一个项目工程.却并没有去项目工程进行介绍.可是之后我们会常常跟项目工程打交道.所以这章笔者就对项程工程的常用的一些功能进行讲解.当然说全面那是不可 ...
- 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
15年出现的JAVA反序列化漏洞,另一个是redis配置不当导致机器入侵.只要redis是用root启动的并且未授权的话,就可以通过set方式直接写入一个authorized_keys到系统的/roo ...
- SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解
本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表 位运算 SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...