天天看點

MIGO BUG修複

migo出錯可能是物料價格的問題。

比如物料5月沒有價格,6月有價格,如果過賬日期在5月,可能就會出錯。

dump截圖如下

MIGO BUG修複
MIGO BUG修複

根據dump關鍵詞搜到Note 2201429,這個note描述和這個問題一模一樣,但是實施了note之後發現依然會dump。

debug進去可以看到,程式先生成了會計憑證号放進内表

MIGO BUG修複

比如這種情況下,内表有一條資料

MIGO BUG修複

然後循環用行項目内表去比對存會計憑證号的内表,得到會計憑證号。

MIGO BUG修複

比對

MIGO BUG修複

其中,項目資料中有$和%,而憑證号内表中隻有$,是以%的項目就比對不到了,就出問題了

MIGO BUG修複

解決方法:

既然Note解決不了,就隻能自己處理了。處理方法有兩種:

1.給存憑證号的内表增加一條%的資料,憑證号和$相同,這樣就能比對到了

2.删除項目中金額為0的資料(%的資料)

選擇第一種做法,使用隐式增強,位置在類CL_FINS_ACDOC_POSTING_EVENTS的方法IF_FINS_ACDOC_POSTING_FRAMEWRK~POST中。

MIGO BUG修複

寫在開頭,代碼如下:

ENHANCEMENT 1 ZMIGO01. "active version

DATA: lt_acdoc_projected_upd2 TYPE tt_acdoc,

lt_acdoc_projected_zero2 TYPE tt_acdoc,

lr_awref_mapping2 TYPE REF TO finss_awfield_mapping,

lv_own_logsys2 TYPE t000-logsys,

lt_change_fields2 TYPE finst_fieldname,

lt_bsegkey_mwskz2 TYPE finst_bsegkey_mwskz.

* BEGIN OF ls_doc_created, "BAUSTELLE 27.01.2015

* rldnr TYPE ty_acdoc-rldnr,

* rbukrs TYPE ty_acdoc-rbukrs,

* gjahr TYPE ty_acdoc-gjahr,

* belnr TYPE ty_acdoc-belnr,

* END OF ls_doc_created.

* lt_doc_created LIKE SORTED TABLE OF ls_doc_created WITH UNIQUE DEFAULT KEY. "BAUSTELLE 27.01.2015

* Delete ACDOCA items from member table mt_acdoc_projected in specific cases.

CALL METHOD delete_items_acdoc_projected( IMPORTING et_acdoc_projected_zero = lt_acdoc_projected_zero2 ).

IF mo_acdoc_bkpf_bseg_events IS NOT INITIAL AND

mt_acdoc_projected IS NOT INITIAL. " post BKPF only if ACDOCA will be posted. If all entries in mt_acdoc_projected

" were deleted, do not post a Universal Journal Entry header

mo_acdoc_bkpf_bseg_events->if_fins_acdoc_posting_framewrk~post(

CHANGING co_acdoc_post_data = co_acdoc_post_data ).

ENDIF.

* get list of final numbers for ACDOCA items

CLEAR mt_acdoc_number[].

* New IF

IF co_acdoc_post_data IS BOUND.

mt_acdoc_number = co_acdoc_post_data->mt_acdoc_number.

* From FI Document Process

IF mt_acdoc_number IS INITIAL.

CALL FUNCTION 'FI_FIBELNR_GET'

TABLES

t_belnr = mt_acdoc_number.

* FROM RWIN

CALL FUNCTION 'FI_ACCBELNR_GET'

**********************************************************************

*修複BUG

DATA LS_mt_acdoc_number2 LIKE LINE OF mt_acdoc_number.

READ TABLE mt_acdoc_number INTO LS_mt_acdoc_number2

WITH KEY belnr_i = '% 1'

.

IF SY-SUBRC NE 0.

READ TABLE mt_acdoc_number

INTO LS_mt_acdoc_number2

WITH KEY belnr_i = '$ 1'.

if sy-subrc = 0.

LS_mt_acdoc_number2-belnr_i = '% 1'.

APPEND LS_mt_acdoc_number2 TO mt_acdoc_number.

endif.

* logical system fields (AWSYS, LOGSYSO, LOGSYSP) must be empty

* in own system; same logic as in FG GLIN:

CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'

IMPORTING

own_logical_system = lv_own_logsys2

EXCEPTIONS

OTHERS = 1.

IF ( sy-subrc <> 0 ).

CLEAR lv_own_logsys2.

CLEAR lt_bsegkey_mwskz2.

CALL FUNCTION 'FI_DOC_MWSKZ_GET'

et_bsegkey_mwskz = lt_bsegkey_mwskz2.

* assign final number to ACDOCA items to bew posted

LOOP AT mt_acdoc_projected REFERENCE INTO DATA(lr_acdoc_projected2).

* BEGINN BAUSTELLE 27.01.2015

** Set document key fields for posted documents buffer

* MOVE-CORRESPONDING lr_acdoc_projected2->* TO ls_doc_created.

*

** don't post zero lines (ignore values in ML additional value fields)

* CONSTANTS lcs_acdoca_ml_additional TYPE cl_fins_acdoc_ml_util=>ts_ml_additional_fields VALUE IS INITIAL.

* DATA(ls_value_data) = lr_acdoc_projected2->value_data.

* MOVE-CORRESPONDING lcs_acdoca_ml_additional TO ls_value_data.

* IF ls_value_data IS INITIAL.

** Do not delete the second item of an document:

** Check if first item exists (is not deleted): Yes: Post this item | No: Delete this item

* IF lr_acdoc_projected2->ktosl = gc_ktosl_2nditem.

* READ TABLE lt_doc_created FROM ls_doc_created TRANSPORTING NO FIELDS.

* IF sy-subrc <> 0.

* CLEAR lr_acdoc_projected2->ktosl.

* ENDIF.

** KTOSL = "Second item" -> Item has to be posted

** Item has to be deleted

* ELSE.

* INSERT lr_acdoc_projected2->* INTO TABLE lt_acdoc_projected_zero2.

* DELETE mt_acdoc_projected.

* CONTINUE.

* ENDE BAUSTELLE 27.01.2015

IF NOT ( lr_acdoc_projected2->poper = '000' AND lr_acdoc_projected2->bstat = 'C' ). "no balance carry foward lines here, they get an own document number

* replace temporary aw field content;

* Add document keys to posted documents buffer

* INSERT ls_doc_created INTO TABLE lt_doc_created. "BAUSTELLE 27.01.2015

* Add proper AWKEY information

READ TABLE co_acdoc_post_data->mt_awref_mapping REFERENCE INTO lr_awref_mapping2

WITH KEY temp_awtyp = lr_acdoc_projected2->awtyp

temp_awref = lr_acdoc_projected2->awref

temp_aworg = lr_acdoc_projected2->aworg.

* temp_awsys = lr_acdoc_projected2->awsys. "temporary commentedd out; clear AWSYS in calse =own syst. must be done in post, not in project

ASSERT sy-subrc = 0.

* Update references to original document now

lr_acdoc_projected2->awsys = lr_awref_mapping2->final_awsys.

lr_acdoc_projected2->awtyp = lr_awref_mapping2->final_awtyp.

lr_acdoc_projected2->awref = lr_awref_mapping2->final_awref.

lr_acdoc_projected2->aworg = lr_awref_mapping2->final_aworg.

* Get final transaction number (CO_BELNR)

IF lr_acdoc_projected2->co_belnr IS NOT INITIAL.

lr_acdoc_projected2->co_belnr = set_co_belnr(

EXPORTING

it_co_belnr_mapping = co_acdoc_post_data->mt_co_belnr_mapping

is_acdoca_item = lr_acdoc_projected2->* ).

IF lr_acdoc_projected2->co_buzei IS NOT INITIAL.

ASSERT lr_acdoc_projected2->co_belnr IS NOT INITIAL.

* get final number for ACDOCA item

IF lr_acdoc_projected2->xtruerev = abap_true.

* ACDOCA item is a real reversal

WITH KEY bukrs = lr_acdoc_projected2->rbukrs

gjahr_rev = lr_acdoc_projected2->gjahr

belnr_i = lr_acdoc_projected2->belnr

REFERENCE INTO DATA(lr_acdoc_number2).

ELSE.

gjahr = lr_acdoc_projected2->gjahr

REFERENCE INTO lr_acdoc_number2.

lr_acdoc_projected2->gjahr = lr_acdoc_number2->gjahr.

