Homelab, Linux, JS & ABAP (~˘▾˘)~
 

[ABAP] BAPI_ACC_DOCUMENT_POST

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.

Leave a Reply

Your email address will not be published. Required fields are marked *