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.
  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:
  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.
