【文章转自】 http://veii.javaeye.com/blog/781613
在ABAP/4中参数的传递可分成 1. Call By Reference: 传参数时将资料的存放地址(address)传至参数中, 也就是子程序中的参数变量与外部实际变量共享地址内的值, 又称为 Call By Address, 若在子程序中地址中的值改变了, 外部实际变量的值也会跟着改变. 语法: PERFORM <subr> [USING <f1> <f2>…] [CHANGING <f1>…] FORM <subr> [USING <f1> <f2>…] [CHANGING <f1>…] Using 之后接在子程序中不会改变的变量, CHANGING接会改变值的变量 但实际上USING之后的参数在子程序中也可将值改变 Example: SUM = 0. NUM1 = 100. NUM2=200. PERFORM ADD USING NUM1 NUM2 CHANGING SUM. WRITE: / NUM1,NUM2,SUM “SUM 由 0 变成 300 FORM ADD USING NUM1 NUM2 CHANGING SUM. SUM = NUM1 + NUM2. ENDFORM. 执行结果: 100 200 300 2. Call By Value 传参数时将数据的值复制一份至另一地址中, 所以在子程序中参数变量值改变, 并不会影响外部实际变量的值. 语法: PERFORM <subr> USING <f1> FORM <subr> USING VALUE(<f1>…) 使用 VALUE(<f1>)表示 <f1>是 Call By Value的传递 Example: SUM = 0. NUM1 = 5. PERFORM MULTI USING NUM1 CHANGING SUM. WRITE: / NUM1,SUM “NUM1值还是5, SUM 由 0 变成 120 FORM MULTI USING VALUE(NUM1) CHANGING SUM. SUM = 1. WHILE NUM1 > 1 SUM = SUM * NUM1. NUM1 = NUM1 – 1. ENDWHILE. ENDFORM. 执行结果: 5 120 3. Call By Value and Return Result 传入参数值的方式同Call By Value, 但在子程序结束执行时会将传入的参数值复制一份传回给外部实际变量. 语法: PERFORM …. CHANGING …. <f1> FORM ….. CHANGING VALUE(<f1>) Example: SUM = 0. NUM1 = 100. NUM2=200. PERFORM ADD USING NUM1 NUM2 CHANGING SUM. WRITE: / NUM1,NUM2,SUM “SUM 由 0 变成 300 FORM ADD USING NUM1 NUM2 CHANGING VALUE(S). S = NUM1 + NUM2. WRITE: / NUM1,NUM2,SUM “得到结果为 100 200 0 ENDFORM. 执行结果: 100 200 0 “在子程序中 SUM值尚未改变 100 200 300 “返回程序时, 将变量 S的值复制给 SUM “所以 SUM值变成 300