SAP 后台表查询方法及消息报错定位方法
SAP 后台表查询方法及消息报错定位方法
- 1 后台表查找方法
- 2 常用BUG调试方式
- 3 一个找表及字段的实例
- 3.1 还是先分析下
- 3.2 下观察点
- 3.3 转换思路,我找这个字段的邻居看看
- 3.4 简单分析下该代码玩玩
- 3.4.1 判断resbd_imp-txtps如果非空,直接赋值“网络文本”,属于错误判断
- 3.4.2 也是错误情况判断,直接赋值“在定制中的帐户分配未知”
- 3.4.3 如果resbd_imp-dbskz(直接采购标识)等于F,或者FLGEX(指示符:外部采购)属于非空,则把标识flag_banf置为‘X’,否则置为空
- 3.4.4 如果esbd_imp-knttp科目分配类别是空,在判断如果上一步骤flag_banf也是空,再判断resbd_imp-vorab(指示符:初步订单)是否为空,都满足则赋值“网络预留text-k05”,不满足则赋值“工厂库存的计划独立需求text-k12”,以及“在定制中的帐户分配未知text-k13”
- 3.4.5 如果resbd_imp-sobkz特殊库存标识为空时,判断resbd_imp-strecke(指示符)是否为空,为空则是网络的采购需求text-k01,否则为网络的第三方需求text-k02
- 3.5 总结,虽然遇到了极端,但是我们仍然满怀信心,耐心的看了下逻辑,虽然也没看太懂。。一般观察点都能找到表,除非~~~~~~~~表不存数据
1 后台表查找方法
其实大神们各种方法都总结了,在此仅做记录,如有雷同,请联系删除。
找到表后检索表数据一般就是SE11、SE16、SE16N、SM30等
1.1 方法1 业务理解加bing
也可以MASS里面存储着一些主要业务对象相关的表
1.1.1 去SE16N查询时,输入CEPC就可以查看相关的表。
1.1.2 或者检索DD02T表(存放元数据的表)
1.1.3 常用模块简单表
财务常用的:
项目常用的:
1.2 方法2 后台配置表查找方法
后台配置直接显示技术信息
用SM30维护即可
1.3 方法3 用F1大法
F1一般会展示3种类型的,分别是表、视图和结构。
1.3.1 F1直接查出来是表
以项目负责人为例,F1选择技术信息,直接出来的是透明表,基本就结束了。
1.3.2 F1直接查出来的是视图
视图还好,直接se11直接display 视图
1.3.3 如果是结构,那么转下一步
1.4 如果结构中是include,那么直接取include表
直接双击KONV即可到达表
1.5 如果字段在常用报表中,可以看报表逻辑对应的字段
1.6 观察点调试代码,有代码经验的比较推荐
以FTXP事务代码中的税率为例
1.6.1 重新进入程序,开启调试模式
将屏幕字段l_kbetr加入到观察点
找到写该屏幕字段的代码
1.6.1 重新调试模式进入税码维护界面,重新下 观察点 portab-kbertr,跟踪 portab-kbertr 字值是从哪来的。
进入断点
可以看到KONP是个表
根据表的值查查是否能查到该记录
但是发现这个明显也不是最终存储税码的地方
1.6.3 继续追踪vake-knumh,断在一个sql语句
看A003,找到了。
1.7 数据元素所用来源,一般不懂代码的优先用
这个的原理是,数据可能存储在多个表,但总有一个主表(权威源),那么从主表到其他的数据拷贝时,其数据元素类型基本上是相同的(这个date element确实是独到的)。
选择表格
1.8 关联视图检索,属于同屏幕关联猜测型
以订单数量为例
由于知道VBAK是订单抬头表,也知道订单编号是VBAK-VBELN,那么可以查VBAK所处的视图
再找到KVMENG是在VBAP中。
1.9 业务修改记录法,项目的变更可用
前提是要开启变更记录,比如项目要在项目参数文件维护项目变更记录。表TCDOB和TCDOBT列出了变更文档创建的所有可能对象类
以项目责任人维护为例
其实可以CN60查看变更记录
1.10 底表修改记录跟踪,这个并不是所有表都记录的,只有大部分业务对象记录了
变更文档表CDHDR和CDPOS记录所有的数据库变更记录信息
以更改销售订单中的采购订单编号为例:
查看CDHDR表,拷贝文档编号
查看CDPOS记录,输入50640
1.11 SQL跟踪,慎用。但是利器
拷贝出来,搜索字段名,大概可以找到表名。
1.12 运行时应用性能分析SAT,属于没招了只能这样找了
此处改一下项目定义的计划结束时间
2 常用BUG调试方式
在配置过程中,甚至开发过程中,经常遇到BUG,而SAP定位错误并没那么精确,如何定位到具体代码呢?以下内容都是网上找的,非本人原创。。
2.1 SE91where user list
以se38随便输入一个程序名,但是该程序名不存在为例
其中DS代表消息类,017代表消息号。事务码SE91, 打开DS message class,定位到第17条消息,点击这个图标使用Where Used List功能。
2.2 观察点方式
通过ABAP的关键字MESSAGE抛出消息时,系统变量SY-MSGID会自动被填充消息所属的Message Class,以DS为例,而SY-MSGNO被填充为抛出消息的编号,这个例子里为017. 因此,通过在调试器里创建watch point并维护相应的触发条件。在程序运行时,一旦触发条件满足,watch point触发,此时执行到的ABAP语句即为消息弹出的准确位置。
在命令输入栏里键入/h打开调试模式,点击Display按钮,弹出调试器:
执行F8
下断点也会下到这。
2.3 使用ABAP调试器里类型为ABAP命令的动态断点
在调试器此处创建类型为ABAP Commands的动态断点,命令设置为MESSAGE. 这样,ABAP调试器会自动在所有出现了MESSAGE关键字的地方停下来。
也可以用
2.4 ABAP源代码静态扫描
事务码SE93里输入SE38,找到SE38实现的ABAP程序名和所处的开发包名称。
方法4的理论依据是,既然我们在SE38里看到了DS017这条消息,那么SE38的实现代码里,必定会出现MESSAGE S017这行代码。因此在方法4里我们改变思路,不再采用动态调试的办法,而选择和它相反的思路。
使用源代码扫描工具程序RS_ABAP_SOURCE_SCAN查找SE38实现代码里所有出现了MESSAGE S017的ABAP代码位置:
2.5 ABAP应用性能分析工具SAT
进入事务码SAT,创建一个新的跟踪Variant,Aggregation(聚合)记得设置为None,否则后续查看结果时将得不到期望看到的完整树形结构。
点击执行
等到100%完成后,来到SAT的结果展示页面里,点击Call Hierarchy标签页,SE38执行的所有ABAP statement罗列如下。使用SAT自带的搜索按钮,输入MESSAGE S017, 执行即可得到结果。双击后就能进入对应的ABAP代码。
2.6 使用ABAP数据库执行跟踪和性能分析工具ST05
为什么要弄清楚SE38到底访问了哪些数据库表?根据经验推断,我们在SE38里输入程序的名称点击Display按钮后,SE38的实现必定会从某个数据库表(即Netweaver里存储所有ABAP程序名称的数据库表)里根据该名称进行搜索,如果搜索未命中,说明该程序并不存在,从而抛一条消息给用户。换言之,SE38里根据用户输入去数据库表里使用OPEN SQL进行查询,和抛出提示消息,这两处代码的位置一定相邻。因此我们只要找到了SE38里查询报表名称的数据库表的位置,那么距离抛出提示消息的代码位置也不远了。
对于SE38里访问数据库表的性能,直接忽略。在ST05的结果列表里,我只盯着Object Name里显示的数据库表名称,PROGDIR在里面太显眼了。这张表存放的就是所有ABAP程序的名称,右边的就是访问该表的ABAP OPEN SQL:
SELECT WHERE ''NAME" = ‘testlgz’ AND “STATE” = ‘A’.
直接显示ABAP调用位置
还是那附近的。
3 一个找表及字段的实例
今天有小伙正好有用到采购类型的需求,这个以前还真没用过,只知道BAPI用要写死这些类型,至于生成的预留后存到那张表,还真心没找过。
3.1 还是先分析下
采用的程序名SAPLCOMD,观察点下字段CNDOK-PRCTYPE,CNDOK-PRCTYPE = ‘WBS 要素预留’
3.2 下观察点
1.选择调试abap
2.点击该计划物料组件,跳到代码
3.下观察点
4.执行F8断到如下位置,那么基本上是通过text-k06赋值了
5.发现整个form都没有对text-k06赋值的地方,继续下观察点,完蛋,F8直接跳出去了,说明这个不太可行
6。宣布第一炮找寻失败。
3.3 转换思路,我找这个字段的邻居看看
SAPLCOMD , CNDOK-NLFZV ,CNDOK-NLFZV = 2
执行F8断下来,可以看到是RESBD-NLFZV进行赋值,要是resbd是个表就完事了,可惜是个结构。
猜猜resb表有没有NLFZV相似的字段呢?果然有,偏移量顺利找到了
我去,邻居轻松找到,但是这个采购类型依然没找到,这可超过我常识了啊。。。大哥你是铁板吗,这字段不会是需要动态推导出来的吧,没进数据库存储~~~仔细看了下代码,还真是动态生成了,宣布game over,什么大法都没鸟用了。
3.4 简单分析下该代码玩玩
3.4.1 判断resbd_imp-txtps如果非空,直接赋值“网络文本”,属于错误判断
* Textposition
IF NOT resbd_imp-txtps IS INITIAL.
knt_text = text-k14.
EXIT.
ENDIF.
3.4.2 也是错误情况判断,直接赋值“在定制中的帐户分配未知”
IF t163k-knttp NE resbd_imp-knttp AND
NOT resbd_imp-knttp IS INITIAL.
CALL FUNCTION 'CO_TA_T163K_READ'
EXPORTING
knttp_imp = resbd_imp-knttp
IMPORTING
t163kwa = t163k
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
knt_text = text-k13.
EXIT.
ENDIF.
ENDIF.
3.4.3 如果resbd_imp-dbskz(直接采购标识)等于F,或者FLGEX(指示符:外部采购)属于非空,则把标识flag_banf置为‘X’,否则置为空
IF resbd_imp-dbskz EQ dbs_fremd OR
NOT resbd_imp-flgex IS INITIAL.
flag_banf = yx.
ELSE.
flag_banf = space.
ENDIF.
看看直接采购标识,以及外部采购对应到啥
本次目前没有F的,这列都是空的,说白了就是F类的服务类的采购,或者
3.4.4 如果esbd_imp-knttp科目分配类别是空,在判断如果上一步骤flag_banf也是空,再判断resbd_imp-vorab(指示符:初步订单)是否为空,都满足则赋值“网络预留text-k05”,不满足则赋值“工厂库存的计划独立需求text-k12”,以及“在定制中的帐户分配未知text-k13”
IF resbd_imp-knttp IS INITIAL.
IF flag_banf IS INITIAL.
IF resbd_imp-vorab IS INITIAL.
knt_text = text-k05.
ELSE.
knt_text = text-k12.
ENDIF.
ELSE.
knt_text = text-k13.
ENDIF.
3.4.5 如果resbd_imp-sobkz特殊库存标识为空时,判断resbd_imp-strecke(指示符)是否为空,为空则是网络的采购需求text-k01,否则为网络的第三方需求text-k02
继续,特殊库存表示等于Q时,再判断上不标识,以及resbd_imp-pbdnr需求计划和resbd_imp-vorab初步订单信息,然后赋值WBS 要素预留text-k06或者WBS 要素的计划独立需求text-k10
CASE resbd_imp-sobkz.
WHEN space.
IF resbd_imp-strecke IS INITIAL.
knt_text = text-k01.
ELSE.
knt_text = text-k02.
ENDIF.
WHEN sobkz-q.
IF flag_banf IS INITIAL.
IF resbd_imp-pbdnr IS INITIAL AND
resbd_imp-vorab IS INITIAL.
knt_text = text-k06.
ELSE.
knt_text = text-k10.
ENDIF.
ELSE.
IF resbd_imp-vorab IS INITIAL AND
resbd_imp-strecke IS INITIAL.
knt_text = text-k08.
ELSEIF NOT resbd_imp-strecke IS INITIAL.
knt_text = text-k15.
ELSE.
knt_text = text-k03.
ENDIF.
ENDIF.
后面代码不分析了,以WBS 要素预留这个为例,走一遍正好得到了该值。
3.5 总结,虽然遇到了极端,但是我们仍然满怀信心,耐心的看了下逻辑,虽然也没看太懂。。一般观察点都能找到表,除非~~~~~~~~表不存数据
文章来自于网络,如果侵犯了您的权益,请联系站长删除!