abap debug 技巧
通过例子学习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运行时分析器 – 用户追踪
追踪并行会话很不错,但是… 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使用教程
实验一调试工具的使用方法训练一、实验目的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编程技术与技巧总结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技巧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(调试器脚本)使用的一些实际例子例子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系统的业务逻辑和数据模型,能够根据业务需求进行程序设计。
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。
ABAP 跟踪常用工具技巧简介V1.0
一、文档版本记录 (2)二、基本操作方法及断点简介 (2)1. 常用按键 (2)2. 断点简介 (3)1) 断点种类介绍 (3)2) 加断点方式介绍 (4)三、DEBUG界面概览 (5)四、常用跟踪工具方法介绍 (8)1. 如何在对象模块查看某内表某行的某个字段? (8)2. 为全部某关键字增加断点。
(9)3. 如何使用监控点 (10)4. 如何查看一个特别长的变量里的值 (14)5. 如何用自己的账号跟踪外部调用RFC函数? (15)6. 如何快捷获取到传入函数的数据? (16)声明:本文档由甄晓达制作,欢迎转载及共享,但请不要用此牟利,譬如设置资源分或者卖钱之类的~也欢迎他人修改完善本文档。
一、文档版本记录●记录文档的版本及修改时间,方便核对同名文档的差异。
二、基本操作方法及断点简介1.常用按键●F5:单步执行。
逐行执行语句,如果遇到FUNCTION、子程序、方法等代码块时,也会进入到相应代码块内部(注:DEFINE定义的宏命令不会进入!所以不建议在宏命令里写很复杂的语句,否则DEBUG的时候会很麻烦)●F6:当前代码块单步执行。
和F5类似,执行每一条语句,但遇到FUNCTION、子程序、方法等其他代码块时会直接执行完毕相应代码块的内容而不是进入到代码块内部。
●F7:直接执行完毕当前代码块的所有代码。
譬如如果当前在子程序内部,会直接执行完毕该子程序所有代码;如果是在FUNCTION内部,会直接执行完毕FUNTION所有代码。
●F8:执行程序。
直接运行所有代码。
以上4个按键和下图示中红框的四个按钮分别对应,不过推荐直接使用按键,更方便快捷,但有时某些按键会失效,譬如用QQ远程协助时,此时只能通过点击按钮来跟踪。
●SHIFT+F12:直接跳至光标所在行,被跳过的代码不执行;可以往回跳也可以往前跳。
(注:不能从LOOP循环外部直接跳入LOOP循环。
)也可以在想跳转的行项目上点“鼠标右键——转到语句”来实现此功能,不过仍然推荐使用按键,方便快捷。
ABAP常识与技巧
一、在ABAP编程时,查找数据表字段1、透明表可以通过帮助直接查找表和字段;2、结构通过SQL跟踪,事务码(ST05)第一步:打开应用到准备更新的界面;第二步:启动SQL跟踪器;第三步:更新数据;第四步:关闭SQL跟踪器,查询记录,找更新信息。
注:可以通过“编辑”→“查找”二、Query应用:1、建立用户组,将一个或多个用户分配到用户组中,表示这些用户拥有该用户组的权限。
2、建立功能区,将要查询的数据表分配到功能区;3、建立Query,选择需要的用户组和功能区,选择要查询并输出的字段。
第一步:事务码(SQ01),查询主界面第二步:“环境”→“用户组”,进入用户组维护界面;第三步:“环境”→“功能区”,进入功能区维护界面。
ABAP技巧:1、本地格式设定(工具条最右边按钮),快速剪切和粘贴2、主界面中,“细节”→“设置”,使“显示技术名称”选项有效,可以使菜单显示TCODE3、程序的规范化,“实用程序”→“设置”→“ABAP Editor”→“Pretty Printer”,菜单设定4、设定个人参数:设定小数点格式、千分位、登录语言等信息。
“系统”→“用户参数文件”→“个人参数”→“默认”5、设置断点时必须先激活程序,F6单步运行,F8直接运行6、在业务系统中启动单步跟踪,直接输入:/h7、在总菜单中查找TCODE:Ctrl+F or SEARCH_SAP_MENU8、通过TCODE查找相关程序:TCODE:SE939、显示系统图标:运行程序SHOWICON10、通过“模式”功能自动生成程序:函数、创建对象、调用对象方法、调用子程序等功能11、当用户打开程序编辑,其他用户不能编辑时,通过TCODE(SM12)来解除锁定12、调用事务,直接添加参数ID,如SET PARAMETER ID “DTB” FIELD …SPFLI‟.CALL FUNCTION SE16 AND SKIP FIRST SCREEN.13、定义工作域含有表结构DA TA: BEGIN OF LINE.DATA COL(1) TYPE C.INCLUDE STRUCTURE SPFLI.DA TA: END OF LINE.DA TA W A_LINE LIKE TABLE OF LINE.14、在内存中存储数据对象将数据提交内表对象REPORT YTEST08DA TA:BEGIN OF LIINE1.DA TA COL1(1) TYPE C.INCLUDE STRUCTURE SPFLI.DA TA: END OF LINE1.DA TA:WA_LINE1 LIKE LIN1.WA_LINE-COL1=‟A‟.WA_LINE-CONNID=‟1011‟EXPORT WA_LINE1 FROM WA_LINE1 TO MEMORY ID …zzz1.SUBMIT YTEST09.从内存中取回数据:REPORT YTEST09DA TA:BEGIN OF LIINE1.DA TA COL1(1) TYPE C.INCLUDE STRUCTURE SPFLI.DA TA: END OF LINE1.DA TA:WA_LINE1 LIKE LIN1.IMPORT W A_LINE1 FROM WA_LINE1 TO MEMORY ID …zzz1‟WRITE :/WA_LINE1-COL1,WA_LINE1-CONNID.15、使用系统对象取编号,TCODE(SNUM)16、修改本地对象的开发类,TCODE(SE03),选择“修改对象目录条目”选择,进行修改。
ABAP技巧总结
ABAP技巧总结1.引用類型z_ref數據對象myref在程序中的聲明方式:DATA myref TYPE z_ref.CREATE DA TA myref TYPE z_ref.2.參照數據字典中的表類型生成內表對象或結構體:DATA mytable TYPE z_table,”數據字典表類型,聲明內表.myline TYPE LINE OF z_table.”表類型的行結構,聲明結構體.3.取系統日期:SY-DATUM,4.取系統時間:SY-UZEIT.05.系統字段定位:SY-FDPOS.字符比較結果為真時,此字段將給出偏移量信息.6.系統字段SY-FDPOS給出字符的位置信息.(P109)7.系統字段SY-INDEX記錄循環語句中的循環次數8.操作內表行結束后系統字段SY-TABIX返回該行索引.對於所有行操作,如果操作成功,系統變量SY-SUBRC返回0,否則返回非0值.9.系統用戶名:SY-UNAME.10.SY-HOST?屏幕序號:sy-dynnr.11.OK代碼:SY-UCOMM或SYST-UCOMM12.屏幕組ID:SY-DYNGR.13.常量聲明:CONSTANT const(len) TYPE type|LIKE dobj [DECIMALS dec][V ALUE val].14.確定數據對象屬性:DESCRIBE FIELD f [LENGTH l] [TYPE t [CONPONENTSn]] [OUTPUT-LENGTH o] [DECIMALS d] [EDIT MASK m] [HELP-ID h].15.數據賦值:MOVE source TO destination.或destination = source.16.設定初始值:CLEAR F.17.檢查字段是否為初始值:f IS INITIAL….18.檢查字段是否被分配:fs IS ASSIGNED…..19.檢查過程中的參數是否被實參填充:p IS [SUPPLIED|REQUESTED]….20.檢查數據對象的值是否屬于某範圍之間:f1 BETWEEN f2 AND f3…..21.檢查數據對象f的內容是否遵從某個選擇表的邏輯條件:f in seltab….22.WRITE: /10 g,”在10個空格后輸出變量g/(8) time using edit mask ‘__:__:__’.”輸出的變量time保持8位的長度.23.將光標移動到下一行:SKIP.24.強制結束循環:EXIT,STOP或REJECT.25.循環的中止:CONTINUE無條件中止當前循環並開始下一輪循環,CHECK條件為真時循環,為假時結束本次循環並開始下一輪循環,EXIT無條件中止並退出整個循環.26.將字符串左移:SHIFT string.27.連接字符串:CONCATENA TE s1 s2 …..sn INTO s_dest [SEPARATED BY sep].如果結果出現被截斷的情況,將SY-SUBRC返回4,否則返回0.符號&用于在字字符串換行時的連接.28.根據分隔符sep拆分字符串:SPLIT s_source AT sep INTO s1 s2 ……sn.使用內表操作可以避免被截斷的情況:SPLIT s_source A T sep INTO TABLE itab.此語句根據子串數目生成n行的內表.29.循環輸出內表的每一行數據:LOOP A T itab INTO text.ENDLOOP.30.替換字段內容:REPLACE str1 WITH str2 INTO s_dest [LENGTH len]. 字段SY-SUBRC的返回值為0時表示己成功替換.31.確定字段長度:[COMPUTE] n = STRLEN( str ).32.刪除字符串中的多余空格:CONDENSE33.字符轉換,如將ABC轉換為abc:TRANSLA TE34.創建一個可以排序的格式:CONVERT TEXT.35.用一個字符串覆蓋另一個字符串:OVERLAY36.WRITE TO賦值時將忽略數據對象的類型,而將其視為字符類型數據.37.字符串比較中的換碼字符:#,用於轉換比較時使用的通配符:*或+.及進行區分大小寫,空格的比較,如#A表示比較大寫的A.38.定位操作子串:strName[+0][(1)].39.字段符號,數據引用:動態數據對象.40.子程序定義:FORM subroutine_name USING parameters1parameters2…. ….ENDFORM.41.子程序調用:PERFORM subroutine_name USING actual_parameters1 p2…. (其中USING可換成CHANGING)42.ULINE.輸出下劃線.43.錯誤查看:ST2244.程序打包release:SE01:找到對應的程序,點開后點上面小汽車,再選中上面的后再點小汽車.點check.程序修改后需要重新打包.45.制作T-CODE:SE93,TCODE應按順序編號:ZMF+流水號,我的程序名46.創建table:t-code:se11,attributes:Delivery class:C.開發類別:ZFI,當自定義Fieldtype時,名稱需為Z+…..格式.->設置技術屬性(TechnicalSetting):Logicalstorage parameters中Data class:APPL1,Size category:4 創建functiongroup:SE80,創建好后將創建的TABLE挂接到function grouph 上去:用se11查出table,點utilites->table maintenance generator:Authorizationgroups:&NC&,Function group中填剛才創建的功能組名稱->onestep->overview screen中必頇填未使用的number,此處screen number與table 是一一對應的關系,也可讓點系統上面的按鈕:find screen number來自動搜索適合的scr. Number.->create,成功后,找到對應的function group中的screen number雙擊即可看到生成的代碼.需要修改欄位名稱可在function group中的element list或layout中.-->se93創建t-code,start object選transaction with parameters(parameter transaction)->default valuesfor->transantion:SM30->Default V alues->name of screen field:viewname\update,value:table name\X.47.field-sign:,field—option:,field-low:表示選擇條件中起始值48.在where子句中如果只有一個表的話,可以不用指定表名.49.獲取用戶IP地址及用戶名:call function 'TH_USER_INFO' " Get user IP,hostnameimportinghostaddr = iporg”轉化前的IP地址terminal = host”電腦名exceptionsothers = 1."Conv.IP addr to format 'xxx.xxx.xxx.xxx'call function 'ZGJ_IPADR2STRING' "Conv.IP addrexportingipadr = iporg”轉化前的IP地址importingstring = ipdec.”轉化后的最終需要的IP地址50.刪除內表中數據完全相同的行,只保留一行: delete adjacent duplicatesfrom itab1 COMPARING / COMPARING ALL FIELDS.51.spro:后臺設定52.輸出選擇框write:/ itab1-flag as checkbox第四章ABAP基礎4.1.5 程序運行例:REPORT z_calling_program.START-OF-PROGRAM.WRITE ‘This program calls another program.’.”此內容在輸出界面看不到SUBMIT z_simple_program.”上面的輸出被此程序覆蓋.如果改用SUBMIT AND RETURN來調用則可以輸出以上內容.2.結束程序:LEA VE PROGRAM.可在任意點強制結束當前運行的程序.4.1.6 內存管理SAP程序同一個用戶和系統可進行最多6個SAPGUI主會話.4.2.1 數據定義TYPES:BEGIN OF t_staff,S_no(3) type n,Name(20),END OF t_staff.DATA staff TYPE t_staff.上例中定義了一個結構類型t_staff,並根據其聲明了一個結構體對象staff.數據類型中的扁帄結構與縱深結構:扁帄類型:運行時長度固定的類型.縱深類型:運行時長度可巒的類型.注意:1.其中C,N,T,D,I,F,P,X為定長類型,即在運行期間長度不能改變.2.類型T,D,I,F的數據存儲長度是固定的,不能指定參照其生成的數據對象占用的內存字節數.3.基于類型C,N,P,X生成的數據對象需要在聲明時指定其長度.否則取默認值.4.如果在聲明一個數據對象時未指明其數據類型,則該數據默認為C類型.5.類型I的數值範圍:-231到231-1的整數.如果運算時出現非整型結果則進行四舍五入取值.而不是截斷小數.6.類型P用于聲明小數位固定的壓縮數,其占據內存字節數和數值範圍取決於定義時指定的整個數據的大小和小數點后位數,如果不指定小數位,則將其視為I類型數據.有效大小可以是從1~16字節的任意值,小數點后最多允許14個數字. 7,類型F為浮點數,浮點意思是數字在內存中以字節形式表示,數值範圍:1*10-307到1*10308,因系統將F類型轉換為二進制數,所以可能出現舍入誤差,若用戶要求較高精度且數值較大時,應使用P類型數據.8.長度可巒的內置類型String, XString是通過引用實際動態的數據對象的固定內存地址來操作.4.2.3 程序內部數據定義參照自定義類型或內置類型生成數據的語法格式:TYPES|DATA …TYPE l_type…參照程序中已經聲明的數據對象生成新數據語法:TYPES|DATA …LIKE dobj…3.結構類型和結構體參照結構類型生成的數據對象稱為結構體.TYPES|DATA:BEGIN OF structure.k1 [TYPE type |LIKE dobj]…,k2 [TYPE type |LIKE dobj]…,…k n [TYPE type |LIKE dobj]…,END OF structure.參照生成:參照結構生成:TYPES|DA TA structure TYPE str_type |LIKE str_dobj...參照數據庫表生成:TYPES|DA TA structure TYPE dbtab.4.表類型和內表表類型的對象稱為內表.4.2.4 數據字典中的類型●數據元素(Data elements),相當於ABAP中的基本類型和引用類型.●結構(Structures),由數據元素字段構成,對應ABAP中的結構類型.表類型(Table types),對應ABAP中的表類型.數據字典中的數據類型與ABAP中的中數據類型對應關系:4.2.5 程序中的數據對象1.文字對象當字符文字長度超過編輯器的一行時,可以使用”&”進行連接,避免因換行而產生的多余空格,如:long = ‘This is ‘&‘a long sentence’.如果需要輸出“’”,則需要在前面多加一個“’”轉回願意.2.有名稱的數據對象常量聲明:CONSTANT: const(len) TYPE|LIKE dobj [DECIMALS dec] V ALUE val.結構體常量聲明(每個組件必頇指定初始值):CONSTANT:BEGIN OF structure,str1 TYPE|LIKE dobj [DECIMALS dec] V ALUE val,str2 TYPE|LIKE dobj [DECIMALS dec] V ALUE val,...,strn TYPE|LIKE dobj [DECIMALS dec] V ALUE val,END OF structure.3.系統數據對象(見附表)4.查明數據對象屬性DESCRIBE FIELD f LENGTH len.此語句將字段f的長度寫入變量len.●LENGTH:確定數據對象長度.●TYPE: 確定數據對象類型.●OUTPUT-LENGTH:確定實際輸出長度.●DECIMALS:確定P類型小數位長.●EDIT MASK:確定在數據字典中定義轉換例程.●HELP-ID:確定在數據字典中定義的F1幫助信息.4.3 基本數據操作4.3.1數據賦值●MOVE source TO incept.等介於:incept = source.●CLEAR dobj.將數據對象dobj還原為初始值.●結構體間賦值:struct2 = struct1.(組件結構相同).●MOVE-CORRESPONDING struct1 TO struct2.(部分組件結構相同).4.3.2類型轉換(見附表).4.3.3數值運算兩個結構體的同名字段之間可以整體進行算術運算:ADD-CORRESPONDING struct1 TO struct2.SUBTRACT-CORRESPONDING struct1 FROM struct2.MULTIPLY-CORRESPONDING struct2 BY struct1.DIVIDE-CORRESPONDING struct2 BY struct1.以上將對兩個結構體中的同名字段進行相應運算(非數值類型數據會引起錯誤).2.數學函數任意類型參數的函數列表:注意:函數名與左括號間不能有空格,括號與參數間必頇有空格.4.3.4數據輸出注:用戶主記錄System->User profile->Own data(SU01).4.3.5邏輯表達式3.IS操作符●...f IS INITIAL...:檢查字段f是否為初始值.●...fs IS ASSIGNED...:檢查字段符號是否被分配.●...p IS [SUPPLIED|REQUESTED]...:檢查過程中的參數是否被實參填充.4.BETWEEN操作符●...f1 BETWEEN f2 AND f3...:檢查數據對象的值是否屬于特定範圍之間.5.IN操作符(P110)●...f IN seltab...:檢查一個數據對象的內容是否遵從某個選擇表的邏輯條件.6.組合邏輯表達式●AND:與.●OR:或.●NOT:非.注:括號與操作數間至少要有一個空格,如:IF ( c > n ) AND ( c < f ).4.4結構控制程序代碼分三種結構:●順序結構:語句逐行執行.●分支結構:根據不同的條件執行不同語句塊.●循環結構:反復執行某個語句.4.4.1分支控制1.IF/ENDIF結構:IF .ELSEIF .......ELSE.ENDIF.注:可嵌套.2.CASE/ENDCASE結構:CASE f.WHEN f11 [OR f12 OR ...].......[WHEN OTHERS.]ENDCASE.其中,f為變量,f ij可以是變量或者固定值.4.4.2循環控制1.無條件循環DO [n TIMES].ENDDO.說明:n為循環次數,可以是文字或變量,如果沒有限定n值,則必頇用EXIT,STOP 或REJECT等語句強制結束循環.DO循環可嵌套,SY-INDEX 為當前循環次數.2.條件循環WHILE .ENDWHILE.注:可嵌套,其它同上.3.循環中止●CONTINUE:無條件中止當前本輪循環,開始下一輪循環.●CHECK:條件中止當前本輪循環(條件為假時), 開始下一輪循環.●EXIT:無條件完全中止當前循環,繼續循環結束語句(ENDDO,ENDWHILE等)后面的代碼,如果在嵌套循環中,系統僅退出當前循環.4.5處理字符數據4.5.1字符數據1.連接字符串CONCA TENATE s1 s2 ... sn INTO s_dest [SEPARATED BY sep].注:所有字串操作將忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量). 如果出現截斷情況,將SY-SUBRC設為4,否則返回0.2.拆分字符串SPLIT s_source AT sep INTO s1 s2 ... sn.如果所有子串足夠長且不必截斷任何部分,則將SY-SUBRC設為0,否則返回4, 如果源字符串能夠拆分的子串多過指定的數目,則源子串最后的剩余部分包括其后的分隔符都將寫入最后一個子串,要避免這種情況,需要使用內表進行操作: SPLIT s_source AT sep INTO TABLE itab.在該形式中,根據子串數目生成n行的內表.例如:DATA:text type string,itab TYPE TABLE OF string.t ext = ‘ABAP is a programming language’.SPLIT text AT space INTO TABLE itab.LOOP AT itab INTO text.WRITE / text.ENDLOOP.3.查找子串模式SEARCH c FOR str.在字段c中查找字符串str.如果找到,則將SY-SUBRC返回0,SY-FDPOS返回字段c中該字符串的位置(從左算起的字節偏移量),否則SY-SUBRC返回4,查找模式有以下幾種:●str 搜索str並忽略尾部空格.●.str. 搜索str,但不忽略尾部空格.●*str 搜索以str結尾的單詞.●str* 搜索以str開始的單詞.REPORT z_string_search.DATA string(30) TYPE c VALUE 'This is a testing sentence.'. WRITE: / 'searched','sy-subrc','sy-fdpos'.SEARCH string FOR 'X'.WRITE: / 'X', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR 'itt '.WRITE: / 'itt ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR '.e .'.WRITE: / '.e .', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR '*e '.WRITE: / '*e ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER'sy-fdpos'.SEARCH string FOR 's* '.WRITE: / 's* ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'.輸出結果如下:searched sy-subrc sy-fdposX 4 0itt 4 0.e . 4 0*e 0 18s* 0 184.替換字段內容.REPLACE str1 WITH str2 INTO s_dest [LENGTH len].搜索s_dest中前len個字符中的子串str1,用str2來替換它,如果成功,SY-SUBRC返回0,否則還回非0值. REPORT z_replace.DATA name TYPE string.name = 'Michael-Cheong'.WHILE sy-subrc = 0.REPLACE '-' WITH ' ' INTO name.ENDWHILE.WRITE / name.輸出結果: Michael Cheong5.確定字段長度n = STRLEN( str ).函數將str作為字符數據類型處理,不考慮其實際類型,也不進行轉換.計算其首字符到最后一個非空字符的長度,不包括結尾空格.6.其它操作語句●SHIT:將字符串整體或子串進行位移.●CONDENSE:刪除字符串中的多余空格.●TRANSLATE:字符轉換,如將ABC轉換為abc.●CONVERT TEXT:創建一個可以排序的格式.●OVERLAY:用一個字符串覆蓋另一個字符串.注:CO,CN,CA,NA比較時區分大小寫,且尾部空格也在比較範圍之內,CS,NS,CP,NP比較時忽略尾部空格且不區分大小寫,比較結束后,如果結果為真,SY-FDPOS將給出s2在s1中的偏移量信息.模式表示可以使用通配符,”*”用于替代任何字符串,”+”用于替代單個字符.換碼字符使用:●指定大小寫(如#A,#b).●通配符”*”(輸入#*),將其轉回原義.●通配符”+”(輸入#+),將其轉回原義.●換碼符本身”#”(輸入##),將其轉回原義.●字符串結尾空格(輸入#__),指定比較結尾空格.4.5.3定位操作子串str[+position][(len)].從字符串str中的position位開始取出長度為len的子串.可動態指定偏移量及長度的情況(即position及len可為變量):●用MOVE語句或賦值運算符給字段賦值時.●用WRITE TO語句向字段寫入值時.●用ASSIGN將字段分配給字段符號時.●用PERFORM將數據傳送給子程序時.off = 6.len = 2.date+off(len) = ‘01’.4.6使用內表types定義的並不是結構體對象,只是結構類型,不能作為工作區,當定義的內表沒有表頭行(工作區)時,必頇為其定義一個結構體作為工作區,否則無法使用此內表.如果沒有給內表定義工作區,則在定義內表時必頇聲明表頭行(with header line). DATA:BEGIN OF line, "work area(structure)結構類型且結構體對象num TYPE i,sqr TYPE i,END OF line,"無表頭行內表,內表定義都使用data關鍵字.itab TYPE(LIKE) STANDARD TABLE OF line WITH KEY table_line. DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.定義標準內表DO 5 TIMES.line-num = sy-index.line-sqr = sy-index ** 2.APPEND line TO itab.ENDDO.LOOP AT itab INTO line.WRITE:/ line-num,line-sqr.ENDLOOP.CLEAR itab.注:1.TYPES與DATA區別:TYPES是用來定義某種類(型)的,需(用DATA語句)實例化以后才可以使用,而DATA是用來定義數據對象(實例變量)的,對于用DA TA直接定義的結構體對象(不參照其它結構類型),其同時也是一個結構類型.2.TYPE與LIKE區別:TYPE后面跟隨的只能是某種類(型),而LIKE后面可以跟隨類型或實例對象,參照結構體對象生成內表時只能用LIKE,不能用TYPE,因為結構體對象不是類型,只是一種實例對象,參照結構類型生成內表時可以用LIKE也可以用TYPE.其中通過LIKE定義的內表直接擁有參照結構類型的元素結構,而通過TYPE定義的內表只能間接擁有被參照結構類型的元素結構,結構類型不能作為內表的工作區,只有結構體對象才可以.內表定義語法:1.標準表:可指定或不指定關鍵字,可重復.邏輯索引,操作數據時數據內存位置不巒,系統只重排數據行的索引值.DATA itab TYPE|LIKE [STANDARD] TABLE OF structure [WITH KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].2.排序表:可指定唯一或不唯一的關鍵字,也可不指定,邏輯索引,按關鍵字升序存儲.DATA itab TYPE|LIKE SORTED TABLE OF structure [WITHNON-UNIQUE(UNIQUE) KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].3.哈希表:必頇指定唯一關鍵字.無索引DATA itab TYPE|LIKE HASHED TABLE OF structure WITH UNIQUE KEY comp1 ... compn(DEFAULT KEY) [WITH HEADER LINE INITIAL SIZE n].注:如果n值為0或不指定的話,程序會為內表對象分配8KB大小內存,所以,如果內表比較小,不要把該值設為0,以避免內存浪費.舊版標準表定義語法:DATA itab TYPE|LIKE [STANDARD] TABLE OF structure OCCURS n.或者DATA:BEGIN OF itab OCCURS n,...,fi...,END OF itab.注:CLEAR itab[].表示操作的是內表對象.而CLEAR itab.當itab有表頭行時表示操作表頭行,如無表頭行時表示操作內表對象.當一個操作語句結束后,SY-TABIX返回該行的索引值,對於所有行操作,如果訪問成功,SY-SUBRC返回0,否則返回非0值.4.插入行—INSERT●INSERT structure INTO itab INDEX idx.無表頭行索引表,itab的行數應大於或等于idx-1.否則失敗●INSERT itab INDEX idx.有表頭行索引表.●對于哈希表,系統按關鍵字將新行插入特定位置.●INSERT structure INTO|INITIAL LINE INTO TABLE itab.此語句對於標準表來說與append效果相同,對於排序表來說,插入的行不可以打亂按照關鍵字排序的順序,否則插入不成功,對於哈希表來說,插入過程中系統按照關鍵字對行進行定位.INITIAL關鍵字是用于向內表中插入結構中各類型的初始值的.●INSERT LINES OF itab1 [FROM n1] [TO n2] INTO [TABLE] itab2 [INDEXidx].將內表中部分或全部數據行整體插入到另一內表中,指定行數時itab1,itab2必頇為索引表,指定TABLE關鍵字時,itab2可以是任意內表.此方式比其它方式快20倍左右.5.附加行—APPEND(只能操作索引表)APPEND [structure TO|INITIAL LINE TO] itab.APPEND LINES OF itab1 [FORM n1] [TO n2] TO itab2.6.聚集附加—COLLECTCOLLECT line INTO itab.對於需要附加的數據,如果在內表中存在關鍵字內容與其相同的數據行,則此語句將需要附加的數據累加到內表中的這一行上,而不會另外再添加一行,操作成功后,SY-TABIX返回被處理過的行的索引.注:關鍵字以外的所有字段必頇是數字類型7.讀取行—READ(可用於任何類型內表)●READ TABLE itab [INTO wa|ASSIGNING ] INDEX idx.通過索引讀取內表中的單行數據. ASSIGNING表表示指派給字段符號.●READ TABLE itab FROM structure [INTO wa|ASSIGNING ].讀取與結構相同的工作區中的關鍵字內容全部相同的內表數據.●READ TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2 [INTOwa|ASSIGNING ].指定所有關鍵字值,並讀取相等時內表行.●READ TABLE itab WITH KEY field1 = v1 ... field2 = v2 [INTOwa|ASSIGNING ].讀取內表中字段fieldn(不一定是表關鍵字段)與值vn 相同時的內表行.8.修改行—MODIFY●MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 f2 ...].如果內表包含的行數少於idx,則不更改任何行.●MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...].根據工作區wa中關鍵字修改內表行, TRANSPORTING表示修改指定字段值.●MODIFY itab FROM wa TRANSPORTING f1 f2 ... WHERE condition.修改符合WHERE子句中條件的內表中的指定字段值.9.刪除行—DELETE●DELETE itab INDEX idx.根據索引刪除內表行.●DELETE TABLE itab FROM wa.根據工作區關鍵字刪除行.●DELETE TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2.根據指定關鍵字值刪除行.●DELETE itab [FROM n1] [TO n2] [WHERE ].10.循環處理--LOOPLOOP AT itab [INTO wa] [FROM n1] [TO n2] [WHEREcondition]..ENDLOOP.4.6.3操作整個內表1.排序SORT itab [ASCENDING|DESCENDING] [AS TEXT] [STABLE] [BY f1 [ASCENDING|DESCENDING] [AS TEXT]......f1 [ASCENDING|DESCENDING] [AS TEXT]]說明:●ASCENDING|DESCENDING:升序或降序.默認升序.●AS TEXT:根據當前語言按字母順序排序字符字段,否則按字符帄台相關內部編碼進行排序.●STABLE:保持排序前后不需要改變的數據行的相對順序.2.控制級操作(用于總計,縮進,格式控制等)A T FIRST|LAST|NEW f|END OF f.ENDA T.說明:●FIRST:當循環為內表的第一行時,執行語句塊中語句.在工作區中,系統用*填充所有關鍵字內容.●LAST: 當循環為內表的最后一行時,執行語句塊中語句. 在工作區中,系統用*填充所有關鍵字內容.●NEW f:字段f前面(即左邊)的全部字段內容之一不同於上一行時, 執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.●END OF f:如果下一行行組中的任何字段內容不同於上一行, 執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.注:在控制級操作期間,在工作區中,對於非標準關鍵字段,將全部進行初始化,在執行完控制操作后(即ENDAT語句后)工作區中的數據將全部還原到進入控制級操作語句前(即進入AT前)狀態.3.初始化內表●CLEAR itab.:帶表頭行時只清空表頭行,不帶表頭行時清空整個內表.●CLEAR itab[].:只清空整個內表對象數據.不清空表頭行.●REFRESH itab或REFRESH itab[].:只清空整個內表對象數據.不清空表頭行.●FREE itab.或FREE itab[].:只清空整個內表對象數據.不清空表頭行,同時釋放內存.●......itab IS INITIAL....:檢查內表是否為空.4.整體復制內表●MOVE itab1 TO itab2.:如果兩表都存在表頭行,則此語句只復制了表頭行.●MOVE itab1[] TO itab2[].:指定表體復制.●MOVE itab1[] TO itab2.:表itab2無表頭行時才成立.●itab2 = itab1.同上1●itab2[] = itab1[].同上2●itab2 = itab1[].同上35.比較內表大小... itab1 itab2...:其中可以為=,<>,><,>=,<=,>,<等.4.6.4Extract Datasets●FIELD-GROUP fg.行結構分配.●INSERT f1 f2 ... INTO fg.生成字段組fg的具體字段結構.●EXTRACT fg.將字段組填充給EXTRACT.●SORT.排序.●LOOP. ENDLOOP.循環輸出EXTRACT.4.7動態數據對象4.7.1字段符號●FIELD-SYMBOLS [TYPE type|LIKE dobj].聲明字段符號.●ASSIGN f TO .靜態分配數據對象給字段符號.●ASSIGN f[+i] [(j)] TO .指定偏移量和長度.●ASSIGN (f) TO .動態分配,先找到字段f的內容,然后將該內容分配給.4.7.2數據引用TYPES t_dref TYPE REF TO DATA.DATA dref TYPE REF TO DATA.4.8模塊化技術4.8.2子程序1.定義:FORM subr [[USING [VALUE(p1)]... ] [TYPE t|LIKE f]...] [TYPE ANY][CHANGING [V ALUE(p1)] ... ] [TYPE t|LIKE f]...] [TYPE ANY].ENDFORM.注:●V ALUE參數表未示值傳遞,此方式在子程序調用后實參的值不會被改變.●無V ALUE參數時表示引用傳遞,會改變實參的值.●USING與CHANGING無任何區別.●位于兩個子程序間的代碼不屬于任何事件塊.●參數傳遞時不存在類型轉換,要求必頇兼容.2.調用:PERFORM subr [USING p1 ... pn] [CHANGING pi ... pj].4.8.3功能模塊(p153)4.8.5源代碼復用1.包含程序包含程序是單純的代碼復用,不是可執行程序,不能單獨運行,必頇被其它程序調用,包含程序不能調用自身.INCLUDE incl.包含程序調用,此語句必頇獨占一行.2.宏:(語句塊中最多只能包含9個占位符&1...&9).例:DATA:result TYPE i,int1 TYPE i VALUE 1,int2 TYPE i VALUE 2.DEFINE operation.result = &1 &2 &3.output &1 &2 &3 result.END-OF-DEFINITION.DEFINE output.write: / 'The result of &1 &2 &3 is',&4.END-OF-DEFINITION.operation 1 + 2.operation int2 - int1.4.9.1靜態錯誤檢查1.語法檢查:用Check鍵.2.擴展語法檢查(SLIN):在ABAP初台界面輸出程序名后,選擇Program->Check->Extended Syntax Check. Standard.4.9.2運行時錯誤控制1.可捕捉的錯誤CA TCH SYSTEM-EXCEPTIONS exc1 = rc1 ... excn = rcn....ENDCATCH.其中exci表示一個單一可捕捉錯誤或者一個ERROR類,rci則代表一個數字.如果其中錯誤之一在CA TCH和ENDCATCH語句之間出現,程序就不會中止,而是直接跳至ENDCATCH后,把系統指定的錯誤代碼rci賦給字段SY-SUBRC.此語句可嵌套.例如:DATA:result1 TYPE p DECIMALS 3,number TYPE i VALUE 11.CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5.DO.number = number - 1.result1 = 1 / number.WRITE: / number,result1.ENDDO.ENDCATCH.IF sy-subrc = 5.WRITE / 'division by zero!'.ENDIF.2.不可捕捉的錯誤(通過ST22查看,在SAP系統中保存14天,可通過Keep功能保存更長時間).。
abap bapi_acc_document_post 统驭科目
abap bapi_acc_document_post 统驭科
目
在使用BAPI_ACC_DOCUMENT_POST进行资产过账时,可能会遇到一些问题。
其中,第一个问题是,在手工过账时,输入第一个行项目后回车会自动带出一个统驭科目编号,但是在BAPI中不能自动带出统驭科目;第二个问题是,对于资产过账,必须有资产号和负资产号,否则过账时会报告“资产不属于公司xxxx的错误”。
对于第一个问题,可以通过强制干预科目为备选统驭科目来解决。
具体来说,标准BAPI 有传入备用统驭科目,但不起任何作用。
通过DEBUG跟踪发现,备用统驭科目会被替换成总账科目,此时可以强制干预回来。
对于第二个问题,需要确保输入的资产号和负资产号是正确的,以避免过账时出现错误。
如果在使用BAPI_ACC_DOCUMENT_POST时遇到其他问题,建议查阅相关文档或咨询SAP 技术支持团队。
ABAP_培训教程
ABAP_培训教程ABAP 培训教程1. ABAP 简介ABAP(Advanced Business Application Programming)是一种高级业务应用程序编程语言,由德国软件公司 SAP 开发。
ABAP 是SAP R/3 系统的核心编程语言,用于开发 SAP 的自定义应用程序。
ABAP 不仅可以用于开发传统的客户端/服务器应用程序,还可以用于开发基于 Web 的应用程序。
2. ABAP 编程环境ABAP Workbench:是 ABAP 编程的主要工具,包括字典、SE38 事务码编辑器、SE80 对象浏览器等。
Dictionary:用于定义和修改数据字典对象,如数据元素、结构、表、视图等。
ABAP Editor:用于编写和编辑 ABAP 程序。
ABAP Debugger:用于调试 ABAP 程序。
3. ABAP 程序结构ABAP 程序由一个或多个程序单元组成,每个程序单元包含一个或多个功能模块。
ABAP 程序的结构如下:Report:是 ABAP 程序的基本单元,用于处理输入、处理数据和输出。
Function Module:是一组相关功能的集合,用于实现特定的业务功能。
Module Pool:是一组用于处理屏幕的逻辑单元,用于创建基于屏幕的应用程序。
Class:是一组相关属性和方法的集合,用于实现面向对象编程。
4. ABAP 语法关键字:ABAP 中的关键字是预定义的,用于表示特定的编程构造,如 IF、ENDIF、LOOP、ENDLOOP 等。
数据定义:ABAP 中的数据定义用于定义程序中的数据类型和数据结构,如 TYPES、DATA、STRUCTURES 等。
控制结构:ABAP 中的控制结构用于控制程序的执行流程,如IF、CASE、LOOP 等。
函数调用:ABAP 中的函数调用用于调用 ABAP 标准函数或自定义函数,如 CALL FUNCTION、PERFORM 等。
5. ABAP 编程示例REPORT z_example.DATA: a TYPE i, b TYPE i, c TYPE i.START-OF-SELECTION.a = 5.b = 3.c = a + b.WRITE: / 'The sum of', a, 'and', b, 'is', c.6. ABAP 开发最佳实践遵循编码规范:遵循 SAP 的编码规范,确保代码的可读性和可维护性。
ABAP技巧总结
1.引用类型z_ref数据对象myref在程序中的声明方式:DATA myref TYPE z_ref.CREATE DATA myref TYPE z_ref.2.参照数据字典中的表类型生成内表对象或结构体:DATA mytable TYPE z_table,”数据字典表类型,声明内表.myline TYPE LINE OF z_table.”表类型的行结构,声明结构体.3.取系统日期:SY-DATUM,4.取系统时间:SY-UZEIT.05.系统字段定位:SY-FDPOS.字符比较结果为真时,此字段将给出偏移量信息.6.系统字段SY-FDPOS给出字符的位置信息.(P109)7.系统字段SY-INDEX记录循环语句中的循环次数8.操作内表行结束后系统字段元SY-TABIX返回该行索引.对于所有行操作,如果操作成功,系统变量SY-SUBRC返回0,否则返回非0值.9.系统用户名:SY-UNAME.10.SY-HOST?屏幕序号:sy-dynnr.11.OK代码:SY-UCOMM或SYST-UCOMM12.屏幕组ID:SY-DYNGR.13.常量声明:CONSTANT const(len) TYPE type|LIKE dobj [DECIMALS dec][VALUE val].14.确定数据对象属性:DESCRIBE FIELD f [LENGTH l] [TYPE t [CONPONENTS n]][OUTPUT-LENGTH o] [DECIMALS d] [EDIT MASK m] [HELP-ID h].15.数据赋值:MOVE source TO destination.或destination = source.16.设定初始值:CLEAR F.17.检查字段是否为初始值:f IS INITIAL….18.检查字段是否被分配:fs IS ASSIGNED…..19.检查过程中的参数是否被实参填充:p IS [SUPPLIED|REQUESTED]….20.检查数据对象的值是否属于某范围之间:f1 BETWEEN f2 AND f3…..21.检查数据对象f的内容是否遵从某个选择表的逻辑条件:f in seltab….22.WRITE: /10 g,”在10个空格后输出变量g/(8) time using edit mask ‘__:__:__’.”输出的变量time保持8位的长度.23.将光标移动到下一行:SKIP.24.强制结束循环:EXIT,STOP或REJECT.25.循环的中止:CONTINUE无条件中止当前循环并开始下一轮循环,CHECK条件为真时循环,为假时结束本次循环并开始下一轮循环,EXIT无条件中止并退出整个循环.26.将字符串左移:SHIFT string.27.连接字符串:CONCATENATE s1 s2 …..sn INTO s_dest [SEPARATED BY sep].如果结果出现被截断的情况,将SY-SUBRC返回4,否则返回0.符号&用于在字字符串换行时的连接.28.根据分隔符号sep拆分字符串:SPLIT s_source AT sep I NTO s1 s2 ……sn.使用内表操作可以避免被截断的情况:SPLIT s_source AT sep INTO TABLE itab.此语句根据子串数目生成n行的内表.29.循环输出内表的每一行数据:LOOP AT itab INTO text.ENDLOOP.30.替换字段内容:REPLACE str1 WITH str2 INTO s_dest [LENGTH len]. 字段SY-SUBRC的返回值为0时表示己成功替换.31.确定字段长度:[COMPUTE] n = STRLEN( str ).32.删除字符串中的多余空格:CONDENSE33.字符转换,如将ABC转换为abc:TRANSLATE34.创建一个可以排序的格式:CONVERT TEXT.35.用一个字符串覆盖另一个字符串:OVERLAY36.WRITE TO赋值时将忽略数据对象的类型,而将其视为字符类型数据.37.字符串比较中的换码字符:#,用于转换比较时使用的通配符:*或+.及进行区分大小写,空格的比较,如#A表示比较大写的A.38.定位操作子串:strName[+0][(1)].39.字段符号,数据引用:动态数据对象.40.子程序定义:FORM subroutine_name USING parameters1parameters2…. ….ENDFORM.41.子程序调用:PERFORM subroutine_name USING actual_parameters1 p2….(其中USING可换成CHANGING)42.ULINE.输出下划线.43.错误查看:ST2244.程序打包release:SE01:找到对应的程序,点开后点上面小汽车,再选中上面的后再点小汽车.点check.程序修改后需要重新打包.45.制作T-CODE:SE93,TCODE应按顺序编号:ZMF+流水号,我的程序名46.创建table:t-code:se11,attributes:Delivery class:C.开发类别:ZFI,当自定义Field type时,名称需为Z+…..格式.->设置技术属性(Technical Setting):Logical storage parameters中Data class:APPL1,Sizecategory:4 创建function group:SE80,创建好后将创建的TABLE挂接到function grouph上去:用se11查出table,点utilites->table maintenance generator:Authorization groups:&NC&,Function group中填刚才创建的功能组名称->one step->overview screen中必须填未使用的number,此处screen number与table是一一对应的关系,也可让点系统上面的按钮:find screen number来自动搜索适合的scr. Number.->create,成功后,找到对应的function group中的screen number双击即可看到生成的代码.需要修改字段元元名称可在function group中的element list或layout中.-->se93创建t-code,start object选transaction with parameters(parameter transaction)->default values for->transantion:SM30->DefaultValues->name of screen field:viewname\update,value:table name\X.47.field-sign:,field—option:,field-low:表示选择条件中起始值48.在where子句中如果只有一个表的话,可以不用指定表名.49.获取用户IP地址及用户名:call function 'TH_USER_INFO' " Get user IP,hostnameimportinghostaddr = iporg”转化前的IP地址terminal = host”计算机名exceptionsothers = 1."Conv.IP addr to format 'xxx.xxx.xxx.xxx'call function 'ZGJ_IPADR2STRING' "Conv.IP addrexportingipadr = iporg”转化前的IP地址importingstring = ipdec.”转化后的最终需要的IP位址50.删除内表中数据完全相同的行,只保留一行: delete adjacent duplicatesfrom itab1 COMPARING <f1> <f2> / COMPARING ALL FIELDS.51.spro:后台设定52.输出选择框write:/ itab1-flag as checkbox第四章 ABAP基础4.1.5 程序运行1.程序内部调用,如下表:例:REPORT z_calling_program.START-OF-PROGRAM.WRITE ‘This program calls another program.’.”此内容在输出接口看不到SUBMIT z_simple_program.”上面的输出被此程序覆盖.如果改用SUBMIT AND RETURN来调用则可以输出以上内容.2.结束程序:LEAVE PROGRAM.可在任意点强制结束当前运行的程序.4.1.6 内存管理SAP程序同一个用户和系统可进行最多6个SAPGUI主会话.4.2.1 数据定义TYPES:BEGIN OF t_staff,S_no(3) type n,Name(20),END OF t_staff.DATA staff TYPE t_staff.上例中定义了一个结构类型t_staff,并根据其声明了一个结构体对象staff.数据类型中的扁平结构与纵深结构:扁平类型:运行时长度固定的类型.纵深类型:运行时长度可峦的类型.4.2.2 ABAP内置基本数据类型:注意:1.其中C,N,T,D,I,F,P,X为定长类型,即在运行期间长度不能改变.2.类型T,D,I,F的数据存储长度是固定的,不能指定参照其生成的数据对象占用的内存字节数.3.基于类型C,N,P,X生成的数据对象需要在声明时指定其长度.否则取默认值.4.如果在声明一个数据对象时未指明其数据类型,则该数据默认为C类型.5.类型I的数值范围:-231到231-1的整数.如果运算时出现非整型结果则进行四舍五入取值.而不是截断小数.6.类型P用于声明小数字固定的压缩数,其占据内存字节数和数值范围取决于定义时指定的整个数据的大小和小数点后位数,如果不指定小数字,则将其视为I类型数据.有效大小可以是从1~16字节的任意值,小数点后最多允许14个数字. 7,类型F为浮点数,浮点意思是数字在内存中以字节形式表示,数值范围:1*10-307到1*10308,因系统将F类型转换为二进制数,所以可能出现舍入误差,若用户要求较高精度且数值较大时,应使用P类型数据.8.长度可峦的内置类型String, XString是通过引用实际动态的数据对象的固定内存地址来操作.4.2.3 程序内部数据定义参照自定义类型或内置类型生成数据的语法格式:TYPES|DATA …TYPE l_type…参照程序中已经声明的数据对象生成新数据语法:TYPES|DATA …LIKE dobj…3.结构类型和结构体参照结构类型生成的数据对象称为结构体.TYPES|DATA:BEGIN OF structure.k[TYPE type |LIKE dobj]…,1[TYPE type |LIKE dobj]…,k2…[TYPE type |LIKE dobj]…,knEND OF structure.参照生成:参照结构生成:TYPES|DATA structure TYPE str_type |LIKE str_dobj...参照数据库表生成:TYPES|DATA structure TYPE dbtab.4.表类型和内表表类型的对象称为内表.4.2.4 数据字典中的类型●数据元素(Data elements),相当于ABAP中的基本类型和引用类型.●结构(Structures),由数据元素字段元构成,对应ABAP中的结构类型.●表类型(Table types),对应ABAP中的表类型.数据字典中的数据类型与ABAP中的中数据类型对应关系:4.2.5 程序中的数据对象1.文字对象当字符文字长度超过编辑器的一行时,可以使用”&”进行连接,避免因换行而产生的多余空格,如:long = ‘This is ‘&‘a long sentence’.如果需要输出“’”,则需要在前面多加一个“’”转回愿意.2.有名称的数据对象常量声明:CONSTANT: const(len) TYPE|LIKE dobj [DECIMALS dec] VALUE val.结构体常量声明(每个组件必须指定初始值):CONSTANT:BEGIN OF structure,str1 TYPE|LIKE dobj [DECIMALS dec] VALUE val,str2 TYPE|LIKE dobj [DECIMALS dec] VALUE val,...,strn TYPE|LIKE dobj [DECIMALS dec] VALUE val, END OF structure.3.系统数据对象(见附表)4.查明数据对象属性DESCRIBE FIELD f LENGTH len.此语句将字段f的长度写入变量len.●LENGTH:确定数据对象长度.●TYPE: 确定数据对象类型.●OUTPUT-LENGTH:确定实际输出长度.●DECIMALS:确定P类型小数位长.●EDIT MASK:确定在数据字典中定义转换例程.●HELP-ID:确定在数据字典中定义的F1帮助信息.4.3 基本数据操作4.3.1数据赋值●MOVE source TO incept.等介于:incept = source.●CLEAR dobj.将数据对象dobj还原为初始值.●结构体间赋值:struct2 = struct1.(组件结构相同).●MOVE-CORRESPONDING struct1 TO struct2.(部分组件结构相同).4.3.2类型转换(见附表).4.3.3数值运算1.算术运算两个结构体的同名字段之间可以整体进行算术运算:ADD-CORRESPONDING struct1 TO struct2.SUBTRACT-CORRESPONDING struct1 FROM struct2.MULTIPLY-CORRESPONDING struct2 BY struct1.DIVIDE-CORRESPONDING struct2 BY struct1.以上将对两个结构体中的同名字段进行相应运算(非数值类型数据会引起错误).2.数学函数任意类型参数的函数列表:注意:函数名与左括号间不能有空格,括号与参数间必须有空格. F类型参数的函数列表(其它类型参数将首先被转换为F类型).4.3.4数据输出输出格式化选项:注:用户主记录System->User profile->Own data(SU01).4.3.5逻辑表达式通用逻辑表达式列表:3.IS操作符●...f IS INITIAL...:检查字段f是否为初始值.●...fs IS ASSIGNED...:检查字段符号是否被分配.●...p IS [SUPPLIED|REQUESTED]...:检查过程中的参数是否被实参填充.4.BETWEEN操作符●...f1 BETWEEN f2 AND f3...:检查数据对象的值是否属于特定范围之间.5.IN操作符(P110)●...f IN seltab...:检查一个数据对象的内容是否遵从某个选择表的逻辑条件.6.组合逻辑表达式●AND:与.●OR:或.●NOT:非.注:括号与操作数间至少要有一个空格,如:IF ( c > n ) AND ( c < f ).4.4结构控制程序代码分三种结构:●顺序结构:语句逐行执行.●分支结构:根据不同的条件执行不同语句块.●循环结构:反复执行某个语句.4.4.1分支控制1.IF/ENDIF结构:IF <condition1>.<statement block>ELSEIF <condition2>.<statement block> ......ELSE.<statement block> ENDIF.注:可嵌套.2.CASE/ENDCASE结构: CASE f.WHEN f11 [OR f12OR ...].<statement block>......[WHEN OTHERS.]<statement block>ENDCASE.其中,f为变量,fij可以是变量或者固定值.4.4.2循环控制1.无条件循环DO [n TIMES].<statement block>ENDDO.说明:n为循环次数,可以是文字或变量,如果没有限定n值,则必须用EXIT,STOP 或REJECT等语句强制结束循环.DO循环可嵌套,SY-INDEX为当前循环次数.2.条件循环WHILE <condition>.<statement block>ENDWHILE.注:可嵌套,其它同上.3.循环中止●CONTINUE:无条件中止当前本轮循环,开始下一轮循环.●CHECK:条件中止当前本轮循环(条件为假时), 开始下一轮循环.●EXIT:无条件完全中止当前循环,继续循环结束语句(ENDDO,ENDWHILE等)后面的代码,如果在嵌套循环中,系统仅退出当前循环.4.5处理字符数据4.5.1字符数据1.连接字符串CONCATENATE s1 s2 ... sn INTO s_dest [SEPARATED BY sep].注:所有字符串操作将忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量).如果出现截断情况,将SY-SUBRC设为4,否则返回0.2.拆分字符串SPLIT s_source AT sep INTO s1 s2 ... sn.如果所有子串足够长且不必截断任何部分,则将SY-SUBRC设为0,否则返回4, 如果源字符串能够拆分的子串多过指定的数目,则源子串最后的剩余部分包括其后的分隔符号都将写入最后一个子串,要避免这种情况,需要使用内表进行操作: SPLIT s_source AT sep INTO TABLE itab.在该形式中,根据子串数目生成n行的内表.例如:DATA:text type string,itab TYPE TABLE OF string.text = ‘ABAP is a programming language’.SPLIT text AT space INTO TABLE itab.LOOP AT itab INTO text.WRITE / text.ENDLOOP.3.查找子串模式SEARCH c FOR str.在字段c中查找字符串str.如果找到,则将SY-SUBRC返回0,SY-FDPOS返回字段c中该字符串的位置(从左算起的字节偏移量),否则SY-SUBRC返回4,查找模式有以下几种:●str 搜索str并忽略尾部空格.●.str. 搜索str,但不忽略尾部空格.●*str 搜索以str结尾的单词.●str* 搜索以str开始的单词.REPORT z_string_search.DATA string(30) TYPE c VALUE 'This is a testing sentence.'.WRITE: / 'searched','sy-subrc','sy-fdpos'.SEARCH string FOR 'X'.WRITE: / 'X', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'. SEARCH string FOR 'itt '.WRITE: / 'itt ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'. SEARCH string FOR '.e .'.WRITE: / '.e .', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'. SEARCH string FOR '*e '.WRITE: / '*e ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'. SEARCH string FOR 's* '.WRITE: / 's* ', sy-subrc UNDER 'sy-subrc',sy-fdpos UNDER 'sy-fdpos'.输出结果如下:searched sy-subrc sy-fdposX 4 0itt 4 0.e . 4 0*e 0 18s* 0 184.替换字段内容.REPLACE str1 WITH str2 INTO s_dest [LENGTH len].搜索s_dest中前len个字符中的子串str1,用str2来替换它,如果成功,SY-SUBRC返回0,否则还回非0值.REPORT z_replace.DATA name TYPE string.name = 'Michael-Cheong'.WHILE sy-subrc = 0.REPLACE '-' WITH ' ' INTO name.ENDWHILE.WRITE / name.输出结果: Michael Cheong5.确定字段长度n = STRLEN( str ).函数将str作为字符数据类型处理,不考虑其实际类型,也不进行转换.计算其首字符到最后一个非空字符的长度,不包括结尾空格.6.其它操作语句●SHIT:将字符串整体或子串进行位移.●CONDENSE:删除字符串中的多余空格.●TRANSLATE:字符转换,如将ABC转换为abc.●CONVERT TEXT:创建一个可以排序的格式.●OVERLAY:用一个字符串覆盖另一个字符串.4.5.2字符数据比较(用于判断两个字符串之间的包含关系):注:CO,CN,CA,NA比较时区分大小写,且尾部空格也在比较范围之内,CS,NS,CP,NP比较时忽略尾部空格且不区分大小写,比较结束后,如果结果为真,SY-FDPOS将给出s2在s1中的偏移量信息.模式表示可以使用通配符,”*”用于替代任何字符串,”+”用于替代单个字符.换码字符使用:●指定大小写(如#A,#b).●通配符”*”(输入#*),将其转回原义.●通配符”+”(输入#+),将其转回原义.●换码符本身”#”(输入##),将其转回原义.●字符串结尾空格(输入#__),指定比较结尾空格.4.5.3定位操作子串str[+position][(len)].从字符串str中的position位开始取出长度为len的子串.可动态指定偏移量及长度的情况(即position及len可为变量):●用MOVE语句或赋值运算符给字段赋值时.●用WRITE TO语句向字段写入值时.●用ASSIGN将字段分配给字段符号时.●用PERFORM将数据传送给子程序时.off = 6.len = 2.date+off(len) = ‘01’.4.6使用内表types定义的并不是结构体对象,只是结构类型,不能作为工作区,当定义的内表没有表头行(工作区)时,必须为其定义一个结构体作为工作区,否则无法使用此内表.如果没有给内表定义工作区,则在定义内表时必须声明表头行(with header line).DATA:BEGIN OF line, "work area(structure)结构类型且结构体对象num TYPE i,sqr TYPE i,END OF line,"无表头行内表,内表定义都使用data关键词.itab TYPE(LIKE) STANDARD TABLE OF line WITH KEY table_line.DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.定义标准内表DO 5 TIMES.line-num = sy-index.line-sqr = sy-index ** 2.APPEND line TO itab.ENDDO.LOOP AT itab INTO line.WRITE:/ line-num,line-sqr.ENDLOOP.CLEAR itab.注:1.TYPES与DATA区别:TYPES是用来定义某种类(型)的,需(用DATA语句)实例化以后才可以使用,而DATA是用来定义数据对象(实例变量)的,对于用DATA直接定义的结构体对象(不参照其它结构类型),其同时也是一个结构类型.2.TYPE与LIKE区别:TYPE后面跟随的只能是某种类(型),而LIKE后面可以跟随类型或实例对象,参照结构体对象生成内表时只能用LIKE,不能用TYPE,因为结构体对象不是类型,只是一种实例对象,参照结构类型生成内表时可以用LIKE也可以用TYPE.其中通过LIKE定义的内表直接拥有参照结构类型的元素结构,而通过TYPE定义的内表只能间接拥有被参照结构类型的元素结构,结构类型不能作为内表的工作区,只有结构体对象才可以.内表定义语法:1.标准表:可指定或不指定关键词,可重复.逻辑索引,操作数据时数据内存位置不峦,系统只重排数据行的索引值.DATA itab TYPE|LIKE [STANDARD] TABLE OF structure [WITH KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].2.排序表:可指定唯一或不唯一的关键词,也可不指定,逻辑索引,按关键词升序存储.DATA itab TYPE|LIKE SORTED TABLE OF structure [WITH NON-UNIQUE(UNIQUE) KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n]. 3.哈希表:必须指定唯一关键词.无索引DATA itab TYPE|LIKE HASHED TABLE OF structure WITH UNIQUE KEY comp1 ... compn(DEFAULT KEY) [WITH HEADER LINE INITIAL SIZE n].注:如果n值为0或不指定的话,程序会为内表对象分配8KB大小内存,所以,如果内表比较小,不要把该值设为0,以避免内存浪费.旧版标准表定义语法:DATA itab TYPE|LIKE [STANDARD] TABLE OF structure OCCURS n.或者DATA:BEGIN OF itab OCCURS n,...,fi...,END OF itab.4.6.2操作内表行注:CLEAR itab[].表示操作的是内表对象.而CLEAR itab.当itab有表头行时表示操作表头行,如无表头行时表示操作内表对象.当一个操作语句结束后,SY-TABIX返回该行的索引值,对于所有行操作,如果访问成功,SY-SUBRC返回0,否则返回非0值.4.插入行—INSERT●INSERT structure INTO itab INDEX idx.无表头行索引表,itab的行数应大于或等于idx-1.否则失败●INSERT itab INDEX idx.有表头行索引表.●对于哈希表,系统按关键词将新行插入特定位置.●INSERT structure INTO|INITIAL LINE INTO TABLE itab.此语句对于标准表来说与append效果相同,对于排序表来说,插入的行不可以打乱按照关键词排序的顺序,否则插入不成功,对于哈希表来说,插入过程中系统按照关键词对行进行定位.INITIAL关键词是用于向内表中插入结构中各类型的初始值的.●INSERT LINES OF itab1 [FROM n1] [TO n2] INTO [TABLE] itab2 [INDEX idx].将内表中部分或全部数据行整体插入到另一内表中,指定行数时itab1,itab2必须为索引表,指定TABLE关键词时,itab2可以是任意内表.此方式比其它方式快20倍左右.5.附加行—APPEND(只能操作索引表)APPEND [structure TO|INITIAL LINE TO] itab.APPEND LINES OF itab1 [FORM n1] [TO n2] TO itab2.6.聚集附加—COLLECTCOLLECT line INTO itab.对于需要附加的数据,如果在内表中存在关键词内容与其相同的数据行,则此语句将需要附加的数据累加到内表中的这一行上,而不会另外再添加一行,操作成功后,SY-TABIX返回被处理过的行的索引.注:关键词以外的所有字段必须是数字类型7.读取行—READ(可用于任何类型内表)●READ TABLE itab [INTO wa|ASSIGNING <fs>] INDEX idx.通过索引读取内表中的单行数据. ASSIGNING表表示指派给字段符号.●READ TABLE itab FROM structure [INTO wa|ASSIGNING <fs>].读取与结构相同的工作区中的关键词内容全部相同的内表数据.●READ TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2 [INTOwa|ASSIGNING <fs>].指定所有关键词值,并读取相等时内表行.●READ TABLE itab WITH KEY field1 = v1 ... field2 = v2 [INTO wa|ASSIGNING<fs>].读取内表中字段fieldn(不一定是表关键字段)与值vn相同时的内表行.8.修改行—MODIFY●MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 f2 ...].如果内表包含的行数少于idx,则不更改任何行.●MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...].根据工作区wa中关键词修改内表行, TRANSPORTING表示修改指定字段值.●MODIFY itab FROM wa TRANSPORTING f1 f2 ... WHERE condition.修改符合WHERE子句中条件的内表中的指定字段值.9.删除行—DELETE●DELETE itab INDEX idx.根据索引删除内表行.●DELETE TABLE itab FROM wa.根据工作区关键词删除行.●DELETE TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2.根据指定关键词值删除行.●DELETE itab [FROM n1] [TO n2] [WHERE <condition>].10.循环处理--LOOPLOOP AT itab [INTO wa] [FROM n1] [TO n2] [WHERE condition].<statement block>.ENDLOOP.4.6.3操作整个内表1.排序SORT itab [ASCENDING|DESCENDING] [AS TEXT] [STABLE][BY f1 [ASCENDING|DESCENDING] [AS TEXT]......f1 [ASCENDING|DESCENDING] [AS TEXT]]说明:●ASCENDING|DESCENDING:升序或降序.默认升序.●AS TEXT:根据当前语言按字母顺序排序字符字段,否则按字符平台相关内部编码进行排序.●STABLE:保持排序前后不需要改变的数据行的相对顺序.2.控制级操作(用于总计,缩进,格式控制等)AT FIRST|LAST|NEW f|END OF f.<statement block>ENDAT.说明:●FIRST:当循环为内表的第一行时,执行语句块中语句.在工作区中,系统用*填充所有关键词内容.●LAST: 当循环为内表的最后一行时,执行语句块中语句. 在工作区中,系统用*填充所有关键词内容.●NEW f:字段元f前面(即左边)的全部字段元内容之一不同于上一行时, 执行语句块中语句.在工作区中,系统用*填充f后面所有关键词内容.●END OF f:如果下一行行组中的任何字段内容不同于上一行, 执行语句块中语句.在工作区中,系统用*填充f后面所有关键词内容.注:在控制级操作期间,在工作区中,对于非标准关键字段元,将全部进行初始化,在执行完控制操作后(即ENDAT语句后)工作区中的数据将全部还原到进入控制级操作语句前(即进入AT前)状态.3.初始化内表●CLEAR itab.:带表头行时只清空表头行,不带表头行时清空整个内表.●CLEAR itab[].:只清空整个内表对象数据.不清空表头行.●REFRESH itab或REFRESH itab[].:只清空整个内表对象数据.不清空表头行.●FREE itab.或FREE itab[].:只清空整个内表对象数据.不清空表头行,同时释放内存.●......itab IS INITIAL....:检查内表是否为空.4.整体复制内表●MOVE itab1 TO itab2.:如果两表都存在表头行,则此语句只复制了表头行.●MOVE itab1[] TO itab2[].:指定表体复制.●MOVE itab1[] TO itab2.:表itab2无表头行时才成立.●itab2 = itab1.同上1●itab2[] = itab1[].同上2●itab2 = itab1[].同上35.比较内表大小... itab1 <operator> itab2...:其中<operator>可以为=,<>,><,>=,<=,>,<等.4.6.4Extract Datasets●FIELD-GROUP fg.行结构分配.●INSERT f1 f2 ... INTO fg.生成字段组fg的具体字段结构.●EXTRACT fg.将字段组填充给EXTRACT.●SORT.排序.●LOOP. <statement block> ENDLOOP.循环输出EXTRACT.4.7动态数据对象4.7.1字段符号●FIELD-SYMBOLS <fs> [TYPE type|LIKE dobj].声明字段符号.●ASSIGN f TO <fs>.静态分配数据对象给字段符号.●ASSIGN f[+i] [(j)] TO <fs>.指定偏移量和长度.●ASSIGN (f) TO <fs>.动态分配,先找到字段f的内容,然后将该内容分配给<fs>.4.7.2数据引用TYPES t_dref TYPE REF TO DATA.DATA dref TYPE REF TO DATA.4.8模块化技术4.8.2子程序1.定义:FORM subr [[USING [VALUE(p1)]... ] [TYPE t|LIKE f]...] [TYPE ANY] [CHANGING [VALUE(p1)] ... ] [TYPE t|LIKE f]...] [TYPE ANY].<subr codes>ENDFORM.注:●VALUE参数表未示值传递,此方式在子程序调用后实参的值不会被改变.●无VALUE参数时表示引用传递,会改变实参的值.●USING与CHANGING无任何区别.●位于两个子程序间的代码不属于任何事件块.●参数传递时不存在类型转换,要求必须兼容.2.调用:PERFORM subr [USING p1 ... pn] [CHANGING pi ... pj].4.8.3功能模块(p153)4.8.5源代码复用1.包含程序包含程序是单纯的代码复用,不是可执行程序,不能单独运行,必须被其它程序调用,包含程序不能调用自身.INCLUDE incl.包含程序调用,此语句必须独占一行.2.宏:(语句块中最多只能包含9个占位符&1...&9).例:DATA:result TYPE i,int1 TYPE i VALUE 1,int2 TYPE i VALUE 2.DEFINE operation.result = &1 &2 &3.output &1 &2 &3 result.END-OF-DEFINITION.DEFINE output.write: / 'The result of &1 &2 &3 is',&4.END-OF-DEFINITION.operation 1 + 2.operation int2 - int1.4.9.1静态错误检查1.语法检查:用Check键.2.扩展语法检查(SLIN):在ABAP初台接口输出程序名后,选择Program->Check->Extended Syntax Check. Standard.4.9.2运行时错误控制1.可捕捉的错误CATCH SYSTEM-EXCEPTIONS exc1 = rc1 ... excn = rcn....ENDCATCH.其中exci表示一个单一可捕捉错误或者一个ERROR类,rci则代表一个数字.如果其中错误之一在CATCH和ENDCATCH语句之间出现,程序就不会中止,而是直接跳至ENDCATCH后,把系统指定的错误代码rci赋给字段SY-SUBRC.此语句可嵌套.例如:DATA:result1 TYPE p DECIMALS 3,number TYPE i VALUE 11.CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5.DO.number = number - 1.result1 = 1 / number.WRITE: / number,result1.ENDDO.ENDCATCH.IF sy-subrc = 5.WRITE / 'division by zero!'.ENDIF.2.不可捕捉的错误(通过ST22查看,在SAP系统中保存14天,可通过Keep功能保存更长时间).第六章数据库操作6.2.1表字段在数据字典中,每创建一个数据库表后,都将同时生成一个同名的结构化数据类型.6.2.2外部关键词外部关键词内容必须在其对应的约束表(check table)中存在,否则无法插入.6.2.3技术设定1.数据类型(data class):●APPL0(Master data),较少需要被修改的系统数据表,如员工个人信息.●APPL1(Transaction data),需要经常被修改的数据表,如产品库存量表. ●APPL2(Organization and customizing),系统定制数据表,在系统安装后很少需要修改,如国家代码等.2.数量级别:0 0 to 6,6001 6,600 to 26,0002 26,000 to 100,0003 100,000 to 420,0004 420,000 to 34,000,0003.缓冲(Buffering)机制如果在缓冲设定中选择了Buffering switched on项,则需要设定其缓冲类型(有Full,Single-record和Generic三种).缓冲机制的意义在于首次查询时将数据表中的数据放入应用服务器缓冲区,以提高后续查询效率,要注意最好不要对经常需要的数据库表设置该机制,对于经常读取但很少更新或者通常只有在60秒后才可能被其它应用服务器程序修改的数据库表,开启缓冲机制可以上百倍地提高效率.4.Log data changes用于设定表中的数据修改时是否在系统日志中记录.6.2.4索引一个数据库表可以包含一个主索引(Primary Index)和多个附属索引(Secondary Indexes).主索引只包含表关键词和指向整个数据条目的指针,由系统自动生成并在添加数据库条目时进行维护.索引中的数据已经排序.6.3.1SELECT语句SELECT <result> FROM <source> INTO <target>[WHERE <condition>] [GROUP BY <fields>][HAVING <cond>] [ORDER BY <fields>].●HAVING子句用于限定ORDER BY子句中数据条目组的选择条件1.选择单行数据:●SELECT SINGLE * FROM tab INTO wa_tab WHERE <condition>.选择单行全部数据.●SELECT SINGLE field1 ... fieldn FROM tab INTO (wa_field1,...,wa_fieldn)WHERE <condition>.选择单行指定字段数据到指定工作区字段.●SELECT SINGLE *|field1 ... fieldn FROM tab INTO CORRESPONDING FIELDS OFwa_tab WHERE <condition>.将选择的值放入工作区中对应的字段中.6.3.3选择多行数据1.循环选择(DISTINCT去掉结果重复的行):SELECT [DISTINCT] ... .<statement block>ENDSELET.系统字段SY-DBCNT给读取的行计数.2.选择至内表:SELECT ... INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE itab.其中INTO选项将复盖itab中的数据,如果不想复盖只想追加则用APPENDING.3.指定选择包大小(一次选择到内表的行数):SELECT * FROM tab INTO|APPENDING TABLE wa_tab PACKAGE SIZE n.<statement block>ENDSELET.6.3.4指定查询条件1.比较运算符:=,<,>,<>,<=,>=.2.范围限定运算符:WHERE ... f [NOT] BETWEEN g1 AND g2 ....3.字符比较运算符:WHERE ... f [NOT] LIKE g [ESCAPE h]...其中g中通配符”_”用于替代单个字符,”%”用于替代任意字符串. ESCAPE选项举例如下: SELECT ... WHERE city LIKE ‘edit#_%’ ESCAPE ‘#’.选择所有以”edit_”开始的城市.4.检查列表值:WHERE ... f [NOT] IN (g1,...gn)...5.检查空值: WHERE ... f IS [NOT] NULL...注:这里的NULL值不等同于初始值INITIAL6.检查选择表.●WHERE ... f [NOT] IN seltab...其中seltab为选择表,如选择屏幕中用户填充数据.●SELECT ... WHERE ( code = ‘01’ OR code = ‘02’ ) AND NOT (country= ‘usa’ ).:AND,OR,NOT可以按照任意顺序组合.●SELECT ... WHERE <condition> AND (itab).内表itab仅包含一个类型为C的字段,且最大长度为72.字段中内容不能使用变量.这种方式查询效率很低.6.3.5多表结合查询1.SELECT语句嵌套DATA:wa_carrid TYPE spfli-carrid,。
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方法
abap方法ABAP方法是SAP系统中常用的一种编程语言,用于开发和定制业务应用程序。
ABAP方法是一种面向对象的编程方法,它可以封装和组织代码,提高代码的可重用性和可维护性。
本文将介绍ABAP方法的基本概念和使用方法。
一、ABAP方法的概念ABAP方法是一段可被重复调用的代码,它可以实现特定的功能。
ABAP方法可以定义在类中或函数模块中。
在类中定义的方法被称为类方法,而在函数模块中定义的方法被称为函数方法。
无论是类方法还是函数方法,它们都可以接收参数,执行一定的逻辑操作,并返回结果。
二、ABAP方法的定义和调用1. 在类中定义方法在ABAP类中定义方法需要使用关键字"METHODS",然后在方法名后面跟上参数列表和可选的返回值。
例如:METHODS method_nameIMPORTINGparameter1 TYPE data_type1EXPORTINGparameter2 TYPE data_type2RETURNINGvalue TYPE data_type3.2. 在函数模块中定义方法在ABAP函数模块中定义方法需要使用关键字"FUNCTION",然后在方法名后面跟上参数列表和可选的返回值。
例如:FUNCTION function_name.IMPORTINGparameter1 TYPE data_type1EXPORTINGparameter2 TYPE data_type2RETURNINGvalue TYPE data_type3.3. 调用ABAP方法在ABAP中调用方法需要使用关键字"CALL METHOD"或"CALL FUNCTION",然后跟上方法名和参数列表。
例如:CALL METHOD class_instance->method_nameEXPORTINGparameter1 = value1IMPORTINGparameter2 = value2.三、ABAP方法的特性和用途1. 封装和组织代码ABAP方法可以将一段逻辑相关的代码封装在一起,提高代码的可读性和可维护性。
分享一个debug看 abap结构和内表查看的办法
分享一个debug abap结构和内表查看的办法::DATA: BEGIN OF i_data OCCURS 0,ebelp LIKE ekpo-ebelp,matnr LIKE ekpo-matnr,bukrs LIKE ekpo-bukrs,lgort LIKE ekpo-lgort,maktx LIKE makt-maktx,END OF i_data.SELECT A~EBELP A~MATNR A~BUKRS A~LGORT INTOCORRESPONDING FIELDS OF I_DATAFROM EKPO AS A WHERE A~EBELN IN s_ebeln.SELECT MAKTX INTO I_DATA-MAKTX FROM MAKT WHERE MATNR = I_DATA-MATNR ." AND SPRAS ='E'.APPEND I_DATA.CLEAR I_DATA.ENDSELECT.ENDSELECT.刚开始执行:执行完:SELECT A~EBELP A~MATNR A~BUKRS A~LGORT INTOCORRESPONDING FIELDS OF I_DATAFROM EKPO AS A WHERE A~EBELN IN s_ebeln.之前的结构I_DATA里面有值了,但是I_DATA[],没有值(他需要执行第二个循环里的APPEND I_DATA 后,才会有值的)双击变量名I_DATA后,调出其值:执行完1、SELECT MAKTX INTO I_DATA-MAKTX FROM MAKT WHERE MATNR = I_DATA-MATNR ." AND SPRAS ='E'.2、APPEND I_DATA.后结论:1、I_DATA[]是内表,I_DATA是结构体,debug中未执行到append前,debug中结构体还是有值的,I_DATA[]没有值2、执行append I_DATA,debug中结构体还是有值的,I_DATA[]没有值完整代码:*&---------------------------------------------------------------------**& Report ZYHJ20200217*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------**REPORT zyhj20200217.*TABLES:ekpo.*DATA: BEGIN OF t_write OCCURS 0,* ebeln LIKE ekpo-ebeln,* ebelp LIKE ekpo-ebelp,* matnr LIKE ekpo-matnr,* bukrs LIKE ekpo-bukrs,* lgort LIKE ekpo-lgort,* END OF t_write.**SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.** SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln.**SELECTION-SCREEN END OF BLOCK blk1.**SELECT ebeln ebelp matnr bukrs lgort INTO CORRESPONDING FIELDS OF TA BLE t_write* FROM ekpo WHERE ebeln IN s_ebeln .*LOOP AT t_write.* WRITE:/ t_write-ebeln,t_write-ebelp,t_write-matnr,t_write-bukrs,t_write-lgort.*ENDLOOP.REPORT zyhj20200217 NO STANDARD PAGE HEADING LINE-SIZE 120 LINE-COUNT 65(2).* 需求:查询采购订单项目,选择条件:订单号,输出结果,行项目,物料号,公司代码,库存地点。
SAPABAP语法实例(二)
*SAP ABAP 语法实例调试1调试键R10巨4亘F5 F6 F7F8*巧为单袖执拧・按F5键程序将逹軒扌丸行.苦代屑中包含子程序或函数・则会辖人 该函數中单帧谓试。
•區只在本强序中单柄执行,遇到子樨序或翡數时会直蛭执疔°*F7会一丈牲执行毛労前代码所在的过程.如子桂序和函數*苦屈主程序中+则直 接执行芜廡桎序。
并返E®」上一层谓用竝F8跳过后面所有断点,程序执行完2外部、会话、调试断点调试断点-debug 时打的断点,程序远程完后就会消失 会话断点-程序运行前通过 会话断点按钮打的断点,在同一登录会话不同窗口都有效,用户注销后消失外部断点-程序运行前通过 二,外部断点按钮打的断点,用户注销后再登录还是有效,但只针对同一用户有效ABAP Ec«tor: Change Report Z3ZJ_TEXT_EDITOR2□田|函固画HI1圖 ®DH.PatteSELECT • INTO TABLE it ZSpJli 7R0M upfli.HEAT TJiSLEWITH 住丫 caixid - cclt_Z3p±ll-di5tfinGe = 2 j J 2 ・MODIFY zsptll FROM it_Z3ptli + FFReportZJZJ」EXT E0ITQR2Active三二己三.39r专4;* SelectSELECT <result> FROM <source> INTO <target> [WHERE <condition>] [GROUP BY <fields>] [HAVING <cond>] [ORDER BY <fields>].GROUP BY:用于将一组数据条目压缩为一个单行作为选择最终结果;HAVING :用于限定ORDER BY子句子数据目组的选择条件;ORDER BY :用于限定行排序;SELECT整体语法结构。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.。