SAP的Update-Module函数
- 格式:doc
- 大小:237.00 KB
- 文档页数:7
SAP日期处理函数汇总SAP日期处理函数是SAP系统中常用的函数之一,用于处理日期和时间相关的操作。
在SAP系统中,日期和时间字段使用特定的数据类型,如DATS(日期类型)和TIMS(时间类型)。
下面是一些常见的SAP日期处理函数的汇总。
1.SY-DATUM:该函数用于获取当前日期。
它返回一个日期值,表示系统日期。
2.SY-ZEIT:该函数用于获取当前时间。
它返回一个时间值,表示系统时间。
3.SY-DAY:该函数用于获取给定日期的天数。
它接受一个日期作为输入,并返回一个整数值,表示该日期的天数。
4.SY-MONTH:该函数用于获取给定日期的月份。
它接受一个日期作为输入,并返回一个整数值,表示该日期的月份。
5.SY-YEAR:该函数用于获取给定日期的年份。
它接受一个日期作为输入,并返回一个整数值,表示该日期的年份。
6.GET_GMT_OFFSE:该函数用于获取给定日期的本地时区相对于GMT (格林尼治标准时间)的偏移量。
它接受一个日期作为输入,并返回一个时间间隔值,表示本地时区与GMT之间的时间差。
7.DATE_IS_VALID:该函数用于检查给定日期是否有效。
它接受一个日期作为输入,并返回一个标识符,表示该日期是否有效。
8.DATE_ADD_DAYS:该函数用于在给定日期上增加指定的天数。
它接受一个日期和一个整数值作为输入,并返回一个新的日期值,表示在给定日期上增加指定天数后的日期。
9.DATE_SUBTRACT_DAYS:该函数用于从给定日期中减去指定的天数。
它接受一个日期和一个整数值作为输入,并返回一个新的日期值,表示从给定日期中减去指定天数后的日期。
10.DATE_DIFFERENCE:该函数用于计算两个日期之间的天数差异。
它接受两个日期作为输入,并返回一个整数值,表示这两个日期之间的天数差异。
11.TIME_CONVERT:该函数用于将给定时间从一种时区转换为另一种时区。
它接受一个时间和两个时区作为输入,并返回一个新的时间值,表示将给定时间从一个时区转换到另一个时区后的时间。
SAP数据更新SAP 应用系统架构应用层运行着DIALOG进程,每个DIALOG进程绑定一个数据库进程,DIALOG 进程与GUI进行通信,每次GUI向应用服务器发送请求时都会通过dispatcher 服务为每个GUI的请求分配一个Dialog进程.一个程序运行时,GUI与Dialog进行需要多次通信,每次通信使用的Dialog进程不一定相同,在Dialog进程将控制权转给前台的GUI时,由于Dialog进程同数据库进程绑定,会触发一个隐式数据库提交(COMMIT WORK),如果在Dialog进程发生A类型错误,则触发隐式的数据库回滚(Rollback)SAP LUWSAP LUW是DB LUW的一个增强,受体系结构限制,SAP程序每次屏幕切换时(控制权从后台DIALOG进程转移到前台GUI的Session),都会触发一个隐式的数据库提交,一个程序在运行是会产生多个DB 的LUW,这样无法做到全部提交或全部回滚,在某些业务场景下,这种事务的提交机制不足以保证数据的一致性,为此有有了SAP LUW机制.SAP LUW是一种延迟执行的技术,它将本来需要执行的程序块,记录下来.记录的位置在内存或DB Table中,如perform on commit 会记录到内存中,update Funciton module即可以记录到内存也可以记录到VBMOD 和VBMOD表中.系统在执行COMMIT WORK的时候会查询记录,真正执行需要运行的代码,COMMIT WORK一般在最后一个屏幕执行,这样就实现了将跨屏幕的数据更新逻辑绑定到一个DB LUW中,实现复杂情况数据更新的一致性SAP LUW的绑定方式CALL FUNCTION...IN UPDATE TASK,该种方式需要Funciton类型为Update Module类型,同时在调用时使用IN UPDATE TASK参数.在程序调用Update Module进行更新时分为本地和非本地非本地方式:注册的更新函数记录在VBMOD 和VBMOD表中,COMMIT WORK 时更新操作在UPDATE进程中执行,此时调用程序不等待被调用函数的返回,使用的为异步方式.如果使用COMMIT WORK AND WAIT,此时调用程序等待被调用函数的返回,使用的为同步方式.本地方式在调用函数前需要执行SET UPDATE TASK LOCAL. 这样所有在该语句后使用CALL FUNCTION...IN UPDATE TASK注册的更新函数不会记录到数据库中,而是记录在内存中,在Commit work之后,会从内存取得待执行的函数,在同一个Dialog进程中执行数据的更新,本地方式更新采用的是同步方式,即使在Commit work后指定了and wait参数,仍然是同步执行.在使用COMMIT WORK之后SET UPDATE TASK LOCAL的效果会被清除掉,如果COMMIT WORK后注册的更新函数仍然需要采用本地方式,需要再执行一次SET UPDATE TASK LOCAL语句.优缺点对比本地方式: 只有同歩不将待执行的更新函数写到数据表中,减少了I/O操作,效率上较高,但由于采用的是同步方式,程序需等待更新结果,用户交互时的会感觉程序运行较慢非本地方式:可同歩可异步会将更新结果记录到数据表中,可以通过SM13查看更新情况,同时由于可以进行异步更新,用户交互时感觉会比较快CALL FUNCTION... IN BACKGROUND TASK DESTINATION,是一种对RFC函数进行事务绑定的方式PERFORM ... ON COMMIT将待执行的程序块注册到内存中,可以使用LEVEL参数指定优先级,优先级按升序进行排列,较小的会优先执行.使用ON COMMIT参数注册的subroutine,如果同样名字的subroutine被注册了多次,在COMMIT WORK时只执行一次,IN UPDATE TASK方式执行的Funciton没有这个限制绑定方式的执行顺序PERFORM ON COMMIT 会优先执行,如果中断,CALL FUNCTION... IN BACKGROUND TASK和CALL FUNCTION...IN UPDATE TASK, DESTINATION 将不会执行,可以保证数据的全部提交和全部回滚建议不要混合使用CALL FUNCTION... IN BACKGROUND TASK和CALL FUNCTION...IN UPDATE TASK,因为一个是针对本地数据进行的更新,一个是远程数据,从技术上猜测,跨数据库的提交与回滚很难实现,故同时使用这两种方式可能会带来数据不一致的问题,除非本地和远程数据不需要保持数据的一致V1 & V2 Update图例说明Immediate start 表示V1方式,更新出错后,可以在SM13里重新执行Immediate start -no restrat possible V1方式,出错后不可以在SM13里重新执行,有些更新脱离具体程序后再执行可能会带来数据的不一致,可以考虑使用这种方式Start delayed V2方式V1方式更新完成后触发,Collective run V2方式需使用Collective(RSM13005)程序手动或JOB方式执行,更新函数分为V1和V2V1优先级高于V2,V2被设计为依赖于V1,适合执行需要在V1完成后进行的操作,V1更新使用V1进程处理,V1进程名字一般为UPD,V1进程绑定独立的数据库进程.在V1进程中调度的更新函数如果更新失败,回滚,不进行V2操作.成功则提交更改到数据库,同时删除所有的SAP锁V2更新使用V2进程处理,如果没有配置V2进程则共用V1进程,V2进程名字为UP2,V2更新在独立DB LUW中,V2更新回滚后不会影响到V1更新提交的数据,由于V1更新结束后会删除SAP的锁,所以V2更新是在没有逻辑锁的情况下进行的,V2更新出错后可以在SM13中重新执行SAP LocksSAP 的锁是一种逻辑锁,通过加锁函数和解锁函数进行处理锁类型S 共享锁读锁,可以累加E 独占锁写锁进程内可以累加X 排他锁写锁不可以累加慎用S锁,S锁的累加特性会造成锁无法彻底释放,造成其他程序无法写入,E锁可以保证只加一次锁锁对象通过锁对象可以生成加锁和解锁函数其中scope 参数1 表示程序内,有效2 表示update module 内有效3 全部_wait 表示如果对象已经被锁定,是否等待后再尝试加锁,最大的等待时间有系统参数ENQUE/DELAY_MAX控制_COLLECT 参数表示是否收集后进行统一提交,COLLECT 是一种缓存与批处理方法,即如果指定了Collect,加锁信息会放到Lock Container 中,Lock Container实际上是一个funciton Group控制的内存区域,如果程序中加了很多锁,锁信息会先放到内存中,这样可以减少对SAP锁管理系统访问,若使Lock Container中的锁生效,需执行FLUSH_ENQUEUE 这个Funciton,将锁信息更新到锁管理系统中,此时加锁操作生效,使用函数RESET_ENQUEUE可以清除Lock Container中的锁信息释放锁调用DEQUEUE函数如果程序更新用到到V1 Update时,在commit work是会删除所有的锁程序中止rollback为什么需要使用SAP LockSAP Lock是一种逻辑锁,相对于DB Lock,是一种轻量级的锁,DB Lock一旦发现不能加锁会进行延迟等待,使用SAP Lock 一定程度上可以减少对DB Lock的占用,避免死锁,同时合理使用SAP Lock可以保证数据的一致性其他select for update 是在DB层次上加的锁参考SM66查看活动进程,如果有V1和V2更新,可以看到UPD和UP2进程SM13查看出错或未执行完的V1和V2更新。
1、获取订单状态(STATUS_READ 和 STATUS_TEXT_EDIT)1.STATUS_READ 改函数的实现原理大概是通过订单的对象好(OR+订单号)到JEST 中取出字段STAT INACT.JEST表中STAT是一串从字面看不出意思的字符,可以根据STAT到表TJ02T中找到具体的描述。
下面是具体用法DATA:objnr TYPE aufk-objnr.objnr = 'OR000000100014'.DATA:t_status TYPE TABLE OF jstat WITH HEADER LINE."结果存放在STATUS表中CALL FUNCTION 'STATUS_READ'EXPORTINGclient = sy-mandtobjnr = objnrTABLESstatus = t_statusEXCEPTIONSobject_not_found = 1OTHERS = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.LOOP AT t_status.IF t_status = 'I0046'.WRITE:'订单已关闭'.EXIT.ENDIF.ENDLOOP.2.STATUS_TEXT_EDIT 改函数读取的结果是将订单状态拼接到一个字符串中,而且这个字符串是在前台订单上看到的状态,比较直接,这样做的结果就可能由于状态较多导致长度过长,在某些情况下取的数据可能不准。
下面是一段代码DATA:line TYPE bsvx-sttxt.CALL FUNCTION 'STATUS_TEXT_EDIT'EXPORTINGclient = sy-mandtobjnr = objnrspras = sy-languIMPORTINGline = lineEXCEPTIONSobject_not_found = 1OTHERS . "IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.SEARCH line FOR 'CLSD'.IF sy-subrc = 0.WRITE:'订单已关闭'.ENDIF.DATA i_jstat LIKE jstat OCCURS 0 WITH HEADER LINE.CALL FUNCTION 'STATUS_READ'EXPORTINGclient = sy-mandtobjnr = i_caufv_resb-objnr ”对象号only_active = 'X'* IMPORTING* OBTYP =* STSMA =* STONR =TABLESstatus = i_jstat “目前的所有状态EXCEPTIONSobject_not_found = 1OTHERS = 2.LOOP AT i_jstat WHERE stat = 'I0013' "DLT 删除标识符.OR stat = 'I0012' "DLV 交货OR stat = 'I0045' "TECO 技术实现OR stat = 'I0043' "LKD 冻结OR stat = 'I0001' "CRTD 建立OR stat = 'I0046' "CLSD 已结算OR stat = 'I0076'. "DLID 删除标志l_delete = 'X'.EXIT.ENDLOOP.2、图标的函数ICON_CREATE1、定义字段data: status_icon type icons-text.2、创建屏幕,并在屏幕定义创建一个"Status Icon"控件,命名为:status_icon3、利用ICON_CREATE函数在输出是设置ICON。
常⽤的SAP标准函数Function Module DescriptionABAP4_CALL_TRANSACTION Call transaction code, also see SAPGUI_SET_FUNCTIONCODEGet additional user address details not retrived bySUSR_USER_ADDRESS_READ (i.e. email address)Retrieve fiscal year and payrole period (based on date andcompany code)CALCULATE_DATE Increase/decrease DATE by a specific number of Days/Months CONVERT_DATE_TO_EXTERNAL Converts date from system storage format to users specifieddisplay formatCREATE_TEXTS Create standard texts (i.e. PO headers texts)Convert currency value from value stored in SAP to displayedcurrencyConvert currency value from displayed currency value to valuestored in SAPCLPB_EXPORT Export files to clipboardCLBP_IMPORT Copies clipboard into tableDATE_COMPUTE_DAY Returns day of the week for a particular date(1=Monday, 5=Fridayetc.)DATE_TO_DAY Returns day of the week for a particular date('Monday', 'Friday','Sat.')ENQUEUE_READ Returns list if active lock objectsRetrieve fiscal year and payrole period (Note: verision parameter isfiscal year varient from table T009)Return values (i.e. from an F4 value request) into respective fieldson a dynpro.F4IF_INT_TABLE_VALUE_REQUEST Display internal table as search help (documented in SAP)FILE_GET_NAME Retrieve Logical file path. Use Transaction 'FILE' to view/createlogical file pathsFTI_FISCAL_YEAR_MONTH_GET Returns fiscal year for specific dateDownload file to PCUpload file from PCHR_SEN_CRULE_0100_DATE Increase/decrease DATE by a specific number ofDays/Months/YearsJOB_OPEN, JOB_SUBMIT, JOB_CLOSE Create and submit background jobs.Builds actual message based on info returned from CalltransactionNUMBER_GET_NEXT Get the next unique number in a number range. Use tcode SNROfor maintaining number ranges.NUMBER_CHECK Check if number is within a number range (see tcode SNRO) NUMBER_GET_INFO Get info about number range (see tcode SNRO).POPUP*Display Pop-up Screen(s)Retrive standard texts (i.e. PO headers texts)READ_EXCHANGE_RATE Retrieve exchange rate on a particular dateRS_CREATE_VARIANT Creating a Report VariantRS_VARIANT_CONTENTS Returns contents of a variant, is also useful as the result lists allvariable names that could be set on screen.Get list of files within specific directory(Application Server) SAPGUI_SET_FUNCTIONCODE Execute SAP function code. Can also be used to executetransaction code by using '/o' i.e. '/OSE80'.STUM_WP_TOTAL_ACTIVITY Retrieves list of all process from all servers (i.e. SM50, SM66).Also returns a second table, containing a list of all the servers. STUM_WP_SERVER_ACTIVITYS &Retrieves list of processes on current server.EW_TH_WPINFOGet user address details stored under 'Own data'SUSR_USER_PARAMETERS_GET Get user parameter details stored under 'Own data'SUSR_USER_DISPLAY_WITH_AUTHS Displays user authorisation objects (Note: may have to debugaround authority checks)SUSR_USER_AGR_ACTIVITYGR_GET Get users activity group detailsSUSR_SYNC_USER_TABLES Sync USR tablesExecute external command(FTP data in & out of SAP)TH_POPUP Display Windows Message on Users ScreenWS_EXECUTE Execute External Program。
1、获取订单状态(STATUS_READ 和 STATUS_TEXT_EDIT)1.STATUS_READ 改函数的实现原理大概是通过订单的对象好(OR+订单号)到JEST 中取出字段STAT INACT.JEST表中STAT是一串从字面看不出意思的字符,可以根据STAT到表TJ02T中找到具体的描述。
下面是具体用法DATA:objnr TYPE aufk-objnr.objnr = 'OR000000100014'.DATA:t_status TYPE TABLE OF jstat WITH HEADER LINE."结果存放在STATUS表中CALL FUNCTION 'STATUS_READ'EXPORTINGclient = sy-mandtobjnr = objnrTABLESstatus = t_statusEXCEPTIONSobject_not_found = 1OTHERS = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.LOOP AT t_status.IF t_status = 'I0046'.WRITE:'订单已关闭'.EXIT.ENDIF.ENDLOOP.2.STATUS_TEXT_EDIT 改函数读取的结果是将订单状态拼接到一个字符串中,而且这个字符串是在前台订单上看到的状态,比较直接,这样做的结果就可能由于状态较多导致长度过长,在某些情况下取的数据可能不准。
下面是一段代码DATA:line TYPE bsvx-sttxt.CALL FUNCTION 'STATUS_TEXT_EDIT'EXPORTINGclient = sy-mandtobjnr = objnrspras = sy-languIMPORTINGline = lineEXCEPTIONSobject_not_found = 1OTHERS . "IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.ENDIF.SEARCH line FOR 'CLSD'.IF sy-subrc = 0.WRITE:'订单已关闭'.ENDIF.DATA i_jstat LIKE jstat OCCURS 0 WITH HEADER LINE.CALL FUNCTION 'STATUS_READ'EXPORTINGclient = sy-mandtobjnr = i_caufv_resb-objnr ”对象号only_active = 'X'* IMPORTING* OBTYP =* STSMA =* STONR =TABLESstatus = i_jstat “目前的所有状态EXCEPTIONSobject_not_found = 1OTHERS = 2.LOOP AT i_jstat WHERE stat = 'I0013' "DLT 删除标识符.OR stat = 'I0012' "DLV 交货OR stat = 'I0045' "TECO 技术实现OR stat = 'I0043' "LKD 冻结OR stat = 'I0001' "CRTD 建立OR stat = 'I0046' "CLSD 已结算OR stat = 'I0076'. "DLID 删除标志l_delete = 'X'.EXIT.ENDLOOP.2、图标的函数ICON_CREATE1、定义字段data: status_icon type icons-text.2、创建屏幕,并在屏幕定义创建一个"Status Icon"控件,命名为:status_icon3、利用ICON_CREATE函数在输出是设置ICON。
MM模块:采购订单增强:BADI :ME_GUI_PO_CUSTME_PROCESS_PO_CUST物料凭证增强:BADI:MB_DOCUMENT_BADIUSER-EXIT:MBCF0002实现功能1、当参照预留过帐时,检查填入数量是否小于预留数量2、移动类型是***的时候,查看RSNUM是否为空3、检查原始单据工厂和库存地点与物料凭证的工厂和库存地点一致MBCF0009实现功能1、当移动类型是***的时候,库存地点只能是****2、工单下达日期+时间小于预留需求日期+时间,警告ENHANCEMENT SPOT1、标准程序MM07MFB0 实现功能:如果移动类型是***,特殊库存标识必须是*,工厂必须是****2、标准程序MM07MFK0_KONTIERUNG_INITSPOT是ENHANCEMENT-POINT KONTIERUNG_INIT_01 SPOTS ES_SAPMM07M.实现功能:如果移动类型是***,特殊库存标识变成灰,工厂变成灰3、标准程序FM07MED0_DYNPRO_MODIFIZIERENSPOT是ENHANCEMENT-POINT DYNPRO_MODIFIZIEREN_06SPOTS ES_FM07MED0_DYNPRO_MODIFIZIERE INCLUDE BOUND实现功能:移动类型是***,则根据采购订单找到库存地点,讲库存地点描述替代到物料凭证的收货方WEMPF字段4、标准程序MM07MFF0_FUSSZEILE_WESPOT是ENHANCEMENT-POINT FUSSZEILE_WE_01 SPOTS ES_SAPMM07M.实现功能:如果移动类型是***,且特殊库存标志是*,库存地点只能是****物料主数据检查:BADI:BADI_MATERIAL_CHECKBADI:MB_RESERV A TION_BADI采购申请增强:BADI:ME_PROCESS_REQ_CUST预制发票增强:BADI:INVOICE_UPDATE 实现功能:检查预制发票中采购订单对应的采购组、采购类型和采购组织的权限供应商增强:BADI:VENDOR_ADD_DA TAVENDOR_ADD_DA TA_CS 供应商主数据屏幕增强PM模块:工单增强:工单——工序——外部BADI:MRO_CONTRACT 实现功能:外部中填入的物料组和维护的物料组是否一致,不一致则报错BADI:WORKORDER_UPDATE 工单的很多判断都在这个里面来实现工单——组件增强USER-EXIT:CNEX0026 FUNCTION:EXIT_SAPLCOMK_005工单BADI:IWO1_ORDER_BADI INST_AUTHORITY_CHECK 实现功能:IW31和IW32的时候检查是否有权限创建和修改工单IWO1_SCREEN_MODIFY 实现功能:修改工单的屏幕字段是否显示USER-EXIT:IEQM0003 FUNCTION:EXIT_SAPMIEQ0_001功能位置增强:USER-EXIT:ILOM0001 FUNCTION:EXIT_SAPMILO0_001通知单增强:USER-EXIT:IWOC0001 FUNCTION:EXIT_SAPLIWO1_001 创建的时候检查QQMA0014 FUNCTION:EXIT_SAPMIWO0_020 保存的时候检查BADI:NOTIF_EVENT_SA VE 保存时检查维护计划增强:IP41/IP42/IP43USER-EXIT:IPRM0004 FUNCTION:EXIT_SAPLIWP3_004 保存时候检查计量点增强:USER-EXIT:IMRC0001, FUNCTION:EXIT_SAPLIMR0_001 检查权限IMRC0005, FUNCTION:EXIT_SAPLIMR1_005 检查权限FI增强会计凭证替代增强:BADI:AC_DOCUMENTACC_DOCUMENTSD模块发票增强:USER-EXIT:SDVFX004 FUNCTION:EXIT_SAPLV60B_004 传递发票的一些字段到会计凭证上客户增强:BADI:CUSTOMER_ADD_DATA_CS 客户主数据屏幕增强CUSTOMER_ADD_DATAUSER-EXIT:SAPMF02D FUNCTION:EXIT_SAPMF02D_001 客户主数据的销售数据增强 SDVFX008 FUNCTION:EXIT_SAPLV60B_008 用销售发票的一些字段替代会计凭证交货单屏幕增强:BADI:LE_SHP_TAB_CUST_ITEM 增强屏幕LE_SHP_DELIVERY_PROC 逻辑编写PS模块BADI:WBS_USER_FIELDS_F4 实现功能:CJ20N创建WBS的时候为特定字段做SEACH HELPBADI:WORKBREAKDOWN_UPDATE 实现功能:CJ20N 保存WBS检查USER-EXIT:CNEX0002 FUNCTION:EXIT_SAPLCNAU_001 PS的权限检查注意sap_x_actvt这个参数要打X。
SAP BOM组件批量更新的函数随着企业生产制造的复杂程度不断提升,对于生产计划和物料清单的管理也变得更加复杂和困难。
而在SAP系统中,BOM(Bill of Materials)组件批量更新的需求也日益凸显。
本文将从以下几个方面介绍如何在SAP系统中实现BOM组件的批量更新功能。
一、背景介绍1.1 BOM概念BOM是指生产制造过程中所使用的原材料、半成品、零部件等物料清单,可以理解为产品的配方。
在SAP系统中,BOM是一个非常重要的模块,用于记录和管理产品的组成结构和物料清单。
1.2 批量更新需求对于大型制造企业而言,BOM组件的更新将涉及到大量的物料和产品,手动逐一更新将耗费大量时间和精力。
需要一种快速高效的方式来实现BOM组件的批量更新,以满足企业的生产需求。
二、功能介绍2.1 批量更新函数在SAP系统中,可以通过ABAP编程语言来实现BOM组件的批量更新功能。
开发人员可以编写相应的批量更新函数,通过传入参数来实现对多个BOM组件的同时更新。
2.2 参数设置在批量更新函数中,需要设置相应的参数来指定需要更新的BOM组件以及更新的内容。
可以通过传入BOM号、物料号、更新数量等参数来实现对特定BOM组件的更新操作。
2.3 数据校验在批量更新功能中,需要对传入的参数进行严格的数据校验,确保更新操作不会对系统数据造成损坏或错误。
可以通过设置数据有效性检查、格式验证等方式来进行数据校验。
2.4 执行更新经过参数设置和数据校验后,可以调用相应的函数来执行BOM组件的批量更新操作。
在更新过程中,需要对更新结果进行及时的反馈和记录,以便后续的数据分析和查询。
三、实现流程3.1 确定更新范围首先需要确定需要更新的BOM组件范围,可以根据产品生产计划或物料需求计划来确定需要进行批量更新的BOM组件。
3.2 编写批量更新函数根据实际需求,开发人员可以编写相应的批量更新函数,通过ABAP语言实现对BOM组件的批量更新。
SAP常用系统函数归纳函数名描述CONVERSION_EXIT_ALPHA_INPUT 料号前面补0CONVERSION_EXIT_ALPHA_OUTPUT 料号前面减0CONVERSION_EXIT_MATN1_INPUT 料号前面补0CONVERSION_EXIT_MATN1_OUTPUT 料号前面减0LAST_DAY_OF_MONTHS 查询某日期的在当月的最后一天CO_SF_CAUFVD_GET 根据工单号查询订单抬头和项目SO_NEW_DOCUMENT_ATT_SEND_API1 外发邮件VIEW_MAINTENANCE_CALL 调用数据表的维护视图SO_OBJECT_SEND 外发邮件函数名CONVERSION_EXIT_ALPHA_INPUT功能:料号前面补0,实例:CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "料号前面加0”EXPORTINGinput = matnr_inIMPORTINGoutput = matnr_out.说明:1)数字料号入Table需要补0,不会自动产生,有字母料号却会自动补0.2)只能用’字符型’CONVERSION_EXIT_MATN1_INPUT功能:料号前面补0实例:CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' "料号前面补0”EXPORTINGinput = matnr_inIMPORTINGoutput = matnr_outEXCEPTIONSlength_error = 1OTHERS = 2.说明: 1)数字料号入Table需要补0,不会自动产生,有字母料号却会自动补0.2)只能用于料号转换CONVERSION_EXIT_ALPHA_OUTPUT功能:料号前面去0实例:CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' "料号前面去0. EXPORTINGinput = wa_ysy1-matnrIMPORTINGoutput = wa_ysy1-matnr.说明:CONVERSION_EXIT_MATN1_OUTPUT功能:料号前面去0实例:CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'EXPORTINGinput = t_afpo-matnrIMPORTINGoutput = t_afpo-matnrEXCEPTIONSOTHERS = 1.说明:LAST_DAY_OF_MONTHS功能:查询某日期的在当月的最后一天CALL FUNCTION 'LAST_DAY_OF_MONTHS'EXPORTINGday_in = f_date "月任意一天类型必须为D(要完成日期##IMPORTINGlast_day_of_month = p_date "月最后一天类型必须为D(完整日期)EXCEPTIONSday_in_no_date = 1OTHERS = 2.说明:CO_SF_CAUFVD_GET功能: 根据工单号查询订单抬头和项目实例:DATA: wa_caufvd TYPE caufvd.CALL FUNCTION 'CO_SF_CAUFVD_GET'"取得订单抬头和项目EXPORTINGaufnr_imp = aufnrIMPORTINGcaufvd_exp = wa_caufvd “订单抬头和项目结构EXCEPTIONSnot_found = 1OTHERS = 2.说明:SO_NEW_DOCUMENT_ATT_SEND_API1功能:邮件发送 SAPoffice: Send new document with attachments using RFC 实例:FORM email_itab. “邮件内容“WRITE: '编号' TO email_itab-line+0(3), "255个长度的文本字段:文本"'记帐日期' TO email_itab-line+3(10),ENDFORM. "email_itabFORM reset_objpack .it_packing_list-transf_bin = space. "标记将以二进制形式传输对象的标志" it_packing_list-head_start = 0."表头开始行"it_packing_list-head_num = 1. "表头行数"it_packing_list-body_start = 1."内容开始行"it_packing_list-body_num = it_message_lines. "内容行数"it_packing_list-doc_type = 'RAW'. "信息类型"APPEND it_packing_list.ENDFORM. "reset_objpackFORM reset_doc_chng .DESCRIBE TABLE email_itab LINES it_message_lines.gd_doc_data-doc_size = it_message_lines * 255 + STRLEN( email_itab ). "SAPoffice 文档的大小 "gd_doc_data-obj_langu = sy-langu. "创建文档使用的语言"gd_doc_data-obj_name = 'SAPRPT'. "文档,文件夹或分配清单的名称"gd_doc_data-obj_descr = '邮件标题'. "Email标题"gd_doc_data-sensitivty = 'F'. "对象:灵敏度(个人的,功能的,...) F:功能" ENDFORM. "reset_doc_chngFORM reset_reclist .SELECT zmaaddrINTO it_receivers-receiverFROM ziebtemail.it_receivers-rec_type = 'U'. "互联网地址APPEND it_receivers.CLEAR it_receivers.ENDSELECT.ENDFORM. "reset_reclistDATA: gd_doc_data LIKE sodocchgi1,gd_sent_all(1) TYPE c,it_message_lines TYPE sy-tabix,it_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,it_receivers LIKE somlreci1 OCCURS 0 WITH HEADER LINE.DATA: BEGIN OF email_itab OCCURS 10.INCLUDE STRUCTURE soli.DATA: END OF email_itab.PERFORM email_itab. "TABLES OUTPUT_TAB.PERFORM reset_doc_chng.PERFORM reset_reclist.PERFORM reset_objpack.CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'EXPORTINGdocument_data = gd_doc_data “新文档的属性”PUT_IN_OUTBOX = 'X' “标志:发送后将文档移到outbox* COMMIT_WORK = ' '* IMPORTINGSENT_TO_ALL = gd_sent_all “Flag: Document sent to all”* NEW_OBJECT_ID = ID of created object (not document!)tablespacking_list = it_packing_list “SAPoffice:输入对象组件描述”* OBJECT_HEADER =* CONTENTS_BIN =* CONTENTS_TXT =* CONTENTS_HEX =* OBJECT_PARA =* OBJECT_PARB =receivers = email_itab”SAPoffice:API 收件人清单的结构”* EXCEPTIONS* TOO_MANY_RECEIVERS = 1* DOCUMENT_NOT_SENT = 2* DOCUMENT_TYPE_NOT_EXIST = 3* OPERATION_NO_AUTHORIZATION = 4* PARAMETER_ERROR = 5* X_ERROR = 6* ENQUEUE_ERROR = 7* OTHERS = 8.IF sy-subrc <>0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.说明:VIEW_MAINTENANCE_CALL功能:调用数据表的维护视图实例:CALL FUNCTION 'VIEW_MAINTENANCE_CALL'EXPORTINGaction = 'U' “活动(显示/维护/传输)”* CORR_NUMBER = ' '* GENERATE_MAINT_TOOL_IF_MISSING = ' '* SHOW_SELECTION_POPUP = ' 'view_name = 'ZIEBTEMAIL' “要处理的视图/表格的名称”* NO_WARNING_FOR_CLIENTINDEP = ' '* RFC_DESTINATION_FOR_UPGRADE = ' '* CLIENT_FOR_UPGRADE = ' '* VARIANT_FOR_SELECTION = ' '* COMPLEX_SELCONDS_USED = ' '* CHECK_DDIC_MAINFLAG = ' '* SUPPRESS_WA_POPUP = ' '* TABLES* DBA_SELLIST =* EXCL_CUA_FUNCT =* EXCEPTIONS* CLIENT_REFERENCE = 1* FOREIGN_LOCK = 2* INVALID_ACTION = 3* NO_CLIENTINDEPENDENT_AUTH = 4* NO_DATABASE_FUNCTION = 5* NO_EDITOR_FUNCTION = 6* NO_SHOW_AUTH = 7* NO_TVDIR_ENTRY = 8* NO_UPD_AUTH = 9* ONLY_SHOW_ALLOWED = 10* SYSTEM_FAILURE = 11* UNKNOWN_FIELD_IN_DBA_SELLIST = 12* VIEW_NOT_FOUND = 13* MAINTENANCE_PROHIBITED = 14* OTHERS = 15.IF sy-subrc <>0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.说明:SO_OBJECT_SEND功能:外发邮件实例:REPORT ztmail02 .DATA: BEGIN OF itab OCCURS 0,pernr LIKE pa0001-pernr,ename LIKE pa0001-ename,END OF itab.DATA: message_content LIKE soli OCCURS 10 WITH HEADER LINE,receiver_list LIKE soos1 OCCURS 5 WITH HEADER LINE,packing_list LIKE soxpl OCCURS 2 WITH HEADER LINE,listobject LIKE abaplist OCCURS 10,compressed_attachment LIKE soli occurs 100 WITH HEADER LINE,w_object_hd_change LIKE sood1 occurs 100 WITH HEADER LINE,compressed_size LIKE sy-index.START-OF-SELECTION.SELECT pernr enameINTO CORRESPONDING FIELDS OF TABLE itabFROM pa0001WHERE pernr <50.LOOP AT itab.WRITE: /02 sy-vline, itab-pernr, 15 sy-vline, itab-ename, 50sy-vline.ENDLOOP.*receiversreceiver_list-recextnam = 'eric.guh@'. “直接外部地址作为接收方”receiver_list-recesc = ‘U’. “收件人类型的说明; U 互联网地址”receiver_list-sndart = ‘MAIL'. “输出设备; MAIL 邮件”receiver_list-sndpri = '1'. “发送:优先级; 1 最高优先权”APPEND receiver_list.*general dataw_object_hd_change-objla = sy-langu. “创建文档使用的语言”w_object_hd_change-objnam = 'Object name'. “文档,文件夹或分配清单的名称”w_object_hd_change-objsns = 'F'. “对象:灵敏度(个人的,功能的,...)” F: 功能w_object_hd_change -OBJDES = ‘Message subject’. “Mail的标题”APPEND w_object_hd_change.*contentmessage_content-line = 'Message content'. “发送的内容”APPEND message_content.CALL FUNCTION 'SO_OBJECT_SEND'EXPORTINGobject_hd_change = w_object_hd_change “通常头数据”object_type = 'RAW' “对象类型”OUTBOX_FLAG = 'X' “标志:发送后将文档移到outboxowner = sy-uname “负责传送的用户”TABLESobjcont = message_content “发送的内容”receivers = receiver_list “接收对象属性”att_cont = compressed_attachment.---------------------------------------------------------------------------------------------函数名描述SD_VBAP_READ_WITH_VBELN 根据销售订单读取表 vbap 中的信息EDIT_LINES 把 READ_TEXT 返回的 LINES 中的行按照 TDFORMAT=“*”重新组织VIEW_MAINTENANCE_CALL 维护表视图函数名描述DY_GET_FOCUS 获得屏幕焦点DY_GET_SET_FIELD_VALUE 获得或者设置屏幕字段的值函数名描述F4IF_INT_TABLE_VALUE_REQUEST 显示检索 helpREAD_TEXT 读取长文本CONVERSION_EXIT_CUNIT_OUTPUT 单位转换SJIS_DBC_TO_SBC 全角转半角SJIS_SBC_TO_DBC 半角转换为全角CO_R0_CHECK_DECIMAL_POINT 根据单位检查数据的小数位POSTAL_CODE_CHECK 检查邮政编码函数名描述CONVERSION_EXIT_ALPHA_INPUT 全数字则在前面补 0CONVERSION_EXIT_ALPHA_INPUT 和上面相反GET_JOB_RUNTIME_INFO 获得 job 相关信息TERMINAL_ID_GET 获得端末 idDATE_CONVERT_TO_FACTORYDATE 把输入日期转为工厂日历日期MESSAGE_TEXT_BUILD 把消息转为文本函数名描述POPUP_TO_CONFIRM 弹出确认窗口函数名描述CONVERSION_EXIT_MATN1_INPUT 物料号码转换函数CONVERSION_EXIT_MATN1_OUTPUT 同上相反CONVERT_TO_LOCAL_CURRENCY 按照指定日期汇率转换金额为指定货币类型 SSF_FUNCTION_MODULE_NAME 根据 form 名取得对应的函数名(SmartForm)函数名描述DATE_CHECK_PLAUSIBILITY 日期 CHECKcl_gui_frontend_services=>gui_upload 上传到服务器cl_gui_frontend_services=>gui_download 下载到服本地SSF_FUNCTION_MODULE_NAME SMARTFORMS 输出报表时,生成一个函数名称,然后 CALL 这个名称函数名描述POPUP_TO_DECIDE_LIST 弹出供选择窗口1.function : SD_VBAP_READ_WITH_VBELN功能:根据销售订单读取表 vbap 中的信息参数:import : I_VBELN 订单号(必输项)I_BYPASSING_BUFFER 是否回避 bufferI_REFRESH_BUFFER 是否清空 buffertables : ET_VBAPVB 不清楚其意义ET_VBAP vbap 表2.form : EDIT_LINES功能:把 READ_TEXT 返回的 LINES 中的行按照 TDFORMAT=“*”重新组织原因:如果用 CREATE_TEXT 登录的长文本不存在该问题,如果是在前台业务登录的 text ,那么存到数据库的时候会在 72 位的地方换行,在 lines 这个表中的 TDFORMAT 设置为空,导致READ_TEXT 返回的表中的行数也许不是你需要的行数。
培训教程•基础概念与入门•控制结构与流程控制•数据处理与操作•模块化编程实践•调试技巧与问题解决•实战案例分析与练习基础概念与入门SAPABAP是SAP系统中用于开发应用程序的高级编程语言。
它支持结构化编程,具有强大的数据处理和逻辑判断能力。
SAPABAP广泛应用于SAP系统的定制开发、报表生成、接口编程等方面。
SAPABAP简介编程环境与工具SAPABAP开发环境提供代码编辑器、调试器、性能分析工具等。
SAPGUI用于与SAP系统交互的图形用户界面。
ABAP Workbench集成开发环境,包括多种开发工具,如数据字典、函数库、屏幕画板等。
包括字符型、数值型、日期型、时间型等。
数据类型变量数据类型转换用于存储数据的容器,包括局部变量、全局变量、静态变量等。
不同数据类型之间的转换规则和方法。
030201数据类型与变量包括算术运算符、比较运算符、逻辑运算符等。
运算符由变量、常量、运算符等组成的计算式。
表达式运算符的优先级和结合性规则,用于确定表达式的计算顺序。
优先级与结合性运算符与表达式控制结构与流程控制用于根据条件执行不同的操作,包括简单IF 、IF-ELSE 和嵌套IF 结构。
IF 语句根据表达式的值选择执行不同的代码块,类似于其他编程语言中的switch-case 结构。
CASE 语句AND 、OR 和NOT 等,用于组合或修改条件表达式的结果。
逻辑运算符条件语句FOR 循环根据指定的次数重复执行一段代码,通常用于遍历数组或处理具有固定次数的任务。
DO 循环重复执行一段代码,直到满足指定的结束条件,包括DO WHILE和DO UNTIL 两种形式。
LOOP 语句无限循环执行一段代码,直到遇到特定的退出语句(如EXIT 或CHECK )才结束。
循环语句03CHECK 语句检查指定条件是否满足,如果不满足则跳转到指定的标签位置。
01JUMP 语句无条件跳转到程序中的指定位置,通常与标签(LABEL )一起使用。
Update Module函数功能简介
1.功能简介
SAP函数存在三种类型:普通函数,RFC函数和Update Module函数三类。
前面两类比较常见,但Update Module函数比较少用。
Update Module函数(又称为更新函数)主要用于对话或报表中实现同步和异步更新数据库的功能。
2.实现方案简介
在自定义对话程序、远程调用目标服务、报表设计过程中,存在需要单独调用函数实现更新数据库表;但又要求对程序的运行不产生影响(即更新成功与否不影响主程序的正常执行)。
此时可以通过更新任务(Update Module函数)实现该功能。
3.详细实现方案
3.1 更新函数概念
Update Module函数(又称为更新函数)主要用于对话或报表中实现同步和异步更新数据库的功能。
更新任务中运行的功能模块必须在函数库中注册,即在函数’属性’设置页卡中设定函数类型为’ Update Module’。
根据更新函数执行的先后顺序,将更新函数分为V1和V2两类;区别如下:立即开始更新
在共享更新事务(SAP LUW)中运行的高优先级(“V1”)功能设置该选项;出现错误时更新任务可以重新启动这些功能。
立即开始更新,不能重启
在共享更新事务中运行的高优先级(“V1”)功能设置该选项;不能由更新任务重新启动这些功能。
延迟启动更新
为在自身更新事务中运行的低优先级(“V2”)功能设置该选项;出现错误时更新任务可以重新启动这些功能。
3.2更新函数的参数设置
更新函数在参数设置上有特定的要求:
1.因为更新任务功能模块不能报告其结果,因此不允许结果参数
(EXPORTING,CHANGING)或例外(EXCEPTIONS);
2.必须指定输入参数(IMPORTING)和带有ABAP/4词典中所定义的参考字
段和参考结构的表格(TABLES)。
3.2.1 传入参数设置
在更新函数中传入参数只允许使用值传递(IMPORTING)方式;对应的参数须使用参照字段进行定义。
如果创建传出参数和指针传递参数(CHANGING)参数,程序将提醒并不允许保存。
3.2.2 传出参数设置
更新函数只允许有TABLE参数,并且该表格需要对应的参考结构。
一般使用TABLE参数用于获取更新执行成功与否的反馈消息(RETURN表格);或者传入用于查询数据的参考内表(尽量不更改传入内表的数据)。
3.3 调用更新函数方式
将函数设置为更新模式后;调用时既可以将该函数定义到更新任务中,也可以作为普通函数进行调用。
3.3.1 作为普通函数调用
如果需要调用该函数时作为普通函数执行,不作为更新函数。
则在调用该函数时,直接只用CALL FUNCTION的方式实现即可。
CALL FUNCTION 'YYWANGT_UPDATAMODULE'
EXPORTING
zcarrid = 'AZ'
zconnid = zconnid.
3.3.2 作为更新函数调用
如果需要将该函数设定为更新函数,则需要在调用该函数时注明IN UPDATE TASK。
将该函数写入LOG TABLE。
当一个SAP LUW执行到COMMIT WORK处时,系统统一执行LOG TABLE中的更新函数。
CALL FUNCTION 'YYWANGT_UPDATAMODULE' IN UPDATE TASK
EXPORTING
zcarrid = 'AZ'
zconnid = zconnid.
下面用一个图形详细描述普通函数和更新函数的执行顺序:
要有效地编程异步更新,必须了解R/3 系统中更新任务如何工作。
典型的SAP 系统配置包括对话任务和更新任务。
对话任务处理所有与其它联机用户的交互会话。
更新任务专用于执行数据库更新。
更新函数用于在对话任务和更新任务中执行更新。
对话任务更新是同步更新。
更新任务更新是异步更新。
(例外:用COMMIT WORK AND WAIT触发更新任务功能时,它是同步更新)
在事务内部,对于每条COMMIT WORK语句可以调用一个或多个更新任务功能模块。
在报表中,调用更新任务的地方,也可以通过COMMIT WORK语句显式提交更新任务功能模块。
简单来说,更新函数只能在COMMIT WORK或ROLL BACK处才会被执行。
而一般调用事务内部,在完成一个SAP LUW时都有一个隐式的COMMIT WORK 功能,故不用再明确提交;而在报表事务中,需要显式使用COMMIT WORK功能进行更新函数的提交。
3.4 更新函数的调试
三类函数的调试存在很大的区别。
普通函数需要通过内部断点( )进行调试,RFC函数需要登录链接账户(华中账户为CCGCRFC)通过外部断点( )进行调试。
更新函数需要开启一个特殊功能后才能调试,现将具体调试方法分为三步进行说明。
3.4.1 开启Update debugging功能
更新函数测试需要开启Update debugging功能后才能实现。
首先设置断点进入Debugging功能界面,选择Setting –display/change debugging Settings
勾选Update debugging 复选框,并点击’保存’( ) 按钮。
(如果勾选’提交’按钮,只会在本次登录中有效。
如果勾选’保存’按钮,下次登录后该调试功能依旧有效。
)
3.4.2 测试更新函数
运行主函数,程序处理完COMMIT WORK语句后,自动进入更新任务表。
以学习机程序’YYWANGT_UPDATAMODULE’为例。
1.程序运行到更新函数处
2.直接跳过更新函数,执行’COMMIT WORK’
3.执行’COMMIT WORK’后,进入更新任务表中更新函数
3.4.3 SM13监控更新任务表
事务码SM13进入更新任务监控。
选择’TO BE UPDATED’显示当前还未执行的更新列表;选择’ALL’显示当前尚未执行的更新列表和存在报错的更新列表。
点击执行后存在两个更新任务。
第一行的STATUS为INITIAL表明程序还未执行;第二行的STATUS为黄色,表明程序执行过程有错误。
点击第一行可进入更新函数列表,其中包含两个更新函数:
YYWANGT_UPDATAMODULE:为V2类型的更新函数;
YYWANGT_UPDATAMODULE2:为V1类型的更新函数。
根据V1,V2类型的区别(优先执行V1,待全部执行后再执行V2)。
程序首先执行V1类型的更新函数;V1函数执行成功后,更新函数列表如图所示:
程序继续执行V2类型的更新函数;执行成功后,在更新任务列表中该记录消失。
针对存在错误的更新函数,我们可通过点击更新任务列表详细查看报错的函数。
双击弹出提示框,可点击ABAP SHORT DUMP( )按钮查看详细报错信息。
同样我们也可通过ST22查看报错记录。
4.结束语
更新函数的使用范围是很广泛的,尤其在ERP与其他系统的接口功能设计时使用很方便。
举一个代表性的例子:当我们需要获取用户刚创建的固定资产信息,但是提供的增强(EXIT_SAPLAISA_001)所传入的数据可能并不完全满足字段需要。
此时我们就可以在增强中添加一个V2类型的更新函数。
因为系统先执行其自带的V1和V2类型的更新函数,然后再执行自定义的V2类型更新函数;所以我们可以直接通过函数在透明表中取值即可。
详细代码可见函数:ZFI_GK_GDZC。