SAP 标准 ABAP 代码里的 IF 1 = 0 是怎么一回事?

简介: SAP 标准 ABAP 代码里的 IF 1 = 0 是怎么一回事?

SAP ABAP 系统里的标准实现,有时会发现下面这种代码:

IF 1 = 0.

然后把逻辑写在这个永远都不可能执行到的 IF 分支里。比如下图这个 SAP CRM 里的标准类 CL_CRM_MDG_BP_CRGRP:

我查看了一下,这个类创建于 2009 年。


这个写法有什么作用?

我们把视野放开阔一点,注意到这行 IF 语句的下一行,即是将 Message Class 消息类 CRM_MDG_CORE 里编号为 034 的消息,通过 add_message 方法,显示在 WebClient UI 界面上。


我们使用事务码 SE91,定位到编号为 034 的这条消息,点击工具栏的 Where Used List 按钮,想查询这条消息到底被哪些 ABAP 类和程序所使用到:


从查询的结果来看,一目了然。原来,针对 ABAP Message 进行的 Cross Reference 即 Where Used List 查询,只能检测到那些通过 MESSAGE 关键字抛出的消息,即下图查询结果里这些包裹在 IF 1 = 0 分支里的 MESSAGE 语句。

然而,MESSAGE 一旦执行,在不同的执行上下文,抛出不同类型的消息,其表现行为都有所差异。


因为我们讨论的代码在 WebClient UI 运行环境下执行,显然不需要 MESSAGE 语句像在 SAPGUI 环境下,执行时弹出一个对话框,因此我们将 MESSAGE e034(crm_mdg_core) 放在永远不可能进入的 IF 1 = 0 分支内,起到的作用是,让 ABAP Message Text 的 Cross Reference 即 Where Used List 功能,能够顺利捕捉到这条消息的使用情况,同时又不让这段代码真的被执行。这算是一个非功能性编程的例子吧。


我当时把这个案例,发在了 SAP 社区上,引起了大家的热烈讨论。

有朋友给出了另一种替代方案,使用下列语句:

MESSAGE e034(crm_mdg_core) INTO lv_message.


这条语句将 CRM_MDG_CORE 里编号为 034 的文本内容,写入变量 lv_message 之中。虽然引入了一个随后根本不会被读取的变量 lv_message, 但是确实消除了会令有些人费解的 IF 1 = 0 分支。


ABAP Extended check 会对这种定义了变量但却又没有读取它的行为提出抱怨(warning),但好在可以通过 Pragma ##NEEDED 来屏蔽。


相关文章
|
5月前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
|
5月前
|
存储 安全 数据库
什么是 SAP ABAP 数据库表的 Display Maintenance Allowed with Restrictions
什么是 SAP ABAP 数据库表的 Display Maintenance Allowed with Restrictions
|
5月前
|
安全 API 数据库
SAP ABAP OData 中 Function import 的概念介绍
SAP ABAP OData 中 Function import 的概念介绍
|
5月前
|
SQL 负载均衡 监控
SAP ABAP DBSQL_SQL_ERROR 错误
SAP ABAP DBSQL_SQL_ERROR 错误
|
5月前
|
前端开发 数据库 开发者
如何在 SEGW 事务码里为 SAP ABAP OData 服务实现 Function Import 试读版
如何在 SEGW 事务码里为 SAP ABAP OData 服务实现 Function Import 试读版
SAP ABAP OData 服务里需要指定 guid 类型的请求参数时,正确语法是什么?
SAP ABAP OData 服务里需要指定 guid 类型的请求参数时,正确语法是什么?
|
5月前
|
JSON 应用服务中间件 API
使用 ABAP 代码消费 SAP 系统的 OData 服务
使用 ABAP 代码消费 SAP 系统的 OData 服务
|
5月前
|
SQL 监控 Oracle
SAP ABAP 系统错误 Return value of the database layer SQL dbsl rc 99
SAP ABAP 系统错误 Return value of the database layer SQL dbsl rc 99
|
5月前
|
存储 前端开发 Linux
在 SAP ABAP 系统里访问 FTP 服务器
在 SAP ABAP 系统里访问 FTP 服务器
|
5月前
|
存储 前端开发 应用服务中间件
使用 SAP ABAP 执行 FTP 操作
使用 SAP ABAP 执行 FTP 操作

热门文章

最新文章

下一篇
无影云桌面