每个做过ABAP开发的人的都会被ABAP“奇特”的语法坑个一两次。这次作者在日常工作中,遇到了两个小坑,记录下来,方便同行借鉴。
背景:作者所在公司的SAP系统,工单有关联关系,比如说有A,B,C三张工单,A可以关联到B,B可以关联到C,但是生产线始终有A工单进行生产,B,C工单仅用于统计报工,不会下发到MES系统。又因为实施了自动报工,所以MES的已完成产品数量会往SAP中上报,如果A工单已月结,则需要找到B工单,如果B工单已经月结,则需要找到C工单进行报工,以此类推。
以下是作者踩过的坑:
1.声明参考类型时用的逗号
按照业务背景,作者利用while循环写了如下一段代码,根据MES上传的工单,找到最后一张被关联的工单。
作者本意是声明两个变量l_rpl_aufnr,l_rpl_aufnr_f,而这两个变量都是参考afko-aufnr这个类型的。
写完之后,自信回头,传到生产机。结果就悲剧死循环了。
没错,这段代码,错就错在这一行 DATA: l_rpl_aufnr,l_rpl_aufnr_f LIKE afko-aufnr.
ABAP认为,作者是声明了两个变量,但是l_rpl_aufnr的类型是C(1),而l_rpl_aufnr_f的类型是afko-aufnr,由于工单是0开头的12位字符串,这里into甚至不会报错,直接给工单里的第一个字符0到l_rpl_aufnr,直接导致死循环。
2.select语句查到空值时的into
还是以上述代码为例,ABAP语法中,当select找不到值的时候,into不会生效。(由于作者目前写C#比较多,下意识认为,找不到值的,select语句会找个一个NULL值或者空值,给到l_rpl_aufnr,所以绝对不会死循环。结果ABAP就是这么坑。
最后,给大家看下改善之后的代码。
当然,有的小伙伴说,作者其实可以用sy-subrc判断select语句有无查询成功。但是,作者因为很久没写ABAP和身处于死循环直接影响生产的情况下,一下子没想起来可以使用这个参数判断。于是用了很蠢的一个选择结构,当l_rpl_aufnr=l_rpl_aufnr_f时,进行了跳出循环。
工作过程中,如果早有准备则不会像作者如此慌乱,而早有准备的前提是,平常不疏于练习。吃过此亏,谨以为记。