How to handle BAPI_ACC_DOCUMENT_POST with a document split at position 980. The method create_document
fills the necessary tables and calls post_document
, if it reaches position 980, to post the current document. Then the method create_document
calls itself recursive for the next positions.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | METHOD create_document. DATA : lt_pos TYPE TABLE OF bapiacgl09, lt_pos_amt TYPE TABLE OF bapiaccr09. gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_info iv_text = |Beginne Belegerstellung| iv_alog = abap_true ). "Belegkopf DATA (ls_documentheader) = VALUE bapiache09( comp_code = gs_sel-p_bukrs header_txt = | header text| pstng_date = sy-datum doc_date = sy-datum fisc_year = sy-datum (4) fis_period = sy-datum +4(2) doc_type = gs_sel-p_blart username = sy-uname ). "Fülle Positionen LOOP AT it_xxx ASSIGNING FIELD - SYMBOL (<ls_xxx>). APPEND VALUE #( itemno_acc = lines ( lt_pos ) + 1 gl_account = <ls_xxx>-hkont stat_con = abap_false acct_type = 'S' "Sachkonto bus_area = '0030' fis_period = sy-datum +4(2) fisc_year = sy-datum (4) pstng_date = sy-datum value_date = sy-datum item_text = |item text| alloc_nmbr = <ls_xxx>-zuonr doc_type = <ls_xxx>-blart comp_code = <ls_xxx>-bukrs func_area = '0030' costcenter = <ls_xxx>-kostl tax_code = <ls_xxx>-mwskz ) TO lt_pos. APPEND VALUE #( itemno_acc = lines ( lt_pos_amt ) + 1 curr_type = '00' "Belegwährung currency = |EUR| amt_doccur = <ls_xxx>-betrg ) TO lt_pos_amt. "Belegsplit notwendig? IF lines ( lt_pos ) = 980. gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_statistic iv_text = |Belegsplit notwendig!| iv_alog = abap_true ). "Verbuche die aktuellen Positionen post_document( is_documentheader = ls_documentheader it_pos = lt_pos it_pos_amt = lt_pos_amt ). "Rekursiver Aufruf der Methode! Nur mit den Sätzen die noch nicht verarbeitet wurden create_document( it_xxx = FILTER #( it_xxx USING KEY sort_key WHERE xxx = xxx ) ). "Verlasse bei Rekursion hier RETURN . ENDIF . ENDLOOP . "Wenn alle Positionen hinzugefügt, lege den Beleg an post_document( is_documentheader = ls_documentheader it_pos = lt_pos it_pos_amt = lt_pos_amt ). ENDMETHOD . |
Calling the BAPI:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | METHOD post_document. DATA lt_return TYPE STANDARD TABLE OF bapiret2. IF gs_sel-p_test = abap_true . gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_info iv_text = |Testlauf: Keine Belegbuchung| iv_alog = abap_true ). RETURN . "Im Testlauf hier verlassen ENDIF . SET UPDATE TASK LOCAL . CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST' EXPORTING documentheader = is_documentheader TABLES accountgl = it_pos currencyamount = it_pos_amt return = lt_return. "Protokollzeilen mit BAPI Meldungen hinzufügen LOOP AT lt_return ASSIGNING FIELD - SYMBOL (<ls_return>). gr_listlog->append_log_entry( iv_type = <ls_return>- type iv_text = CONV #( <ls_return>- message ) iv_alog = abap_true ). ENDLOOP . "Prüfen, ob eine Fehlermeldung vorliegt IF line_exists ( lt_return[ type = 'A' ] ) OR line_exists ( lt_return[ type = 'E' ] ). "Rollback CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' . ELSE . "Alles gut -> commit CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X' . "Protokollzeile mit der Erzeugten Belegnummer nochmal explizit ins Log DATA (lv_documentnumber) = lt_return[ 1 ]-message_v2(10). "hier steht laut Doku die Belegnummer drin gr_listlog->append_log_entry( iv_type = gr_listlog->gc_log_type_success iv_text = |Belegnummer: { lv_documentnumber }| iv_alog = abap_true ). ENDIF . ENDMETHOD . |