会计凭证原因代码增强

使用BAPI_ACC_DOCUMENT_POST 创建会计凭证,用BADI扩展

业务需求:和银行做一个接口,要通过银行流水产生会计凭证,会计凭证的事务码是F-02,查到了BAPI方法BAPI_ACC_DOCUMENT_POST。昨天测试发现,有一些参数在BAPI_ACC_DOCUMENT_POST的输入和表参数中根本没有,如记账码Posting Key、原因代码Reason Code,那怎么把这些字段的值传进去呢?在SDN查了一下相关问题的解决办法,发现遇到这个问题的朋友还挺多,总结了一下,解决办法大体如下:
   1、se11创建结构,必须包含行项目号POSNR字段,和其他需要扩展的字段,如记账码Posting Key、原因代码Reason Code
   2、SE19实现BADI增强ACC_DOCUMENT,这个增强是用来将BAPI_ACC_DOCUMENT_POST参数表EXTENSION2传入系统表
   3、使用BAPI_ACC_DOCUMENT_POST参数表EXTENSION2,将扩展字段传入

详细步骤如下:
1、创建结构,se11,很简单,不再赘述,如下图:

2、SE19实现BADI增强ACC_DOCUMENT
通过ACC_DOCUMENT help文档知道,方法CHANGE用来完成字段的扩展,还有一个需要注意的是参考业务类型,这个一定要选对,不然执行BAPI的时候不会调用这个BADI,我用的是BKPFF,如下图:

激活这个BADI实现。

双击change方法创建,可以查看ACC_DOCUMENT 的实现例子CL_EXM_IM_ACC_DOCUMENT(R/3 4.7版本,其他版本可能名称不一样),,将这个实例的change方法的代码直接copy过来,激活方法,代码如下

***********************************************************************
* Example to move fields from BAPI parameter EXTENSION2 to structure  *
* ACCIT (accounting document line items).                            *
* The dictionary structure (content for EXTENSION2-STRUCTURE) must    *
* contain field POSNR, (TYPE POSNR_ACC) to indentify the correct line *
* item of the internal table ACCIT.                                  *
***********************************************************************

DATA: wa_extension   TYPE bapiparex,
       ext_value(960) TYPE c,
       wa_accit      TYPE accit,
       l_ref         TYPE REF TO data.

FIELD-SYMBOLS: <l_struc> TYPE ANY,
                <l_field> TYPE ANY.

SORT c_extension2 BY structure.

LOOP AT c_extension2 INTO wa_extension.
    AT NEW structure.
     CREATE DATA l_ref TYPE (wa_extension-structure).
     ASSIGN l_ref->* TO <l_struc>.
    ENDAT.
    CONCATENATE wa_extension-valuepart1 wa_extension-valuepart2
               wa_extension-valuepart3 wa_extension-valuepart4
          INTO ext_value.
    MOVE ext_value TO <l_struc>.
    ASSIGN COMPONENT ‘POSNR‘ OF STRUCTURE <l_struc> TO <l_field>.
    READ TABLE c_accit WITH KEY posnr = <l_field>
         INTO wa_accit.
    IF sy-subrc IS INITIAL.
     MOVE-CORRESPONDING <l_struc> TO wa_accit.
     MODIFY c_accit FROM wa_accit INDEX sy-tabix.
    ENDIF.
  ENDLOOP.

3、使用BAPI_ACC_DOCUMENT_POST参数表EXTENSION2,将扩展字段传入
**********************************************************************
*INTERNAL TABLE DECLARATION
**********************************************************************

*&—-G/L ACCOUNT ITEM
DATA: ACCOUNTGL TYPE STANDARD TABLE OF BAPIACGL09.

*&—CURRENCY ITEMS
DATA: CURRENCY_AMOUNT TYPE STANDARD TABLE OF BAPIACCR09.

*&—-RETURN PARAMETER
DATA: RETURN TYPE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE.

*&—-it_extension2 ITEMS
DATA: IT_EXTENSION2 TYPE STANDARD TABLE OF BAPIPAREX WITH HEADER LINE.

*&—WORKAREA FOR ZEXTEN
DATA: WA_ZEXTEN LIKE ZEXTEN. ”ZEXTEN就是刚才SE11创建的那个结构

**********************************************************************
*赋值
**********************************************************************

*& EXTENSION2 扩展字段增强部分

