关于宏的定义

DATA: RESULT TYPE I,
N1 TYPE I VALUE 5,
N2 TYPE I VALUE 6.
DEFINE OPERATION.
RESULT = &1 &2 &3.
OUTPUT &1 &2 &3 RESULT.
END-OF-DEFINITION.
DEFINE OUTPUT.
WRITE: / ‘The result of &1 &2 &3 is’, &4.
END-OF-DEFINITION.
OPERATION 4 + 3.
OPERATION 2 ** 7.
OPERATION N2 - N1.


The produces the following output:
The result of 4 + 3 is 7
The result of 2 ** 7 is 128
The result of N2 - N1 is 1
这是一个定义宏的语句,在DEFINE和END-OF-DEFINITION之间有完整的ABAP语句,用&N作为占位符,在调用的时候把真正的字符传入并取代。

宏的定义与调用
语法:

DEFINE NAME. “NAME为宏的名,自己定义”
. “代码段,一般是计算公式或赋值”
END-OF-DEFINITION.123

define后跟的是宏的名。在define和end-of-definition 之间必须指定完整语句。语句中最多可包含九个占位符:&1,&2,&3 ………. &9.

完成宏的定义后,就可以进行调用,方法如下:
NAME P1 P2 P3 ………P9 .

其中p1 p2 p3到p9可以为任何变量,分别对应宏定义中的9个占位符&1~&9. 宏可以调用另外一个宏,但是不能调用自己。

举个简单的例子:

DATA:SUM TYPE I,
COUNT TYPE I,
A1 TYPE I VALUE 90,
A2 TYPE I VALUE 30.

“定义第一个宏counter”
DEFINE COUNTER.
SUM = &1 + &2 .
COUNT = &3 &4 &5 .“注意:每个占位符之间有空格隔开”
WRITE:/ ‘加法的结果是:’,SUM.
WRITER &3 &4 &5 COUNT .“调用第二个宏”
WRITE:/.
END-OF-DEFINITION.

“定义第二个宏 writer”
DEFINE WRITER.
WRITE:/ ‘&1 &2 &3 的结果是:’ , &4.
END-OF-DEFINITION.

"执行测试数据: "
COUNTER 1 2 31 - 12 .
COUNTER 12 23 9 ** 3 .
COUNTER 123 323 A1 - A2 .
123456789101112131415161718192021222324

显示的结果:

我们可以看到第一,二行是我们第一次调用COUNTER的结果,1 2 分别分配给占位符&1和&2,这样就相当于 sum = 1 + 2 .自然我们得到的结果就是3.接下来,31 - 12 分别对应占位符&3 &4 &5 ,那count = 31 - 12.,count的值为19。然后这时我们调用了宏writer:
WRITER &3 &4 &5 COUNT . 这句话其实就相当于 WRITER 31 - 12 19 。然后依次对应writer中的四个占位符&1,&2,&3,&4。这样就很简单明了了,其实就是内部调用新的宏。

这里容易混淆的就是多个宏的占位符,每一个宏是独立的,不要将两个宏的占位符混淆。

还有一点要注意,我在测试时,上述代码在sap编辑器中显示有红色字体(一般语法错误会显示红色字体),但是在执行检察时并未提示错误,执行也没有down掉,并能输出正确结果,暂时未查明何因,各位博友有遇到过或者清楚原因的可以留言交流一下。

上面的例子基本可以清楚讲述宏的用法,下面简单看下我们在实际使用中的小例子:

DATA:FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.
DEFINE ADD_FIELD.
CLEAR:FIELDCAT.
FIELDCAT-COL_POS = &1.
FIELDCAT-FIELDNAME = &2 .
FIELDCAT-SELTEXT_L = &3 .
APPEND FIELDCAT.
END-OF-DEFINITION.
FORM FRM_FIELDCAT.
ADD_FIELD 1 ‘MATNR’ ‘物料号’.
ADD_FIELD 2 ‘WERKS’ ‘工厂’.
ADD_FIELD 3 ‘DISPO’ ‘MRP控制者’.
ENDFORM.12345678910111213

这是我们使用宏 创建fieldcat内表的一个简单应用,有时如果ALV字段比较少且结构简单,我们可以不建立结构,直接在代码段中实现fieldcat的创建和相应字段的赋值。

我对宏的使用暂时不多,有些地方也不很了解,简单分享一下,希望大家在阅读代码时若见到宏的使用能有所了解。

猜你喜欢

转载自blog.csdn.net/weixin_42921800/article/details/82994503