乐趣区

关于sap: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 来屏蔽。

退出移动版