WA_ZEXTEN-POSNR = ‘0000000010‘. "凭证行项目
  WA_ZEXTEN-RSTGR = ‘171‘. "凭证行项目原因代码

IT_EXTENSION2-STRUCTURE  = ‘ZEXTEN‘.
  IT_EXTENSION2-VALUEPART1 = WA_ZEXTEN.
  APPEND IT_EXTENSION2.

*其他参数表的字段赋值如下例

HEADER-HEADER_TXT = ‘TEST HEADER‘."凭证抬头文本
  HEADER-USERNAME = SY-UNAME. "用户名
  HEADER-COMP_CODE = ‘1000‘."公司代码
  HEADER-DOC_DATE = ‘20090618‘."凭证中的凭证日期
  HEADER-PSTNG_DATE = ‘20090618‘."凭证中的记帐日期
  HEADER-DOC_TYPE = ‘S1‘."凭证类型
*  HEADER-BUS_ACT = ‘RFBU‘."交易业务

WA_ACCOUNTGL-ITEMNO_ACC = ‘0000000010‘. "会计凭证行项目编号
  WA_ACCOUNTGL-GL_ACCOUNT = ‘1002010105‘. "总分类帐帐目
*  WA_ACCOUNTGL-ITEM_TEXT = .
  WA_ACCOUNTGL-BUS_AREA = ‘8000‘. "业务范围
  APPEND WA_ACCOUNTGL TO ACCOUNTGL.
  CLEAR WA_ACCOUNTGL.

WA_ACCOUNTGL-ITEMNO_ACC = ‘0000000020‘. "会计凭证行项目编号
  WA_ACCOUNTGL-GL_ACCOUNT = ‘1301040000‘. "总分类帐帐目
  WA_ACCOUNTGL-BUS_AREA = ‘8000‘. "业务范围
*WA_ACCOUNTGL-ITEM_TEXT = .
*wa_accountgl-ACCT_TYPE = ‘R‘.
  APPEND WA_ACCOUNTGL TO ACCOUNTGL.
  CLEAR WA_ACCOUNTGL.

WA_CURRENCY_AMOUNT-ITEMNO_ACC = ‘0000000010‘. "行项目编号
  WA_CURRENCY_AMOUNT-AMT_DOCCUR = ‘500‘. "金额
  WA_CURRENCY_AMOUNT-CURRENCY = ‘RMB‘.
  APPEND WA_CURRENCY_AMOUNT TO CURRENCY_AMOUNT.
  CLEAR WA_CURRENCY_AMOUNT.

WA_CURRENCY_AMOUNT-ITEMNO_ACC = ‘0000000020‘.
  WA_CURRENCY_AMOUNT-AMT_DOCCUR = ‘-500‘.
  WA_CURRENCY_AMOUNT-CURRENCY = ‘RMB‘.
  APPEND WA_CURRENCY_AMOUNT TO CURRENCY_AMOUNT.
  CLEAR WA_CURRENCY_AMOUNT.

*执行BAPI
CALL FUNCTION ‘BAPI_ACC_DOCUMENT_POST‘
  EXPORTING
  DOCUMENTHEADER = HEADER
*CUSTOMERCPD =
*CONTRACTHEADER =
*IMPORTING
*OBJ_TYPE =
*OBJ_KEY =
*OBJ_SYS =
  TABLES
  ACCOUNTGL = ACCOUNTGL

*ACCOUNTRECEIVABLE =
*ACCOUNTPAYABLE =
*ACCOUNTTAX =
  CURRENCYAMOUNT = CURRENCY_AMOUNT

*CRITERIA =
*VALUEFIELD =
*EXTENSION1 =
  RETURN = RETURN
*PAYMENTCARD =
*CONTRACTITEM =
  EXTENSION2 = IT_EXTENSION2
*REALESTATE =
  .

IF RETURN-TYPE NA ‘EA‘.
    CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT‘
     EXPORTING
       WAIT = ‘X‘.
  ENDIF.
如果还需要扩展其他字段,在结构ZEXTEN加入,然后在调用BAPI前对相应字段赋值,就行了。

原文地址:https://www.cnblogs.com/rainysblog/p/11974273.html

时间: 2024-08-01 18:42:04

会计凭证原因代码增强的相关文章

Microsoft VBScript 编译器错误 错误原因 代码大全

Microsoft VBScript 编译器错误 错误 '' 缺少语句 ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件 MicrosoftOLEDBProviderforODBCDrivers(0x80040E21)-->sql语句出错(数据类型不匹配或表名(字段名)错误或表处于编辑状态,或表不存在于conn打开的数据库中) MicrosoftOLEDBProviderforODBCDrivers(0x80040E14)-->sql语句出错

BAPI_ACC_DOCUMENT_POST 解决原因代码输入问题-利用BADI

(1)    复制函数SAMPLE_INTERFACE_RWBAPI01为Z SAMPLE_INTERFACE_RWBAPI01 *"---------------------------------------------------------------------- *"*"Local interface: *" TABLES *" IT_ACCIT STRUCTURE ACCIT *" IT_ACCCR STRUCTURE ACCCR

使用BAPI_ACC_DOCUMENT_POST,创建会计凭证 增强

业务需求:和银行做一个接口,要通过银行流水产生会计凭证,会计凭证的事务码是F-02,查到了BAPI方法 BAPI_ACC_DOCUMENT_POST. 昨天测试发现,有一些参数在BAPI_ACC_DOCUMENT_POST的输入和表参数中根本没有, 如 记账码Posting Key.原因代码Reason Code,那怎么把这些字段的值传进去呢? 在SDN查了一下相关问题的解决办法,发现遇到这个问题的朋友还挺多, 总结了一下,解决办法大体如下: 1.se11创建结构,必须包含行项目号POSNR字段

BAPI_ACC_DOCUMENT_POST 字段增强

1.se11创建结构,必须包含行项目号POSNR字段,和其他需要扩展的字段,如记账码Posting Key.原因代码Reason Code    2.SE19实现BADI增强,这个增强是用来将BAPI_ACC_DOCUMENT_POST参数表EXTENSION2传入系统表    3.使用BAPI_ACC_DOCUMENT_POST参数表EXTENSION2,将扩展字段传入 详细步骤如下:1.创建结构,se11,很简单,不再赘述,如下图: 2.SE19实现BADI增强ACC_DOCUMENT通过A

编写高质量代码改善java程序的151个建议——[110-117]异常及Web项目中异常处理

原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 文章宗旨:Talk is cheap show me the code. 大成若缺,其用不弊.大盈若冲,其用不穷.  <道德经-老子>最完满的东西,好似有残缺一样,但它的作用永远不会衰竭:最充盈的东西,好似是空虚一样,但是它的作用是不会穷尽的 Written In The Font 摘要: 异常处理概述 学习内容: 建议110: 提倡异常封装 建议111: 采用异常链传递异常 建议

创建 会计凭证

FUNCTION zrfc_mm018. *"---------------------------------------------------------------------- *"*"Local interface: *" IMPORTING *" VALUE(CALLNO) TYPE ZCALLNO *" VALUE(ZFIS005) LIKE ZFIS005 STRUCTURE ZFIS005 *" EXPORTING

如何编写高质量的Javascript代码

1.避免全局变量,因为全局变量容易发生名称上的冲突,可维护性不好. a,使用命名空间 b,使用闭包 c,在函数内部使用var声明 2.编写可维护的代码 a.可读性 b.连续性 c.预见性 d.看起来是一个人写的 e.有文档 3.不要扩展内建的原型 扩展原型的构造函数,可以提供一些很强大的功能,但是有时候他太强大了. 有时候你会去扩展Object(),Array(),Fucntion()的原型方法,这样会导致可维护性的问题,因为这会让你的代码的移植性变差.其他的开发人员使用你的代码的时候,可能只需

修改原有的方法名称(字节码增强)

通常对一个方法增加日志记录,安全检查都会说采用AOP或CGLIB动态代理,但无论哪种方式都必需改变原有的调用方式:同时,大量的反射调用也必增加系统的开销.下面介绍一种不需要改变客户端调用方式而又能实现对指定方法增加缓存或日志的方式,那就是——字节码增强! 在实际项目中通常需要对一些频繁访问数据库的方法采用对象缓存,从而提高系统性能减少不必要的网络开销.这时候一般我们会去修改方法的源码,增加Cache的put,get调用,要么采用AspectJ或cglib进行方法执行前或执行后的拦截 但采用无论采

Java深度理解——Java字节代码的操纵

导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展.但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及的话题.InfoQ中文站特地邀请IBM高级工程师成富为大家撰写这个<Java深度历险>专栏,旨在就Java的一些深度和高级特性分享他的经验.在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行 Java 程序就可以了.