2022年2022年汇率类型的替代 .pdf
作者 SAP 屠夫付鸿杰汇率替代方案 : 业务需求 : 同一 SAP Client 运行了海外和国内多个公司代码,希望不同公司代码各自使用不同汇率类型,各自维护汇率。业务分析 :SAP 本身显然认为, 同一 SAP Client 下的所有公司代码应该使用同一套汇率实际记帐,这个汇率类型就是默认的月平均汇率M, OBA7 凭证类型已经默认M 汇率类型 ,见下图 -1 ,如果修改为 P,则 SA 凭证将使用P 汇率类型。由于凭证类型是整个集团有效,如果为了取得不同汇率类型去为不同公司代码复制一套凭证类型显然太折腾,也不大现实。当然,你可以为期末外币评估和外币报表折算设计一汇率类型比如叫C;或者KEPM 做全年利润计划时设置一P 汇率类型,那么实际记帐如何使不同公司代码使用不同汇率类型并各自维护自己的汇率呢?逻辑分析 : 首先分析一下设计逻辑,看看BKPF 会计凭证抬头表,由于SAP 最多可使用多达3 个本位币,因此BKPF 涉及 3 种汇率类型和对应的3 种汇率。第 1 本位币:BKPF-KURSF :汇率值 (第 1 本位币汇率 ) BKPF-WWERT: 汇率换算日期注意第 1 本位币并未设置汇率类型,因为默认从凭证类型中获取,通常就是M,除非你特意为某凭证类型指定另外的汇率类型,因此 BKPF 中不再为第1 本位币设置汇率类型字段。第 2/3 附加本位币:BKPF-KUTY2/BKPF-KUTY3: 第二和第三本位币汇率类型BKPF-KURS2/BKPF-KURS3: 第二和第三本位币转换汇率设置附加本位币: (TCODE :OB22)OB22:第一本位币的汇率类型默认为M,汇率日期从换算日期,这个换算日期实际上就是过帐日期,除非你去修改,见 F-02 的一个截图,除非你修改换算日期,否则它将等于过帐日期,并通过该日期去获取OB08。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 作者 SAP 屠夫付鸿杰如果只涉及1 个本位币 ,无需要 OB22 设置汇率类型,如果涉及多本位币,则可为附加本位币设置汇率类型和换算日类型,这个类型可以是过帐日期、凭证日期或者专门的换算日期。奇怪的是, 第 1 本位币的汇率类型和换算日期已经固定,不能做任何修改。有个用户要求后勤发票校验MIRO 是否能让换算日期默认取发票日期(发票日期反应在FI 就是凭证日期) ,很可惜,默认做不到!解决方法 : 如何做到不同公司代码使用不同汇率类型呢?假设某集团不涉及附加本位币,要求海外使用汇率类型M, 国内使用汇率类型Z,思路步骤如下:(1).Tcode:OB07 新建立另一汇率类型比如叫Z 。(2).Tcode:OB08 各自维护汇率(3).前面分析过,BKPF 第 1 本位币不涉及汇率类型,只涉及汇率 ,因此修改GB01 表允许汇率被替代 ,可使用下表程序。REPORT ZGB01. PARAMETERS: Z_BCLTAB like GB01-BCLTAB default BKPF , 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 作者 SAP 屠夫付鸿杰Z_BCLFLD like GB01-BCLFIELD default KURSF . DATA ZGB01 LIKE GB01 . SELECT SINGLE * INTO ZGB01 FROM GB01 WHERE CLASSTYPE = S AND BCLTAB = Z_BCLTAB AND BCLFIELD = Z_BCLFLD . ZGB01-BEXCLUDE = . UPDATE GB01 FROM ZGB01 . MESSAGE I001(00) with 汇率字段已修改为允许替代! . (4).OBBH 抬头替代 ,从 OB08 维护的 TCURR 汇率表根据公司代码读取不同的汇率类型,并根据换算日期读取该汇率类型对应的汇率,替代为BKPF-KURSF 。FI 总程序SAPMF05A中有段专门的汇率转换程序,见下表。MF05AI10_W AEHRUNG_PRUEFEN:获取汇率的程序CALL FUNCTION CONVERT_TO_FOREIGN_CURRENCYEXPORTING LOCAL_CURRENCY= T001-W AERS FOREIGN_CURRENCY = BKPF-WAERS LOCAL_AMOUNT = REFE1 DATE = BKPF-WWERT RATE = BKPF-KURSF IMPORTING FOREIGN_AMOUNT = REFE2. 替代步骤很简单,如下 :I.OBBH 设置抬头替代,使用退出例程,见下图 -1: II .例程 U100 的参考代码如下表,非常简单 ,调用函数CONVERT_TO_FOREIGN_CURRENCY: IF BKPF-BUKRS = 2331 . DATA I_ZKURSF LIKE BKPF-KURSF . CALL FUNCTION CONVERT_TO_FOREIGN_CURRENCY EXPORTING LOCAL_CURRENCY = RMB FOREIGN_CURRENCY = BKPF-WAERS LOCAL_AMOUNT = 0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 作者 SAP 屠夫付鸿杰 DATE = BKPF-WWERT * 可设置象凭证日期等作为换算日期 RATE = 0 * 公司代码 2331使用汇率类型Z TYPE_OF_RATE = Z IMPORTING EXCHANGE_RATE = I_ZKURSF . * 汇率将使用 Z类型的汇率 BKPF-KURSF = I_ZKURSF . ENDIF .(5).为什么汇率替代不生效?I SE38: 运行 RGUGBR00 重新生产程序 ,必须的 ! II.SE38 检查动态程序GBTDMFI0(不同企业可能程序名不一),其中有个重要例程叫EXP_T AB_008_BKPF, 其代码可能如下:FORM EXP_TAB_008_BKPF USING IN_ORIG STRUCTURE BKPF CHANGING OUT_RESULT STRUCTURE BKPF B_RESULT. DATA: ORIG LIKE BKPF. DATA: BEGIN OF TEMP_STRUCT, BATCH LIKE BKPF-BATCH, BKTXT LIKE BKPF-BKTXT, BLDAT LIKE BKPF-BLDAT, KURSF LIKE BKPF-KURSF, * 重新生产程序后,一定要看到KURSF 在 EXP_TAB_008_BKPF 的临时结构中,否则 KURSF 就不能被替代,说白了,什么叫替代? 就是系统将财务凭证原始数据先放在一内表,然后复制一份 ,这份数据可以让你去折腾, 最后将复制的数据覆盖原始数据,基本设计思路就是这样的 . . END OF TEMP_STRUCT. IF IN_ORIG = BKPF . B_RESULT = B_FALSE. OUT_RESULT = IN_ORIG. EXIT. ENDIF. MOVE-CORRESPONDING BKPF TO TEMP_STRUCT. OUT_RESULT = IN_ORIG. MOVE-CORRESPONDING TEMP_STRUCT TO OUT_RESULT. IF IN_ORIG = OUT_RESULT . B_RESULT = B_FALSE. ELSE. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 作者 SAP 屠夫付鸿杰 B_RESULT = B_TRUE. ENDIF. BKPF = OUT_RESULT. ENDFORM. EXP_TAB_008_BKPFIII . 如果你家的替代动态程序不叫动态程序GBTDMFI0, 则 SE37 查看替代调用函数G_VSR_SUBSTITUTION_CALL,设置一断点,然后读出替代动态程序名称,见下图 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -