abap debug 技巧

合集下载

通过例子学习ABAP(二)--内表的赋值

通过例子学习ABAP(二)--内表的赋值

通过例⼦学习ABAP(⼆)--内表的赋值这是⼀个很有趣的例⼦,可以反映出带表头的内表和不带表头的内表赋值的区别。

例⼦中先定义了⼀个结构化的字段LINE,包含了COL1和COL2两个字段。

通过APPEND line TO etab. 将值赋给ETAB之后,DEBUG看到的结果是:这时候再通过 MOVE etab[] TO ftab1. 语句将值赋给ITAB1中后,可以看到FTAB1表的结果是:可以清楚的看到有表头的表etab和⽆表头的表 ftab1结果是不⼀样的,所以赋值和输出的⽅式也不同。

⽆表头的表需要再定义⼀个与该内表结构相同的⼯作区对象供程序使⽤,将数据写⼊内表时,必须⾸先给⼯作区赋值,然后在⼯作区添加或者插⼊内表。

从内表中取值时,需要⽤已定义的内表⾏内容覆盖⼯作区的内容,然后再从程序中使⽤⼯作区的内容。

*&---------------------------------------------------------------------**& Report ZTEST_SD1*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT ZTEST_SD1.* moveDATA: BEGIN OF line,col1(1) TYPE c,col2(1) TYPE c,END OF line.DATA: etab LIKE TABLE OF line WITH HEADER LINE,ftab1 LIKE TABLE OF line.line-col1 = 'A'. line-col2 = 'B'.APPEND line TO etab.LOOP AT ETAB.WRITE: / ETAB-COL1, ETAB-COL2.ENDLOOP.MOVE etab[] TO ftab1.DATA wa LIKE LINE OF ftab1.LOOP AT ftab1 INTO WA. WRITE : / WA-COL1 ,WA-COL2. ENDLOOP.LOOP AT ftab1 INTO line . WRITE: / line-col1, line-col2. ENDLOOP.SKIP.ULINE.。

ABAP高级调试功能

ABAP高级调试功能
SAT 程序流分析 –追踪并行进程
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

debug使用教程

debug使用教程

实验一调试工具的使用方法训练一、实验目的1.熟悉调试工具DEBUG的使用方法。

2.理解汇编指令、存储单元和寄存器等有关概念。

3.能够对简单的汇编语言程序进行调试。

二、实验设备PC机一台。

三、实验内容及步骤DEBUG是DOS操作系统为汇编语言程序设计者和系统管理员提供的一个通用调试工具,利用DEBUG可以读写、传送、比较、查找和显示存储器单元内容,设置程序起始执行地址或断点,执行程序或分段执行程序,跟踪程序执行,显示处理器状态,汇编或反汇编程序等。

用DEBUG编程简单、方便和直观,可以直接查看程序执行情况,便于熟悉和理解指令,掌握基本编程技巧。

DEBUG只使用十六进制表示数据(十六进制数后不加“H”),屏幕的显示数据形式如下:1400:0100 24 65 6E 64 73 0D 0A 20 - 20 63 6F 64 65 20 20 24 *ends..code * 1400:0110 73 65 67 6D 65 6E 74 0D - 0A 20 20 20 20 20 20 24 segment.. * …………1400:0170 24 61 78 2c 30 0D 0A 09 - 20 20 20 20 70 75 73 68 *ax,0 push屏幕每行显示内容分为三部分,一行共显示十六个字节单元的内容。

第一部分是本行所显示的16个字节数据在存储器中的起始存放地址;第二部分是以十六进制显示的16个字节数据;第三部分是将本行所显示字节数据看作ASCII码时显示的字符,若某字节数据对应不可显示的ASCII码,则显示一个“.”字符代替该字节数据的显示字符。

DEBUG只有十几条单字母命令,功能强且易掌握,常用DEBUG命令如下:1)DEBUG的进入和退出进入DEBUG时,键入如下命令:H:\> DEBUG-“-”是DEBUG的命令提示符,表明已进入DEBUG状态。

在“-”提示符之后,可以键入DEBUG命令。

ABAP编程技术与技巧总结

ABAP编程技术与技巧总结

