分支循环
分支
case 默认匹配的都是大写字符,也就是when后接大写字符才会捕获到
EQ比较字符是区分大小写的
exit是直接跳出循环或者子例程,check后接判断语句若为真则继续执行若为假则跳出循环或者子例程。
IF p_input EQ 'a'.
write:/ 'a'.
ELSEIF p_input EQ 'b'.
write:/ 'b'.
ELSE
write:/ 'others'.
ENDIF
CASE p_input.
WHEN 'EXIT'.
EXIT.
WHEN 'CHECK'.
CHECK p_input NE 'check'.
WHEN OTHERS.
WRITE:/ 'others'.
ENDCASE.
子例程
创建和调用子例程
创建的两种方法
- 输入 perform f1 using p_1 然后双击 f1(子例程名称)然后会有弹出窗口提示创建子例程,点确认之后他会自动生成 form … endform,然后就可以在里面编写子例程代码了
- 纯手工输入,自己手写 form … endform
调用子例程:
内部程序调用直接perform,外部程序调用如果找不到会报错所以可以用 if found 关键字
perform f(外部程序名)if found using p.
下例是外部程序动态调用,也可以用LIST动态调用多个但是有不能输入参数的缺点用的不多而且只能用于内部程序调用。
data fucname(10) value 'f'.
data programname(20) value 'program1'.
perform (funcname) in program(programname)using p.
子例程参数
实参和虚参
调用子例程用的参数叫实参,在子例程中用的参数叫虚参。
call by value/ref
- call by value:虚参占用自己的内存,即实参的值赋值给虚参。只有一种情况:FORM语句中使用 USING VALUE 搭配,即参数值会赋值给子例程中的参数,而非传递的物理地址。
- call by ref: 虚参使用实参的物理地址的情况很多了,怎么写都可以 USING CHANGING 两个关键字自由搭配
perform f1 using p_1 p_2 changing p_3
form f1 using value(p_1) value(p_2) changing p_3
p_3 = p_1 + p_2.
endform.
虚参的参数类型
子例程使用虚参定义参数类型
- 不声明参数类型则默认为generic类型,继承传入的实参类型
- type 或者 like
form f1 using p1 type c.
form f2 using p2 like gv_val.
- 使用结构体或内表做参数时必须要定义参数类型否则语法检查会报错。
可以用 type,like,structure
例如下例会报 gs_sflight没有结构,因此没有组件connid的错误
form f3 using p3 structure gs_sflight.
write gs_sflight-connid.
endform.
临时子程序
每太看懂,好像是先声明一个代码内表,然后把代码一句句append到代码内表中,然后再生成这个程序,再调用这个程序。
可以定义在主内存中执行的动态子程序
generate subroutine pool gt_code name gv_prog.
宏Macro
遇到 commit work 或者 rollback时调用方法
perform f1 on commit
perform f1 on rollback
有些情况只是代码的重复不用写子例程,用macro就可以。
define name
xxx
end-of-difinition.
*定义con宏,其中调用了dis宏
define con.
concatenate &1 &2 into &3 seperated by space.
dis &1.
end-of-difinition.
define dis.
write &1.
end-of-difinition.
con 'A' 'B' 'AP'.
上述代码是局部宏,仅能在程序内部调用,设置全局宏需要进TRMAC表维护
函数
函数相当于全局子程序,创建函数组然后在里面新增函数,其他程序想要调用函数使用 call function 关键字
RFC函数即开启RFC选项可供外部系统调用。
Function ALV
内表
会计凭证 BSEG, 会计凭证客户清账BSAD,BSID 会计凭证标题 BKPF
利润中心:利润中心主数据表CEPC 利润中心主数据文本 CEPCT
销售发票: 发票项目VBRP
销售交货单: 交货单抬头LIKP 交货单行项目 LIPS
客户 客户一般数据KNA1