lr_acdoc_projected2->belnr = lr_acdoc_number2->belnr_e.

* clear logical system if it is identical to the own logical system:

IF ( lr_acdoc_projected2->awsys = lv_own_logsys2 ).

* AWSYS shall remain emtpy in DB in own logical system:

CLEAR lr_acdoc_projected2->awsys.

IF ( lr_acdoc_projected2->logsyso = lv_own_logsys2 ).

* LOGSYSO shall remain emtpy in DB in own logical system:

CLEAR lr_acdoc_projected2->logsyso.

IF ( lr_acdoc_projected2->logsysp = lv_own_logsys2 ).

* LOGSYSP shall remain emtpy in DB in own logical system:

CLEAR lr_acdoc_projected2->logsysp.

* SET allocation number drawn during post of FI DOCUMENT

IF lr_acdoc_projected2->zuonr IS INITIAL.

set_allocation_number(

CHANGING

cs_acdoc_projected = lr_acdoc_projected2->*

).

* set tax code substituted after event PROJECT, before event POST

determine_tax_code( EXPORTING iv_bukrs = lr_acdoc_projected2->rbukrs

iv_belnr = lr_acdoc_projected2->belnr

iv_gjahr = lr_acdoc_projected2->gjahr

iv_buzei = lr_acdoc_projected2->buzei

it_bsegkey_mwskz = lt_bsegkey_mwskz2

CHANGING cv_mwskz = lr_acdoc_projected2->mwskz ).

ENDLOOP.

* process clearing

IF mt_clear_asgmt IS NOT INITIAL.

CLEAR lt_acdoc_projected_upd2.

update_clearing_info(

it_clear_asgmt = mt_clear_asgmt

et_acdoc_cleared = lt_acdoc_projected_upd2

et_change_fields = lt_change_fields2

ct_acdoc_clearing = mt_acdoc_projected ).

* process reversal

IF ms_accrev IS NOT INITIAL.

INDEX 1.

update_reversal_info(

iv_awref = lr_awref_mapping2->final_awref

iv_aworg = lr_awref_mapping2->final_aworg

is_accrev = ms_accrev

et_acdoc_reversed = lt_acdoc_projected_upd2

ct_acdoc_reversal = mt_acdoc_projected ).

* check if reversal light apllies

ELSEIF mt_accrev_light IS NOT INITIAL.

update_reversal_light_info(

it_accrev_light = mt_accrev_light

it_acdoc_reversal = mt_acdoc_projected

ct_acdoc_reversed = lt_acdoc_projected_upd2

ct_change_fields = lt_change_fields2 ).

CLEAR mt_accrev_light.

* process settlement

IF mt_settlement IS NOT INITIAL

OR mt_reposted_item IS NOT INITIAL.

update_settlement_info(

it_settlement = mt_settlement

it_reposted = mt_reposted_item

it_acdoc_settling = mt_acdoc_projected

ct_acdoc_settled = lt_acdoc_projected_upd2

CLEAR mt_settlement.

* set the document number for automatic balance carry forward lines

set_doc_number_autom_bcf(

ct_acdoc_projected = mt_acdoc_projected ).

* Set global timestamp

DATA ls_acdoc_projected2 TYPE LINE OF finst_acdoca.

GET TIME STAMP FIELD ls_acdoc_projected2-timestamp.

MODIFY mt_acdoc_projected FROM ls_acdoc_projected2 TRANSPORTING timestamp WHERE timestamp IS INITIAL.

* Update Material Ledger Auxilliary for reconstruction the Compatibility Views

* Reason: It may happen that there are line items for the previous period but not for the current period

cl_fins_acdoc_ml_util=>auxilliary_table_update(

it_acdoca = mt_acdoc_projected

it_acdoca_zero = lt_acdoc_projected_zero2 ).

* check for ambiguous leading sign needed?

DATA(lo_fins_acdoc_change2) = NEW cl_fins_acdoc_change( ).

lo_fins_acdoc_change2->insert_acdoca(

it_acdoca_ins = mt_acdoc_projected ).

lo_fins_acdoc_change2->change_acdoca(

it_change_fields = lt_change_fields2

it_acdoca_upd = lt_acdoc_projected_upd2

iv_write_change_docs = abap_true ).

RETURN.

ENDENHANCEMENT.