ABAP+记录一个BDC的BUG修改过程
问题背景:
业务顾问反馈在使用BDC 进行MEQ1进行供应商配额时,由于以前录屏时用例只有3行数据,导致现在有5行数据的时候,代码仍然只获取了3行数据进行录入,现在需要更改代码,使其按照实际情况自动调整行数。
解决记录:
首先根据业务顾问提供的出错的案例,进行问题复刻,将CALL事务代码的时候,模式的值IM_MODE调整为A,就可以将屏幕一步一步点开进行调试。
下面是调试的界面
数据填充结束的时候,我们可以看到下面这里本应该有5条,但是现在只有3条,那应该就是这里的问题,一般情况下,像这种填充表格的时候数据被重复覆盖,大概率是表格的行数在赋值时重复了,这时候一般可以直接从BDCDATA入手。
在调试时看一下BDCDATA的数据,这里我导出来了,放一个截图,从下图可以看到,这个数字02出现了很多次,应该是它的问题,我们将其依次在debug的时候改成02、03、04、05,再进行调试。
调试结果如下,发现数据从3条成功变成了5条,那么数据就可以这样修改:
下面放一个赋值的思维,这样填写就可以根据数据行数进行行数累加了:
这样就修改完了。
后续思考:
其实这是一个比较偷懒的改法,一点都没有动脑,直接改变了原有的逻辑。因为我在看代码的时候,发现上一个开发者在02旁边写了一句话“两条以上的记录,点击新增,在第二行里录入信息”,其实是表明他是考虑到多行输入数据的情况的,只是出了差错,每次新填的数据将原有的第2行进行覆盖了。这是因为在BDC录屏时,如果上下拉动进度条或者滑动鼠标滚轮,都是需要记录的,但是滑动鼠标滚轮时不生成记录代码,必须改为上下拉动进度条。这里少了拉动进度条的代码,所以每个02都会覆盖原有的数据,如果加上拉动进度条的代码,就可以保证每个02都是新增,因为我不擅长添加拉动进度条的代码,所以,我老老实实添加的代表数字的代码。
好吧,最后的最后,我还是又按照原来开发的意思修改了代码,在代码原有的基础上更改了代码,加上了拉动进度条的代码BDC_OKCODE = NL,就是拉动进度条的意思,原有代码的BDC_OKCODE是/00,是回车的意思,现在修改成=NL,就可以了。业务顾问测试后也是可以的,可恶,我写了这么多代码,那就还是把以前的代码放进来做个纪念吧
以前的代码:
ELSE. " 两条以上的记录,点击新增,在第二行里录入信息
* CHANGE BY GYX D20250630,两条以上数据按照编号依次新增 START-------
** PERFORM BDC_DYNPRO USING 'SAPDM06Q' '0215'.
** PERFORM BDC_FIELD USING 'BDC_CURSOR'
** 'EQUP-QUOTE(02)'.
** PERFORM BDC_FIELD USING 'BDC_OKCODE'
** '/00'.
** PERFORM BDC_FIELD USING 'EQUP-BESKZ(02)'
** W_DATA-BESKZ.
** PERFORM BDC_FIELD USING 'RM06Q-SOBIN(02)'
** W_DATA-ESOBS.
** PERFORM BDC_FIELD USING 'EQUP-LIFNR(02)'
** W_DATA-LIFNR.
** WRITE W_DATA-QUOTE TO LC_QUOTE.
** PERFORM BDC_FIELD USING 'EQUP-QUOTE(02)'
** LC_QUOTE.
**
** "最小批量尺寸
** WRITE W_DATA-MINLS TO L_STR.
** PERFORM BDC_FIELD USING 'EQUP-MINLS(02)'
** L_STR.PERFORM BDC_DYNPRO USING 'SAPDM06Q' '0215'.DATA(GV_FIELD) = 'EQUP-QUOTE(' && LV_NUM && ')'.PERFORM BDC_FIELD USING 'BDC_CURSOR'GV_FIELD."'EQUP-QUOTE(02)'.PERFORM BDC_FIELD USING 'BDC_OKCODE''/00'.GV_FIELD = 'EQUP-BESKZ(' && LV_NUM && ')'.PERFORM BDC_FIELD USING GV_FIELD"'EQUP-BESKZ(02)'W_DATA-BESKZ.GV_FIELD = 'RM06Q-SOBIN(' && LV_NUM && ')'.PERFORM BDC_FIELD USING GV_FIELD"'RM06Q-SOBIN(02)'W_DATA-ESOBS.GV_FIELD = 'EQUP-LIFNR(' && LV_NUM && ')'.PERFORM BDC_FIELD USING GV_FIELD"'EQUP-LIFNR(02)'W_DATA-LIFNR.WRITE W_DATA-QUOTE TO LC_QUOTE.GV_FIELD = 'EQUP-QUOTE(' && LV_NUM && ')'.PERFORM BDC_FIELD USING GV_FIELD"'EQUP-QUOTE(02)'LC_QUOTE."最小批量尺寸WRITE W_DATA-MINLS TO L_STR.GV_FIELD = 'EQUP-MINLS(' && LV_NUM && ')'.PERFORM BDC_FIELD USING GV_FIELD"'EQUP-MINLS(02)'L_STR.* CHANGE BY GYX D20250630,两条以上数据按照编号依次新增 END------