SAP 后台表查询方法及消息报错定位方法

SAP 后台表查询方法及消息报错定位方法

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列出了变更文档创建的所有可能对象类

在这里插入图片描述

以项目责任人维护为例

z

其实可以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 总结,虽然遇到了极端,但是我们仍然满怀信心,耐心的看了下逻辑,虽然也没看太懂。。一般观察点都能找到表,除非~~~~~~~~表不存数据

  • 16
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值