其实大神们各种方法都总结了,在此仅做记录,如有雷同,请联系删除。
找到表后检索表数据一般就是SE11、SE16、SE16N、SM30等
也可以MASS里面存储着一些主要业务对象相关的表
项目常用的:
这个是项目常用表
后台配置直接显示技术信息
用SM30维护即可
F1一般会展示3种类型的,分别是表、视图和结构。
以项目负责人为例,F1选择技术信息,直接出来的是透明表,基本就结束了。
视图还好,直接se11直接display 视图
以FTXP事务代码中的税率为例
将屏幕字段l_kbetr加入到观察点
找到写该屏幕字段的代码
根据表的值查查是否能查到该记录
看A003,找到了。
这个的原理是,数据可能存储在多个表,但总有一个主表(权威源),那么从主表到其他的数据拷贝时,其数据元素类型基本上是相同的(这个date element确实是独到的)。
选择表格
以订单数量为例
由于知道VBAK是订单抬头表,也知道订单编号是VBAK-VBELN,那么可以查VBAK所处的视图
再找到KVMENG是在VBAP中。
前提是要开启变更记录,比如项目要在项目参数文件维护项目变更记录。表TCDOB和TCDOBT列出了变更文档创建的所有可能对象类
以项目责任人维护为例
其实可以CN60查看变更记录
变更文档表CDHDR和CDPOS记录所有的数据库变更记录信息
查看CDHDR表,拷贝文档编号
查看CDPOS记录,输入50640
拷贝出来,搜索字段名,大概可以找到表名。
此处改一下项目定义的计划结束时间
在配置过程中,甚至开发过程中,经常遇到BUG,而SAP定位错误并没那么精确,如何定位到具体代码呢?以下内容都是网上找的,非本人原创。。
以se38随便输入一个程序名,但是该程序名不存在为例
其中DS代表消息类,017代表消息号。事务码SE91, 打开DS message class,定位到第17条消息,点击这个图标使用Where Used List功能。
通过ABAP的关键字MESSAGE抛出消息时,系统变量SY-MSGID会自动被填充消息所属的Message Class,以DS为例,而SY-MSGNO被填充为抛出消息的编号,这个例子里为017. 因此,通过在调试器里创建watch point并维护相应的触发条件。在程序运行时,一旦触发条件满足,watch point触发,此时执行到的ABAP语句即为消息弹出的准确位置。
在命令输入栏里键入/h打开调试模式,点击Display按钮,弹出调试器:
执行F8
在调试器此处创建类型为ABAP Commands的动态断点,命令设置为MESSAGE. 这样,ABAP调试器会自动在所有出现了MESSAGE关键字的地方停下来。
也可以用
事务码SE93里输入SE38,找到SE38实现的ABAP程序名和所处的开发包名称。
方法4的理论依据是,既然我们在SE38里看到了DS017这条消息,那么SE38的实现代码里,必定会出现MESSAGE S017这行代码。因此在方法4里我们改变思路,不再采用动态调试的办法,而选择和它相反的思路。
使用源代码扫描工具程序RS_ABAP_SOURCE_SCAN查找SE38实现代码里所有出现了MESSAGE S017的ABAP代码位置:
进入事务码SAT,创建一个新的跟踪Variant,Aggregation(聚合)记得设置为None,否则后续查看结果时将得不到期望看到的完整树形结构。
点击执行
等到100%完成后,来到SAT的结果展示页面里,点击Call Hierarchy标签页,SE38执行的所有ABAP statement罗列如下。使用SAT自带的搜索按钮,输入MESSAGE S017, 执行即可得到结果。双击后就能进入对应的ABAP代码。
为什么要弄清楚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调用位置
还是那附近的。
今天有小伙正好有用到采购类型的需求,这个以前还真没用过,只知道BAPI用要写死这些类型,至于生成的预留后存到那张表,还真心没找过。
采用的程序名SAPLCOMD,观察点下字段CNDOK-PRCTYPE,CNDOK-PRCTYPE = ‘WBS 要素预留’
1.选择调试abap
3.下观察点
4.执行F8断到如下位置,那么基本上是通过text-k06赋值了
5.发现整个form都没有对text-k06赋值的地方,继续下观察点,完蛋,F8直接跳出去了,说明这个不太可行
6。宣布第一炮找寻失败。
SAPLCOMD , CNDOK-NLFZV ,CNDOK-NLFZV = 2
执行F8断下来,可以看到是RESBD-NLFZV进行赋值,要是resbd是个表就完事了,可惜是个结构。
猜猜resb表有没有NLFZV相似的字段呢?果然有,偏移量顺利找到了
我去,邻居轻松找到,但是这个采购类型依然没找到,这可超过我常识了啊。。。大哥你是铁板吗,这字段不会是需要动态推导出来的吧,没进数据库存储~~~仔细看了下代码,还真是动态生成了,宣布game over,什么大法都没鸟用了。
* Textposition
IF NOT resbd_imp-txtps IS INITIAL.
knt_text = text-k14.
EXIT.
ENDIF.
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.
IF resbd_imp-dbskz EQ dbs_fremd OR
NOT resbd_imp-flgex IS INITIAL.
flag_banf = yx.
ELSE.
flag_banf = space.
ENDIF.
看看直接采购标识,以及外部采购对应到啥
本次目前没有F的,这列都是空的,说白了就是F类的服务类的采购,或者
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.
继续,特殊库存表示等于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 要素预留这个为例,走一遍正好得到了该值。