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

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

  • 1 后台表查找方法
    • 1.1 方法1 业务理解加bing
      • 1.1.1 去SE16N查询时,输入*CEPC*就可以查看相关的表。
      • 1.1.2 或者检索DD02T表(存放元数据的表)
      • 1.1.3 常用模块简单表
    • 1.2 方法2 后台配置表查找方法
    • 1.3 方法3 用F1大法
      • 1.3.1 F1直接查出来是表
      • 1.3.2 F1直接查出来的是视图
      • 1.3.3 如果是结构,那么转下一步
    • 1.4 如果结构中是include,那么直接取include表
    • 1.5 如果字段在常用报表中,可以看报表逻辑对应的字段
    • 1.6 观察点调试代码,有代码经验的比较推荐
      • 1.6.1 重新进入程序,开启调试模式
      • 1.6.1 重新调试模式进入税码维护界面,重新下 观察点 portab-kbertr,跟踪 portab-kbertr 字值是从哪来的。
      • 1.6.3 继续追踪vake-knumh,断在一个sql语句
    • 1.7 数据元素所用来源,一般不懂代码的优先用
    • 1.8 关联视图检索,属于同屏幕关联猜测型
    • 1.9 业务修改记录法,项目的变更可用
    • 1.10 底表修改记录跟踪,这个并不是所有表都记录的,只有大部分业务对象记录了
    • 1.11 SQL跟踪,慎用。但是利器
    • 1.12 运行时应用性能分析SAT,属于没招了只能这样找了
  • 2 常用BUG调试方式
    • 2.1 SE91where user list
    • 2.2 观察点方式
    • 2.3 使用ABAP调试器里类型为ABAP命令的动态断点
    • 2.4 ABAP源代码静态扫描
    • 2.5 ABAP应用性能分析工具SAT
    • 2.6 使用ABAP数据库执行跟踪和性能分析工具ST05
  • 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里面存储着一些主要业务对象相关的表

SAP 后台表查询方法及消息报错定位方法_第1张图片

SAP 后台表查询方法及消息报错定位方法_第2张图片

1.1.1 去SE16N查询时,输入CEPC就可以查看相关的表。

SAP 后台表查询方法及消息报错定位方法_第3张图片

1.1.2 或者检索DD02T表(存放元数据的表)

SAP 后台表查询方法及消息报错定位方法_第4张图片

SAP 后台表查询方法及消息报错定位方法_第5张图片

1.1.3 常用模块简单表

财务常用的:
SAP 后台表查询方法及消息报错定位方法_第6张图片

项目常用的:

这个是项目常用表

1.2 方法2 后台配置表查找方法

后台配置直接显示技术信息

SAP 后台表查询方法及消息报错定位方法_第7张图片

SAP 后台表查询方法及消息报错定位方法_第8张图片

用SM30维护即可

SAP 后台表查询方法及消息报错定位方法_第9张图片

1.3 方法3 用F1大法

F1一般会展示3种类型的,分别是表、视图和结构。

1.3.1 F1直接查出来是表

以项目负责人为例,F1选择技术信息,直接出来的是透明表,基本就结束了。

SAP 后台表查询方法及消息报错定位方法_第10张图片

1.3.2 F1直接查出来的是视图

视图还好,直接se11直接display 视图

SAP 后台表查询方法及消息报错定位方法_第11张图片

1.3.3 如果是结构,那么转下一步

1.4 如果结构中是include,那么直接取include表

SAP 后台表查询方法及消息报错定位方法_第12张图片
直接双击KONV即可到达表
SAP 后台表查询方法及消息报错定位方法_第13张图片

SAP 后台表查询方法及消息报错定位方法_第14张图片

1.5 如果字段在常用报表中,可以看报表逻辑对应的字段

1.6 观察点调试代码,有代码经验的比较推荐

以FTXP事务代码中的税率为例

SAP 后台表查询方法及消息报错定位方法_第15张图片

1.6.1 重新进入程序,开启调试模式

SAP 后台表查询方法及消息报错定位方法_第16张图片

将屏幕字段l_kbetr加入到观察点

SAP 后台表查询方法及消息报错定位方法_第17张图片

找到写该屏幕字段的代码

SAP 后台表查询方法及消息报错定位方法_第18张图片

1.6.1 重新调试模式进入税码维护界面,重新下 观察点 portab-kbertr,跟踪 portab-kbertr 字值是从哪来的。

SAP 后台表查询方法及消息报错定位方法_第19张图片

进入断点
SAP 后台表查询方法及消息报错定位方法_第20张图片

可以看到KONP是个表SAP 后台表查询方法及消息报错定位方法_第21张图片

根据表的值查查是否能查到该记录

SAP 后台表查询方法及消息报错定位方法_第22张图片

SAP 后台表查询方法及消息报错定位方法_第23张图片
但是发现这个明显也不是最终存储税码的地方

SAP 后台表查询方法及消息报错定位方法_第24张图片

1.6.3 继续追踪vake-knumh,断在一个sql语句

SAP 后台表查询方法及消息报错定位方法_第25张图片

看A003,找到了。

SAP 后台表查询方法及消息报错定位方法_第26张图片

1.7 数据元素所用来源,一般不懂代码的优先用

这个的原理是,数据可能存储在多个表,但总有一个主表(权威源),那么从主表到其他的数据拷贝时,其数据元素类型基本上是相同的(这个date element确实是独到的)。

SAP 后台表查询方法及消息报错定位方法_第27张图片

SAP 后台表查询方法及消息报错定位方法_第28张图片

选择表格

SAP 后台表查询方法及消息报错定位方法_第29张图片

1.8 关联视图检索,属于同屏幕关联猜测型

以订单数量为例

SAP 后台表查询方法及消息报错定位方法_第30张图片

由于知道VBAK是订单抬头表,也知道订单编号是VBAK-VBELN,那么可以查VBAK所处的视图

SAP 后台表查询方法及消息报错定位方法_第31张图片

SAP 后台表查询方法及消息报错定位方法_第32张图片

再找到KVMENG是在VBAP中。

1.9 业务修改记录法,项目的变更可用

前提是要开启变更记录,比如项目要在项目参数文件维护项目变更记录。表TCDOB和TCDOBT列出了变更文档创建的所有可能对象类

SAP 后台表查询方法及消息报错定位方法_第33张图片

以项目责任人维护为例

SAP 后台表查询方法及消息报错定位方法_第34张图片

其实可以CN60查看变更记录

SAP 后台表查询方法及消息报错定位方法_第35张图片

1.10 底表修改记录跟踪,这个并不是所有表都记录的,只有大部分业务对象记录了

变更文档表CDHDR和CDPOS记录所有的数据库变更记录信息

以更改销售订单中的采购订单编号为例:
SAP 后台表查询方法及消息报错定位方法_第36张图片

查看CDHDR表,拷贝文档编号

SAP 后台表查询方法及消息报错定位方法_第37张图片

查看CDPOS记录,输入50640

SAP 后台表查询方法及消息报错定位方法_第38张图片

1.11 SQL跟踪,慎用。但是利器

SAP 后台表查询方法及消息报错定位方法_第39张图片

SAP 后台表查询方法及消息报错定位方法_第40张图片

SAP 后台表查询方法及消息报错定位方法_第41张图片

拷贝出来,搜索字段名,大概可以找到表名。

SAP 后台表查询方法及消息报错定位方法_第42张图片

1.12 运行时应用性能分析SAT,属于没招了只能这样找了

SAP 后台表查询方法及消息报错定位方法_第43张图片

此处改一下项目定义的计划结束时间

SAP 后台表查询方法及消息报错定位方法_第44张图片

2 常用BUG调试方式

在配置过程中,甚至开发过程中,经常遇到BUG,而SAP定位错误并没那么精确,如何定位到具体代码呢?以下内容都是网上找的,非本人原创。。

2.1 SE91where user list

以se38随便输入一个程序名,但是该程序名不存在为例

SAP 后台表查询方法及消息报错定位方法_第45张图片

其中DS代表消息类,017代表消息号。事务码SE91, 打开DS message class,定位到第17条消息,点击这个图标使用Where Used List功能。

SAP 后台表查询方法及消息报错定位方法_第46张图片

2.2 观察点方式

通过ABAP的关键字MESSAGE抛出消息时,系统变量SY-MSGID会自动被填充消息所属的Message Class,以DS为例,而SY-MSGNO被填充为抛出消息的编号,这个例子里为017. 因此,通过在调试器里创建watch point并维护相应的触发条件。在程序运行时,一旦触发条件满足,watch point触发,此时执行到的ABAP语句即为消息弹出的准确位置。

在命令输入栏里键入/h打开调试模式,点击Display按钮,弹出调试器:

SAP 后台表查询方法及消息报错定位方法_第47张图片

执行F8

SAP 后台表查询方法及消息报错定位方法_第48张图片
下断点也会下到这。

SAP 后台表查询方法及消息报错定位方法_第49张图片

2.3 使用ABAP调试器里类型为ABAP命令的动态断点

在调试器此处创建类型为ABAP Commands的动态断点,命令设置为MESSAGE. 这样,ABAP调试器会自动在所有出现了MESSAGE关键字的地方停下来。

SAP 后台表查询方法及消息报错定位方法_第50张图片

SAP 后台表查询方法及消息报错定位方法_第51张图片

也可以用

SAP 后台表查询方法及消息报错定位方法_第52张图片

SAP 后台表查询方法及消息报错定位方法_第53张图片

2.4 ABAP源代码静态扫描

事务码SE93里输入SE38,找到SE38实现的ABAP程序名和所处的开发包名称。

SAP 后台表查询方法及消息报错定位方法_第54张图片

方法4的理论依据是,既然我们在SE38里看到了DS017这条消息,那么SE38的实现代码里,必定会出现MESSAGE S017这行代码。因此在方法4里我们改变思路,不再采用动态调试的办法,而选择和它相反的思路。
使用源代码扫描工具程序RS_ABAP_SOURCE_SCAN查找SE38实现代码里所有出现了MESSAGE S017的ABAP代码位置:

SAP 后台表查询方法及消息报错定位方法_第55张图片

SAP 后台表查询方法及消息报错定位方法_第56张图片

2.5 ABAP应用性能分析工具SAT

进入事务码SAT,创建一个新的跟踪Variant,Aggregation(聚合)记得设置为None,否则后续查看结果时将得不到期望看到的完整树形结构。

SAP 后台表查询方法及消息报错定位方法_第57张图片

SAP 后台表查询方法及消息报错定位方法_第58张图片

点击执行

等到100%完成后,来到SAT的结果展示页面里,点击Call Hierarchy标签页,SE38执行的所有ABAP statement罗列如下。使用SAT自带的搜索按钮,输入MESSAGE S017, 执行即可得到结果。双击后就能进入对应的ABAP代码。

SAP 后台表查询方法及消息报错定位方法_第59张图片

SAP 后台表查询方法及消息报错定位方法_第60张图片

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’.

SAP 后台表查询方法及消息报错定位方法_第61张图片

直接显示ABAP调用位置

SAP 后台表查询方法及消息报错定位方法_第62张图片

SAP 后台表查询方法及消息报错定位方法_第63张图片

还是那附近的。

SAP 后台表查询方法及消息报错定位方法_第64张图片

3 一个找表及字段的实例

今天有小伙正好有用到采购类型的需求,这个以前还真没用过,只知道BAPI用要写死这些类型,至于生成的预留后存到那张表,还真心没找过。
SAP 后台表查询方法及消息报错定位方法_第65张图片

3.1 还是先分析下

采用的程序名SAPLCOMD,观察点下字段CNDOK-PRCTYPE,CNDOK-PRCTYPE = ‘WBS 要素预留’

SAP 后台表查询方法及消息报错定位方法_第66张图片

3.2 下观察点

1.选择调试abap

2.点击该计划物料组件,跳到代码SAP 后台表查询方法及消息报错定位方法_第67张图片

3.下观察点

SAP 后台表查询方法及消息报错定位方法_第68张图片

4.执行F8断到如下位置,那么基本上是通过text-k06赋值了

SAP 后台表查询方法及消息报错定位方法_第69张图片

5.发现整个form都没有对text-k06赋值的地方,继续下观察点,完蛋,F8直接跳出去了,说明这个不太可行

SAP 后台表查询方法及消息报错定位方法_第70张图片

6。宣布第一炮找寻失败。

3.3 转换思路,我找这个字段的邻居看看

SAPLCOMD , CNDOK-NLFZV ,CNDOK-NLFZV = 2

SAP 后台表查询方法及消息报错定位方法_第71张图片
SAP 后台表查询方法及消息报错定位方法_第72张图片

执行F8断下来,可以看到是RESBD-NLFZV进行赋值,要是resbd是个表就完事了,可惜是个结构。

SAP 后台表查询方法及消息报错定位方法_第73张图片

猜猜resb表有没有NLFZV相似的字段呢?果然有,偏移量顺利找到了

SAP 后台表查询方法及消息报错定位方法_第74张图片

我去,邻居轻松找到,但是这个采购类型依然没找到,这可超过我常识了啊。。。大哥你是铁板吗,这字段不会是需要动态推导出来的吧,没进数据库存储~~~仔细看了下代码,还真是动态生成了,宣布game over,什么大法都没鸟用了。

SAP 后台表查询方法及消息报错定位方法_第75张图片

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

你可能感兴趣的:(SAP,ABAP,sap,erp)