SAP ABAP子程序SUBMIT调用的方法

编写两个程序 ZTEST06 和 ZTEST07 , 在ZTEST06 里调用ZTEST07 程序。

ZTEST06 作用是收集并整理数据,并存放到内存

ZTEST07 从内存取到数据,并列印出来

ZTEST06程序代码如下:

*&---------------------------------------------------------------------*
*& Report  ZTEST06
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZTEST06.

*----------------------------------------------------------------------*
*  define internal tables
*  定义内表
*
*----------------------------------------------------------------------*
DATA BEGIN  OF  W_DATA,
  FID1 TYPE  STRING,
  NUM1 TYPE  ,
  NUM2 TYPE  ,
END    OF  W_DATA.
DATA T_OUT LIKE  W_DATA OCCURS  0  WITH  HEADER  LINE .


*----------------------------------------------------------------------*
*  assign value to internal tables
*  给内表赋值
*
*----------------------------------------------------------------------*
DO  10  TIMES .
  IF  SY-INDEX  .
    T_OUT-FID1 'A' .
    T_OUT-NUM1 SY-INDEX .
    T_OUT-NUM2 SY-INDEX  .
  ELSEIF  SY-INDEX  .
    T_OUT-FID1 'B' .
    T_OUT-NUM1 SY-INDEX  .
    T_OUT-NUM2 SY-INDEX  .
  ELSE .
    T_OUT-FID1 'C' .
    T_OUT-NUM1 SY-INDEX .
    T_OUT-NUM2 SY-INDEX  .
  ENDIF .

  APPEND  T_OUT.
ENDDO .

*-----------------------------------------------------------------------*
*  call extenral program
*  调用外部程序
*
*-----------------------------------------------------------------------*
***  使用ABAP内存进行数据传递
EXPORT  T_OUT TO  MEMORY  ID  'T_OUT' .

*** 以下两种情况是调用程序被结束,被调用程序开始执行
* SUBMIT ZWRITE_DATA.

***  如果使用这种情况程序之间的数据访问就不能ABAP内存访问了
* LEAVE TO TRANSACTION 'ZGET_DATA'.

*** 以下两种情况是调用程序被打断,当被调用程序执行完毕之后,调用程序继续执行
SUBMIT  ZTEST07 AND  RETURN .

***  调用事物代码(和SUBMIT <PROGRAM> AND RETURN的效果一样) 将程序 ZTEST07 设一个 事务码 ZGET_DATA
* CALL TRANSACTION 'ZGET_DATA'.

 

ZTEST07程序代码如下:

 

*&---------------------------------------------------------------------*
*& Report  ZTEST07
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report  ztest07.

*----------------------------------------------------------------------*
*  define internal tables
*  定义内表
*
*----------------------------------------------------------------------*
data begin  of  w_data,              "这里定义一个跟调用程序一样的内表结构
  fid1 type  string,
  num1 type  ,
  num2 type  ,
end    of  w_data.
data t_out like  w_data occurs  0  with  header  line .

*----------------------------------------------------------------------*
*  get data from sap memory and write out
*  从SAP内存读取数据然后打印输出
*
*----------------------------------------------------------------------*

import  t_out from  memory  id  'T_OUT' .

free  memory  id  'T_OUT' .

write sy-uline .

write '从调用程序取到的数据如下:' .
loop  at  t_out.
  write ' ' ,t_out-fid1t_out-num1t_out-num2.
endloop .
write sy-uline .

*** 退出程序
* leave program.

 

当然上面的功能完全可以放在一个程序里又简单又简洁,

只是举这么个简单例子说明 SUBMIT 是怎么用的。至于什么样的情况要这样使用,那么就是具体问题具体解决了。


作者: SAP道长

<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`)记录不同的操作日志。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值