一、创建凭证

主要是使用BAPI ‘BAPI_ACC_DOCUMENT_POST’创建凭证

由于’BAPI_ACC_DOCUMENT_POST‘对一些字段(如记账码、我们自己增强的现金流量码等)的传递使用扩展字段,所以需要使用BAdI ‘ACC_DOCUMENT‘。

BAdI ‘ACC_DOCUMENT‘的增强:

来自CSDN博客,转载请标明出处:http://blog.csdn.net/longgerr/archive/2010/10/22/5958210.aspx

1、SE11创建结构ZKS_OA_ACC_EXT

2、SE19 ,实例化ACC_DOCUMENT– ZACC_DOCUMENT

参考交易使用BKPFF

3、保存

如果保存时出现了下面这个消息,说明必须将做的Classic Badi迁移到New Badi。

此时可以选择已有的或创建新的Badi Enhancement Implementation。我们选择创建新的。

创建好之后,系统会提示消息。

4、删除原始Classic Badi

回到SE19。

如果进行了迁移,则在双击新建的New Badi的时候会报出消息:

所以我们删除我们之前创建的ZACC_DOCUMENT,才能保证这个增强能够被正常调用。

删除Classic Badi时,系统首先提示:

这个选择Yes

随后系统又提示:

这个提示的意思是询问,是否删除从这个Classic Badi迁移过去的New Badi。显然要保留,这个选择No启用new badi

5、编辑代码

在New Badi里面显示ZACC_DOCUMENT,此时将不会报出需要删除Classic Badi的警告了。

双击CHANGE方法即可进入编辑。

代码释义:

CHANGE方法中参数FLT_VAL,C_ACCHD,C_ACCIT,C_ACCCR,C_ACCWT,C_ACCTX均与凭证数据相关。

C_EXTENSION2中传入的数据即为BAPI_ACC_DOCUMENT_POST中EXTENSION2参数。

BAPIPAREX-TE_STRUC为数据字典中结构的名称,其余为扩展数据。

生成BAPI的EXTENTION2参数时,就是按照ZKS_OA_ACC_EXT的数据结构顺序写入的,读取时也按照相同的方式读取即可。

根据参数里面的类型和说明来判断某个参数对应凭证中的什么数据,将BAPI中无法传入的数据从EXTENTION2里面取出,传入CHANGE的参数里面即可。

参考代码:

method IF_EX_ACC_DOCUMENT~CHANGE.
DATA: wa_extension TYPE bapiparex,
zext_data TYPE zks_oa_acc_ext.

FIELD-SYMBOLS: <accit> TYPE accit.
IF c_extension2[] IS NOT INITIAL.

READ TABLE c_extension2 INTO wa_extension WITH KEY structure = ’PARK’.”预制凭证
IF sy-subrc = 0.
MOVE ’2′ TO c_acchd-status_new.
DELETE c_extension2 INDEX sy-tabix.
ENDIF.

LOOP AT c_extension2 INTO wa_extension WHERE structure = ’ZKS_OA_ACC_EXT’.
zext_data = wa_extension-valuepart1.
READ TABLE c_accit ASSIGNING <accit> WITH KEY posnr = zext_data-posnr.
IF sy-subrc = 0.
<accit>-rstgr = zext_data-rstgr.
<accit>-bschl = zext_data-bschl.
<accit>-xref1_hd = zext_data-xref1_hd.
<accit>-zfbdt = zext_data-zfbdt.
<accit>-FKBER = zext_data-FKBER.
<accit>-ANBWA = zext_data-BWASL.
ENDIF.
ENDLOOP.
ENDIF.
endmethod.

资产类凭证(AA)创建问题:

在使用BAPI_ACC_DOCUMENT_POST创建AA凭证时,参数

OBJ_TYPE 参考交易

OBJ_KEY

OBJ_SYS

BUS_ACT业务事务

为必填,根据SAP的回复,OBJ_TYPE应为自建类型,使用SM30,在表TTYP中拷贝行BKPF新建ZBKPF。注意:使用该参考交易的凭证无法使用FB08冲销。

Dear customer,

because I was not able to find an expert for BAPI area at this weekend Imyself tried to find out for you relevant information concerning the
above mentioned issue:

First I have lowered the priority of this message because the priority 1is intended for other problem cases -> please have a look at the
attached notes 19500 and 67739.

Secondly I assume that this is not a system error or program error but
rather a consulting issue.

However I will give you some hints:

Please see note 643232, there are several restrictions when you post an
asset transaction by means of a BAPI which is not from asset accounting:
1. You can only post acquisitions or credit memos to fixed asset.

2. You must maintain the acquisition value offsetting account in the
Customizing of the Asset Accounting although it is not posted.

3. You must use a customer-specific object type OBJ_TYPE that starts
with ” Z”.

4. The asset transaction type cannot be derived automatically, so it is absolutely necessary that you fill the line item using the BAPI (if
necessary via the extension method).

5. It is absolutely necessary to assign the company code currency and
possibly existing parallel currency values. The Asset Accounting
performs currency translations from transaction currencies.

The BAPI_ACC_DOCUMENT_POST (located in function group ACC9)
as a newer BAPI only uses BTE as exit technology, no SMOD/CMOD exits.
So you may copy the function module SAMPLE_INTERFACE_RWBAPI01
to something like ZRWBAPI01, then enter your program code
in ZRWBAPI01, activate it and then call transaction FIBF and make
there a new entry for event RWBAPI01 as a “process function
module of a customer” and enter ZRWBAPI01 as function module name.
You will also need to enter a product identifier here and make sure
that you activate the product in FIBF.

以上参数在凭证头中的位置,其中BUS_ACT = ’RMWE’

测试发现,不止AA类凭证需要这样处理,记帐码的类型如果为A,则也需要同样处理。记帐码的类型可以从表tbsl中获得。

参考代码:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DATA t_tbsl LIKE TABLE OF tbsl WITH HEADER LINE.
DATA:ls_doc_head LIKE bapiache09,
lt_accountgl LIKE TABLE OF bapiacgl09 WITH HEADER LINE,
lt_amount LIKE TABLE OF bapiaccr09 WITH HEADER LINE,
lt_accountreceivable LIKE TABLE OF bapiacar09 WITH HEADER LINE,
lt_accountpayable LIKE TABLE OF bapiacap09 WITH HEADER LINE,
lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE,
l_itemno LIKE bapiacgl09-itemno_acc,
l_trade_id LIKE lt_accountgl-trade_id.
DATA: wa_zks_oa_acc_ext LIKE zks_oa_acc_ext.

DATA: it_extension2 TYPE STANDARD TABLE OF bapiparex WITH HEADER LINE.
DATA: G_BELNR TYPE BSEG-BELNR,
G_GJAHR TYPE BSEG-GJAHR.
DATA: BEGIN OF IT_BSEG OCCURS 0,
BELNR TYPE BSEG-BELNR,
END OF IT_BSEG.
DATA: L_AWSYS TYPE BKPF-AWSYS,
l_OBJ_TYPE type BAPIACHE09-OBJ_TYPE,
l_OBJ_KEY type BAPIACHE09-OBJ_KEY,
l_OBJ_SYS type BAPIACHE09-OBJ_SYS.
DATA: RND_VALUE TYPE DATATYPE-CHAR0128.
DATA: WA_BSEG TYPE ZHEC_BSEG.

DEFINE SET_AA_HEAD. “ 资产类凭证的凭证头的特殊处理
CALL FUNCTION ‘OWN_LOGICAL_SYSTEM_GET’ “当前逻辑系统
IMPORTING
OWN_LOGICAL_SYSTEM = L_AWSYS
EXCEPTIONS
OWN_LOGICAL_SYSTEM_NOT_DEFINED = 1.
G_GJAHR = i_bkpf-pstng_date(4).
“ AA凭证需要获得将生成凭证的凭证号 作为参考字段。
SELECT BELNR FROM BKPF INTO TABLE IT_BSEG
WHERE BUKRS = i_bkpf-comp_code
AND GJAHR = G_GJAHR
AND BLART = I_BKPF-DOC_TYPE.
SORT IT_BSEG BY BELNR DESCENDING.
READ TABLE IT_BSEG INDEX 1.
IT_BSEG-BELNR = IT_BSEG-BELNR + 1.
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
INPUT = IT_BSEG-BELNR
IMPORTING
OUTPUT = IT_BSEG-BELNR .
CALL FUNCTION ‘RANDOM_C’ “ 参考字段加上2位随机码与正常凭证区分
EXPORTING
LEN_MIN = 2
LEN_MAX = 2
CHAR_MAX = 27
IMPORTING
RND_VALUE = RND_VALUE
.
CONCATENATE IT_BSEG-BELNR i_bkpf-comp_code G_GJAHR RND_VALUE INTO ls_doc_head-OBJ_KEY.
ls_doc_head-OBJ_TYPE = ‘ZBKPF’.
* SHIFT ls_doc_head-OBJ_KEY LEFT DELETING LEADING SPACE.
ls_doc_head-OBJ_SYS = L_AWSYS.
ls_doc_head-BUS_ACT = ‘RMWE’.
END-OF-DEFINITION.

SELECT * INTO CORRESPONDING FIELDS OF TABLE t_tbsl FROM tbsl.

ls_doc_head-doc_type = i_bkpf-doc_type. “凭证类型
ls_doc_head-fis_period = i_bkpf-fis_period .“会计期间
ls_doc_head-doc_date = i_bkpf-doc_date. “凭证中的凭证日期
ls_doc_head-pstng_date = i_bkpf-pstng_date. “凭证中的记帐日期
ls_doc_head-header_txt = i_bkpf-header_txt. “ 凭证抬头文本
ls_doc_head-ref_doc_no = i_bkpf-ref_doc_no. “参考凭证编号
ls_doc_head-comp_code = i_bkpf-comp_code. “公司代码
ls_doc_head-username = i_bkpf-username. “用户名
IF i_bkpf-doc_type = ‘AA’.
SET_AA_HEAD.
ENDIF.

SORT t_tbsl BY bschl.
LOOP AT t_bseg INTO WA_BSEG.“取供应商客户行贸易伙伴 供原因代码为关联方时候用
READ TABLE t_tbsl WITH KEY bschl = WA_bseg-bschl BINARY SEARCH.
IF sy-subrc = 0.
IF t_tbsl-koart = ‘K’.
SELECT SINGLE vbund INTO l_trade_id FROM lfa1 WHERE lifnr = WA_bseg-vendor_no
and vbund like ‘HZ%’.
EXIT.
ELSEIF t_tbsl-koart = ‘D’.
SELECT SINGLE vbund INTO l_trade_id FROM kna1 WHERE lifnr = WA_bseg-customer
and vbund like ‘HZ%’.
EXIT.
ENDIF.
ENDIF.
CLEAR WA_bseg.
ENDLOOP.

LOOP AT t_bseg INTO WA_BSEG.
CLEAR : lt_accountgl,lt_accountpayable, lt_accountreceivable.
ADD 10 TO l_itemno.
READ TABLE t_tbsl WITH KEY bschl = WA_bseg-bschl BINARY SEARCH.
IF sy-subrc = 0.
IF t_tbsl-koart = ‘S’.
lt_accountgl-itemno_acc = l_itemno. “会计凭证行项目编
lt_accountgl-gl_account = WA_bseg-gl_account.“总分类帐帐目
lt_accountgl-costcenter = WA_bseg-costcenter.“成本中心
lt_accountgl-item_text = WA_bseg-item_text.“项目文本
lt_accountgl-value_date = WA_bseg-value_date.“起息日
lt_accountgl-alloc_nmbr = WA_bseg-alloc_nmbr.“分配号
lt_accountgl-PROFIT_CTR = WA_bseg-PROFIT_CTR. “ 利润中心
lt_accountgl-orderid = WA_bseg-orderid.“订单号
lt_accountgl-ACCT_TYPE = ‘S’.
lt_accountgl-trade_id = l_trade_id.“贸易伙伴
lt_accountgl-REF_KEY_1 = WA_BSEG-XREF1.
APPEND lt_accountgl.
CLEAR lt_accountgl.
ELSEIF t_tbsl-koart = ‘K’.
lt_accountpayable-itemno_acc = l_itemno. “会计凭证行项目编
lt_accountpayable-vendor_no = WA_bseg-vendor_no.“供应商或债权人的帐号
lt_accountpayable-gl_account = WA_bseg-gl_account.“总分类帐帐目
lt_accountpayable-sp_gl_ind = WA_bseg-sp_gl_ind.“特殊总分类帐标志
lt_accountpayable-item_text = WA_bseg-item_text.“项目文本
lt_accountpayable-pmnttrms = WA_bseg-pmnttrms.“付款条件代码
lt_accountpayable-alloc_nmbr = WA_bseg-alloc_nmbr.“分配号
lt_accountpayable-PROFIT_CTR = WA_bseg-PROFIT_CTR. “ 利润中心
“功能范围,在扩展字段中
LT_ACCOUNTPAYABLE-REF_KEY_1 = WA_BSEG-XREF1.
APPEND lt_accountpayable.
CLEAR lt_accountpayable.
ELSEIF t_tbsl-koart = ‘D’.
lt_accountreceivable-itemno_acc = l_itemno. “会计凭证行项目编
lt_accountreceivable-item_text = WA_bseg-item_text.“项目文本
lt_accountreceivable-customer = WA_bseg-customer. “客户编号1
lt_accountreceivable-sp_gl_ind = WA_bseg-sp_gl_ind.“特殊总分类帐标志
lt_accountreceivable-gl_account = WA_bseg-gl_account.“总分类帐帐目
lt_accountreceivable-pmnttrms = WA_bseg-pmnttrms.“付款条件代码
lt_accountreceivable-alloc_nmbr = WA_bseg-alloc_nmbr.“分配号
lt_accountreceivable-PROFIT_CTR = WA_bseg-PROFIT_CTR. “ 利润中心
lt_accountreceivable-REF_KEY_1 = WA_BSEG-XREF1.
APPEND lt_accountreceivable.
CLEAR lt_accountreceivable.
ELSEIF t_tbsl-koart = ‘A’.
lt_accountgl-itemno_acc = l_itemno. “会计凭证行项目编
lt_accountgl-GL_ACCOUNT = WA_bseg-GL_ACCOUNT. “总分类帐帐目
* lt_accountgl-CUSTOMER = t_bseg-CUSTOMER. “客户编号1
* lt_accountgl-VENDOR_NO = t_bseg-VENDOR_NO. “供应商或债权人的帐号
lt_accountgl-ITEM_TEXT = WA_bseg-ITEM_TEXT. “项目文本
lt_accountgl-PROFIT_CTR = WA_bseg-PROFIT_CTR. “ 利润中心
lt_accountgl-ASSET_NO = WA_bseg-ASSET_NO. “ 资产号
lt_accountgl-SUB_NUMBER = WA_bseg-SUB_NUMBER. “ 资产次级编号
lt_accountgl-PO_NUMBER = WA_bseg-PO_NUMBER. “ 采购单号
lt_accountgl-ACCT_TYPE = ‘A’.
lt_accountgl-REF_KEY_1 = WA_BSEG-XREF1.

IF ls_doc_head-OBJ_TYPE IS INITIAL.
SET_AA_HEAD.
ENDIF.
APPEND lt_accountgl.
CLEAR lt_accountgl.
ENDIF.
lt_amount-itemno_acc = l_itemno. “会计凭证行项目编
IF t_tbsl-shkzg = ‘S’.“金额正负处理
IF WA_bseg-amt_doccur < 0.
lt_amount-amt_doccur = WA_bseg-amt_doccur * -1. “金额
ELSE.
lt_amount-amt_doccur = WA_bseg-amt_doccur. “金额
ENDIF.
ELSEIF t_tbsl-shkzg = ‘H’.
IF WA_bseg-amt_doccur > 0.
lt_amount-amt_doccur = WA_bseg-amt_doccur * -1. “金额
ELSE.
lt_amount-amt_doccur = WA_bseg-amt_doccur. “金额
ENDIF.
ENDIF.
lt_amount-currency = i_bkpf-currency. “货币
wa_zks_oa_acc_ext-posnr = l_itemno. “凭证行项目
wa_zks_oa_acc_ext-zfbdt = WA_bseg-bline_date. “到期日
wa_zks_oa_acc_ext-bschl = WA_bseg-bschl.“记账码
wa_zks_oa_acc_ext-rstgr = WA_bseg-rstgr.“付款原因代码
wa_zks_oa_acc_ext-BWASL = WA_bseg-BWASL. “ 资产事务类型
wa_zks_oa_acc_ext-xref1_hd = i_bkpf-xref1_hd.“参考字段(标题1),说明该凭证来自HEC系统
* IF t_tbsl-koart = ‘K’.
wa_zks_oa_acc_ext-FKBER = WA_bseg-FKBER. “功能范围
* ENDIF.
wa_zks_oa_acc_ext-BWASL = WA_bseg-BWASL. “ 事务类型
it_extension2-structure = ‘ZKS_OA_ACC_EXT’.
it_extension2-valuepart1 = wa_zks_oa_acc_ext.

APPEND:lt_amount,it_extension2.
CLEAR:lt_amount,it_extension2.
ELSE.
i_return-type = ‘E’.
i_return-message = ‘记账码有误‘.
ENDIF.
CLEAR WA_bseg.

ENDLOOP.

CALL FUNCTION ‘BAPI_ACC_DOCUMENT_POST’
EXPORTING
documentheader = ls_doc_head
IMPORTING
OBJ_TYPE = l_OBJ_TYPE
OBJ_KEY = l_OBJ_KEY
OBJ_SYS = l_OBJ_SYS
TABLES
accountgl = lt_accountgl
currencyamount = lt_amount
accountpayable = lt_accountpayable
accountreceivable = lt_accountreceivable
return = lt_return
extension2 = it_extension2.
READ TABLE lt_return WITH KEY type = ‘E’.
IF sy-subrc = 0.
CALL FUNCTION ‘BAPI_TRANSACTION_ROLLBACK’.
LOOP AT lt_return.
i_return-type = ‘E’.
CONCATENATE i_return-message ‘/’ lt_return-message INTO i_return-message.
CLEAR lt_return.
ENDLOOP.
ELSE.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait = ‘X’.
LOOP AT lt_return.
i_return-type = ‘S’.
IF lt_return-type = ‘S’.
IF i_bkpf-doc_type = ‘AA’.
SELECT SINGLE BELNR FROM BKPF INTO i_return-BELNR “ 根据参考码得到真正的凭证号,用于返回
WHERE BUKRS = i_bkpf-comp_code
AND GJAHR = G_GJAHR
AND AWTYP = l_OBJ_TYPE
AND AWKEY = l_OBJ_KEY.
CONCATENATE G_GJAHR ‘_’ i_bkpf-comp_code ‘_’ i_return-BELNR INTO i_return-BELNR.
ELSE.
CONCATENATE lt_return-message_v2+14(4) ‘_’ lt_return-message_v2+10(4) ‘_’ lt_return-message_v2+0(10) INTO i_return-belnr.
ENDIF.
ENDIF.
CONCATENATE i_return-message ‘/’ lt_return-message INTO i_return-message.
CLEAR lt_return.
ENDLOOP.

ENDIF.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

另外,上面BAdI ACC_DOCUMENT的参考交易为BKPFF,这将导致使用ZBKPF的AA类凭证无法激活BAdI,无法传输扩展字段,需要修改BAdI的过滤器值,增加or AWTYP = ZBKPF

KZ类凭证 预付帐款-在建工程 创建问题:

使用BAPI ‘BAPI_ACC_DOCUMENT_POST’创建预付账款-在建工程凭证(29 -J)时无法完成以下功能:

1)无法将AUC号传给供应商

2)无法自动生成50 70两行项目

参考使用录屏方式完成,该录屏方式号称可以实现所有类型凭证的创建。

另外,录屏方式返回的失败错误信息需要读取SM35中的类似错误信息

1) 通过Session name查找session的属性

SELECT * FROM apql
INTO TABLE i_apql
WHERE groupid = L_GROUPID
AND mandant = sy-mandt.

2)使用程序rsbdc_protocol的Function “read_bdc_log_plain”,通过session的属性查找Session日志的Message

PERFORM read_bdc_log_plain(rsbdc_protocol)
TABLES
logtable
USING
i_apql-temseid i_apql-mandant.

3)通过上面的Message - logtable 输出Message的具体信息。

bapiret2-ID = logtable-logmessage+74(16).
bapiret2-NUMBER = logtable-logmessage+94(3).
bapiret2-message_v1 = logtable-logmessage+100(20).
CALL FUNCTION ’BAPI_MESSAGE_GETDETAIL’
EXPORTING
ID         = bapiret2-ID
NUMBER     = bapiret2-NUMBER
textformat = ’ASC’
message_v1 = bapiret2-message_v1
IMPORTING
MESSAGE    = bapiret2-MESSAGE.
CONCATENATE bapiret2-MESSAGE ’//’ L_MESSAGE INTO L_MESSAGE.

参考代码:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

*——————————————-

* Import

** I_BKPF

DOC_TYPE BLART

CURRENCY WAERS

FIS_PERIOD MONAT

DOC_DATE BLDAT

PSTNG_DATE BUDAT

HEADER_TXT BKTXT

REF_DOC_NO XBLNR

COMP_CODE BUKRS

XREF1_HD XREF1_HD

USERNAME USNAM

XREF2_HD XREF2_HD

______________________________ ______________________________

* Table

**T_BSEG

COSTCENTER KOSTL

BSCHL BSCHL

SP_GL_IND ACPI_UMSKZ

CUSTOMER KUNNR

VENDOR_NO LIFNR

GL_ACCOUNT HKONT

ITEM_TEXT SGTXT

AMT_DOCCUR WRBTR

RSTGR RSTGR

VALUE_DATE VALUT

BLINE_DATE ACPI_ZFBDT

PMNTTRMS ACPI_ZTERM

ALLOC_NMBR ACPI_ZUONR

ORDERID AUFNR

PROFIT_CTR PRCTR

ASSET_NO ANLN1

SUB_NUMBER ANLN2

PO_NUMBER EBELN

FKBER FKBER

BWASL BWASL

XREF1 XREF1

______________________________ ______________________________

TABLES:TBSL.

DATA   WA_BSEG TYPE ZHEC_BSEG.

DATA: L_NUM TYPE BKPF-NUMPG,

G_GROUPID TYPE  APQI-GROUPID.

DATA: L_TCODE TYPE SY-TCODE.

DATA: L_STYPE LIKE FTPOST-STYPE.

DATA: L_COUNTER TYPE COUNT_PI.

DATA: L_FVALUE  TYPE BDC_FVAL.

DATA: LT_FTPOST TYPE STANDARD TABLE OF FTPOST.

DATA: L_SUBRC TYPE SY-SUBRC.

DATA: LT_BLNTAB TYPE STANDARD TABLE OF BLNTAB.

DATA: LT_FTTAX TYPE STANDARD TABLE OF FTTAX.

DATA: RND_VALUE TYPE DATATYPE-CHAR0128.

DATA : L_GJAHR TYPE BKPF-GJAHR.

DATA: L_BELNR LIKE BKPF-BELNR.

CLEAR L_NUM.

LOOP AT T_BSEG INTO WA_BSEG.

L_NUM = L_NUM + 1.

ENDLOOP.

L_GJAHR = I_BKPF-PSTNG_DATE(4).

CALL FUNCTION ‘RANDOM_C’

EXPORTING

LEN_MIN = 2

LEN_MAX = 2

CHAR_MAX = 27

IMPORTING

RND_VALUE       = RND_VALUE.

CONCATENATE ‘FI’ SY-DATUM+4(4) SY-UZEIT(4) RND_VALUE INTO G_GROUPID. “生成会话名称session name

*开始录屏

CALL FUNCTION ‘POSTING_INTERFACE_START’

EXPORTING

I_FUNCTION = ‘B’

I_XBDCC    = ‘X’

I_KEEP     = ‘X’

I_GROUP    = G_GROUPID

*      I_MODE     = L_MODE

I_USER     = SY-UNAME.

MOVE ‘FB01′ TO L_TCODE.

CLEAR L_COUNTER.

L_COUNTER = L_COUNTER + 1.

L_STYPE = ‘K’.

*   fill Hearder

MOVE I_BKPF-COMP_CODE TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-BUKRS’ L_FVALUE . “公司代码

MOVE I_BKPF-DOC_TYPE TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-BLART’ L_FVALUE .  ”凭证类型

WRITE I_BKPF-PSTNG_DATE TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-BUDAT’ L_FVALUE .  ” 过账日期

WRITE I_BKPF-DOC_DATE TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-BLDAT’ L_FVALUE .   “凭证日期

IF I_BKPF-FIS_PERIOD IS NOT INITIAL.

WRITE I_BKPF-FIS_PERIOD TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-MONAT’ L_FVALUE .  ” 过账期间

ENDIF.

WRITE I_BKPF-CURRENCY TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-WAERS’ L_FVALUE .  ”货币

IF I_BKPF-HEADER_TXT IS NOT INITIAL.

WRITE I_BKPF-HEADER_TXT TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-BKTXT’ L_FVALUE .   ” 凭证抬头文本

ENDIF.

* IF I_BKPF-REF_DOC_NO IS NOT INITIAL.

* WRITE I_BKPF-REF_DOC_NO TO L_FVALUE.

*  PERFORM F_FILL_FIELD

*        TABLES LT_FTPOST

*        USING L_STYPE L_COUNTER ‘BKPF-XBLNR’ L_FVALUE .  ” 参照

* ENDIF.

* PAGES

WRITE L_NUM TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BKPF-NUMPG’ L_FVALUE . ” 页数,取凭证行项目数

* FILL ITEM

L_STYPE = ‘P’.

CLEAR L_COUNTER.

LOOP AT T_BSEG INTO WA_BSEG.

L_COUNTER = L_COUNTER + 1.

MOVE WA_BSEG-BSCHL TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-BSCHL’ L_FVALUE .  ” 过账码

WRITE WA_BSEG-amt_doccur TO L_FVALUE LEFT-JUSTIFIED.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-WRBTR’ L_FVALUE .   ” 凭证货币金额

MOVE WA_BSEG-sp_gl_ind TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-UMSKZ’ L_FVALUE .   ” 特殊 G/L 标识

IF WA_BSEG-BSCHL(1) = 3.                              ” 科目/供应商/客户

MOVE WA_BSEG-VENDOR_NO TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-LIFNR’ L_FVALUE .

ELSEIF WA_BSEG-BSCHL(1) = 0.

MOVE WA_BSEG-CUSTOMER TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-KUNNR’ L_FVALUE .

ELSEIF WA_BSEG-BSCHL(1) = 2.

MOVE WA_BSEG-VENDOR_NO TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-HKONT’ L_FVALUE .

ELSE.

MOVE WA_BSEG-GL_ACCOUNT TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-HKONT’ L_FVALUE .

ENDIF.

*    INTERNAL ORDER

IF WA_BSEG-orderid IS NOT INITIAL.

WRITE WA_BSEG-orderid TO L_FVALUE LEFT-JUSTIFIED.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘COBL-AUFNR’ L_FVALUE .     ” 订单号

ENDIF.

*   Profit center

IF WA_BSEG-PROFIT_CTR IS NOT  INITIAL.                  ” 利润中心

CLEAR L_FVALUE.

WRITE WA_BSEG-PROFIT_CTR TO L_FVALUE LEFT-JUSTIFIED.

IF WA_BSEG-BSCHL(1) = 2.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-PRCTR’ L_FVALUE .

ELSE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘COBL-PRCTR’ L_FVALUE .

ENDIF.

ENDIF.

*    REASON CODE

IF WA_BSEG-RSTGR IS NOT  INITIAL.

WRITE WA_BSEG-RSTGR TO L_FVALUE LEFT-JUSTIFIED.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-RSTGR’ L_FVALUE .     ” 原因代码

ENDIF.

IF WA_BSEG-costcenter IS NOT INITIAL.

WRITE WA_BSEG-costcenter TO L_FVALUE LEFT-JUSTIFIED.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘COBL-KOSTL’ L_FVALUE .      ”  成本中心

ENDIF.

IF WA_BSEG-BSCHL <> ‘40′ AND WA_BSEG-BSCHL <> ‘50′.

IF WA_BSEG-PMNTTRMS IS NOT INITIAL.

MOVE WA_BSEG-PMNTTRMS TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-ZTERM’ L_FVALUE .    ” 付款条件

ENDIF.

ENDIF.

IF WA_BSEG-alloc_nmbr IS NOT INITIAL.

MOVE WA_BSEG-alloc_nmbr TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-ZUONR’ L_FVALUE .   ” 分配编号

ENDIF.

IF WA_BSEG-item_text  IS NOT INITIAL.

MOVE WA_BSEG-item_text TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-SGTXT’ L_FVALUE .    ” 项目文本

ENDIF.

IF WA_BSEG-ASSET_NO IS NOT INITIAL.

MOVE WA_BSEG-ASSET_NO TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-ANLN1′ L_FVALUE .   ” 资产号

MOVE WA_BSEG-SUB_NUMBER TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-ANLN2′ L_FVALUE .

ENDIF.

*    CLEAR TBSL.

*    SELECT SINGLE * FROM TBSL WHERE BSCHL = WA_BSEG-BSCHL.

*    IF TBSL-KOART = ‘K’.

MOVE WA_BSEG-XREF1 TO L_FVALUE.

PERFORM F_FILL_FIELD

TABLES LT_FTPOST

USING L_STYPE L_COUNTER ‘BSEG-XREF1′ L_FVALUE .   ” 参考码,用于凭证过滤

*    ENDIF.

CLEAR WA_BSEG.

ENDLOOP.

CALL FUNCTION ‘POSTING_INTERFACE_DOCUMENT’

EXPORTING

I_TCODE                  = L_TCODE

IMPORTING

E_SUBRC                  = L_SUBRC

TABLES

T_BLNTAB                 = LT_BLNTAB

T_FTPOST                 = LT_FTPOST

T_FTTAX                  = LT_FTTAX

EXCEPTIONS

ACCOUNT_MISSING          = 1

COMPANY_CODE_MISSING     = 2

POSTING_KEY_INVALID      = 3

POSTING_KEY_MISSING      = 4

RECORD_TYPE_INVALID      = 5

TRANSACTION_CODE_INVALID = 6

AMOUNT_FORMAT_ERROR      = 7

TOO_MANY_LINE_ITEMS      = 8

COMPANY_CODE_INVALID     = 9

SCREEN_NOT_FOUND         = 10

NO_AUTHORIZATION         = 11

OTHERS                   = 12.

IF SY-SUBRC <> 0.

I_RETURN-TYPE = ‘E’.

ENDIF.

CALL FUNCTION ‘POSTING_INTERFACE_END’.     ” 录屏结束

* 调用会话,执行录屏内容

SUBMIT RSBDCSUB WITH MAPPE EQ G_GROUPID

WITH VON EQ SY-DATUM

WITH BIS EQ SY-DATUM

WITH Z_VERARB EQ ‘X’

WITH FEHLER EQ ”

EXPORTING LIST TO MEMORY

AND RETURN.

* 等待5S后,读取生成的凭证号

WAIT UP TO 5 SECONDS.

SELECT SINGLE BELNR FROM BKPF INTO L_BELNR

WHERE bukrs =  I_BKPF-COMP_CODE

AND GJAHR = L_GJAHR

AND GRPID = G_GROUPID.

IF SY-subrc = 0.

I_RETURN-TYPE = ‘S’.

CONCATENATE L_GJAHR ‘_’ I_BKPF-COMP_CODE ‘_’ L_BELNR INTO I_RETURN-BELNR.

* ———————————————————————————–

*  MODIFY USER FROM rfc USER

* ———————————————————————————–

UPDATE BKPF SET USNAM = I_BKPF-USERNAME

XREF1_HD = I_BKPF-XREF1_HD

XREF2_HD = I_BKPF-XREF2_HD

WHERE BUKRS = I_BKPF-COMP_CODE

AND   BELNR = L_BELNR

AND   GJAHR = L_GJAHR.

IF SY-SUBRC = 0 .

COMMIT WORK.

ELSE.

ROLLBACK WORK.

ENDIF.

* —————————————————————————————

ELSE.

I_RETURN-TYPE = ‘E’.

PERFORM FM_BDC_LOG USING G_GROUPID

CHANGING I_RETURN-MESSAGE.

ENDIF.

*&———————————————————————*

*&      Form  FM_BDC_LOG

*&———————————————————————*

* 如果SESSION执行出错,读取错误信息

*———————————————————————-*

*      –>P_G_GROUPID  text

*      <–P_I_RETURN_MESSAGE  text

*———————————————————————-*

FORM FM_BDC_LOG  USING    L_GROUPID TYPE APQI-GROUPID

CHANGING L_MESSAGE TYPE BAPI_MSG.

TABLES:bapiret2.

DATA: I_APQL TYPE TABLE OF APQL WITH HEADER LINE.

DATA: BEGIN OF logtable OCCURS 50,   ” plain log information in TemSe

enterdate LIKE btctle-enterdate,

entertime LIKE btctle-entertime,

logmessage(400) TYPE C,

END OF logtable.

DATA: l_logtable LIKE logtable.

SELECT * FROM apql

INTO TABLE i_apql

WHERE groupid = L_GROUPID

AND mandant = sy-mandt.

LOOP AT i_apql.

FREE logtable.

PERFORM read_bdc_log_plain(rsbdc_protocol)

TABLES

logtable

USING

i_apql-temseid i_apql-mandant.

LOOP AT logtable .

l_logtable = logtable.

IF logtable-logmessage+9(20) NE ”.

CLEAR bapiret2.

bapiret2-ID = logtable-logmessage+74(16).

bapiret2-NUMBER = logtable-logmessage+94(3).

bapiret2-message_v1 = logtable-logmessage+100(20).

CALL FUNCTION ‘BAPI_MESSAGE_GETDETAIL’

EXPORTING

ID         = bapiret2-ID

NUMBER     = bapiret2-NUMBER

textformat = ‘ASC’

message_v1 = bapiret2-message_v1

IMPORTING

MESSAGE    = bapiret2-MESSAGE.

CONCATENATE bapiret2-MESSAGE ‘//’ L_MESSAGE INTO L_MESSAGE.

ENDIF.

ENDLOOP.

ENDLOOP.

ENDFORM.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

二、冲销凭证

问题1:原使用CALL FUNCTION ’NUMBER_RANGE_DEQUEUE’获取下一个凭证号,却发生跳号现象。只得人工计算下个凭证号。冲销凭证BAPI需要参数-OBJ_KEY(凭证号+公司代码+会计年度)

SELECT SINGLE STBLA FROM T003 INTO L_STBLA
WHERE BLART = LS_BKPF-BLART.    “ 获取冲销凭证的凭证类型
SELECT SINGLE NUMKR FROM T003 INTO L_NUMKR
WHERE BLART = L_STBLA.          “ 冲销凭证号码段
CONCATENATE L_NUMKR ’%’ INTO L_STRING.
SELECT BELNR  FROM BKPF INTO TABLE IT_BSEG
WHERE BUKRS = I_COMP_CODE
AND GJAHR = L_GJAHR
AND BLART = L_STBLA
AND BELNR LIKE L_STRING.
if SY-SUBRC = 0.
SORT IT_BSEG BY BELNR DESCENDING.
READ TABLE IT_BSEG INDEX 1.
IT_BSEG-BELNR = IT_BSEG-BELNR + 1.

问题2:1、se37 . run ‘Z_DOCUMENT_REV_POST’. (This function calls BAPI-
BAPI_ACC_GL_POSTING_REV_POST).
2、with Parameter
BELNR RE PSTNG_DATE FI USERNAME
2012_H001_2000000271 03
3、created reversal document 2000000281 successfully
4、But in FBN1(COMPANY:H001), the current number is still 2000000280.

SAP的回复如下:

You use a custom function module (Z_DOCUMENT_REV_POST) which then
calls the BAPI BAPI_ACC_GL_POSTING_REV_POST. And you submit the document number directly to the BAPI in field REVERSAL-OBJ_KEY. The document is
posted correctly with the document number entered, but the document
number itself has not been drawn from the database.
This is why document number level is not updated, but document is posted correctly.

As we talked via phone, you use the function module
BAPI_ACC_GL_POSTING_POST to post the source document .  This function module will draw the document number for OBJ_TYPE = BKPFF automatically, but the reversal BAPI will NOT do this.

We have two options for this issue:
1.Call function module RF_GET_DOCUMENT_NUMBER before calling the
reversal BAPI BAPI_ACC_GL_POSTING_REV_POST to get the next free document number

关于凭证和冲销凭证的RFC相关推荐

  1. SAP 发票凭证反向冲销

    发票凭证反向冲销: 业务模拟: MIRO发票校验后,生成发票凭证号: 事务代码MR8M,输入凭证号码,反向冲销(类似于MIGO入库后的反向冲销):   此时进入MIRO查看,发现冲销成功,可以再次做M ...

  2. SAP 创建会计冲销凭证

    "功能描述:根据传输过来数据创建会计冲销凭证,并返回消息和状态 *"-------------------------------------------------------- ...

  3. SAP各种凭证的冲销

    SAP各种凭证的冲销 一:凭证的更改 1,已经过帐的 FB02. 过完帐的允许更改的地方有限,只有凭证抬头文本,参照,分配,文本,原因代码等 2,预制凭证的更改. TCODE,FBV2. 预制凭证可以 ...

  4. SAP中各种记账凭证的冲销

    转自"春暖花开"--http://hi.baidu.com/renjg/blog/item/a74b4a4ea0b907cfd1c86a89.html 一:凭证的更改 1,已经过帐 ...

  5. SAP 创建冲销凭证

    *"---------------------------------------------------------------------- ""本地接口: *&qu ...

  6. fi sap 凭证冲销 稅_SAP中各种记账凭证的冲销

    举报 转自 " 春暖花 开 " --http://hi.baidu.com/renjg/blog/item/a74b4a4ea0b907cfd1c86a89.html 一 : 凭证 ...

  7. 收款凭证 付款凭证 记账凭证的区别

    1.记账凭证是会计人员根据审核后的原始凭证进行归类.整理,并确定会计分录而编制的凭证,是直接凭以登账的依据.记帐凭证(专用记账凭证)分为收款凭证.付款凭证和转账凭证.[@more@](1)收款凭证:是 ...

  8. SAP物料凭证中的凭证类型交易/事件

    物料凭证中的凭证类型决定是由于T-code配置对应的凭证类型以及凭证编码产生的 OMBA:定义相关事务执行产生的物料凭证类型 OMBT:为物料凭证类型分配对应的凭证编码范围,与物料编码分配相同 交易/ ...

  9. 金蝶EAS,凭证接口,生成凭证,删除凭证,WebService接口

    凭证接口属于业务接口,调用业务接口之前,需先调用登录接口. 金蝶EAS接口调用时,可以先下载相应的WSDL文件,需要知道金蝶应用服务器地址,下载路径例如: http://192.168.1.199:6 ...

最新文章

  1. 浅析linux容器--Docker
  2. java 闹钟代码_JAVA可视化闹钟源码
  3. R语言学习——处理数据对象的实用函数
  4. Python深浅拷贝辨析
  5. Java9都快发布了,Java8的十大新特性你了解多少呢?
  6. 第四届数据科学国际会议(ICDS2017)将于5月在上海召开
  7. python-数据容器-有序容器与无序容器
  8. stl 基于哈希的map c++_关于哈希表,你该了解这些!
  9. 聊聊下一代监控:Prometheus
  10. Jquery弹出层插件,非常好用绚丽Lee dialog 1.0
  11. lua html 转义字符,Lua中特殊字符过滤(UTF8编码)
  12. goc 介绍与源代码分析
  13. 海思Hi3798MV300_Hi3798MV300H_Datasheet-系统
  14. 极目智能完成2亿元C1轮融资,已获多个乘用车ADAS项目定点
  15. 【多传感器融合理论】01自动驾驶中常用传感器硬件介绍
  16. 2012服务器清理系统盘,windows2012磁盘清理
  17. 【Python】半次元COS图爬取
  18. HTML5七夕情人节表白网页抖音超火的樱花雨3D相册 HTML+CSS+JavaScript
  19. 免费屏幕录制程序都不用
  20. [量子计算]量子计算的最佳应用(The Best Applications for Quantum Computing)

热门文章

  1. 百度VS谷歌?搜索质量评判也要讲基本法
  2. 阿里云Linux的mysql安装,使用yum安装
  3. python的文件流,初步网页爬虫,序列化和反序列化
  4. CDS view注解解析 - @Environment.systemField
  5. 工具推荐|程序员必须知道的11款新型编程工具
  6. 多媒体(1):MCI接口编程
  7. Neutron 架构 - 每天5分钟玩转 OpenStack(67)
  8. LaTeX Test
  9. 开发短视频APP跟上时代的快车
  10. [Linux实用工具]Ubuntu环境下SSH的安装及使用