博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABAP WB01 BDC ”No batch input data for screen & &“ ”没有屏幕 & & 的批输入数据“
阅读量:6095 次
发布时间:2019-06-20

本文共 3443 字,大约阅读时间需要 11 分钟。

公司今年计划大批扩建门店,需要自动化维护相关主数据,其中就有一步通过调用 WB01的BDC录屏来自动创建地点,前台跑没有问题,但后台JOB死活不行,屏幕是以前同事录好的,只能硬着头皮修改。
后台任务日志:
717614-20180123102059303-886811698.png
 抛RAISE_EXCEPTION异常。
用ST22进去跟踪出错的代码:
717614-20180123102059537-425893952.png
717614-20180123102059772-1311585105.png
出错的地方:
717614-20180123102100069-2035568825.png
结合前台调式,发现了出错屏幕:
717614-20180123102100334-1783310535.png
即SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕出问题,经查证原因是屏幕上的ALV是OO方式写的
解决办法:后台时跳过该屏幕,但处理逻辑不能省。由于屏幕只是个交互过程,可以在后台代码直接将有用户输入的值给赋值上,屏幕自然就可以不要了,具体实现就是将原屏幕PAI与PBO相关的代码抠出来直接调用,而不再Call 屏幕
 查找该屏幕被调用的地方:
717614-20180123102100662-1614262066.png
发现两处调用:
717614-20180123102100928-196408734.png
将这两处都打上断点:
717614-20180123102101194-1999621080.png
717614-20180123102101381-1304842300.png
 然后断点调试看是哪个地方,SM37进去:
717614-20180123102101850-1249707748.png
勾上出错的JOB,输入JDBG事务码,回车:
717614-20180123102102115-658172356.png
 
 
 看调用栈,这样就知道是哪个调用了吧,就是DISPLAY_PLANT_COPY_CUSTOMIZING函数,然后进该函数,找到调用
SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕的位置进行代码修改。(
注:在按F8调试完JOB后,发现报
OBJECTS_OBJREF_NOT_ASSIGNED异常
717614-20180123102102319-1866770566.png
但先不要去解决这个问题,本人就因为去解决这个问题耗费了大量时间,这个问题的本质还是因为OO方式的ALV在后台无法构建出的问题,与前面的问题其实是同一问题,只是运行方式不一样:前面的
RAISE_EXCEPTION异常是直接通过任务跑出来的,这个
OBJECTS_OBJREF_NOT_ASSIGNED异常是通过再一次调试该任务出来的。
可以ST22查看出错点:
717614-20180123102102787-1192328183.png
下面就继续修改代码,但代码是标准的程序,一般是不让改的,但我司是老的SAP系统,都不会再升级或打补丁了,再说SAP出来了新的S/4产品,都明确说过,以后不再对老的SAP产品进行维护,就像Windows XP一样,所以想维护想修改BUG的话,就自己来吧
在修改标准程序前,还需要破解程序,不然是修改不了的,我想搞过的人都知道吧,这里就不说破解的事了
但要注意的是,修改标准程序不要影响其他的程序,所以最好在主调程序调用WB01录屏之前,设置一些标记,将这些标记传到标准程序中,然后在修改标准程序的地方,读取这些标记,能读到,则修改,否则还是走原来的逻辑。
下面是自己的程序,就是该程序调用WB01录屏的:
717614-20180123102103053-1386024638.png
 
下面是已修改的标准程序:
717614-20180123102103334-1938032522.png
 
(注:ok_code = 'BSTV'.,因为从后面可以看出该Code还要继续传到外面去,调用它的程序应该需要用到)
上面红框中的代码就是 
SAPLPLANT_DISPLAY_CUSTOMIZING的1000屏幕 的处理逻辑,我们可以打开1000屏幕,将它的PBO,以前PAI抠出来,再这里进行直接进行调用,这样虽然去掉了1000屏幕的交互过程,但后台逻辑我们并没有省略,这样数据就不会出问题。
其实到这里还没有完,当再次定义JOB跑时,上面的1000屏幕已成功去掉,但相应的数据没问题,但是,出现了新的问题
717614-20180123102103584-44673606.png
那我们再进SAPLSTRD标准程序的0300屏幕,找出错原因。
先入到
SAPLSTRD0300屏幕,在PBO与PAI都打上断点:
717614-20180123102103834-630573347.png
 
717614-20180123102104084-1035551824.png
 
为什么要选择这两个Module进行断点呢?原因就是因为该屏幕出问题,但不知道是PBO里,还是PAI里出问题,所以两个都断点一下,再调试看看屏幕的走向。
 断点打好后,
同样再调试该JOB:
717614-20180123102104334-155340914.png
 F8到下面断点暂定,然后F6看屏幕一步步走的轨迹:
 
717614-20180123102104819-100178437.png
 
 继续F6,发现所有屏幕都退出,PAI模块根本没调用,直接退到我们自己的主调程序里:
717614-20180123102105428-1389283499.png
 
717614-20180123102105897-1907803624.png
此时sy-subrc为1001状态,查看返回消息内表PT_MESSTAB[],找到出错Message ID以及错误号:
717614-20180123102106615-1778409935.png
 
 SE91查看详细错误消息:
717614-20180123102107709-1607094456.png
717614-20180123102117319-52525606.png
没有屏幕 & & 的批输入数据
对应的英文:
717614-20180123102117522-436012398.png
No batch input data for screen & &
选中,看长文本:
717614-20180123102117772-1869123659.png
还是看不懂,云里雾里,只能暂停............
从上面调式300屏幕仔细来看,只走了PBO模块,PAI没有走,没触发PAI,录屏中已传OKCODE,即使这里手动设置还是不行.............
很久后,硬是没找到问题...................
没触发PAI,这问题真是难找,原来的别人的录屏又那么复杂,没有适当数据,重录出来的屏幕流程与原来又不一样,产品还没找出原因,干脆一不做二不休,将出问题的这个300屏幕也从屏幕流中干掉,屏我也懒得重录了
通过上面可以看出,问题出在SAPLSTRD的300屏幕:
717614-20180123102118397-187355922.png
 从前台调试,可以得知是300屏幕是如下传输请求屏幕:
717614-20180123102118569-881350759.png
 
现在要跳过300屏幕,与前面跳过1000屏幕一样,先要找到调用这300屏幕的地方,其实从上面图就可以看出,是在 TRINT_ORDER
_CHOICE调用的,所以打开这个函数,再次进行代码修订:
717614-20180123102119225-1463889597.png
 
与略掉1000屏幕一样,将300里PAI与PBO相应影响数据的Module调用Form扣出来,在这里直接调用,不走屏幕的PAI与PBO。
修改后,继续跑后台测试,很不幸,还是出问题:
717614-20180123102119725-964160905.png
 初看起来与前面 
SAPLSTRD的300屏幕问题一样,也是没有什么批输入数据什么的,但经过下面调试,发现还真不一样,前面是没有触发PAI,这里又是什么情况呢,继续调试上面出错的JOB,调试前,与前面一样,在SAPMWBE3的101屏幕中的PAI与PBO各打上一个断点,查看屏幕的走向逻辑:
717614-20180123102120506-368562604.png
 继续调试上面出错的JOB,F8直到上面两处断点地方,继续调试JOB:
717614-20180123102120819-530236274.png
 
经过F6一步步调试,Module调用顺序 :PBO --> PAI  --> PBO,这与前面1000屏幕不一样,PAI触发过(1000屏幕只执行过PBO),问题有所变化:虽然都是 没有屏幕 && 的批输入数据 的问题,但可能引发的原因不一样,以经过一段时间的思考,这里应该是屏幕没有退出,因为PBO执行了第二次,问题的原因应该是在修改标准函数 
TRINT_ORDER
_CHOICE引起的。下面那就在TRINT_ORDER_CHOICE函数里修改的地方打上断点:
717614-20180123102121209-462424262.png
 然后继续调试上面JOB,F8直到上面的断点地方:
717614-20180123102121600-845019373.png
 F6一步步执行,发现当执行完 PERFORM append_to_order. 后,直接退到了上面第二行,即调用0101屏幕的地方:
717614-20180123102121944-380790941.png
 
现在可以看出,函数 TRINT_ORDER_CHOICE 就直接退到0101屏幕了,说明该函数中有 LEAVE SCREEN 语句,退出了401屏幕:
717614-20180123102122647-1692055404.png
 
按理来说,TRINT_ORDER_CHOICE 函数的调用不应该退出401屏幕,因这个函数是在 PERFORM append_to_order. form中调用的,该函数是我们修改标准程序调用的,而修改的目的是不走屏幕流程,即屏幕以及流程跳转语句应该也要屏蔽掉,所以继续看append_to_order Form,发现最后面有 LEAVE SCREEN 语句:
717614-20180123102122850-1621337225.png
 
也将其
屏蔽掉
 
717614-20180123102123100-619016319.png
 
 
 再次以JOB跑,结果成功:
717614-20180123102123303-1007978881.png
 
总结:出现
No batch input data for screen & &问题
1、BDC输入没有转到录屏,比如下面红框注掉,但流程中有这个屏(注:如果有相关的BDC录屏,但没有对应的屏幕,不会出这种问题):
717614-20180123102123631-2015479669.png
 (现在上面图中1000与300 BDC录屏的代码,对于后台可以留着,也可以去掉,但前面需要,所以还是留着吧)
2、屏幕没有结束,就像上面0101屏幕那样,
PBO --> PAI --> PBO,屏幕未退出,会导致屏幕流不能正常结束
最后,解决此问题花费了大量时间,硬是将一个只能前台跑的Tcode,改成了后台,反反复复调试了N遍,也可能是刚开始思路的问题,很长一段时间未能解决,但后来坚信一个总体思路:解决有问题的屏幕,不能解决的直接跳过它,直接将其PBO和PAI的代码抠出来直接调用,略过屏幕。可能解决这个屏幕,又会出新的问题,那再按这个思路解决新的屏幕问题.........
唉,ABAP真是各种苦,在我快要放弃的时候,又出现了转机。如是Java我想问题早已得以解决..........
所以,ABAP注定是孤独的...............
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

转载地址:http://pwwza.baihongyu.com/

你可能感兴趣的文章
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
Docker - 创建支持SSH服务的容器镜像
查看>>
[TC13761]Mutalisk
查看>>
三级菜单
查看>>
Data Wrangling文摘:Non-tidy-data
查看>>
加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
查看>>
while()
查看>>
常用限制input的方法
查看>>
Ext Js简单事件处理和对象作用域
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
12.通过微信小程序端访问企查查(采集工商信息)
查看>>
WinXp 开机登录密码
查看>>
POJ 1001 Exponentiation
查看>>
HDU 4377 Sub Sequence[串构造]
查看>>
云时代架构阅读笔记之四
查看>>
WEB请求处理一:浏览器请求发起处理
查看>>
Lua学习笔记(8): 元表
查看>>
PHP经典算法题
查看>>