1、FM的功能定位 1.1 、FM模块的主要功能定位 话说当前各个实体企业都在提出精细化管理,因此有一天相关人员组织了一场讨论大会,参加人员有外企、国企、民企、还有个体户,X-SAP也混在其中,想趁机推广一下SAP。 外企:我们制定了合理的预算,并严格遵守和执行,一年下来,我的费用得到有效控制,并减少了费用成本的开支,提高了企业的竞争能力…… 国企:我们制定了各种各样高大上的预算,使用相当漂亮的报表,并提供领导决策,领导对我们编制的预算非常满意,我们的预算取得了成功,并成功的进行了预算。 外企:你们按需求
一,过程 1,DIALOG程序获得用户要更新的数据,并把它写到一个特殊的LOG TABLE,表内的条目属于同一个请求类型,包含了稍后将要写到数据库的数据。一个DIALOG程序可以写多条数据到LOG TABLE。写进LOG TABLE里的条目属于同一个LUW,意思就是它们要么都被执行,要么都不被执行。 2,DIALOG程序关闭LUW(将LOG TABLE的条目打包),并通知系统基本程序有一个包的数据需要更新。 3,系统基本程序从LOG TABLE读取这个LUW的需要更新的数据,并把这些数据提供给系统更新程序。 4,系统更新程序接受传输给它的数据,并更新数据库。 5,如果更新程序运行成功,系统基本程序删除这个LUW在LOG TABLE的所有数据;如果失败,保持LOG TABLE的这些数据,并标记不成功。触发更新程序的用户会收到系统发的关于这个错误的E-MAIL。可以用参数rdisp/vbmail(1发,0不发)来控制错误时是否发E-MAIL和rdisp/vb_mail_user_list($ACTUSER代表创建更新数据的用户)来控制错误时发E-MAIL给谁。可以用事务SM13来监控更新请求。 二,技术实现 更新程序必须用一个特殊的FM(update module)来实现。UPDATE MODULE和其他的FM一样,有传输参数的接口,但是只能有IMPORTING和TABLES,并且类型只能用参考或者结构。EXPORTING和EXCEPTION参数在UPDATE MODULE里是被忽略的。UPDATE MODULE里包含实际的数据库更新语句。 在DIALOG程序中,通过一个特别的FM,使用IN UPDATE TASK。如: CALL FUNCTON 'F1' IN UPDATE TASK EXPORTING P1 = A P2 = B. 使用这样写法的FM不会立即执行,而是写进LOG TABLE,作为一个执行请求,一个SAP LUW下的更新请求存储在同一个UPDATE KEY下。对一个SAP LUW来说UPDATE KEY是一个唯一的世界范围的识别码,意思就是一个SAP LUW的UPDATE KEY是唯一的,不会和另外的SAP LUW的UPDATE KEY重复。 只有当程序执行到COMMIT WORK的时候,才会为这些请求创建一个抬头条目LOG HEADER,表示以上这些同样UPDATE KEY的属于同一个包,然后系统关闭这个LUW。当LOG HEADER创建以后,系统通知DISPATCHER有一个更新包已经准备好可以处理了。 有些时候,你可能需要丢弃当前SAP LUW的所有changes(比如结束TCODE),可以使用ROLLBACK WORK或者弹出一个A类型的MESSAGE,这两个语句都可以有以下的效果: -删除写到该点之前的所有的change requests -删除写到该点之前所有的锁 -丢弃当前DB LUW执行的changes -丢弃所有使用POC形式登记的subroutines ROLLBACK WORK语句不会影响程序上下文,意思就是,所有的数据对象保持不变。UPDATE MODULE里面不允许有显示的ROLLBACK WORK或者COMMIT WORK语句。 如果更新失败,属于这个SAP LUW的LOG条目会标记成不正确,同时错误消息也会保存到日志。可以用SM13来检查LOG条目。 如果在DIALOG程序里为更新技术设置了锁,并且锁的参数_scope = 2,那么使用COMMIT WORK之后锁会被传递到UPDATE TASK,这个时候在DIALOG程序中,锁不能被访问。 在UPDATE MODULE里不必显示的去释放锁,因为更新处理的最后阶段,系统会自动释放这些锁。当UPDATE TASK有错误发生的时候,也会自动释放锁。 如果UPDATE MODULE允许更新请求再次被处理,在处理的时候数据库中的数据表跟失败的时候可能不一样,而且也没有锁保护了,因为错误产生的时候,锁自动被释放了。 举个例子,如果一个凭证没有成功更新到数据库是因为数据库的表空间溢出,这个时候比较适合再次处理。 三,更新的模式 1,异步模式 在这个模式下,DIALOG程序和UPDATE程序各自运行。DIALOG程序写请求到LOG TABLE,用一个COMMIT WORK来关闭LUW。UPDATE程序被COMMIT触发并开始运行来处理这些请求,DIALOG程序继续运行,不会等待UPDATE程序结束。UPDATE程序在特殊的UPDATE WORK PROCESS中运行。 当数据库更新花费比较长的时间,用户DIALOG需要较少的响应时间,异步更新显得比较重要。在DIALOG处理中,异步更新是标准的技术
一,过程 1,DIALOG程序获得用户要更新的数据,并把它写到一个特殊的LOG TABLE,表内的条目属于同一个请求类型,包含了稍后将要写到数据库的数据。一个DIALOG程序可以写多条数据到LOG TABLE。写进LOG TABLE里的条目属于同一个LUW,意思就是它们要么都被执行,要么都不被执行。 2,DIALOG程序关闭LUW(将LOG TABLE的条目打包),并通知系统基本程序有一个包的数据需要更新。 3,系统基本程序从LOG TABLE读取这个LUW的需要更新的数据,并把这些数据提供给系统更新程序。 4,系统更新程序接受传输给它的数据,并更新数据库。 5,如果更新程序运行成功,系统基本程序删除这个LUW在LOG TABLE的所有数据;如果失败,保持LOG TABLE的这些数据,并标记不成功。触发更新程序的用户会收到系统发的关于这个错误的E-MAIL。可以用参数rdisp/vbmail(1发,0不发)来控制错误时是否发E-MAIL和rdisp/vb_mail_user_list($ACTUSER代表创建更新数据的用户)来控制错误时发E-MAIL给谁。可以用事务SM13来监控更新请求。 二,技术实现 更新程序必须用一个特殊的FM(update module)来实现。UPDATE MODULE和其他的FM一样,有传输参数的接口,但是只能有IMPORTING和TABLES,并且类型只能用参考或者结构。EXPORTING和EXCEPTION参数在UPDATE MODULE里是被忽略的。UPDATE MODULE里包含实际的数据库更新语句。 在DIALOG程序中,通过一个特别的FM,使用IN UPDATE TASK。如: CALL FUNCTON 'F1' IN UPDATE TASK EXPORTING P1 = A P2 = B. 使用这样写法的FM不会立即执行,而是写进LOG TABLE,作为一个执行请求,一个SAP LUW下的更新请求存储在同一个UPDATE KEY下。对一个SAP LUW来说UPDATE KEY是一个唯一的世界范围的识别码,意思就是一个SAP LUW的UPDATE KEY是唯一的,不会和另外的SAP LUW的UPDATE KEY重复。 只有当程序执行到COMMIT WORK的时候,才会为这些请求创建一个抬头条目LOG HEADER,表示以上这些同样UPDATE KEY的属于同一个包,然后系统关闭这个LUW。当LOG HEADER创建以后,系统通知DISPATCHER有一个更新包已经准备好可以处理了。 有些时候,你可能需要丢弃当前SAP LUW的所有changes(比如结束TCODE),可以使用ROLLBACK WORK或者弹出一个A类型的MESSAGE,这两个语句都可以有以下的效果: -删除写到该点之前的所有的change requests -删除写到该点之前所有的锁 -丢弃当前DB LUW执行的changes -丢弃所有使用POC形式登记的subroutines ROLLBACK WORK语句不会影响程序上下文,意思就是,所有的数据对象保持不变。UPDATE MODULE里面不允许有显示的ROLLBACK WORK或者COMMIT WORK语句。 如果更新失败,属于这个SAP LUW的LOG条目会标记成不正确,同时错误消息也会保存到日志。可以用SM13来检查LOG条目。 如果在DIALOG程序里为更新技术设置了锁,并且锁的参数_scope = 2,那么使用COMMIT WORK之后锁会被传递到UPDATE TASK,这个时候在DIALOG程序中,锁不能被访问。 在UPDATE MODULE里不必显示的去释放锁,因为更新处理的最后阶段,系统会自动释放这些锁。当UPDATE TASK有错误发生的时候,也会自动释放锁。 如果UPDATE MODULE允许更新请求再次被处理,在处理的时候数据库中的数据表跟失败的时候可能不一样,而且也没有锁保护了,因为错误产生的时候,锁自动被释放了。 举个例子,如果一个凭证没有成功更新到数据库是因为数据库的表空间溢出,这个时候比较适合再次处理。 三,更新的模式 1,异步模式 在这个模式下,DIALOG程序和UPDATE程序各自运行。DIALOG程序写请求到LOG TABLE,用一个COMMIT WORK来关闭LUW。UPDATE程序被COMMIT触发并开始运行来处理这些请求,DIALOG程序继续运行,不会等待UPDATE程序结束。UPDATE程序在特殊的UPDATE WORK PROCESS中运行。 当数据库更新花费比较长的时间,用户DIALOG需要较少的响应时间,异步更新显得比较重要。在DIALOG处理中,异步更新是标准的技术,意思就是DIALOG程序一般会采取异步更新方式。 可
4 派生规则推导策略 派生规则推导,是SAP提供由数据源推导到目标数据的一种工具,它提供了一系列面向用户开放使用的方法来使数据源经过逻辑推理后生成了有效目标数据。比如已知业务发生形成的源数据A,经过了一个复杂的逻辑推导,得到B,然后把B作为结果来使用。 我们可以开放的理解一下,在由源数据推导到目标数据的过程中,由于SAP系统无法列举可能的业务模式或者业务逻辑来供用户配置,于是就提供了一个开放的由用户自己定义一段程序来达到这个目的,你没有看错就是一段程序,而实现这段被SAP规范的程序的工具就是派生规则推导工具
BAPI_COMPANYCODE_GETDETAIL是一个适合演示的函数,没有import paramter参数,调用后COMPANYCODE_GETDETAIL 表参数返回SAP系统中所有公司代码的清单。只包括公司代码ID和公司代码名称两个字段。
以前做enhancement的时候用过parameter id 和 memory id, 但很多其他语法用法我是没接触过的, 今天看了Palm同鞋做的文档SAP Memory & ABAP Memory, 做了一些测试, 本文几乎所有内容来自Palm同鞋的文档.
一、认识BTE BTE(Business Transaction Event)也称之为“业务交易事件”,一般的增强(Tcode:SMOD|CMOD)依旧使用ABAP进行二次开发,然而BTE则提供了RFC调用其它产品的可能(Tcode:FIBF)。BTE的设计思路更加简单,和BADI有点类似。在标准程序中留有OPEN_FI的出口(以函数OPEN_FI_PERFORM_eventid_type的形式存在),提供一个可配置的TABLE,可以在里面针对某个特定的Event维护自己定义的出口函数,标准程序走到这里,如果查出用户定义了出口函数,则会调用,达到增强的目的。 BTE增强有2种类型,类似于会计凭证的验证和替代。 P/S函数模块(Publish and Subscribe Interface):只提供SAP数据源,可以供外部程序使用或者达到数据检查的目的。 处理函数模块(Process Interface):可以达到数据修改的目的,用来增强标准的业务流程。
3.1.1.2 承诺项目主数据维护 1)FMCIA - 单个处理 维护单个的承诺项目。 ① image.png ② 直接可记账的:该承诺项目可以在预算生成和预算耗用中直接记账使用。 ③ 不能直接可记
JCo3.0调用SAP函数的过程 大致可以总结为以下步骤: 连接至SAP系统 创建JcoFunction接口的实例(这个实例代表SAP系统中相关函数) 设置importing参数 调用函数 从exporting参数或者table参数获取数据 代码: package jco3.demo4; import org.junit.Test; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoDestinationManager
3.1.6 账户分配要素主数据权限检查 在FM模块当中部份主数据的权限检查,SAP支持不是很好,比如对基金计划程序的权限支持不是很好。针对集团式管控的企业,对FM主数据有着细分权限管理需求,除了使用权限组外,可以增强对账户分配要素主数据的权限检查,例如,自建一个基金计划程序的权限对象,然后用于基金计划程序的权限检查。 因此可以激活BADI:FM_AUTHORITY_CHECK 来增强用户自定义的权限检查。 该BADI提供了以下几种方法,来扩展增强权限检查: FM_AUTHORITY_CHECK~COMMIT
假设MAIN PROGRAM(调用程序)为MAIN,其所在的为SAP LUW 1。
一,同步调用从一个程序同步调用其他的ABAP程序,有2种方式: 1,调用程序被打断,当被调用程序执行完毕之后,调用程序继续执行。如:CALL FUNCTION <function>SUBMIT <program> AND RETURNCALL TRANSACTION <tcode> 使用CALL FUNCTION 'AAA'调用FM的时候,相应的FUNCTION GROUP被加载到调用程序所在的internal session。当FM执行完毕,接着执行调用程序。FUNCTION GROUP和其GLOBAL DATA会一直保存在这个internal session直到调用程序结束。当调用程序再次调用这个FM的时候,不会再次加载相应的FUNCTION GROUP。这个FUNCTON GROUP的GLOBAL DATA和第一次调用它时的内容是一样的。 使用SUBMIT <program> AND RETURN或者CALL TRANSACTION <tcode>的时候,实际是插入了一个新的internal session,当被调用的程序执行完毕之后,新插入的internal session会被删除,继续执行调用程序。可以使用leave program语句来结束程序。
void append(DOMString name, DOMString value)
如果SAP中多个函数需要在一个session中运行,需要JCoContext来提供保证。如果在同一个线程中,大体模式这样:
20201228学习《ABAP_ALV_知识整理》,以下为读书笔记和我的ALV开发实例。
数组与函数递归调用是C语言中很重要的组成部分,算数计算过程中也要留意对象的数据类型对于结果的影响
ABAP 的 CALL FUNCTION 类似于 Java/.NET 中的本地或远程方法调用。 CALL FUNCTION 可以分为四种: 1. Synchronous RFC (sRFC) - 同步调用 2. Asynchronous RFC (aRFC) - 异步调用 3. Transactional RFC (tRFC) - 保证 Transaction 数据一致性的调用 4. Queued RFC (qRFC) - 用一个对列序列化的 tRFC 本文很好地介绍了前面两种,也是最常用的两种。 SAP Help 的相关文档是: http://help.sap.com/SAPhelp_nw04/helpdata/en/9f/db98ef35c111d1829f0000e829fbfe/frameset.htm Calling Function Modules http://help.sap.com/saphelp_nwpi71/helpdata/en/8f/53b67ad30be445b0ccc968d69bc6ff/frameset.htm CALL FUNCTION
2, 下达该成品的工单,系统弹出如下的Result of Derivation小窗口,
1,在SE11,创建需要的structure (必须为flat类型,否则会出现Reference parameters are not allowed with RFC)
3、主数据 在FM当中主数据主要分成了两类:一类是账户分配要素,另一类是预算结构用到的地址(如预算地址、记账地址)。 3.1 账户分配要素-主数据 根据PSM及PSM-FM-BCS激活的账户分配要素,需要对这些要素主数据进行维护,这些主数据的在维护完成后,可使用这些账户分配要素进行组合,形成FM当中的预算地址、记账地址、预算控制地址。简单来讲账户分配要素的组合要表达的就是预算主体(或者说对象)和内容,比如那个部门什么费用的预算,再比如那个部门的那个项目的什么费用预算。 3.1.1承诺项目 承诺项目是FM模块
在制药行业里经常有这样的场景或者需求:成品工单是一个包装工单,将生产好的半成品加上内外包材,经过包装后做成可以交付给客户的成品,成品的批次的属性本质上跟被包装的半成品的批次一致,批次号保持一致。
其本义是:异步通信时,通信双方时钟允许存在一定误差;同步通信时,双方时钟的允许误差较小。在SAP的系统间的通信过程中,也借用术语同步通信和异步通信,但其主要差异在于调用系统是否需要立即接受返回结果。这两种通信模式各有局限性,不同的应用适用于不同的通信模式。
该文主要是深入探讨在ABAP开发中如何使用SAP提供的应用层的锁机制来保证数据库表中的数据一致性。
In SAP Transportation Management, we get many scenarios to trigger a PPF (Post Processing Framework) Action by stand alone code. Examples being; Trigger a PPF Action from a POWL (Personal Object Work list) or trigger a PPF action in TRQ (Booking Request) when a condition satisfies in TOR (Manifestation). So we need a mechanism to trigger the PPF action configured in a BO via stand alone code.
1, 使用function module SUSR_USER_PARAMETERS_GET
3.1.4 基金计划程序 基金计划程序是可选账户分配要素,可以用它来进行跨公司、跨年度的框架内预算控制,比如一个大型项目。它同其他账户分配要素不同,它可以直接进行预算,但不能在预算消耗中的账户分要配界
SQL 监控:事务 SQLM 将管理任务作为目标/事务 SQLMD 用于数据记录分析
SAP The FM To Get the Characteristic Value
4、 打开业务工程---》业务对象类型。根据我们的业务需求。我们要找销售订单的创建,所有BUS2032 销售订单 的可能性最大。
领取专属 10元无门槛券
手把手带您无忧上云