第2章:ABAP语言基础与开发规范
各位同学,咱们今天聊聊ABAP的根基——数据类型、变量声明、结构体、内表,还有那些让人又爱又恨的编码规范。说实话,我见过太多新手在数据类型上栽跟头,也见过老手因为命名不规范被代码审查怼得哑口无言。所以这一章,咱们把基础打扎实了。
2.1 ABAP数据类型:别小看这些“砖块”
ABAP的数据类型,说白了就是搭积木的砖块。砖块选不对,房子迟早塌。我个人习惯把数据类型分成三派:
- 完整类型:比如
CHAR10、DEC31_2,长度和小数位都写死了。适合定义结构固定的字段。 - 参照类型:比如
LIKE MARA-MATNR,直接引用数据字典里的字段。我强烈推荐这个——你想想看,如果物料号长度变了,你代码里所有CHAR18都得手动改,多痛苦? - 泛型类型:比如
ANY TABLE、CLIKE,用于接口参数。嗯,这里要注意:泛型类型在运行时才确定具体类型,性能会打点折扣。
我在项目中遇到过一位同事,把物料号硬编码成 CHAR18。后来SAP升级,物料号扩展到40位,他改了三天三夜。从那以后,我但凡定义变量,第一反应就是 LIKE 或 TYPE 引用数据字典。
核心原则:能用 LIKE 就别用硬编码长度。这是ABAP开发的“第一戒律”。
2.2 变量声明:从“我”开始
ABAP的变量声明,其实挺啰嗦的。但啰嗦有啰嗦的好处——你一眼就能看出变量的用途和类型。来看个例子:
DATA: lv_matnr TYPE mara-matnr, " 物料号
lv_menge TYPE p DECIMALS 3, " 数量,保留3位小数
lv_name TYPE string. " 名称,动态长度
我个人习惯用 lv_ 前缀表示局部变量,gv_ 表示全局变量。为什么?因为代码审查时,扫一眼前缀就知道变量的作用域,省得满屏找声明。
你可能会问:TYPE 和 LIKE 到底啥区别?说白了:TYPE 是“复制类型定义”,LIKE 是“复制字段属性”。比如 TYPE mara-matnr 会创建一个和物料号类型完全一样的变量,而 LIKE mara-matnr 则连数据元素里的标签、帮助文档都带过来了。我一般用 TYPE 定义新变量,用 LIKE 引用已有字段。
小技巧:声明常量用 CONSTANTS,别用 DATA 加注释。比如 CONSTANTS: c_max_rows TYPE i VALUE 100. 这样编译器会帮你检查,防止意外修改。
2.3 结构体与内表:ABAP的“乐高积木”
结构体(Structure)和内表(Internal Table),是ABAP里最常用的复合数据类型。我经常跟团队说:你只要会玩结构体和内表,ABAP就学会了一半。
结构体:就是一组字段的集合。比如:
TYPES: BEGIN OF ty_student,
name TYPE string,
age TYPE i,
score TYPE p DECIMALS 2,
END OF ty_student.
DATA: ls_student TYPE ty_student.
ls_student-name = '张三'.
ls_student-age = 20.
内表:就是结构体的数组。ABAP里内表有三种:
| 类型 | 特点 | 适用场景 |
|---|---|---|
| STANDARD TABLE | 有索引,可排序 | 大多数情况,默认选择 |
| SORTED TABLE | 自动排序,主键唯一 | 需要快速按主键读取 |
| HASHED TABLE | 无索引,哈希查找 | 大表按主键精确查找 |
我曾经在项目中用 STANDARD TABLE 存了10万条数据,然后循环里嵌套 READ TABLE,结果跑了20分钟。后来换成 SORTED TABLE,秒级完成。你想想看,选对内表类型,性能差距就是这么大。
避坑指南:内表操作时,记得用 FIELD-SYMBOL 或 REF TO 来修改数据,别直接 MODIFY 整个工作区。我曾经因为忘了用 ASSIGNING,导致内表数据被覆盖,查了两小时bug。
2.4 ABAP编码规范与命名约定:别让代码变成“天书”
说实话,我见过最烂的代码,变量名叫 a、b、c,函数名是 Z_FUNC_001。这种代码,三个月后连作者自己都看不懂。所以,规范不是束缚,是救命的。
我总结了几条铁律:
- 变量命名:
lv_(局部变量)、gv_(全局变量)、ls_(结构体)、lt_(内表)。比如lt_student一看就是学生内表。 - 常量命名:
c_前缀,全大写。比如c_max_retry。 - 函数/方法命名:动词+名词,比如
get_material_data、save_order。别用do_something这种。 - 注释规范:代码即注释,但复杂逻辑必须写注释。我习惯在方法开头写一段“目的-输入-输出”的说明。
举个例子,规范的代码长这样:
METHOD get_material_description.
" 目的:根据物料号获取物料描述
" 输入:iv_matnr 物料号
" 输出:ev_maktx 物料描述
DATA: lv_matnr TYPE mara-matnr,
ls_makt TYPE makt.
lv_matnr = iv_matnr.
SELECT SINGLE * FROM makt INTO ls_makt
WHERE matnr = lv_matnr AND spras = sy-langu.
ev_maktx = ls_makt-maktx.
ENDMETHOD.
你看,变量名、注释、缩进都清清楚楚。哪怕半年后回来看,也能秒懂。
我的建议:团队里统一用 ABAP Clean Code 规范。别自己发明一套,除非你想被代码审查怼到怀疑人生。
2.5 小结:基础不牢,地动山摇
这一章咱们聊了数据类型、变量声明、结构体与内表,还有编码规范。说实话,这些内容看起来简单,但真正用好的没几个。我见过太多人把内表当数组用,结果性能一塌糊涂;也见过因为命名不规范,导致接口对接时字段对不上。
所以,我的建议是:写代码前,先想清楚数据类型;写代码时,按规范命名;写完后,回头看看有没有可以优化的地方。嗯,这样你的ABAP水平,至少能超过80%的人。
下一章,咱们聊聊ABAP的流程控制——条件判断和循环。到时候我会分享一个我踩过的“死循环”坑,保证让你印象深刻。