ABAP8 Haziran 2026· 5 dk okuma

Muhasebe Belgesi Oluşturma: BAPI_ACC_DOCUMENT_POST ve EXTENSION Alanları

Enes Malik Yüksek

Muhasebe Belgesi Oluşturma: BAPI_ACC_DOCUMENT_POST ve EXTENSION Alanları

Muhasebe Belgesi Oluşturma: BAPI_ACC_DOCUMENT_POST ve EXTENSION Alanlarının Kullanımı


SAP sistemlerinde muhasebe belgesi oluşturmak için ABAP raporlarında sıklıkla tercih edilen yöntemlerden biri BAPI kullanmaktır. Bu amaç için kullanılan standart BAPI, BAPI_ACC_DOCUMENT_POST'tur.

BAPI_ACC_DOCUMENT_POST Nedir?

BAPI_ACC_DOCUMENT_POST, SAP'de muhasebe belgelerini (Accounting Document) otomatik olarak oluşturmak için kullanılan standart bir arayüzdür. Belge içeriğini parametre olarak alır ve rapor içerisinde belgeyi otomatik olarak kaydeder.

Bu BAPI'nin temel parametreleri IMPORT, EXPORT ve TABLES olarak ayrılır. Ancak standart arayüzde yer almayan ek verileri veya özelleştirilmiş alanları aktarmak için EXTENSION1, EXTENSION2 ve CRITERIA parametreleri kullanılır.

EXTENSION1, EXTENSION2 ve CRITERIA Alanları Nedir? Farkları Nelerdir?

BAPI'de bulunan bu uzatma parametreleri, standart arayüzde bulunmayan ek verilerin veya özelleştirilmiş alanların aktarılmasına ve kârlılık analizi (CO-PA) verilerinin atanmasına olanak tanır.

Boyutsal Türetme (CRITERIA)

  • Amaç: Doğrudan SAP'nin Kontrol (CO) ve Karlılık Analizi (CO-PA) türetme motoruna veri sağlar.
  • İşlev: Muhasebe belgesi hareketinin hangi Karlılık Segmentine ait olacağının doğru boyutlarla belirlenmesine yardımcı olur.
  • Gereksinim: Bu süreç, BAPI’nin dahili mantığı içerisinde, özel bir BAdI geliştirmesine ihtiyaç duyulmadan yürütülür.

Genel Alan Modifikasyonu (EXTENSION1/EXTENSION2)

  • Amaç: CO-PA türetme mantığıyla doğrudan ilgili olmayan, belgenin nihai kaydedilmiş hali üzerindeki herhangi bir özel alanın veya standart alanın güncellenmesi/eklenmesi için kullanılır.
  • İşlev: Aktarılan bu verilerin BAPI içinde anlam kazanması ve belgeye uygulanması, mutlak suretle bir müşteri geliştirimi (BAdI) gerektirir.
  • Tercih: EXTENSION2, genellikle ACC_DOCUMENT BAdI'si ile birlikte kullanılan, daha esnek ve güncel bir uzatma mekanizmasıdır. Çoğu modern geliştirme senaryosunda bu alan tercih edilir.

EXTENSION2 Parametresinin Kullanım Mantığı

EXTENSION2 tablosu, aktarılacak verileri yapısal olarak paketler. İçerdiği alanlar şunlardır:

Alan Adı Açıklama
STRUCTURE Aktarılacak verinin orijinal SAP yapısının adı (örneğin: BKPF, BSEG, ACCIT, ACCHD). Hangi tabloya veya yapıya veri aktarılacağını belirtir.
VALUEPART1 Veri paketinin ilk 240 karakterlik kısmı (Pozisyon numarası vb. kullanılabilir).
VALUEPART2 Veri paketinin ikinci 240 karakterlik kısmı (Hedef yapının adı kullanılabilir).
VALUEPART3 Veri paketinin üçüncü 240 karakterlik kısmı (Hedef alanın adı).
VALUEPART4 Veri paketinin dördüncü 240 karakterlik kısmı (Hedef alanın değeri).

Nasıl Kullanılır? (BAdI Uygulaması)

Bu uzatma tabloları tek başlarına çalışmaz. Aktarılan verilerin muhasebe belgesi yapılarındaki (örneğin ACCHD, ACCIT) karşılık gelen alanlara atanması için mutlaka bir BAdI implementasyonu gerekir. BADI_ACC_DOCUMENT BAdI'sinin CHANGE metodu bu atamayı yapmak için kullanılır.

Aşağıdaki ABAP kodu, BAdI içerisinde EXTENSION2 parametresinden gelen veriyi okuyarak muhasebe belgesi yapılarındaki ilgili alanı güncelleyen temel mantığı göstermektedir:


DATA: t_extension2 TYPE STANDARD TABLE OF bapiparex.

FIELD-SYMBOLS: <fs_table>   TYPE STANDARD TABLE,
               <fs_header>  TYPE any,
               <fs_field>   TYPE any,
               <fs_extens>  TYPE bapiparex,
               <fs_extens2> TYPE bapiparex.

t_extension2[] = c_extension2[].
SORT t_extension2.
DELETE ADJACENT DUPLICATES FROM t_extension2 COMPARING ALL FIELDS.

LOOP AT t_extension2 ASSIGNING <fs_extens>.
  IF NOT <fs_extens>-valuepart1 IS INITIAL.
    UNASSIGN: <fs_table>.
    * VALUEPART2 alanındaki hedef tablo/yapı adını temizleme (Örn: 'C_ACCIT')
    CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
      EXPORTING
        intext  = <fs_extens>-valuepart2
      IMPORTING
        outtext = <fs_extens>-valuepart2
      EXCEPTIONS
        OTHERS  = 6.
    
    * Hedef tabloya (Örn: C_ACCIT) dynamic olarak atama
    ASSIGN (<fs_extens>-valuepart2) TO <fs_table>.
    CHECK sy-subrc = 0.
    
    TRY.
      * Belge içerisindeki ilgili pozisyonu bulma
      READ TABLE <fs_table> WITH KEY ('BAPI_PARAM') = <fs_extens>-structure
                                    ('POSNR')      = <fs_extens>-valuepart1 ASSIGNING <fs_header>.
      CHECK sy-subrc = 0.
      
      * Aynı pozisyon için EXTENSION2'deki tüm alanları döngüye alma
      LOOP AT c_extension2 ASSIGNING <fs_extens2> 
          WHERE structure  = <fs_extens>-structure
          AND   valuepart1 = <fs_extens>-valuepart1
          AND   valuepart2 = <fs_extens>-valuepart2.
        
        UNASSIGN: <fs_field>.
        * VALUEPART3'teki alan adını (Örn: 'BSCHL') hedef yapıdaki (C_ACCIT) ilgili alana atama
        ASSIGN COMPONENT <fs_extens2>-valuepart3 OF STRUCTURE <fs_header> TO <fs_field>.
        CHECK sy-subrc = 0.
        
        * VALUEPART4'teki değeri (Örn: '37') alana set etme
        <fs_field> = <fs_extens2>-valuepart4.
      ENDLOOP.
      
    CATCH cx_root.
      UNASSIGN: <fs_table>.
    ENDTRY.
  ENDIF.
ENDLOOP.
        

Örnek Senaryo: Kayıt Anahtarı (BSCHL) Güncelleme

Yukarıdaki BAdI implementasyonu ile beraber, ABAP raporunda EXTENSION2 parametresi kullanılarak bir alıcı (Account Payable) pozisyonunun Kayıt Anahtarı (BSCHL) alanının '31' değerinden '37' değerine güncellenmesi sağlanabilir.

BAPI'ye Gönderilecek EXTENSION2 İçeriği:


APPEND VALUE #( structure = 'ACCOUNTPAYABLE' "BAPI'deki hesap tablosunun adı
               valuepart1 = '0000000002'   "Değiştirilecek pozisyon numarası
               valuepart2 = 'C_ACCIT'      "Hedef belge yapısı
               valuepart3 = 'BSCHL'        "Değiştirilecek alan
               valuepart4 = '37' )         "Yeni değer
TO lt_extension2.
        

BAPI Çağrısı:


CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
  EXPORTING
    documentheader = ls_documentheader
  IMPORTING
    obj_key        = lv_obj_key
  TABLES
    accountgl      = lt_accountgl
    accountpayable = lt_accountpayable
    currencyamount = lt_currencyamount
    return         = lt_return
    extension2     = lt_extension2. "Uzatma tablosu BAPI'ye geçirilir
        

Bu kullanım sonucunda, muhasebe belgesi oluşurken alıcı (Account Payable) pozisyonunun Kayıt Anahtarı (BSCHL) alanı BAdI içerisindeki kod sayesinde '37' olarak güncellenir. Oluşan belge görüntüsü:

Oluşan Belge Görüntüsü

Notlar ve gereksinimler

  • EXTENSION2 verileri tek başına çalışmaz — BAdI (ör. BADI_ACC_DOCUMENT) içinde bu verilerin ilgili yapıya kopyalanması gerekir.
  • BAdI içinde genellikle CHANGE metodu kullanılarak gelen extension2 tablosundaki satırlar ilgili ACCHD / ACCIT / BSEG gibi yapılara atanır.
  • Her SAP sürümünde veya müşteriye özel projede farklı iç yapı isimleri olabilir; bu nedenle kullanmadan önce çevrenizdeki BAdI uygulamasını kontrol edin.
Destekleri için Mustafa Zorlu'ya teşekkürler
Enes Malik Yüksek - Abap Consultant