您的位置:首页 > 编程语言

SD--RV_accounting_document_create函数的代码解读

2016-09-28 13:01 405 查看
这几天看一个SD开票并产生会计凭证时做种种字段修改、行项目删除、并产生第三种自定义单据的变态增强开发需求,追SD release to accounting时发现调用的function module RV_ACCOUNTING_DOCUMENT_CREATE ,这里面大体逻辑是根据SD数据,做科目确定等等,调了几个BAdI和exit,然后会计凭证冲销或过账,详细解读,见下文。

转自大顾 Jack Wu,原文地址:http://blog.csdn.net/compassbutton/article/details/3496203

FUNCTION rv_accounting_document_create.

DATA : da_anzah_netwr LIKE vbrp-netwr.

DATA : da_anzah_mwsbp LIKE vbrp-mwsbp.

DATA : da_anzah_netwrg LIKE vbrk-netwr.

DATA : da_anzah_fplnr LIKE vbrp-fplnr.

DATA : da_anzah_sign.

DATA : da_pos_netwr LIKE vbrp-netwr.

DATA : da_tax_subtracted.

DATA : ld_aenderung_konv.

DATA : lt_vbpa LIKE vbpavb OCCURS 5 WITH HEADER LINE.

DATA : abfor LIKE vbrp-abfor.

DATA : loc_accrev LIKE accrev.

DATA : nonewcancel.

DATA: ld_collect_processed LIKE boole-boole.

MOVE invoice_header TO vbrk.

MOVE vbrk-rfbsk TO o_vbrk_rfbsk.

*

IF mode NE 'B'.

REFRESH: xacchd, xaccit, xacccr, xaccit_wt, accdpc, xaccit_deb.

*xacchd:会计界面:标题信息

*xaccit:会计核算界面:项目信息

*xacccr:会计核算界面:货币信息

*xaccit_wt:FI 界面的预扣税信息

*accdpc:预付定金清算的代码字段

*xaccit_deb:关于创建客户行的项目字段

CLEAR: xkomk1, xkomk2, xkomk3.

CLEAR: xacchd, xaccit, xacccr, accdpc.

CLEAR: loc_bsid, loc_bkpf.

CLEAR: jcdactive, external, txjlv, txjdp.

CLEAR: o_new_cancel_fail.

ENDIF.

CLEAR: rule_new_cancel.

* start Revenue Recognition Project

*清除内表数据

REFRESH: rr_accit, rr_acccr.

CLEAR: rr_accit, rr_acccr.
* end Revenue Recognition Project

*系统默认的财务项目编号从1001编号,对应的客户项目1编号
IF mode = 'B'.

posnr = 500000.

ELSE.

posnr = 1000.

ENDIF.

tax = 0.

cashdiscount = 0.

securevalue = 0.

totalvalue = 0.

creditvalue = 0.

CLEAR xgsber.

postgsb = ' '.

IF t001-bukrs NE vbrk-bukrs.

SELECT SINGLE * FROM t001 WHERE bukrs EQ vbrk-bukrs.

ENDIF.

IF tvfk-fkart NE vbrk-fkart OR vbrk-sfakn NE space.

SELECT SINGLE * FROM tvfk WHERE fkart EQ vbrk-fkart.

ENDIF.

* check if external tax determination is active

IF vbrk-vbtyp NA vbtyp_reli.

CALL FUNCTION 'CHECK_JURISDICTION_ACTIVE'

EXPORTING

i_land = t001-land1

i_bukrs = vbrk-bukrs

IMPORTING

e_external = external

e_isactive = jcdactive.

ENDIF.

* fill header

IF mode CA ' A'.

CLEAR xacchd.

xacchd-mandt = sy-mandt.

xacchd-awtyp = con_awtyp_vbrk.

xacchd-awref = vbrk-vbeln.

xacchd-awsys = vbrk-logsys.

xacchd-usnam = sy-uname.

xacchd-tcode = sy-tcode.

xacchd-cpudt = sy-datum.

xacchd-cputm = sy-uzeit.

IF mode = 'A'.

xacchd-aworg = 'CORR'.

ENDIF.

IF vbrk-fktyp = con_fktyp_p.

* business transaction for downpayment request

xacchd-glvor = con_glvor_rfst.

ELSE.

* business transaction for normal invoice

xacchd-glvor = con_glvor_sd00.

ENDIF.

ENDIF.
*系统默认SD 的发票生成RV类型的财务凭证

* use document type from TVFK if entered
IF tvfk-blart IS INITIAL.

xaccit-blart = 'RV'.

ELSE.

xaccit-blart = tvfk-blart.

ENDIF.

* rebate and vprs update with ext. number range: use new document type

IF mode CA 'AB' AND NOT blart IS INITIAL.

xaccit-blart = blart.

ENDIF.

xvbrp_key = vbrk.

IF document_old(1) = con_$.

xvbrp_key-vbeln = document_old.

ENDIF.

* negative posting

IF mode = ' '.

PERFORM xaccit_xnegp_set.

* credit memo with value date

PERFORM xaccit_xvalgs_zfbdt_set.

ENDIF.

xaccit-budat = vbrk-fkdat.

xaccit-bldat = vbrk-fkdat.

xaccit-xblnr = vbrk-xblnr. "H27515

xaccit-wwert = vbrk-kurrf_dat.

IF mode = ' '.
* Userexit Header
CALL CUSTOMER-FUNCTION '001'

EXPORTING

xacchd = xacchd

xaccit = xaccit

vbrk = vbrk

doc_number = xvbrp_key-vbeln

IMPORTING

xacchd = xacchd

xaccit = xaccit

TABLES

cvbrp = xvbrp

ckomv = xkomv.

ENDIF. "Modus

IF mode CA ' A'.

APPEND xacchd.

ENDIF.

MOVE-CORRESPONDING xaccit TO xkomk1.

PERFORM userexit_fill_xkomk1.

* new cancellation

* sfakn is only set, when the whole invoice is cancelled

*取消发票处理

IF NOT vbrk-sfakn IS INITIAL AND NOT vbrk-fktyp EQ con_fktyp_p AND rule_new_cancel NE con_a AND new_acct_det IS INITIAL.

IF NOT rrrel IS INITIAL.

nonewcancel = 'X'.

ENDIF.

IF nonewcancel IS INITIAL.

loc_accrev-awtyp = con_awtyp_vbrk.

loc_accrev-awref = vbrk-vbeln.

loc_accrev-aworg = space.

loc_accrev-awsys = vbrk-logsys.

loc_accrev-belnr = vbrk-vbeln.

loc_accrev-fkart = vbrk-fkart.

loc_accrev-awref_rev = vbrk-sfakn.

loc_accrev-aworg_rev = space.

loc_accrev-bukrs = vbrk-bukrs.

loc_accrev-budat = vbrk-fkdat.

loc_accrev-budat_rev = vbrk-fkdat.

loc_accrev-xnegp = xaccit-xnegp.

loc_accrev-glvor = xacchd-glvor.

loc_accrev-cpudt = xacchd-cpudt.

loc_accrev-cputm = xacchd-cputm.

loc_accrev-glvor = xacchd-glvor.

* badi grants management method: gm_billing_status_set

* loc_accrev added for FI-CA

DATA: l_sd_gm_exit TYPE REF TO if_ex_badi_sd_gm,

active TYPE xfeld.

IF vbrk-vbtyp NA vbtyp_reli.

CALL FUNCTION 'GET_HANDLE_SD_GM'

IMPORTING

handle = l_sd_gm_exit

active = active.

IF active = 'X'.

CALL METHOD l_sd_gm_exit->gm_billing_status_set

EXPORTING

fvbrk = vbrk

fxvbrpvb = xvbrp[]

f_tvfk = tvfk

CHANGING

faccrev = loc_accrev.

ENDIF.

ENDIF.

*反向生成取消发票的财务操作

CALL FUNCTION 'AC_DOCUMENT_REVERSE'

EXPORTING

i_accrev = loc_accrev

i_comp = i_comp

EXCEPTIONS

reverse_impossible = 1

error_message = 2

OTHERS = 3.

IF sy-subrc = 0.

EXIT.

ENDIF.

IF sy-subrc = 2.

IF sy-msgty = 'A'.

* display error directly when abend message

MESSAGE ID sy-msgid TYPE 'A' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

IF rule_new_cancel NE con_b.

IF check NE con_x.

* write error to protocol

RAISE error_01.

ELSE.

* display error directly

MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDIF.

ENDIF.

IF sy-subrc EQ 1 OR sy-subrc = 3.

IF check EQ con_x.

MESSAGE ID 'VF' TYPE 'I' NUMBER '208'

WITH vbrk-sfakn vbrk-vbeln.

ELSE.

o_new_cancel_fail = 'X'.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

*下面代码为正常发票生成财务凭证

*判断是否有发票凭证:xvbrp_key =800+发票号
READ TABLE xvbrp WITH KEY xvbrp_key BINARY SEARCH.

IF sy-subrc = 0.

xvbrp_tabix = sy-tabix.
*对发票项目进行循环,将各个项目对应的定价过程生成数据提取汇总到内表(生成财务财务凭证需要的数据)
* invoice items ( l o o p )

DO.

* reset item information for debitor line items

CLEAR xaccit_deb.

* initialize amount for POS interface

CLEAR da_pos_netwr.

CLEAR ld_collect_processed.

CLEAR item_with_rrdp.

* BADI call for FI-CA

IF NOT vbrk-vkont IS INITIAL.

DATA: l_sd_accounting_exit TYPE REF TO if_ex_badi_sd_accounting.

IF vbrk-vbtyp NA vbtyp_reli.

CALL FUNCTION 'GET_HANDLE_SD_ACCOUNTING'

IMPORTING

handle = l_sd_accounting_exit

active = active.

IF active = 'X'.

CALL METHOD l_sd_accounting_exit->fica_kunnr_get

EXPORTING

f_old_document = document_old

fvbrk = vbrk

fvbrp = xvbrp

fxvbpa = xvbpa[]

CHANGING

fxkomv = xkomv[]

f_konv_changed = ld_aenderung_konv.

ENDIF.

ENDIF.

ENDIF.

* choose document/ item number for downpayment request

IF xvbrp-fareg CA con_fareg_anzahlungen.

IF NOT xvbrp-vbelv IS INITIAL.

anz_vgbel = xvbrp-vbelv.

anz_vgpos = xvbrp-posnv.

ELSE.

anz_vgbel = xvbrp-vgbel.

anz_vgpos = xvbrp-vgpos.

ENDIF.

ENDIF.

* down payments/ billing plan with resource-related billing

* check if the item is relevant

IF xvbrp-fareg EQ '5'.

CALL FUNCTION 'DPBP_RELEVANCE_CHECK'

EXPORTING

i_vgbel = xvbrp-vgbel

i_vgpos = xvbrp-vgpos

i_fplnr = xvbrp-fplnr

i_fpltr = xvbrp-fpltr

i_aubel = xvbrp-aubel

i_vgtyp = xvbrp-vgtyp

IMPORTING

e_item_with_rrdp = item_with_rrdp.

IF NOT item_with_rrdp IS INITIAL.

anz_vgbel = xvbrp-aubel.

anz_vgpos = xvbrp-aupos.

ENDIF.

ENDIF.

* no tax and G/L account items for down payment requests

IF vbrk-fktyp EQ con_fktyp_p OR

vbrk-fktyp NE con_fktyp_p AND

xvbrp-fareg NA con_fareg_anzahlungen.

IF xvbrp-kowrr IS INITIAL. " h115788

* Save net value of the invoice item for value check of

* the downpayments that will be cleared

CLEAR: da_anzah_netwr,

da_anzah_mwsbp,

da_anzah_fplnr,

da_anzah_sign.

da_anzah_netwr = xvbrp-netwr.

da_anzah_mwsbp = xvbrp-mwsbp.

da_anzah_fplnr = xvbrp-fplnr.

IF xvbrp-netwr GE 0.

da_anzah_sign = con_plus.

ELSE.

da_anzah_sign = con_minus.

ENDIF.

* down payments/ billing plan with resource-related billing

IF vbrk-fktyp NE con_fktyp_p AND

* not for downpayment requests

NOT item_with_rrdp IS INITIAL.

DATA: sum_da_anzah_netwr LIKE da_anzah_netwr.

DATA: sum_da_anzah_mwsbp LIKE da_anzah_mwsbp.

DATA: save_aubel LIKE xvbrp-aubel.

DATA: save_aupos LIKE xvbrp-aupos.

IF xvbrp-aubel NE save_aubel OR

xvbrp-aupos NE save_aupos.

CLEAR sum_da_anzah_netwr.

CLEAR sum_da_anzah_mwsbp.

save_aubel = xvbrp-aubel.

save_aupos = xvbrp-aupos.

ENDIF.

sum_da_anzah_netwr = sum_da_anzah_netwr + xvbrp-netwr.

sum_da_anzah_mwsbp = sum_da_anzah_mwsbp + xvbrp-mwsbp.

da_anzah_netwr = sum_da_anzah_netwr.

da_anzah_mwsbp = sum_da_anzah_mwsbp.

IF da_anzah_netwr GE 0.

da_anzah_sign = con_plus.

ELSE.

da_anzah_sign = con_minus.

ENDIF.

ENDIF.

IF mode = ' '.

* initialize cash management data

CLEAR : fmii1.

* cash management: determine order account assignment

IF NOT xvbrp-aubel IS INITIAL

AND NOT xvbrp-aupos IS INITIAL

AND xvbrp-autyp CA vbtyp_verk

AND vbrk-vbtyp NA vbtyp_fkiv.

CALL FUNCTION 'FM_CO_ASS_INPUT_GET_SD'

EXPORTING

i_vbeln = xvbrp-aubel

i_posnr = xvbrp-aupos

i_bukrs = vbrk-bukrs

i_flg_check_completeness = 'X'

IMPORTING

e_fipos = fmii1-fipos

e_fistl = fmii1-fistl

e_fonds = fmii1-fonds

e_fkber = fmii1-farea

e_grant_nbr = fmii1-grant_nbr

EXCEPTIONS

no_customizing_found = 1

assignment_incomplete = 2

not_active = 3.

IF sy-subrc = 2.

IF check NE con_x.

* display error into log

RAISE error_01.

ELSE.

* display error directly

MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDIF.

ENDIF.

PERFORM txjcd_aufbereiten.

* cash discount value of the item is summed up for the customer

* line item

ADD xvbrp-skfbp TO xaccit_deb-skfbp.

* determine secure value

IF abfor NE xvbrp-abfor.

SELECT SINGLE * FROM t691k WHERE absfo = xvbrp-abfor.

abfor = xvbrp-abfor.

ENDIF.

IF t691k-abstp NE '3'. " not for credit cards

PERFORM cmpre_calculate(saplvkmp)

USING xvbrp-cmpre

xvbrp-cmpre_flt

xvbrp-fkimg

xvbrp-abges

CHANGING creditvalue_det

totalvalue_det

securevalue_det.

ADD totalvalue_det TO xaccit_deb-totalval.

ADD creditvalue_det TO xaccit_deb-creditval.

ADD securevalue_det TO xaccit_deb-secureval.

ENDIF.

IF vbrk-fktyp EQ con_fktyp_p."Note: 113374 (98)

free-of-charge = 'N'.

ELSE.

free-of-charge = 'X'. " P30K123459

ENDIF.

IF postgsb = ' '.

xgsber = xvbrp-gsber.

ELSE.

IF xgsber NE xvbrp-gsber.

CLEAR xgsber.

ENDIF.

ENDIF.

postgsb = 'X'.

ENDIF. "Modus

xkomv_key = xvbrp_key.

IF document_old(1) NE con_$.

xkomv_key-knumv = vbrk-knumv.

ENDIF.

xkomv_key-kposn = xvbrp-posnr.

IF mode NE 'A'.
* START OF : account determination

* 根据当前的发票项目号,对xkomv表(定价过程生成的定价内表)中对应的该项目号的记录进行确定科目,

* 并将科目填写到xkomv表中,就是修改SAKN1和SAKN2
IF xvbrp-kowrr = space AND

vbrk-sfakn = space AND "已取消的出具发票凭证号

i_comp IS INITIAL AND

xvbrp-fareg NA con_fareg_anzahlungen AND

( ( vbrk-rfbsk CA ' ABHIK' OR mode = 'B' ) OR

( sy-cprog = 'SAPFACC0' ) OR

( sy-cprog = 'SAPFACC1' ) ) OR

( new_acct_det EQ con_x ).

CALL FUNCTION 'RV_INVOICE_ACCOUNT_DETERM' "确定科目

EXPORTING

document_internal = document_old

invoice_header = vbrk

invoice_item = xvbrp

procedure = tvfk-kalsmc

protocol = ' '

mode = mode

new_acct_det = new_acct_det

IMPORTING

konv_changed = ld_aenderung_konv

TABLES

tkomv = xkomv

xvbpa = xvbpa

EXCEPTIONS

account_missing = 4.

IF sy-subrc NE 0.

CASE vbrk-rfbsk.

WHEN ' '.

o_vbrk_rfbsk = 'B'.

sy-msgid = 'VF'.

sy-msgno = '051'. "凭证 & 保存(帐户确定出错)

sy-msgv1 = vbrk-vbeln.

RAISE error_01.

WHEN 'H'.

o_vbrk_rfbsk = 'I'.

ENDCASE.

ENDIF.

IF ld_aenderung_konv = 'X'.

o_konv_changed = 'X'.

ENDIF.

ENDIF.

ENDIF. "Modus

* END OF : account determination

REFRESH taccit_wt.
*xkomv_key :单据条件数+条件项目号

*对已经确认科目的Xkomv表中对应的记录进行财务凭证项目生成
READ TABLE xkomv WITH KEY xkomv_key BINARY SEARCH.

IF sy-subrc = 0.

xkomv_tabix = sy-tabix.

CLEAR remmwskz. " note 141899

* conditions ( l o o p )

DO.

IF xkomv-koaid = con_d AND "con_d 表示税

xkomv-kinak = space AND "表示条件不活跃

mode = space AND

xkomv-kstat = space. "条件用作统计

* tax line item

ADD xkomv-kwert TO xaccit_deb-mwsbp.

* set tax indicator for downpayment requests

IF vbrk-fktyp EQ con_fktyp_p.

xaccit_deb-mwsk1 = xkomv-mwsk1.

ENDIF.

* FI-CA: set tax indicator for debit lines

IF NOT vbrk-vkont IS INITIAL AND xkomv-kstat IS INITIAL

OR NOT deb_lines_for_cond IS INITIAL.

xaccit_deb-mwsk1 = xkomv-mwsk1.

ENDIF.

* end: set tax indicator

IF xkomv-kwert NE 0 OR xkomv-mwsk1 NE space.

PERFORM accounting_tax_line.

ENDIF.

ENDIF.

IF xkomv-koaid NE con_d AND

xkomv-koaid NE con_w AND

xkomv-kinak EQ space AND

xkomv-kwert NE 0 AND

vbrk-fktyp NE con_fktyp_p.

free-of-charge = 'N'. " P30K123459

* G/L account item

* FI-CA: set tax indicator for debit lines

IF NOT vbrk-vkont IS INITIAL AND xkomv-kstat IS INITIAL

OR NOT deb_lines_for_cond IS INITIAL.

xaccit_deb-mwsk1 = xkomv-mwsk1.

ENDIF.

IF mode CA 'AB'.

IF xkomv-koaid EQ con_c AND "nur Bonus

mode_types = '1'.

PERFORM accounting_item_line.

ENDIF.

IF xkomv-kntyp CA 'Ghb' AND "nur VPRS und TP

mode_types = '2'.

PERFORM accounting_item_line.

ENDIF.

ELSE.

PERFORM accounting_item_line.

ENDIF.

ENDIF.

* FI-CA: set tax indicator for debit lines

IF NOT vbrk-vkont IS INITIAL AND xkomv-kstat IS INITIAL

OR NOT deb_lines_for_cond IS INITIAL.

xaccit_deb-mwsk1 = xkomv-mwsk1.

ENDIF.

IF xkomv-koaid = con_w AND xkomv-kinak = space.

* withholding tax data for( customer line item(s))

CLEAR taccit_wt.

PERFORM wt_type_for_kschl_get USING xvbrp-aland

xkomv-kschl

CHANGING taccit_wt-witht.

IF taccit_wt-witht <> space.

taccit_wt-wt_withcd = xkomv-mwsk2.

ENDIF.

APPEND taccit_wt.

ENDIF.

* save value of cash conditions from POS interface

IF xkomv-kntyp EQ con_kntyp_pos.

da_pos_netwr = da_pos_netwr + xkomv-kwert.

ENDIF.

IF NOT vbrk-vkont IS INITIAL OR

NOT deb_lines_for_cond IS INITIAL.

PERFORM fill_accit_deb USING 'C'

CHANGING da_pos_netwr

ld_collect_processed.

ENDIF.

ADD 1 TO xkomv_tabix.

READ TABLE xkomv INDEX xkomv_tabix.

IF sy-subrc NE 0 OR xkomv-knumv NE xkomv_key-knumv

OR xkomv-kposn NE xkomv_key-kposn.

EXIT.

ENDIF.

ENDDO. "SD单据的单个项目对应定价循环结束
ENDIF.
* fill data for the customer lines

*使用collect方法添加到Xaccit_deb内表,供后续计算客户项目使用
PERFORM fill_accit_deb USING 'I'

CHANGING da_pos_netwr

ld_collect_processed.

ENDIF. " h115788

* BADI call for FI-CA

IF NOT vbrk-vkont IS INITIAL AND NOT xvbrp-aubel IS INITIAL AND

NOT xvbrp-fplnr IS INITIAL.

DATA: l_sd_billing_item_exit TYPE REF TO

if_ex_badi_sd_billing_item.

IF vbrk-vbtyp NA vbtyp_reli.

CALL FUNCTION 'GET_HANDLE_SD_BILLING_ITEM'

IMPORTING

handle = l_sd_billing_item_exit

active = active.

IF active = 'X'.

CALL METHOD l_sd_billing_item_exit->fi_ca_down_payments_read

EXPORTING

f_waerk = vbrk-waerk

f_vgbel = xvbrp-aubel

f_tvfk = tvfk

fvbrk = vbrk

CHANGING

faccdpc = t_sdaccdpc[].

ENDIF.

ENDIF.

ENDIF.

ELSE.

IF i_comp IS INITIAL. " Not for subsequent posting

* Item net value

IF xvbrp-mwsbp IS INITIAL.

da_anzah_netwr = da_anzah_netwr + da_anzah_mwsbp

- xvbrp-netwr.

ELSE.

da_anzah_netwr = da_anzah_netwr - xvbrp-netwr.

ENDIF.

* Header net value

IF xvbrp-mwsbp IS INITIAL AND da_tax_subtracted IS INITIAL.

da_anzah_netwrg = da_anzah_netwrg + xvbrp-netwr

- vbrk-mwsbk.

da_tax_subtracted = 'X'.

ELSE.

da_anzah_netwrg = da_anzah_netwrg + xvbrp-netwr.

ENDIF.

IF da_anzah_fplnr NE xvbrp-fplnr OR

( NOT item_with_rrdp IS INITIAL ) OR

( da_anzah_sign EQ con_plus AND da_anzah_netwr GE 0 ) OR

( da_anzah_sign EQ con_minus AND da_anzah_netwr LE 0 ).

* Fill FI table with downpayment clearings

PERFORM accdpc_fuellen_aus_sdaccdpc.

ELSE.

sy-msgid = 'VF'.

sy-msgno = '525'.

sy-msgv1 = xvbrp-posnr.

IF check NE con_x.

* Write message to protocol

RAISE error_01.

ELSE.

* Send message

MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDIF.

ENDIF. " Not for subsequent posting

ENDIF.

ADD 1 TO xvbrp_tabix.

READ TABLE xvbrp INDEX xvbrp_tabix.

IF sy-subrc NE 0 OR xvbrp-vbeln NE xvbrp_key-vbeln.

EXIT.

ENDIF.

ENDDO."SD单据项目循环

* Down payments are higher than invoice net value

IF vbrk-netwr GT 0 AND vbrk-netwr LT da_anzah_netwrg OR

vbrk-netwr LT 0 AND vbrk-netwr GT da_anzah_netwrg.

sy-msgid = 'VF'.

sy-msgno = '527'.

sy-msgv1 = vbrk-vbeln.

IF check NE con_x.

* Write message to protocol

RAISE error_01.

ELSE.

* Send message

MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDIF.

ENDIF.

* start Revenue Recognition Project

* Save the position number before it is cleared for rev. rec.

DATA : lif_posnr LIKE accit-posnr.

lif_posnr = posnr.

* end Revenue Recognition Project

* customer line item(s)

IF mode = ' '.
*清空,从1开始编写客户项目编号,

*前面的其他项目从1000开始编号
CLEAR: posnr.

* CCARD ...

PERFORM credit_card.

* Reduce the end value of the customer lines using the value

* previously posted. Tax and cashdiscount are not reduced

* The risk management fields are already processed with a factor

* The end value is corrected for rounding differences

* The cash discount is not corrected

DATA: da_factor TYPE f,

da_brtwr_total_v LIKE xaccit_deb-brtwr,

da_brtwr_total_n LIKE xaccit_deb-brtwr,

da_brtwr_diff LIKE xaccit_deb-brtwr,

da_brtwr_total LIKE xaccit_deb-brtwr,

da_tabix LIKE sy-tabix.

IF ctotal NE 0. " Hinweis: 111916/116922

da_brtwr_total = invoice_header-netwr + invoice_header-mwsbk.

IF da_brtwr_total NE 0. " If da_brtwr_total...

da_factor = ( 1 - ctotal / da_brtwr_total ).

LOOP AT xaccit_deb.

ADD xaccit_deb-brtwr TO da_brtwr_total_v.

xaccit_deb-brtwr = xaccit_deb-brtwr * da_factor.

xaccit_deb-skfbp = xaccit_deb-skfbp * da_factor.

ADD xaccit_deb-brtwr TO da_brtwr_total_n.

MODIFY xaccit_deb.

ENDLOOP.

ENDIF. " If da_brtwr_total...

da_brtwr_diff = ( da_brtwr_total_v - ctotal ) -

( da_brtwr_total_n ).

DESCRIBE TABLE xaccit_deb LINES da_tabix.

IF da_tabix NE 0.

READ TABLE xaccit_deb INDEX da_tabix.

ADD da_brtwr_diff TO xaccit_deb-brtwr.

ADD da_brtwr_diff TO xaccit_deb-skfbp.

MODIFY xaccit_deb INDEX da_tabix.

ENDIF.

ENDIF.

* Create debitor lines

LOOP AT xaccit_deb.

* set global data, no change of the customer line item with respect to XACCCR

pos_brutto = xaccit_deb-brtwr.

pos_netto = xaccit_deb-netwr.

tax = xaccit_deb-mwsbp.

cashdiscount = xaccit_deb-skfbp.

securevalue = xaccit_deb-secureval.

creditvalue = xaccit_deb-creditval.

totalvalue = xaccit_deb-totalval.

IF NOT xgsber IS INITIAL.

xaccit_deb-gsber = xgsber.

ENDIF.
*填写客户项目到XACCIT表
PERFORM accounting_head_line.

ENDLOOP.

* call badi_sd_accounting

IF vbrk-vbtyp NA vbtyp_reli.

CALL FUNCTION 'GET_HANDLE_SD_ACCOUNTING'

IMPORTING

handle = l_sd_accounting_exit

active = active.

IF active = 'X'.

CALL METHOD l_sd_accounting_exit->accounting_interface

EXPORTING

fcvbrk = vbrk

fdoc_number = xvbrp_key-vbeln

CHANGING

fxvbrp = xvbrp[]

fxkomv = xkomv[]

fxaccit = xaccit[]

fxacccr = xacccr[].

ENDIF.

ENDIF.

* possibility to change interface tables

CALL CUSTOMER-FUNCTION '008'

EXPORTING

cvbrk = vbrk

doc_number = xvbrp_key-vbeln

TABLES

xaccit = xaccit

xacccr = xacccr

cvbrp = xvbrp

ckomv = xkomv

caccdpc = accdpc.

* call from simulation report

IF sy-cprog = 'SAPFACC0'

OR sy-cprog = 'SAPFACC1'.

EXPORT xacchd xaccit xacccr TO MEMORY ID 'SAPLV60B'.

EXIT.

ENDIF.

ENDIF.

* create FI document

DESCRIBE TABLE xaccit LINES sy-tabix.

IF sy-tabix = 0.

* start Revenue Recognition Project

IF NOT rrrel IS INITIAL AND

vbrk-fktyp NE con_fktyp_p. " No downpayment requests

DESCRIBE TABLE rr_accit LINES sy-tabix.

ENDIF.

IF sy-tabix = 0.

* end Revenue Recognition Project

* clear SYS-MSG-fields, as previously the fields were filled without

* outputting them ( example: text processing )

CLEAR: sy-msgno, sy-msgv1, sy-msgv2, sy-msgv3, sy-msgv4.

RAISE no_document_required.

EXIT.

ENDIF.

ENDIF.

IF mode = ' '.

* check if there are down payment clearings

DESCRIBE TABLE accdpc LINES sy-tabix.

IF sy-tabix > 0 OR NOT vbrk-vkont IS INITIAL.

* fill tables ACCIT and ACCCR with downpayment clearings

PERFORM anzahlungen_fuer_accit_acccr.

ENDIF.

ENDIF.

CHECK mode NE 'A'.

* start Revenue Recognition Project

IF NOT rrrel IS INITIAL AND

vbrk-fktyp NE con_fktyp_p AND " No downpayment requests

mode = ' '.

* Call Rev. Rec. Billing Function Module

CALL FUNCTION 'SD_REV_REC_BILLING'

EXPORTING

fis_vbrk = vbrk

fif_dummy_nr = document_old

fis_t001 = t001

fif_posnr = lif_posnr

TABLES

fit_xaccit = xaccit

fit_xacccr = xacccr

fit_xvbrp = xvbrp

fit_xkomv = xkomv

fit_xacchd = xacchd

fit_rr_accit = rr_accit

fit_rr_acccr = rr_acccr

fit_xfplt = xfplt

fit_xvbpa = xvbpa

EXCEPTIONS

error_01 = 01.

IF sy-subrc EQ 0.

* Check RW-interface table again whether there are entries

DESCRIBE TABLE xaccit LINES sy-tabix.

IF sy-tabix = 0.

CLEAR: sy-msgno, sy-msgv1, sy-msgv2, sy-msgv3, sy-msgv4.

RAISE no_document_required.

EXIT.

ENDIF.

ENDIF.

ELSE.

* Initialize error mark

CLEAR: sy-subrc.

ENDIF.

IF sy-subrc EQ 0.

* end Revenue Recognition Project

IF mode = ' ' OR ( mode = 'B' AND mode_types = '2' ).

* Gegenbuchung zu Transferpreisen erzeugen.

CALL FUNCTION 'TP_PREPARE_ACCCR_SD'

TABLES

t_acchd = xacchd

t_accit = xaccit

t_acccr = xacccr

EXCEPTIONS

OTHERS = 0.

ENDIF.

IF sy-subrc NE 01.

* Call badi_sd_gm grants management

IF mode = ' ' AND vbrk-vbtyp NA vbtyp_reli.

CALL FUNCTION 'GET_HANDLE_SD_GM'

IMPORTING

handle = l_sd_gm_exit

active = active.

IF active = 'X'.

CALL METHOD l_sd_gm_exit->gm_billing_status_set

EXPORTING

fvbrk = vbrk

fxvbrpvb = xvbrp[].

ENDIF.

ENDIF.
*生成SAP的财务凭证

*该函数里会根据SAP配置调用对应过程生成对应的各类凭证

*对应过程存储在TRWPR表里
CALL FUNCTION 'AC_DOCUMENT_CREATE'

EXPORTING

i_comp = i_comp

i_comp_check = i_comp_check

TABLES

t_acccr = xacccr

t_acchd = xacchd

t_accit = xaccit

t_accfi = lt_accfi "会计界面:财务会计一次性科目->只包含需要记账的记录

t_accwt = xaccit_wt

EXCEPTIONS

error_message = 01.

ENDIF.

* start Revenue Recognition Project

ENDIF.

* end Revenue Recognition Project

IF sy-subrc = 01.

IF mode = ' '.

* start Revenue Recognition Project

* if posting to accounting failed,then this function restores xvbrev

IF NOT rrrel IS INITIAL AND

vbrk-fktyp NE con_fktyp_p. " No downpayment requests

CALL FUNCTION 'SD_REV_REC_RESTORE'.

ENDIF.

* end Revenue Recognition Project

ENDIF.

IF check NE con_x.

* write error to protocol

RAISE error_01.

ELSE.

* display error directly

MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDIF.

ENDFUNCTION.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: