SAP ABAP使用SUBMIT,call transaction进行程序跳转

SAP程序调用与参数传递详解
本文介绍了SAP中三种不同的程序调用方式:直接跳转、带参数执行及事务码调用。示例代码展示了如何使用SUBMIT和CALL TRANSACTION命令,并通过SETPARAMETERID设置参数,实现数据传递。这些方法在SAP编程中用于不同场景的程序交互。

代码:

Eg1:

SUBMIT zhrr027 VIA SELECTION-SCREEN.

跳转到程序zhrr027的选择屏幕,不执行
Eg2:

SUBMIT rfidcn_acctbln
                 WITH p_bukrs = <fs_alv>-rbukrs
                 WITH p_year = <fs_alv>-gjahr
                 WITH r_hkont = <fs_alv>-racct
                 AND RETURN.

跳转到程序rfidcn_acctbln**并执行,带有参数。**这种方法可以不适用memoryid , 比较方便。
Eg3:

SET PARAMETER ID 'BLN' FIELD <fs_alv>-belnr.
      SET PARAMETER ID 'BUK' FIELD <fs_alv>-rbukrs.
      SET PARAMETER ID 'GJR' FIELD <fs_alv>-gjahr.
      CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.

跳转到事务码FB03并执行并带有参数。使用set parameter id来赋值参数。这种方法使用MEMORY ID。

<think>嗯,用户这次问的是在SAPABAP中如何判断程序是否被SUBMIT调用,这是个很具体的开发问题。从引用内容看,用户应该是个ABAP开发人员,可能在处理程序交互逻辑时需要这个功能。用户引用的资料里提到几个关键点:[^2]里SY-CALLD这个系统变量特别重要,它专门用来标识调用类型。[^1]补充了SUBMIT语法的扩展参数,[^3]和[^4]虽然不直接相关,但说明用户正在处理事务码和标准程序调用场景。我记得SUBMIT调用分两种形式:带ANDRETURN的会保留调用栈,不带则不会。SY-CALLD变量正好对应这两种情况:如果程序是被其他程序通过CALLTRANSACTION/CALLDIALOG/SUBMIT…ANDRETURN调用的,SY-CALLD会置为'X';如果是直接运行或被SUBMIT(不带ANDRETURN)调用,则保持初始值。用户可能遇到的实际场景是:在子程序里需要区分自己是独立运行还是被嵌入其他程序执行的。比如被SUBMIT调用时可能要隐藏某些选择屏幕字段,就像[^1]提到的选择屏幕控制需求。需要提醒用户SY-CALLD的局限性:如果程序被LEAVETOTRANSACTION或直接通过事务码启动,这个值仍为空。不过对于纯SUBMIT调用场景完全够用。用户如果要做选择屏幕动态控制,可能还要结合SY-BATCH判断后台作业场景。用户没问但可能延伸想知道的是:怎么获取调用程序名?这可以用SY-CPROG变量。另外如果用户处理的是自定义程序,建议在调用链中用GETPARAMETER传递自定义标识会更可靠。</think> 在 SAP ABAP 中,判断当前程序是否被其他程序通过 `SUBMIT` 调用的核心方法是检查系统变量 **`SY-CALLD`**。以下是具体实现和分析: --- ### 📌 核心方法:使用 `SY-CALLD` 系统变量 1. **判断逻辑**: ```abap IF SY-CALLD = 'X'. " 程序被其他程序通过 CALL TRANSACTION/CALL DIALOG/SUBMIT ... AND RETURN 调用 ELSE. " 程序是主动运行或被 SUBMIT(不带 AND RETURN)调用 ENDIF. ``` - **`SY-CALLD = 'X'`**: 表示当前程序是被外部程序通过以下方式调用: - `CALL TRANSACTION` - `CALL DIALOG` - `SUBMIT ... AND RETURN` - **`SY-CALLD = space`**: 表示程序是独立运行、通过事务码直接启动,或被 `SUBMIT`(不带 `AND RETURN`)调用 [^2][^3]。 2. **`SUBMIT` 的两种调用方式**: - **`SUBMIT prog ... AND RETURN`**: 调用后,`SY-CALLD` 在子程序中为 `'X'`。 - **`SUBMIT prog ...`**(无 `AND RETURN`): 调用后,`SY-CALLD` 在子程序中保持调用程序的 `SY-CALLD` 值(通常为 `space`) [^2]。 --- ### 📊 判断是否被 `SUBMIT` 调用的完整代码示例 ```abap IF SY-CALLD IS NOT INITIAL. " 等同于 SY-CALLD = 'X' WRITE: '当前程序被其他程序通过 CALL TRANSACTION/DIALOG 或 SUBMIT ... AND RETURN 调用'. ELSE. " 进一步判断是否被 SUBMIT(不带 AND RETURN)调用 IF SY-CPROG <> SY-REPID. " 检查调用程序是否与当前程序不同 WRITE: '当前程序SUBMIT(不带 AND RETURN)调用'. ELSE. WRITE: '当前程序是主动运行或通过事务码直接启动'. ENDIF. ENDIF. ``` --- ### 🔍 关键系统变量解析 | 变量 | 说明 | |------------|----------------------------------------------------------------------| | **`SY-CALLD`** | `X`=被外部调用;`space`=独立运行/直接启动/被简单`SUBMIT`调用 [^2] | | **`SY-CPROG`** | 调用当前程序的上级程序名称(若为独立运行,则与 `SY-REPID` 相同) | | **`SY-REPID`** | 当前程序的名称 | --- ### ⚠️ 注意事项 1. **嵌套调用**: 若程序被多层调用(如 `A → B → C`),在程序 `C` 中: - `SY-CALLD = 'X'`(只要上级是 `SUBMIT ... AND RETURN` 或事务调用) - `SY-CPROG` 始终指向直接调用者(即程序 `B` 的名称)。 2. **事务码启动**: 通过事务码启动时,`SY-CALLD = space` 且 `SY-CPROG = SY-REPID` [^3]。 3. **后台作业**: 若程序在后台作业中运行,需额外检查 `SY-BATCH` 变量(`X`=后台执行)。 --- ### 💡 实际应用场景 - **动态隐藏选择屏幕**: 若程序是被 `SUBMIT` 调用的子程序,可隐藏部分选择屏幕字段 [^1]。 - **权限控制**: 限制某些功能仅在主动运行时可用(如调试模式)。 - **日志记录**: 根据调用来源(`SY-CPROG`)记录不同的操作日志。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值