ABAP编程技术与技巧总结1.时间及⽇期合法性检查FUNCTION:TIME_CHECK_PLAUSIBILITY Time plausibility checkDATE_CHECK_PLAUSIBILITY Date plausibility check说明:当数据合法时SY-SUBRC返回值为0,否则返回1.2.弹出⽤户交互对话框:CALL FUNCTION 'POPUP_TO_CONFIRM'EXPORTINGtitlebar = 'CHECK'* DIAGNOSE_OBJECT = ' 'text_question = texttext_button_1 = 'YES'icon_button_1 = 'NO'IMPORTINGanswer = answer* TABLES* PARAMETER =EXCEPTIONStext_not_found = 1OTHERS = 2.说明:其中text是⽤于显⽰在弹出对话框的中的⽂本字符.需事先设置好其值. Answer为⼀位字符型数据,1表⽰YES,2表⽰NO.3.根据某年某⽉某⽇得到本年本⽉的最后⼀天:call function 'RP_LAST_DAY_OF_MONTHS'exportingday_in = sdataimportinglast_day_of_month = sdataexceptionsday_in_no_date = 1others = 2.4.传输请求:STMS(se10)->选择要传输的主机名双击->细节—>Other Requeset->ADD,输⼊需传输的Request num..刷新->是->登录被传输的系统->查到需要传输的Request num.->import Request(后⾯的⼩车)->选择集团->是。

abap debug技巧

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. 运行时间调试•单步执行: 在调试时,可以逐行或逐过程执行代码,以便观察执行过程。

ABAPDebuggingScript(调试器脚本)使用的一些实际例子

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中的功能用法

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系统的业务逻辑和数据模型,能够根据业务需求进行程序设计。

sap abap查找增强的方法和程序查找增强方法

sap abap查找增强的方法和程序查找增强方法

1、通过程序——查找第二代、第三代增强方法。

找到出口名称,在smod里面查找相应的增强组件,再去cmod里面创建包含多个组件的增强项目,再去实现这些增强(屏幕增强、结构增强字段增强等)。

其他方法:***方法一****************************************通过SE30,运行TCODE后,点Evaluate后,查看运行时间分析评估:命中清单。

找以“exit”开头的SAP程序,如:EXIT_SAPLIE01_007,这个FUNCTION就是TCODE提供的一个出口。

至于如何查看这个增强是属于哪个SMOD,能够查阅MODSAP这个表(SAP Enhancements).***方法二****************************************通过SE37中的:MODX_FUNCTION_ACTIVE_CHECK 函数来找,在函数的最后一行打个断点,再运行TCODE的,如果有增强则会跳入DEBUG界面,在DEBUG界面中,查看L_FUNCNAME字段对应的值,此值就是就是要找的出口,再去SE11中通过MODSAP来查看出口对就的是那个SMOD,接下来就可以在CMOD中创建增强组了,把找到的增强填入,最后根据实际的业务进行处理。

以上的两种方法是用来找第二代增强。

***方法三****************************************找BADI的方法。

先运行SE24,查看类对象CL_EXITHANDLER, 在其方法:GET_INSTANCE的14行(CALL METHOD CL_EXITHANDLER=>GET_CLASS_NAME_BY_INTERFACE)打上一个断点。

接下来运行事务代码,当有BADI是将会被执行,这时在DEBUG模式下,会进入类CL_EXITHANDLER 的GET_INSTANCE 方法,按F6执行这个方法之后,点参数EXIT_NAME查看其对应的值,所有的方法实现都在此类对象中,此时就是我们所要找的BADI。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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中有条件地去执行程序,类似于在程序中设置了一道“门槛”,程序运行至此则停下来。

在程序中,在最初的时候设置了进入debug如下:
这里,为了测试简便设置watch point在sy-subrc为14。

如下:
设置watch point:
然后,在watch poing list中可以查看到:
这里可以修改、删除等等。

然后在debug中,可以F8等,一直运行到sy-subrc = 14后的操作地方。

如下,当按下F8后,停在了sy-subrc为14的地方:
(2)更改内表等选项
在Debug中,这一块是使用最多的地方了,无论是修改参数还是变量,还是内表。

如对参数或者变量
的修改,只需要双击更改便是。

这里记录下修改内表的debug内容,使用其右边的tool:
可以的操作有:
(3)Go to statement的应用
在Debug中,经常会出现,已经跑到后面去了,但又想看一下前面的过程是怎么跑的。

当然重新打开跑一下debug是Ok的,但重新跑debug比较费时费力。

例如现在debug已经跑到第74行:
但假设,想看它如何跑第45行的FM:将光标置于45行,选择:
就Ok了.
(但是注意:对于已经在后面修改过的值/变量等,此时是不会还原回来的).
4. Debug附加
关于debug还有很多的选项。

Debug是一项非常有意思有意义的工具。

(1)Debug调试数据库操作程序
也就是Debug状态下,自动commit work(隐式地进行DB commit,就类似于如果我们不加上commit work 语句,当程序结束后,check数据库仍然已改变)。

但是,如果是update FM或者perfrom on commit的情况,并不会自动commit work(这种情况下需要执行commit work语句)
(2)WebDynpro的Debug
通过上面第一部分,可以知道,调试WD需要用external break-point.。

相关文档
最新文档