ABAP高级调试功能
SAPABAP性能优化
SAPABAP性能优化SAPABAP(高级商务应用编程语言)是一种面向SAP应用程序开发的编程语言。
在开发SAPABAP应用程序时,性能优化是非常重要的,可以提高应用程序的响应速度和效率。
以下是一些优化SAPABAP性能的技术和实践。
1.数据库访问优化:在数据库访问方面,以下几种方法可以提高性能:-尽量避免对数据库频繁的读写操作,尽量减少数据库访问的次数。
-使用WHERE语句来限制查询结果的数量,尽量避免返回大量数据。
-使用索引来加速数据库查询操作。
对于频繁访问的字段,可以创建相应的索引。
-避免在循环中进行数据库查询操作,可以将多次查询合并为一次查询,提高效率。
2.代码优化:在编写ABAP代码时,以下几种方法可以提高性能:-避免使用SELECT*语句,尽量只选择需要的字段。
-避免在循环中进行复杂的计算操作,可以将计算提取到循环之外,减少计算次数。
-避免频繁使用长字段,例如TEXT字段,可以将其存储在辅助表中,减少数据库访问次数。
-使用内表来处理数据,避免频繁的数据库访问。
3.内存优化:在使用内存方面,以下几种方法可以提高性能:-尽量减少内存的使用,避免无用的变量和数据结构占用过多内存。
-对于大量数据的处理,可以使用ITAB或HASHEDTABLE来提高效率,尽量避免使用SORTEDTABLE。
-注意内存泄漏问题,及时释放不再使用的内存空间。
4.并发处理优化:在处理并发操作时,以下几种方法可以提高性能:-使用合适的锁策略,避免死锁和长时间的等待。
-尽量避免对同一个资源进行频繁的读写操作,可以考虑其他方法来减少并发冲突。
-使用事务控制来保证数据的一致性和完整性。
-如果可能,可以将并发操作分解成多个较小的操作,减少并发冲突的可能性。
5.缓存优化:在使用缓存方面,以下几种方法可以提高性能:- 使用合适的缓存技术,例如SAP的共享内存(Shared Memory)和缓冲区(Buffers)。
-对于频繁使用的数据,可以将其缓存在共享内存中,提高访问速度。
abap debug 技巧
1. 静态menu/button设置debug: 用户相关如今的系统(因为debug是与系统有关的),屏幕上可以有两种类型的debug mode:当然,这两个break-point都是用户相关的,也就是说不同的用户是不会相互影响的。
(1)Set/Delete session break-point前一种:同一个logon session,也就是说,在同一个登录session中,它的状态是保持着的。
如下:先设置一个session break-point:设置break-point:然后再打开另一个session,同样看该program:发现该break-point仍然存在。
如果再重新登录,再打开该program:可以发现,break-point不见了。
(2)Set/Delete External break-point后一种:不同的logon session,范围大于(包括)前一种。
先设置一个session break-point和external breakpoint:然后再打开另一个session,同样看该program,发现该两个break-point仍然存在。
如果再重新登录,再打开该program,可以发现,只有external 的break-point存在了。
2. Coding中设置debug:用户无关与用户相关这里仅记录两个break-point以及break <User>:(1)Break-Point:用户无关Break-point:是与用户无关。
如在程序中定义:然后,执行会进入debug。
如果再换一个用户(非当前的用户),同样会进入到debug中去。
(2)Break <userID>:用户相关Break <userID>:是与用户相关。
如在程序中定义:然后,执行会进入debug。
如果再换一个用户(非当前的用户),则不会进入到debug中去。
3. Debug中操作(1)设置Watch Point在Debug中设置watch point主要是为了在debug中有条件地去执行程序,类似于在程序中设置了一道“门槛”,程序运行至此则停下来。
ABAP高级调试功能
ABAP运行时分析器 – 用户追踪
追踪并行会话很不错,但是… HTTP 请求 (佚名HTTP 用户) RFC请求(RFC用户)
需要ABAP用户追踪
后台作业或者别的用户启动的业务 - 开始的时间未知
© 2010 SAP AG. All rights reserved. / Page 30
ABAP运行时分析器 – SAT – 性能分析
© 2010 SAP AG. All rights reserved. / Page 34
ABAP运行时分析器 – 性能问题
策略
尽量多地限定跟踪文件 (
变式). 特别是运行时间很长的程序。否则很快超出文件大小限制。
启动跟踪要以“按调用”(by call)来合计(结果只有命中列表) 限定语句– 例如:仅模块 (functions, forms, methods …) 在第二次追踪中缩小分析范围,用以追踪使性能最差的模块 只跟踪在“Limitation on Program Components”中定义的模块。
?重用新调试器界面框架获得先进且灵活的界面?不产生本地追踪文件可通过系统所有服务器来访问中央追踪容器?提供便利的跳转功能例如从调用层次到命中列表等等在各个视图之间灵活切换?使用profiletool检查哪个包层程序占用最多时间?针对每条调用层次项均可访问其调用堆栈?除了详细的调用层次分析以外还提供了一个模块树工具用以显示调用堆栈的合计视图
3. ABAP 单元测试器– 生成测试单元对每个功能模块进行测试
4. 覆盖分析器 –通过测试确保程序里每个单元都被执行到
© 2010 SAP AG. All rights reserved. / Page 5
[调整ABAP程序的性能]
如何调整ABAP程序的性能1、使用where语句不推荐Select * from zflight.Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’.Endselect.推荐Select * from zflight where airln = ‘LF’ and fligh = ‘222’.Endselect.2、使用聚合函数不推荐Maxnu = 0.Select * from zflight where airln = ‘LF’ and cntry = ‘IN’.Check zflight-fligh > maxnu.Maxnu = zflight-fligh.Endselect.推荐Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntr y = ‘IN’.3、使用视图代替基本表查询不推荐Select * from zcntry where cntry like ‘IN%’.Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’.Endselect.推荐Select * from zcnfl where cntry like ‘IN%’ and airln = ‘LF’.Endselect.4、使用INTO table 代替select endselect不推荐Refresh: int_fligh.Select * from zflight into int_fligh.Append int_fligh. Clear int_fligh.Endselect.推荐Refresh: int_fligh.Select * from zflight into table int_fligh.5、使用批量修改内表代替逐行修改不推荐Loop at int_fligh.If int_fligh-flag is initial.Int_fligh-flag = ‘X’.Endif.Modify int_fligh.Endloop.推荐Int_fligh-flag = ‘X’.Modify int_fligh transporting flag where flag is initial.6、使用二分法查询,提高查询内表数据速度不推荐Read table int_fligh with key airln = ‘LF’.推荐Read table int_fligh with key airln = ‘LF’ binary search.7、两个内表添加使用批量增加代替逐行不推荐Loop at int_fligh1.Append int_fligh1 to int_fligh2.Endloop.推荐Append lines of int_fligh1 to int_fligh2.8、使用table bufferingUse of buffered tables is recommended to improve the performance considerab ly. The buffer is bypassed while using the following statementsSelect distinctSelect … for updateOrder by, group by, having clauseJoinsUse the Bypass buffer addition to the select clause in order to explicitly bypas s the buffer while selecting the data.9、使用FOR ALL Entries不推荐Loop at int_cntry.Select single * from zfligh into int_flighwhere cntry = int_cntry-cntry.Append int_fligh.Endloop.推荐Select * from zfligh appending table int_flighFor all entries in int_cntryWhere cntry = int_cntry-cntry.10、正确地使用where语句,使查询能使用索引When a base table has multiple indices, the where clause should be in the ord er of the index, either a primary or a secondary indexTo choose an index, the optimizer checks the field names specified in the whe re clause and then uses an index that has the same order of the fields. One more tip is that if a table begins with MANDT, while an index does not, there is a high possibility that the optimizer might not use that index.11、正确地使用MOVE语句Instead of using the move-corresponding clause it is advisable to use the move statement instead. Attempt should be made to move entire inter nal table headers in a single shot, rather than moving the fields one by one.12、正确地使用inner joinLet us take an example of 2 tables, zairln and zflight. The table zairln has t he field airln, which is the airline code and the field lnnam, which is the name of the airline. The table zflight has the field airln, the airline code and other f ields which hold the details of the flights that an airline operates.Since these 2 tables are logically joined by the airln field, it is advisable to use the inner join.Select a~airln a~lnnam b~fligh b~cntry into table int_airdetFrom zairln as a inner join zflight as b on a~airln = b~airln.In order to restrict the data as per the selection criteria, a where clause can be added to the above inner join.13、使用sort by 代替order by14、避免使用SELECT DISTINCT语句使用的ABAP SORT + DELETE ADJACENT DUPLICATES 代替.15、使用select 字段列表代替Select *不推荐SELECT * FROM DD01L INTO DD01L_WAWHERE DOMNAME LIKE 'CHAR%'AND AS4LOCAL = 'A'.ENDSELECT.推荐SELECT DOMNAME FROM DD01LINTO DD01L_WA-DOMNAMEWHERE DOMNAME LIKE 'CHAR%'AND AS4LOCAL = 'A'.ENDSELECT.16、使用subquery代替多个select语句不推荐SELECT * FROM SPFLIINTO TABLE T_SPFLIWHERE CITYFROM = 'FRANKFURT'AND CITYTO = 'NEW YORK'.SELECT * FROM SFLIGHT AS FINTO SFLIGHT_WAFOR ALL ENTRIES IN T_SPFLIWHERE SEATSOCC < F~SEATSMAXAND CARRID = T_SPFLI-CARRIDAND CONNID = T_SPFLI-CONNIDAND FLDATE BETWEEN '19990101' AND '19990331'. ENDSELECT.推荐SELECT * FROM SFLIGHT AS F INTO SFLIGHT_WA WHERE SEATSOCC < F~SEATSMAXAND EXISTS ( SELECT * FROM SPFLIWHERE CARRID = F~CARRIDAND CONNID = F~CONNIDAND CITYFROM = 'FRANKFURT'AND CITYTO = 'NEW YORK' )AND FLDATE BETWEEN '19990101' AND '19990331'. ENDSELECT.17、如何快速删除重复内表的记录不推荐READ TABLE ITAB INDEX 1 INTO PREV_LINE.LOOP AT ITAB FROM 2 INTO WA.IF WA = PREV_LINE.DELETE ITAB.ELSE.PREV_LINE = WA.ENDIF.ENDLOOP.推荐DELETE ADJACENT DUPLICATES FROM ITABCOMPARING K.18、如何快速删除内表一定范围内的记录不推荐DO 101 TIMES.DELETE ITAB INDEX 450.ENDDO.推荐DELETE ITAB FROM 450 TO 550.19、使用collect语句代替人工合计计算结果不推荐LOOP AT ITAB1 INTO WA1.READ TABLE ITAB2 INTO WA2 WITH KEY K = WA1-K BINARY SEARCH. IF SY-SUBRC = 0.ADD: WA1-VAL1 TO WA2-VAL1,WA1-VAL2 TO WA2-VAL2.MODIFY ITAB2 FROM WA2 INDEX SY-TABIX TRANSPORTING VAL1 VAL2. ELSE.INSERT WA1 INTO ITAB2 INDEX SY-TABIX.ENDIF.ENDLOOP.推荐LOOP AT ITAB1 INTO WA.COLLECT WA INTO ITAB2.ENDLOOP.SORT ITAB2 BY K.20、使用显示的work area 代替默认的work area不推荐ITAB = WA.APPEND ITAB.推荐APPEND WA TO ITAB.21、使用LOOP ...ASSIGNING代替loop ... modify. 不推荐(整条记录更新)LOOP AT ITAB INTO WA.I = SY-TABIX MOD 2.IF I = 0.WA-FLAG = 'X'.MODIFY ITAB FROM WA.ENDIF.ENDLOOP.推荐(只会更新需要修改内容)LOOP AT ITAB ASSIGNING <WA>.I = SY-TABIX MOD 2.IF I = 0.<WA>-FLAG = 'X'.ENDIF.ENDLOOP.。
abap调试标准alv -回复
abap调试标准alv -回复什么是ABAP调试?ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言,它允许开发人员根据特定业务需求创建和修改SAP应用程序。
而ABAP调试则是一种用于诊断和修复ABAP程序中的错误和问题的技术工具。
ABAP调试标准ALV是ABAP调试的一种常用工具,它提供了一种可视化的方式来查看程序内部状态和执行流程,使开发人员能够更加方便地定位和修复错误。
那么,ABAP调试标准ALV 是如何使用的呢?下面我们将一步一步回答这个问题。
第一步:启动调试模式在调试ABAP程序之前,首先需要将程序启动到调试模式。
有多种方式可以启动调试模式,最简单的方式是在SAP Easy Access主界面上使用快捷键“Ctrl+Shift+F8”,或者在菜单栏选择“系统”→“工具”→“ABAP程序调试”。
第二步:设置断点一旦程序在调试模式中运行,开发人员就可以根据需要在程序中设置断点。
断点是一种指示程序执行暂停的标记,可以将断点设置在关键代码的位置,以便检查程序运行到该位置时的内部状态。
要设置断点,只需在代码行上单击鼠标右键,然后选择“断点设置”。
第三步:运行程序设置断点后,可以开始运行程序。
根据程序的逻辑,程序将在设置断点处停止执行,等待开发人员进一步操作。
可以通过单击SAP界面上的绿色箭头按钮或使用快捷键“F8”来继续程序的执行。
第四步:观察内部状态当程序执行到断点时,调试工具会显示程序的内部状态。
可以查看各个变量的值、调用栈、当前执行的代码行等信息。
这些信息将帮助开发人员找出程序错误或异常的原因。
第五步:修改代码一旦开发人员定位到程序中的问题,就可以对代码进行修改。
可以通过编辑器界面直接对代码进行修改,也可以使用调试工具提供的功能来修改变量的值、跳转到不同的代码行等操作。
第六步:继续执行或单步执行修改代码后,可以选择继续执行程序或者单步执行程序来验证修改的效果。
abap debug技巧
abap debug技巧ABAP Debug技巧1. 概述ABAP Debug技巧是在ABAP开发中用于调试和定位错误的重要工具。
本文将介绍几种常用的ABAP Debug技巧,以帮助开发者快速定位问题并进行调试。
2. 断点调试•设置断点: 使用BREAK-POINT语句在代码中设置断点,当程序执行到该断点时会暂停执行。
例如:BREAK-POINT.•条件断点: 可以在断点设置时添加条件,只有满足条件时才会暂停执行。
例如:BREAK-POINT ID 'COND_BREAKPOINT' IFlv_variable = 'ABC'.•动态断点: 使用DYNAMIC BREAK-POINT语句在运行时设置断点。
例如:DYNAMIC BREAK-POINT 'Z_MY_PROGRAM''Z_MY_FORM'.3. 查看变量•使用WATCHPOINT语句: 在代码中设置WATCHPOINT以监视变量的值。
例如:WATCHPOINT lv_variable.当该变量的值发生变化时,程序会暂停执行。
•直接查看变量: 可以在断点暂停执行时,使用鼠标右键点击变量并选择“Display”或“Evaluate”,来查看变量的当前值。
•使用变量监视器: 在调试时,可以使用变量监视器来实时监视变量的值。
在调试视图的“监视”标签页中添加要监视的变量,并可以选择刷新频率。
4. 调试窗口•全局断点视图: 在调试时,可以点击“全局断点”视图查看已设置的断点,并可以控制是否激活或禁用特定的断点。
•断点列表视图: 在调试时,可以点击“断点列表”视图查看已设置的断点,并可以快速跳转到具体的断点位置。
•断点堆栈视图: 在调试时,可以点击“断点堆栈”视图查看当前堆栈的断点信息,并可以跳转到调用堆栈上一层的断点。
5. 运行时间调试•单步执行: 在调试时,可以逐行或逐过程执行代码,以便观察执行过程。
ABAP程序性能优化的一些做法
ABAP程序性能优化的一些做法ABAP程序性能优化的一些做法ABAP程序基本上都需要从数据库里面抓数,所以性能很重要,同时有一些基本的,和优秀的写法是我们必须要掌握的,不然就会造成程序性能很差。
下面给予总结(这里包括有很基本的,也包括有比较少用到的),顺便推荐一个好的SAP标准文档 ABAP_PERFORMANCE_DOS_AND_DONTS :我觉得重要的是,1.尽量少的取数据到abap执行,多用inner join 把数据取出来。
一、基本的几条需要避免的规则(具体的一些怎么替换,可以看三和五):1、不使用select....endselect,估计月球人都知道这个事实了。
2、基本不使用select * ,跟多人喜欢直接用这个,因为方便,但是在数据量比较大的时候,应该使用select 字段,这样可以避免抓取无用数据。
3、LOOP 里面不用sort ,在loop外面排序完再进入LOOP。
4、尽量避免LOOP 里面嵌套select,这样多次访问数据库也会造成性能问题,但是有些时候避免不了也难免。
改为外面select,LOOP 里面read table。
5、大数据的read table,使用二分法 BINARY SEARCH,用之前要按关键字排序。
6、尽量避免LOOP里面嵌套LOOP,特别是当两个内表数据量都很大的时候,如果实在要嵌套LOOP可以参考三和五里面的解决办法。
7、尽量避免LOOP里面不用delete,append等语句。
改成批量处理。
二、index和buffer的合理使用:1、index的使用,在使用现有的index的时候注意,where条件里面的字段的顺序要跟index一致,而且可以可以适当的去匹配index,创建一些空的字段或者是index 后面再加字段,或者是使用index抓出数据后,再去做其它条件的处理。
2、index里面最好只有'=' AND 或者是…IN?。
有其它逻辑条件,会影响index的使用。
abap debug的五种方式
abap debug的五种方式
ABAP Debug是一种用于调试SAP ABAP程序的工具。
下面是ABAP Debug 的五种方式:
1. Classic Debugger:Classic Debugger是ABAP Debug的最基本版本,它允许用户在程序中设置断点、单步执行代码、查看和修改变量值以及跟踪函数调用。
用户可以通过菜单选项或快捷键直接进入Classic Debugger。
2. New Debugger:New Debugger是ABAP Debug的新版本,它比Classic Debugger更加灵活和易于使用。
New Debugger可以在不改变程序代码的情况下动态修改变量值,还可以在运行时插入代码。
此外,New Debugger还提供了更多的调试选项和功能。
3. Debugging Workbench:Debugging Workbench是一个集成了Classic Debugger和New Debugger的调试工具。
它提供了更多的调试选项和功能,如调试程序的不同层次、跟踪执行路线、检查用户权限等。
4. ABAP Trace:ABAP Trace是一种跟踪ABAP程序执行过程的工具,它可以帮助用户识别程序中的性能瓶颈和错误。
用户可以通过设置不同的跟踪选项,对程序进行跟踪并生成详细的日志信息。
5. SQL Trace:SQL Trace是一种跟踪SAP系统中数据库操作的工具,它可以帮助用户优化SQL查询语句和提高系统性能。
用户可以通过设置不同的跟踪选项,对SQL查询进行跟踪并生成详细的日志信息。
ABAPDebuggingScript(调试器脚本)使用的一些实际例子
ABAPDebuggingScript(调试器脚本)使用的一些实际例子例子1:Use ABAP debugger script to view BOL entity content in an efficient wayIn CRM, if we could like to review a BOL entity content in debugger, for example consider the following sample code which fetches line item product of a given one order document:DATA: lo_collection TYPE REF TO if_bol_entity_col, l v_view_name TYPE crmt_view_name, lv_query_name T YPE crmt_ext_obj_name, ls_parameter TYPE genilt_query_ parameters, lt_query_parameter TYPE genilt_selection_param eter_tab, ls_query_parameter LIKE LINE OF lt_query_paramet er. ls_query_parameter-attr_name = 'OBJECT_ID'. ls_query_parameter-low = iv_oppt_id. ls_query_parameter-option = 'EQ'. ls_query_parameter-sign = 'I'. APPEND ls_query_parameter TO lt_query_parameter. ls_query_parameter-attr_name = 'PROCESS_TYPE'. ls_query_parameter-low = iv_process_type. ls_query_parameter-option = 'EQ'. ls_query_parameter-sign = 'I'. APPEND ls_query_parameter TO lt_query_parameter. so_core = cl_crm_bol_core=>get_instance( ). so_core->load _component_set( 'BT' ). lv_query_name = 'BTQ1Order'. DATA( lo_result) = so_core->dquery( iv_query_name = lv_ query_name is_query_parameters = ls_parameter i t_selection_parameters = lt_query_parameter iv_vie w_name = lv_view_name ). CHECK lo_result->size( ) = 1. DATA(lo_order_result) = lo_result->get_first( ). DATA(lo_bt_order) = lo_order_result->get_related_entity( 'BTADVS1Ord' ). CHECK lo_bt_order IS NOT INITIAL. DATA(lo_header) = lo_bt_ order->get_related_entity( 'BTOrderHeader' ). CHECK lo_heade r IS NOT INITIAL. DATA(lo_items) = lo_header->get_related_en tities( iv_relation_name = 'BTHeaderItemsExt' ). CHECK lo_item s->size( ) = 1. DATA(lo_item) = lo_items->get_first( ). DATA(l o_admini) = lo_item->get_related_entity( 'BTItemsFirstLevel' ). CHECK lo_admini IS NOT INITIAL. DATA(lo_product) = lo_admi ni->get_related_entity( 'BTItemProductExt' ).If you would like to review the content of lo_product, you have to:(1) double click container_proxy:(2) double click DATA_REF:(3) double click:(4) double click ATTRIBUTE_REF:(5) double click:So totally you need to perform FIVE times double click in order to review content:Using ABAP debugger script(1) Click Script tab:(2) Create a new script:Choose a name for your script:(3) Use the following source code to overwrite the default source code:*---------------------------------------------------------------------** CLASS lcl_debugger_script DEFINITION*---------------------------------------------------------------------***---------------------------------------------------------------------*CLASS lcl_debugger_script DEFINITION INHERITING FROM cl_tpda_script_class_super . PUBLIC SECTION. METHODS: prolog ue REDEFINITION, init REDEFINITION, script REDEFINIT ION, end REDEFINITION. INTERFACES: if_tpda_script_w_i nput, if_tpda_script_w_output. PRIVATE SECTION. DATA: en tity_name TYPE string. DATA: value TYPE string. DATA: outpu t TYPE tpda_transfer_it_unsorted. DATA: bol_object_name TYP E crmt_ext_obj_name. METHODS get_attribute IMPORTING io_oref_descr TYPE REF TO cl_tpda_script_orefdescr iv_attribute_name TYPE string RETURNING VALUE(ro_descr) TYPE REF TO cl_tpda_script_data_descr.ENDCLASS. " lcl_debugger_script DEFINITION*---------------------------------------------------------------------** CLASS lcl_debugger_script IMPLEMENTATION*---------------------------------------------------------------------***---------------------------------------------------------------------*CLASS lcl_debugger_script IMPLEMENTATION. METHOD prolo gue.*** generate abap_source (source handler for ABAP) super ->prologue( ). ENDMETHOD. "prolog METHOD if_t pda_script_w_input~get_parameters. DATA lt_input TYPE tp da_transfer_it. DATA ls_input TYPE tpda_transfer_struc. ls_ input-id = 'ENTITY'. APPEND ls_input TO lt_input. p_parameters_it = lt_input. ENDMETHOD. "if_tpda_script_w_input~ get_parameters METHOD if_tpda_script_w_input~set_paramete r_values.* Tabelle mit Inputparameter und Wert DATA lt_inpu t TYPE tpda_transfer_it. DATA ls_input TYPE tpda_transfer _struc. lt_input = p_parameter_values_it. LOOP AT lt_input IN TO ls_input. IF ls_input-id = 'ENTITY'. entity_name = ls_input-value. ENDIF. ENDLOOP. ENDMETHOD. "if_tpda_script_w_input~set_parameter_values METHOD init.*** insert y our initialization code here ENDMETHOD. "init MET HOD script. DATA lr_data_descr TYPE REF TO cl_tpda_script _data_descr. DATA lr_struct_descr TYPE REF TO cl_tpda_script _structdescr. DATA lr_cx TYPE REF TO cx_root. DATA l s_quick TYPE tpda_scr_quick_info. DATA lv_name TYPE string. DATA lt_struct TYPE tpda_scr_struct_comp_it. DATA ls_struct TYPE tpda_scr_struct_comp. DATA ls_ou tput TYPE tpda_transfer_struc. DATA lr_symbsimple T YPE REF TO tpda_sys_symbsimple. DATA ls_varinfo TYPE t pda_quick_vars. FIELD-SYMBOLS: <lv_value> TYPE any. TRY. CLEAR output.* BREAK-POINT. ls_varinfo = cl_tpda_script_data_descr=>get_variable _info( 'LO_PRODUCT' ).* get object type name IF ls_varin fo-varvalue = 'OBJECT'.* class instance passed directly lv _name = entity_name && '-CONTAINER_PROXY->DATA_REF->OBJECT_NAME'. ELSE.* variable of class instance passed lv_name = ls_varinfo-varvalue && '-CONTAINER_PROXY->DATA_REF->OBJECT_NAME'. ENDIF. ls_quick = cl_tpda_script_data_descr=>get_quick_info( lv_na me ). ASSIGN ls_quick-quickdata TO <lv_value>. lr_symbsimple ?= <lv_value>. bol_object_name = lr_symbsimple->valstring.* get content IF ls_varinfo-varvalue = 'OBJECT'. lv_name = entity_name && '-CONTAINER_PROXY->DATA_REF->ATTRIBUTE_REF->*'. ELSE . lv_name = ls_varinfo-varvalue && '-CONTAINER_PROXY->DATA_REF->ATTRIBUTE_REF->*'. END IF. lr_data_descr = cl_tpda_script_data_descr=>factory( lv_n ame ). lr_struct_descr ?= lr_data_descr. lr_struct_descr-> components( IMPORTING* p_components_it = p_components_full_it = lt_struct ). LOOP AT lt_str uct INTO ls_struct. ls_output-id = ls_struct-compname. TRY. ASSIGN ls_struct-symbquick-quickdata TO <lv_value>. lr_symbsimple ?= <lv_value>. ls_output-value = lr_symbsimple->valstring. CATCH cx_root INTO lr _cx. ls_output-value = lr_cx->get_text( ). ENDTRY. APPEND ls_outpu t TO output. ENDLOOP. DATA lt_col_alv TYPE tpda_script_service_source_tab. DATA ls_col_alv LIKE LINE OF lt_col_alv. ls_col_alv-fieldname = ls_col_alv-content = 'ID'. APPEND ls_col_alv TO lt_col_alv. ls_col_al v-fieldname = ls_col_alv-content = 'VALUE'. APPEND ls_col_alv TO lt_col_alv. CAL L METHOD cl_tpda_script_data_display=>data_display EXP ORTING p_list_header = 'Query Selection Parameters' p_column_it = lt_col_alv p_popup = 'X' CH ANGING p_data_it = output.* BREAK-POINT. CATCH cx_root INTO lr_cx. BREAK-POINT. "#EC NOBREAK value = lr_cx ->get_text( ). ENDTRY. ENDMETHOD. "script MET HOD end.*** insert your code which shall be executed at the en d of the scripting (before trace is saved)*** here ENDMETHOD. "end METHOD if_tpda_script_w_output~get_parame ter_values. DATA lt_param TYPE tpda_transfer_it_unsorted. D ATA ls_param TYPE tpda_transfer_struc. ls_param-id = 'VARIABLE'. ls_param-value = entity_name. APPEND ls_param TO lt_param. ls_para m-id = 'OBJECT_NAME'. ls_param-value = bol_object_name. APPEND ls_param TO lt_param. AP PEND INITIAL LINE TO lt_param. APPEND LINES OF output TO lt_param. p_parameter_values_it = lt_param. ENDMETHOD. "if_tpda_script_w_output~get_parameter_values METH OD get_attribute. DATA lr_oref_descr TYPE REF TO cl_tpda_s cript_orefdescr. DATA lr_object_descr TYPE REF TO cl_tpda_sc ript_objectdescr. DATA ls_varinfo TYPE tpda_quick_vars. DATA lv_longname TYPE string. DATA lt_attributes TYPE tp da_script_object_attribut_it. lr_oref_descr = io_oref_descr. lr _object_descr = lr_oref_descr->get_object_handle( ). lt_attribut es = lr_object_descr->attributes( ). ro_descr = lr_object_descr->get_attribut_handle( lv_longname ). ENDMETHOD. "get_oref_attributeENDCLASS. "lcl_debugger_script IMPLEMENTATIONOnce done, save the scrip t and choose “Execute Directly”.(4) Before you start Script by clicking button “Start Script”, make sure you use the correct variable name used in your ABAP code. In my example, it is “LO_PRODUCT”.Once done, click button “Start Script”: the BOL entity content is now automatically displayed, without five times double click any more.例子2:Use ABAP debugger script to view dynamic query service selection parameter in an efficient wayIn WebUI we can maintain search parameter for dynamic search:The value maintained in WebUI could be found fromdynamic query service instance in backend via debugging. Double click variable qs:We need the following FIVE steps to see the selection parameter value.(1) double click SELECTION_PARAM_COL:(2) Double click ENTITY_LIST:(3) These four entities represent the four selection parameters we see in WebUI. Double click one of them:(4) Double click PARAMETER_DATA:(5) double click:Finally we see the value:Use ABAP debugger script to directly review variable content without so many double clicks(1) Click Script tab, create a new Script:(2) Choose a name for your script:Paste the following source code to overwrite automatically generated source code:*---------------------------------------------------------------------** CLASS lcl_debugger_script DEFINITION*---------------------------------------------------------------------***---------------------------------------------------------------------*CLASS lcl_debugger_script DEFINITION INHERITING FROM cl_t pda_script_class_super . PUBLIC SECTION. METHODS: prolog ue REDEFINITION, init REDEFINITION, script R EDEFINITION, end REDEFINITION. INTERFACES: if_t pda_script_w_input. PRIVATE SECTION. DATA queryservice name TYPE string. CONSTANTS querydefaultname TYPE string VALUE 'QUERY_SERVICE'.ENDCLASS. "lcl_debugger_ script DEFINITION*---------------------------------------------------------------------** CLASS lcl_debugger_script IMPLEMENTATION*---------------------------------------------------------------------***---------------------------------------------------------------------*CLASS lcl_debugger_script IMPLEMENTATION. METHOD prolo gue.*** generate abap_source (source handler for ABAP) super ->prologue( ). ENDMETHOD. "prolog METHOD init. queryservicename = querydefaultname. ENDMETHOD. "init METHOD script. TYPES: BEGIN OF ty_selparam, attrname TYPE string, sign TYPE string, opti on TYPE string, low TYPE string, high TYPE stri ng, END OF ty_selparam. DATA lt_col_alv TYPE tpda_script_service_source_tab. DATA ls_col_alv like LINE OF lt_col_alv. DATA ls_selparam TYPE ty_selpar am. DATA lr_query_service TYPE tpda_quick_vars. DA TA lv_query_service_object_name TYPE tpda_var_name. DATA l v_selparamcol_object_name TYPE tpda_var_name. DATA lv_b o_object_name TYPE tpda_var_name. DATA lv_number_ of_selparam TYPE i. DATA lt_attr TYPE tpda_s cript_object_attribut_it. DATA ls_attr TYPE tpda_sc ript_object_attributes. DATA lt_selparam TYPE STAN DARD TABLE OF ty_selparam. DATA lr_attr TYPE R EF TO cl_tpda_script_data_descr. DATA lr_entity_list TY PE REF TO cl_tpda_script_tabledescr. DATA lr_obj_descr TYPE REF TO cl_tpda_script_objectdescr. REFRESH lt_selpara m. TRY. lv_query_service_object_name = cl_tpda_script_da ta_descr=>get_variable_info( queryservicename )-varvalue. lv_selparamcol_object_name = cl_tpda_script_data _descr=>get_variable_info( lv_query_service_object_name && '-SELECTION_PARAM_COL' )-varvalue. lr_entity_list ?= cl_tpda_script_data_descr=>factor y( lv_selparamcol_object_name && '-ENTITY_LIST' ). lv_number_of_selparam = lr_entity_list->line cnt( ). DO lv_number_of_selparam TIMES. lv_bo_object _name = cl_tpda_script_data_descr=>get_variable_info( lv_selpa ramcol_object_name && '-ENTITY_LIST[' && sy-index && ']-BO')-varvalue. ls_selparam-attrname = cl_tpda_script_data_descr=>get_simple_value( lv_bo _object_name && '-PARAMETER_DATA->ATTR_NAME' ). ls_selparam-option = cl_tpda_script_data_descr=>get_simple_value( lv_bo_o bject_name && '-PARAMETER_DATA->SIGN' ). ls_selparam-sign = cl_tpda_script_data_descr=>get_simple_value( lv_bo_obje ct_name && '-PARAMETER_DATA->OPTION' ). ls_selparam-low = cl_tpda_script_data_descr=>get_simple_value( lv_bo_obje ct_name && '-PARAMETER_DATA->LOW' ). ls_selparam-high = cl_tpda_script_data_descr=>get_simple_value( lv_bo_obj ect_name && '-PARAMETER_DATA->HIGH' ). APPEND ls_selparam TO lt_se lparam. ENDDO. REFRESH lt_col_alv. ls_col_alv-fieldname = ls_col_alv-content = 'ATTRNAME'. APPEND ls_col_alv TO lt_col_alv. ls_col_alv-fieldname = ls_col_alv-content = 'SIGN'. APPEND ls_col_alv TO lt_col_alv. ls_col _alv-fieldname = ls_col_alv-content = 'OPTION'. APPEND ls_col_alv TO lt_col_alv. ls_ col_alv-fieldname = ls_col_alv-content = 'LOW'. APPEND ls_col_alv TO lt_col_alv. ls_col_alv-fieldname = ls_col_alv-content = 'HIGH'. APPEND ls_col_alv TO lt_col_alv. CALL METHOD cl_tpda_script_data_display=>data_display EXP ORTING p_list_header = 'Query Selection Parameters' p_column_it = lt_col_alv p_popup = 'X' CH ANGING p_data_it = lt_selparam. CATCH cx_tpda_va rname cx_tpda_data_descr_invalidated cx_sy_move _cast_error cx_tpda_table_wrong_key cx_tpda_scrip t_no_simple_type cx_tpda_table_wrong_table_type. m e->raise_error( ). ENDTRY. ENDMETHOD. "script METHOD end.*** insert your code which shall be executed at th e end of the scripting (before trace is saved)*** here ENDMETH OD. "end METHOD if_tpda_script_w_input~get_para meters. DATA l_input TYPE tpda_transfer_struc. IF p_parame ters_it IS INITIAL. l_input-id = 'Query Service Variable Name'. l_input-value = querydefaultname. APPEND l_input TO p_paramete rs_it. ENDIF. ENDMETHOD. "if_tpda_script_w_input ~get_parameters METHOD if_tpda_script_w_input~set_paramet er_values. DATA l_input TYPE tpda_transfer_struc. READ TAB LE p_parameter_values_it INTO l_input INDEX 1. queryservicen ame = l_input-value. ENDMETHOD. "if_tpda_script_w_input~set_pa rameter_valuesENDCLASS. "lcl_debugger_script IMP LEMENTATIONSpecify the name of your query service variable in line 21. In my example, it is QS. Start script by clicking button “Start Script”:Now you see all four selection parameter value displayed inALV.。
abap中的功能用法
ABAP(Advanced Business Application Programming)是一种高级商业应用程序编程语言,主要用于SAP系统的开发。
下面将对ABAP中的功能用法进行全面阐述,包括定义、用法、重点、难点和注意事项等方面,并附有应用案例。
一、定义ABAP是一种面向对象的语言,用于开发SAP系统的功能模块、报表、界面等。
它是一种高级编程语言,能够简化SAP系统的开发过程,提高开发效率和代码质量。
二、用法1.定义变量和方法在ABAP中,可以使用声明语句来定义变量和方法。
变量是用来存储数据的标识符,而方法是用来执行特定操作的函数。
例1:定义一个整数型变量i,并将其赋值为10。
例2:定义一个方法get_sum,用于计算两个数的和。
2.条件语句和循环语句在ABAP中,可以使用条件语句和循环语句来实现程序的逻辑控制。
条件语句用于根据条件执行不同的操作,而循环语句则用于重复执行特定的操作。
例3:使用条件语句判断一个数是否为偶数。
例4:使用循环语句计算1到10的和。
3.事务代码和报表输出在ABAP中,可以使用事务代码和报表输出功能来实现与用户的交互。
事务代码用于执行特定的业务流程,而报表输出功能则可以将查询结果以表格或报表的形式呈现给用户。
例5:使用事务代码SE38执行一个程序。
在命令行输入事务代码SE38,输入程序名,按Enter键执行程序。
三、重点1.熟练掌握ABAP语法和程序结构,能够编写简单的程序和函数。
2.了解SAP系统的数据模型和业务逻辑,能够根据实际需求进行程序设计。
3.掌握ABAP中的常用函数和工具,如数据转换函数、文本处理函数、报表输出等。
4.了解ABAP程序的调试和测试方法,能够进行程序调试和性能优化。
四、难点1.ABAP中的复杂语法和程序结构,如条件判断、循环控制、异常处理等。
2.与其他系统的集成和交互,如与SAP系统外的数据库或应用程序的接口开发。
3.理解SAP系统的业务逻辑和数据模型,能够根据业务需求进行程序设计。
最浅显易懂的SAPGUI里ABAP调试器的使用方法介绍
最浅显易懂的SAPGUI里ABAP调试器的使用方法介绍ABAP调试器是SAPGUI中的一项重要工具,用于调试ABAP程序。
通过使用ABAP调试器,开发人员可以逐行执行程序并查看变量的值,以帮助他们找到程序中的错误和问题。
本文将介绍ABAP调试器的使用方法,并提供一些实用的调试技巧。
首先,我们需要打开ABAP调试器。
在SAPGUI的起始菜单中,选择"工具",然后选择"ABAP调试器"。
或者通过快捷键"Ctrl+Shift+F12"来直接打开ABAP调试器。
在调试器的控制面板中,我们将看到一些常用的按钮和选项。
以下是一些常用的按钮和选项的说明:1.执行按钮:点击此按钮,调试器将从当前光标所在的行开始执行程序,直到遇到断点或程序结束。
2.逐行执行按钮:点击此按钮,调试器将一次执行一行程序。
可以在每行程序执行时查看变量的值。
3.断点按钮:点击此按钮,调试器会在当前行设置一个断点。
在执行程序时,调试器将在达到断点时停止执行,以便我们查看当前的程序状态。
4.变量显示按钮:点击此按钮,调试器将显示当前程序中所有的变量及其值。
可以通过点击变量名称来查看更详细的变量信息。
5.调用堆栈按钮:点击此按钮,调试器将显示当前的调用堆栈。
调用堆栈显示了程序中所有被调用的函数和方法。
可以通过点击堆栈中的条目来查看更详细的函数和方法信息。
6.断点管理按钮:点击此按钮,调试器将显示当前程序中所有设置的断点。
可以通过点击断点条目来查看和修改断点的设置。
在使用ABAP调试器时,以下是一些实用的调试技巧:1.设置断点:在调试程序之前,我们可以在程序中设置断点。
断点将决定程序在何处停止执行。
通过点击源代码中的行号,我们可以在该行上设置一个断点。
2.智能断点:在一些情况下,我们可能只对程序执行的特定部分感兴趣。
在这种情况下,我们可以设置智能断点。
智能断点可以在程序中的特定条件满足时触发断点。
ABAP高级调试功能
ABAP高级调试功能ABAP(Advanced Business Application Programming)是SAP系统中的编程语言,用于开发企业级应用程序。
在ABAP开发过程中,调试是一个非常重要的环节,它能帮助开发人员找到代码中的问题并进行修复。
ABAP提供了一些高级调试功能,使得调试过程更加方便和高效。
1.断点功能:ABAP可以在代码的一些位置设置断点,当程序执行到该位置时会暂停,开发人员可以查看当前变量的值、调用堆栈和其他相关信息。
断点可以在编程开发工具中手动设置,也可以在代码中使用语句设置。
2.跳转功能:在调试过程中,开发人员可以通过调试器工具中的"进入"、"步过"、"步出"等功能来控制程序的执行流程。
这些功能可以帮助开发人员在调试过程中遍历代码,并观察每一步的执行结果。
3.变量监视功能:在调试过程中,可以使用变量监视功能来跟踪特定变量的值。
开发人员可以选择要监视的变量,每当程序执行到一个断点时,变量监视功能会自动更新变量的值,并显示在监视窗口中,方便开发人员进行分析。
4.条件断点功能:在设置断点时,可以定义一个条件,当满足条件时才会暂停程序执行。
这个功能特别适用于需要在特定情况下才进行调试的场景。
例如,可以设置一个条件断点,只有在一些变量的值大于一些阈值时才会触发。
5.模拟功能:ABAP调试器还提供了模拟功能,可以在不影响实际数据的情况下测试特定代码的执行情况。
通过模拟功能,开发人员可以指定用于测试的输入数据,并验证代码的正确性。
6.远程调试功能:有时,开发人员可能需要在远程系统中调试ABAP程序。
ABAP调试器支持远程调试功能,通过与远程系统建立连接,开发人员可以在本地环境中调试远程系统中运行的ABAP程序。
这个功能方便了开发人员在分布式环境中进行调试。
7.事件断点功能:ABAP调试器提供了事件断点功能,可以在特定事件触发时暂停程序执行。
sap abap技巧 -回复
sap abap技巧-回复SAP ABAP技巧:深入理解ABAP语言的基础知识与高级应用ABAP(Advanced Business Application Programming)是用于SAP ERP系统的一种编程语言。
作为SAP系统的核心,ABAP是许多企业中重要业务流程的驱动力。
在本文中,我们将逐步介绍ABAP语言的基础知识和一些高级应用技巧。
第一步:入门理解ABAP语言ABAP是一种面向对象的编程语言,它使用了跟传统编程语言不同的编码规范和语法。
入门ABAP语言的第一步是理解其基础知识。
以下是一些核心概念:1. 数据字典:在ABAP中,数据字典是用于定义数据库中表、视图、数据类型等的工具。
了解和熟悉数据字典中的常用对象和概念将有助于您编写更高效的ABAP代码。
2. ABAP编辑器:SAP系统中的ABAP编辑器是用于创建、修改和管理ABAP程序的工具。
学习如何使用编辑器的不同功能,如代码补全、语法检查和调试器,将大大提高您的开发速度和效率。
3. ABAP语句:ABAP的语法有许多与其他编程语言相似之处,如变量声明、条件语句和循环结构等。
但是,ABAP还具有一些与SAP系统集成紧密相关的特殊语句。
学习掌握ABAP语句的不同类型和用法是成为一名优秀的ABAP开发人员的关键。
第二步:使用ABAP语言进行数据处理在SAP系统中,数据处理是ABAP开发的重要组成部分。
以下是一些重要的数据处理技巧:1. 内表(Internal Table):内表是ABAP中的一种数据结构,用于存储和处理表格数据。
了解如何创建、填充和读取内表是处理大量数据的一项基本技能。
2. 数据选取和过滤:使用SELECT语句从数据库表中检索数据是ABAP 开发的常见操作。
学习如何编写有效的SELECT语句,并掌握过滤数据的技巧,如WHERE子句和JOIN操作,将帮助您更好地处理和操作数据。
3. 事务处理(Transaction Processing):在SAP系统中,事务是一系列相关的业务操作,例如创建销售订单或支付供应商发票。
SAPABAP程序性能优化
SAPABAP程序性能优化SAPABAP是一种高级商务应用编程语言,用于在SAP系统中开发和定制程序。
在开发ABAP程序时,程序的性能是一个重要的考虑因素。
优化ABAP程序的性能可以提高系统的响应速度和吞吐量,提高用户体验,减少系统负载,延长硬件使用寿命并节省资源。
下面将介绍一些常见的优化技术和最佳实践。
1.使用合适的数据库访问方法:SAPABAP程序通常需要与数据库进行交互。
在数据库访问方面,使用合适的方法可以大大提高性能。
例如,使用SELECT语句并带有合理的WHERE条件可以减少检索的数据量。
使用内部表进行数据操作,而不是使用数据库表,可以避免不必要的数据库访问。
2.避免在循环中执行数据库访问操作:在循环中执行数据库访问是一个常见的性能瓶颈。
如果可能的话,尽量避免在循环中执行数据库访问操作。
可以将数据库操作放在循环外部,并使用适当的数据结构来处理数据,以减少数据库访问的次数。
3.使用合适的索引:索引是一种用于加速数据库查询操作的数据结构。
为数据库表添加适当的索引,可以减少查询操作的时间复杂度,提高查询性能。
在ABAP程序中,可以使用数据库表的维护事务码(SE14)来添加或删除索引。
4.使用合适的缓存技术:缓存是一种将频繁访问的数据存储在存储介质中的技术。
在ABAP程序中,可以使用SAP提供的缓存技术,如共享内存和工作区缓存,来提高数据访问的性能。
使用缓存可以减少数据库访问的次数,从而显著提高程序的性能。
5.避免冗余的计算:在ABAP程序中,可以通过避免重复计算来提高性能。
如果一些计算结果在程序中多次使用,可以将结果存储在一个变量中,并在需要时使用该变量,而不是每次都重新计算。
6.使用合适的数据类型:选择合适的数据类型可以提高程序的性能。
例如,使用整数类型(INTEGER)而不是字符类型(CHAR)来存储整数数据,可以减少内存占用和计算时间。
在ABAP程序中,可以使用合适的数据类型以及相应的类型转换操作,来提高程序的性能。
SAP ABAP Web dynpro 跟踪 调试 工具
Web Dynpro For ABAP跟踪测试工具简介概述从传统ABAP UI开发(如Dynpro,ABAP List等等)直接转到Web Dynpro For ABAP 开发来,我们可能会发现那些传统的跟踪测试工具(如SAT,也许SAAB还是一个简单易用的、合适的工具)并不适用在Web Dynpro For ABAP上。
即使你有ITS的开发测试经验,知道如何通过ICF来跟踪测试Web应用,但是如果你把相同的方法用在Web Dynpro For ABAP 上,会发现有相当的局限性。
SAP为Web Dynpro For ABAP提供了一组工具,以帮助程序员跟踪测试。
这个系列将有对如何操作这组工具(包括浏览器端的非SAP官方提供的工具)做个简介。
以下所有示例运行在:服务器端:SAP EHP 2 for SAP NetWeaver 7.0SAP_BASIS 702 support package level 0SAP_ABA 702 support package level 0客户端:Windows XP SP2SAP GUI For Windows 710 Patch level 14Internet Explorer 7.0.5730.13第一部分服务器端跟踪工具第二部分浏览器端跟踪工具第三部分性能监视器第一部分服务器端跟踪工具在Web应用服务器端,SAP为Web Dynpro For ABAP的跟踪设计了一个运行于.Net framework上的称为Web Dynpro trace tool的工具。
这个工具可以收集Web Dynpro应用程序在整个(或者部分)运行时中,数据交互、事件处理、HTTP请求/响应等等信息,可以用于错误分析等。
工具提供了两种跟踪数据浏览方式:-离线方式:将跟踪数据生成HTML页面,并打包下载至本地。
-在线方式:直接在浏览器中浏览实时的数据。
跟踪程序在收集数据时对程序的运行性能有一定的影响,因此开发员可以基于某个特定的用户选择激活或关闭工具。
SAP-ABAP程序性能调优介绍
SAT程序性能跟踪分析
For User/Service
20
SAT程序性能跟踪分析
Evalute 显示分析结果
显示Net%最多的语句,双击显示代码
21
SAT程序性能跟踪分析
Tips & Tricks
特别是SQL和Internal Table
22
ST05 SQL Trace
按SQL语句汇总 Explain
查看扩展内存
查看CurUse和In Mem 查看Heap Memory 查看个人内存占用
双击Extended Memory -> 模式
11
ST04 数据库性能查看
Data Buffer Quality [%] > 99.5% Session Monitor 查看当前数据库session
In Dialog - 最常用
直接跟踪事务、程序和函数
In Parallel Session
直接跟踪某个Session
For User/Service
后台跟踪某个用户或者程序
15
SAT程序性能跟踪分析
测量精确性
高:对特定区域的高精度测量方式,降低测量错误的可能性,但测量时间会变短 低:测量时间及测试范围更大,但测试错误的可能性高
SQL优化
For all entries in
执行顺序 索引
正确的索引和字段顺序 正确的命中字段 大SQL/Hints
多进程处理
SAP用户与服务器交互过程
Pres. Server
SAP Application Server
Database Server
Network
Dispatcher Network
SAP ABAP 的常用debug方式
SAP ABAP 的常用debug方式SAP ABAP 的常用debug方式:1. 直接在程序中设断点在se38里面打上breakpoint,程序运行到该处即进入debug模式2.background Job的debug进入SM37 查找到自己想要debug的后台程序,这里运行完毕或者正在运行的均可进入debug查找到后打中job前面的勾然后在控制框输入JDBG回车,即进入debug3.在程序运行界面进入debug在程序的控制框输入/H,运行程序的时候就会进入debug4.正在运行的程序进入debug进入sm50 找到需要进入debug的process 然后点工具栏Program/Mode->program->debuging即可进入Debug5.call function in update task的debug我们在update task的function里面设断点的话正常是进不去debug的我们在debugger里面路径setting-> Display/change debugger settings这里面会有update debugging 选上以后我们运行到update task的function 后会自动开辟新的session进行debug6.sm13 error message的debug有些时候我们在程序运行的时候会报一些update的error message进入sm13可以找到相应的item 就可以进行debug双击我们需要的debug进去有个debug的按钮就可以进去debug了7.RFC的Debug在RFC所在系统用RFC连接所用的用户账号去设断点然后再进行debug就可以了8.针对一些弹出窗口的debug可能有时候我们程序运行过程中会出现一些弹出窗口没有输入/H的地方,但是我们要debug怎么办?新建一个txt文档内容如下,当我们需要debug某个窗口的时候直接把这个txt文档拖入对应窗口即可实现debug[FUNCTION]Command=/HTitle=DebuggerType=SystemCommand。
ABAP调试器应用(比较详细)
ABAP 开发系列(02): ABAP Development Workbench 介绍(下)- ABAP 调试器8. Debugger –ABAP 调试器开发程序,调试器是必不可少的工具,而ABAP调试器与一般的IDE调试器也有些差异。
ABAP调试器的主要内容有:1. 进入Debugger模式的方法;2. Single Step/Execute/Return/Contiune 的用法;3. Watchpoint 的使用方法;4. 调试器的其他功能;8.1进入Debugger模式的方法8.1.1 通过内部断点我们可以通过ABAP编辑器中工具栏的会话断点按钮,来设置程序的断点,将光标停在待调试的程序行后,点击设置断点按钮,然后直接执行,程序就会停在我们设置断点的位置:提到内部断点,我们不得不说下另外一种断点外部断点。
顾名思义,外部断点用于我们提供给外部接口时的程序调试断点例如:Call RFC、Web Dynpro for Java。
而且只限于Call RFC的公共用户,且只保持2个小时有效。
外部断点位于内部断点的右边,添加外部断点后,断点标志是以头像的形式出现:激活调试后,当我们运行时,系统会新开一个调试会话窗口,也就是我们的调试界面:8.1.2 通过‘/h’命令(一般常用于生产环境)如果不想在程序里面去设置断点进行调试的话,我们进入程序运行初始屏幕后(输入T-Code后的屏幕界面),在命令域里面输入‘/h’, 来激活调试:当激活调试成功时,系统下边栏会弹出相关提示:这时当我们执行程序,则会进入到调试界面,只不过这里默认的断点位置是从程序的开头开始。
8.1.3 通过系统菜单在操作事务的屏幕界面上,也可以通过系统菜单(系统-> 实用程序-> 调试ABAP)激活调试:8.2 Single Step/Execute/Return/Continue 的用法调试界面工具栏上,我们可以看到这样几个工具按钮:从左到右分别是:Single Step(单步执行/F5)、Execute(执行/F6)、Return(返回/F7)、Continue(继续执行/F8)、Watchpoint(创建查看点/ Shift+F4)、Layout(布局)8.2.1Single Step 用法Single Step 也是我们常说的单步调试(快捷键:F5),这种方式都是以单步跟踪调试每一条程序;可以通过Single Step 来调试查看标准程序的操作。
abap调put方法
abap调put方法在ABAP中,PUT方法是一种用于将数据存入内部表或数据库表中的操作。
PUT方法可用于编写适用于特定需求的自定义逻辑,以实现数据的写入功能。
下面是关于ABAP调PUT方法的详细介绍。
首先,PUT方法主要用于向内部表中插入数据项。
内部表是ABAP中一种常用的数据结构,它可以存储不同数据类型的数据。
PUT方法可以将单个数据项插入到表的指定位置,或者将多个数据项一次性插入到表的最后。
下面是一个示例:```DATA: lt_table TYPE TABLE OF string.APPEND 'Item 1' TO lt_table.APPEND 'Item 2' TO lt_table.LOOP AT lt_table INTO DATA(ls_item).WRITE: / ls_item.ENDLOOP.```在上面的示例中,我们首先定义了一个内部表lt_table,并向其中插入了两个字符串项。
然后,我们使用PUT方法将插入的数据项逐个输出,以确认数据插入的正确性。
除了向内部表插入数据,PUT方法也可以用于向数据库表中插入数据。
在ABAP中,我们可以通过使用INSERT语句将数据项插入到数据库表中。
下面是一个示例:```DATA: lt_table TYPE TABLE OF string.DATA: ls_item TYPE string.ls_item = 'Item 1'.APPEND ls_item TO lt_table.ls_item = 'Item 2'.APPEND ls_item TO lt_table.LOOP AT lt_table INTO DATA(ls_item).INSERT INTO database_table (column1, column2) VALUES ls_item.ENDLOOP.```在上面的示例中,我们首先定义了一个内部表lt_table,并向其中插入了两个字符串项。
如何开启ABAPUpdatefunctionmodule和系统程序的调试功能
如何开启ABAPUpdatefunctionmodule和系统程序的调试
功能
有朋友咨询,在这些update function module 里设置了断点,但是运行时,断点并没有停下来,这是为什么?
这位朋友有这样的疑问:
是有什么特殊设置?还是SAP故意不让
我们debug 有些程序?比如里我无论怎么设
置breakpoint,怎么都跳不进去。
其实不是这样的,ABAP 里的代码,无论是update function module,还是系统程序(system program),都是可以调试的,设置如下。
所谓 update function module,就是 SE37 里 Update Module 前面的勾被选上的函数:
在update function module 执行之前,启动调试器,选择菜单:Settings->Change Debugger Profile/Settings:
在弹出的对话框里,一定要记得把
System Debugging
和
Update Debugging
前面的✓打上:
最后一定要记住,点击保存按钮,这样才能将当前的修改保存。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
除了详细的调用层次分析以外,还提供了一个模块树工具用以显示调用堆栈的合计视图。
通过热点分析找出事关性能及内存的要点 使用Diff tool来比较两个命中列表和调用层次
© 2010 SAP AG. All rights reserved. / Page 39
ABAP运行时分析器 – 练习
练习 2:
对程序 “ZTSTECHED_SE30_PERF” 运行SAT追踪性能,找到“性能瓶 颈” (使用 Profile Tool & Hit List 工具)。 理解为什么这个程序的性能如此低下。 通过SAT运行程序 “ZTSTECHED_SE30_PERF_OPT” ,找到性能大幅 提高的原因
通过什么方式测量?
在运行时分析的同时,系统会对上述语句的耗费时间进行测试 系统会将测试结果保存在数据库上的中央跟踪容器中 用户随时随地可以对测试结果进行评估 系统会将做测试和追踪所消耗的CPU时间从总CPU时间消耗中剔除
© 2010 SAP AG. All rights reserved. / Page 11
© 2010 SAP AG. All rights reserved. / Page 40
ABAP运行时分析器 – 小结
程序流分析 -- ABAP追踪(调用层次)
追踪ABAP语句( 寻找MESSAGE …) 从调用层次工具跳转到进程块工具,来获取调用各个层次的汇总信息
缩小追踪范围,只跟踪必要的对象 (通过显性地指定程序名或选择参数 “Limitation on Program Components”的动态方式 ) 追踪运行事务的内存消耗 (打开追踪变式中的“Measure Memory Use”选项)
ABAP 运行时分析器 – 动机
提示信息从哪里来? 我想要知道信息出来的确 切位置。
© 2010 SAP AG. All rights reserved. / Page 9
ABAP 运行时分析器 – 概 览 (I)
ABAP 运行时分析器 – 分析
程序流分析 – ABAP 跟踪
ABAP运行时分析器 – SAT – 性能分析
© 2010 SAP AG. All rights reserved. / Page 34
ABAP运行时分析器 – 性能问题
策略
尽量多地限定跟踪文件 (
变式). 特别是运行时间很长的程序。否则很快超出文件大小限制。
启动跟踪要以“按调用”(by call)来合计(结果只有命中列表) 限定语句– 例如:仅模块 (functions, forms, methods …) 在第二次追踪中缩小分析范围,用以追踪使性能最差的模块 只跟踪在“Limitation on Program Components”中定义的模块。
SAT 程序流分析 –追踪并行进程
ABAP运行时分析器 – 用户追踪
追踪并行会话很不错,但是… HTTP 请求 (佚名HTTP 用户) RFC请求(RFC用户)
需要ABAP用户追踪
后台作业或者别的用户启动的业务 - 开始的时间未知
© 2010 SAP AG. All rights reserved. / Page 30
运行时分析工具
性能 程序流 ABAP 运行时分析器(SAT / SE30) SQL 跟踪 (ST05) Dynpro 跟踪 (ST20) 调试器 Dynpro 处理
内存分析器
© 2010 SAP AG. All rights reserved. / Page 6
ABAP语言新特性(SAP NetWeaver 7.0 EhP2) – 分析 与调试
ABAP运行时分析器 – 用户追踪
WEB AS/NW以下版本可支持
6.20: SAP_BASIS SP55 + 640-Kernel PL>= 83 6.40: SAP_BASIS SP14 + 640-Kernel PL>= 83 7.00: SAP_BASIS SP03 + 700-Kernel PL>= 17
性能分析 -- ABAP追踪(命中列表)
在第一次运行时限制跟踪到模块级别,在追踪变式中使用汇总功能。 第二次运行中可以指定跟踪性能最差的模块。
• • • • • 唯一的一个可以在语句级别上追踪ABAP程序的工具(Debugger Script 除外) 定位ABAP语句 在不同的客户端或系统间对比应用程序的流程 找到某些特定的功能模块,例如,自定义的用户出口 追踪应用程序的内存使用情况
性能分析 – Hit lists
• • 判断导致程序性能低下的瓶颈在程序中的位置(ABAP vs. SQL, 某个方法 或者功能模 块) 定位导致性能低下的SQL语句或ABAP语句
© 2010 SAP AG. All rights reserved. / Page 31
Demo 演示
SAT 程序流分析– 用户追踪
ABAP运行时分析器 – 性能问题
为什么程序性能那么差?
使用ABAP运行时分析器来分 析性能,是一个最好的出发点!
© 2010 SAP AG. All rights reserved. / Page 33
© 2010 SAP AG. All rights reserved. / Page 10
ABAP 运行时分析器 – 概览(II)
哪些语句将被追踪/测量?
只有那些耗费CPU时间的ABAP语句会被追踪(不是全部ABAP语句)
耗费CPU时间显著的语句:
数据库访问: 模块单元: 内表操作: 文件处理: 其他: Select, Exec SQL, Module, CALL Function, CALL Screen, CALL Transaction, CALL Dialog Append, Collect, Sort, Read Table, Read Dataset Transfer, Open Dataset EXPORT … TO …, IMPORT … FROM …, Rollback, … SET PF-STATUS, SET TITLEBAR, MESSAGE, ASSIGN
ABAP 运行时分析器 – ABAP 追踪
© 2010 SAP AG. All rights reserved. / Page 12
SAT – 新ABAP 运行时分析器
用户 . . .
SAT
R
执行追踪
R
分析结果
SAP System SAP NW AS ABAP 虚拟机 . . . 跟踪文件 跟踪文件 SAP NW AS ABAP 虚拟机
新ABAP运行时分析器-- SAT
新ABAP调试器
-> CD263 , ABAP语言新特色
© 2010 SAP AG. All rights reserved. / Page 7
议程
1. 简介 2. SAT – 新ABAP运行时分析器 3. 新ABAP调试器
© 2010 SAP AG. All rights reserved. / Page 8
© 2010 SAP AG. All rights reserved. / Page 35
Demo 演示
SAT - 性能分析
ABAP运行时分析器 – 优势
SAT主要优势:
重用新调试器界面框架,获得先进且灵活的界面
不产生本地追踪文件,可通过系统所有服务器来访问中央追踪容器 提供便利的跳转功能 (例如从调用层次到命中列表等等),在各个视图之间灵活切换 使用Profile Tool检查哪个包/层/程序占用最多时间 针对每条调用层次项均可访问其调用堆栈
CD260 ABAP高级调试功能
SAP全球技术研发者大会(上海): 董朝明, R&D AS ABAP, SAP BP 高亚平, R&D AS ABAP, SAP CD 瞿佳乐, R&D AS ABAP, SAP CD 2010年12月
法律声明
This presentation outlines our general product direction and should not be relied on in making a purchase decision. This presentation is not subject to your license agreement or any other agreement with SAP. SAP has no obligation to pursue any course of business outlined in this presentation or to develop or release any functionality mentioned in this presentation. This presentation and SAP's strategy and possible future developments are subject to change and may be changed by SAP at any time for any reason without notice. This document is provided without a warranty of any kind, either express or implied, including but not limited to, the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. SAP assumes no responsibility for errors or omissions in this document, except if such damages were caused by SAP intentionally or grossly negligent.