пятница, 1 июня 2012 г.

BAPI_ACC_DOCUMENT_POST

**********************************************************************
  DATA ls_hdr                     TYPE bapiache09.
  DATA lt_acc                     TYPE TABLE OF bapiacgl09.
  DATA ls_acc                     TYPE bapiacgl09.
  DATA lt_amt                     TYPE TABLE OF bapiaccr09.
  DATA ls_amt                     TYPE bapiaccr09.
  DATA lt_ext                     TYPE TABLE OF bapiparex.
  DATA ls_ext                     TYPE bapiparex.
  DATA lt_ret                     TYPE TABLE OF bapiret2.
  DATA lt_ret_all                 TYPE TABLE OF bapiret2.
  DATA lv_obj_type                TYPE bapiache09-obj_type.
  DATA lv_obj_key                 TYPE bapiache09-obj_key.
  DATA lv_test                    TYPE xfeld.
  DATA lv_error                   TYPE xfeld.

  DO 2 TIMES. " Проверим создание кредиторского и дебиторского документа
    IF sy-index EQ 1.
      lv_test = 'X'.
    ELSE.
      CHECK lv_error IS INITIAL AND i_test IS INITIAL.
      CLEAR lt_ret_all[].
      lv_test = ''.
    ENDIF.

    LOOP AT g_tab ASSIGNING .
* Создание корректирующей проводки – Проводка кредиторской задолженности
      CLEAR ls_hdr.
      CLEAR lt_acc[].
      CLEAR lt_amt[].
      CLEAR lt_ret[].
      CLEAR lt_ext[].

      ls_hdr-username     = sy-uname.
      ls_hdr-comp_code    = -bukrs.
      ls_hdr-doc_date     = date_doc.
      ls_hdr-pstng_date   = date_post.
      ls_hdr-doc_type     = blart.

      CLEAR ls_acc.
      ls_acc-itemno_acc = 1.
      ls_acc-acct_type  = 'S'.
      ls_acc-gl_account = -saknr1.
      INSERT ls_acc INTO TABLE lt_acc.

      CLEAR ls_amt.
      ls_amt-itemno_acc = ls_acc-itemno_acc.
      ls_amt-currency   = 'RUB'.
      ls_amt-amt_doccur = - -saldo.
      INSERT ls_amt INTO TABLE lt_amt.

      ADD 1 TO ls_acc-itemno_acc.
      ls_acc-gl_account = -saknr2.
      INSERT ls_acc INTO TABLE lt_acc.

      ls_amt-itemno_acc = ls_acc-itemno_acc.
      ls_amt-amt_doccur = - ls_amt-amt_doccur.
      INSERT ls_amt INTO TABLE lt_amt.
*
      IF lv_test IS NOT INITIAL.
        CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
          EXPORTING
            documentheader = ls_hdr
          TABLES
            accountgl      = lt_acc
            currencyamount = lt_amt
            extension2     = lt_ext
            return         = lt_ret.
      ELSE.
        CLEAR lv_obj_key.
        CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
          EXPORTING
            documentheader = ls_hdr
          IMPORTING
            obj_type       = lv_obj_type
            obj_key        = lv_obj_key
          TABLES
            accountgl      = lt_acc
            currencyamount = lt_amt
            extension2     = lt_ext
            return         = lt_ret.
      ENDIF.

      INSERT LINES OF lt_ret INTO TABLE lt_ret_all.
      LOOP AT lt_ret TRANSPORTING NO FIELDS WHERE type EQ 'E' OR type EQ 'A'.
        lv_error = 'X'.
        EXIT.
      ENDLOOP.
      IF lv_error IS INITIAL AND lv_test IS INITIAL.
        ls_alv = .
        ls_alv-belnr = lv_obj_key+0(10).
        ls_alv-gjahr = lv_obj_key+14(4).
        INSERT ls_alv INTO TABLE lt_alv.
      ENDIF.
    ENDLOOP.
  ENDDO.
*
  IF i_test IS INITIAL.
    IF lv_error IS NOT INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ENDIF.
  ENDIF.

* Покажем лог, если были ошибки
  IF lv_error IS NOT INITIAL.
    CALL FUNCTION 'FINB_BAPIRET2_DISPLAY'
      EXPORTING
        it_message = lt_ret_all.
  ELSEIF i_test IS NOT INITIAL.
    MESSAGE 'Моделирование прошло без ошибок' TYPE 'I'.
  ENDIF.
**********************************************************************

Комментариев нет: