İçindekiler
- Teknolojiden Önce Sorulacak Beş Soru
- Teknoloji Haritası
- IDoc: Asenkron, İzlenebilir, Yeniden İşlenebilir
- RFC ve BAPI: SAP'ler Arası Senkron Çağrı
- OData: SAP'yi Dışarıya Açmak
- ABAP'tan Dışarıya REST Çağrısı
- Olay Tabanlı Entegrasyon
- Noktadan Noktaya mı, Middleware mı?
- Hata Yönetimi ve İzleme
- Senaryoya Göre Hızlı Karar Tablosu
- Sık Yapılan Hatalar
- Sonuç
"Bu entegrasyonu REST ile mi yapalım, IDoc ile mi?" sorusu genellikle toplantının ilk beş dakikasında sorulur ve çoğu zaman ekibin en iyi bildiği teknolojiyle cevaplanır. Sonuç tanıdıktır: senkron çağrılardan oluşan kırılgan zincirler, hata verdiğinde kimsenin fark etmediği akışlar, "dün gece neden çift sipariş oluştu?" soruşturmaları.
SAP, dış dünyayla konuşmak için çok sayıda araç sunar; sorun araç eksikliği değil, seçimin gerekçesiz yapılmasıdır. Bu yazıda her aracın güçlü olduğu yeri, sahada tipik olarak nerede kırıldığını ve hataların nasıl yönetileceğini anlatıyorum.
Teknolojiden Önce Sorulacak Beş Soru
- Yön: SAP mi karşı tarafı çağırıyor, karşı taraf mı SAP'yi? Yoksa ikisi de bir aracıya mı konuşuyor?
- Cevap beklentisi: Çağıran taraf sonucu hemen mi bilmeli (senkron), yoksa "aldım, işleyeceğim" yeterli mi (asenkron)? Ekranda bekleyen bir kullanıcı var mı?
- Hacim ve sıklık: Günde on belge mi, saatte on bin mi? Anlık mı, gece toplu mu?
- Teslim garantisi: Bir mesaj kaybolursa ne olur? Aynı mesaj iki kez işlenirse ne olur? Sıra önemli mi?
- Karşı taraf: Ne konuşabiliyor? Başka bir SAP sistemi, modern bir REST API, yalnızca dosya bırakabilen eski bir sistem?
Teknoloji Haritası
| Teknoloji | Biçim | Güçlü olduğu yer | Dikkat |
|---|---|---|---|
| IDoc / ALE | Asenkron, belge tabanlı | SAP'ler arası ana veri ve belge dağıtımı, EDI; durum takibi ve yeniden işleme hazır | Format SAP'ye özgü; SAP dışı taraf için çoğunlukla aracı gerekir |
| RFC / BAPI | Senkron (tRFC/qRFC/bgRFC ile asenkron) | SAP'ler arası anlık çağrı, standart iş fonksiyonları | Sistemleri sıkı bağlar; ağ ve yetki tasarımı gerekir |
| OData (V2/V4) | Senkron, HTTP | Fiori ve dış uygulamaların SAP verisini okuyup yazması | Toplu veri aktarımı için uygun değil |
| HTTP/REST istemcisi | Senkron, HTTP | SAP'nin dış API çağırması: kargo, banka, e-belge entegratörü | Tekrar deneme ve kayıt sizin sorumluluğunuzda |
| SOAP (Enterprise Services) | Senkron veya asenkron | Mevcut SOAP sözleşmeleri, bazı standart SAP senaryoları | Yeni geliştirmede genellikle tercih edilmiyor |
| Olaylar (business events) | Asenkron, yayınla/abone ol | Bir değişikliği birden çok sisteme haber vermek | Bir olay aracısı (event broker) gerektirir |
| Dosya (SFTP) | Asenkron, toplu | Eski sistemler, yüksek hacimli gece aktarımları | Hata geri bildirimi zayıf; izleme elle kurulur |
IDoc: Asenkron, İzlenebilir, Yeniden İşlenebilir
IDoc eski görünse de çözdüğü problem hâlâ güncel: bir belgeyi başka bir sisteme güvenilir biçimde taşımak. Her IDoc'un bir numarası, bir durum geçmişi ve bir yeniden işleme yolu vardır. Bir REST entegrasyonunda sıfırdan kurmanız gereken izleme ve tekrar deneme altyapısı, IDoc'ta kutudan çıkar.
Özel bir giden IDoc oluşturmak birkaç satırdır. Hangi alıcıya, hangi port üzerinden ve ne zaman gönderileceği koddan değil, partner profilinden (WE20) gelir:
DATA communication TYPE STANDARD TABLE OF edidc WITH EMPTY KEY.
DATA data_records TYPE STANDARD TABLE OF edidd WITH EMPTY KEY.
DATA(control) = VALUE edidc( mestyp = 'ZSHIPMENT'
idoctp = 'ZSHIPMENT01'
rcvprt = 'LS'
rcvprn = 'CARRIER01' ).
" Segment yapısı düz ve karakter tipli olmalı
data_records = VALUE #( ( segnam = 'Z1SHIPHDR'
sdata = shipment_header ) ).
CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
master_idoc_control = control
TABLES
communication_idoc_control = communication
master_idoc_data = data_records
EXCEPTIONS
error_in_idoc_control = 1
error_writing_idoc_status = 2
error_in_idoc_data = 3
sending_logical_system_unknown = 4
OTHERS = 5.
IF sy-subrc = 0.
" IDoc, çağıran programın commit'i ile kalıcı olur
COMMIT WORK.
ENDIF.communication tablosu oluşan IDoc numaralarını döndürür; bunları kendi belgenizle ilişkilendirip kaydetmek, ileride "bu sevkiyat hangi IDoc ile gitti?" sorusunu saniyeler içinde cevaplatır.
IDoc'un günlük araçları
WE02 / WE05: IDoc listesi ve segment içeriği. BD87: hatalı IDoc'ları düzeltip yeniden işleme. WE20 / WE21: partner profili ve port. WE19: mevcut bir IDoc'tan test IDoc'u üretme. Destek ekibinin bu dört ekranı tanıması, entegrasyon hatalarının büyük kısmının geliştiriciye ulaşmadan çözülmesi demektir.
RFC ve BAPI: SAP'ler Arası Senkron Çağrı
İki SAP sistemi arasında "şimdi şu belgeyi oluştur ve numarasını bana söyle" ihtiyacı varsa RFC üzerinden BAPI çağrısı hâlâ en kısa yoldur. Ama iki tür hatayı birbirinden ayırmak şarttır:
DATA return TYPE STANDARD TABLE OF bapiret2 WITH EMPTY KEY.
DATA rfc_msg TYPE c LENGTH 200.
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
DESTINATION 'ERP_PROD'
EXPORTING
order_header_in = header
IMPORTING
salesdocument = sales_document
TABLES
return = return
order_items_in = items
order_partners = partners
EXCEPTIONS
system_failure = 1 MESSAGE rfc_msg
communication_failure = 2 MESSAGE rfc_msg
OTHERS = 3.
IF sy-subrc <> 0.
" Teknik hata: ağ, karşı sistem, yetki. Tekrar denemek anlamlı olabilir.
RETURN.
ENDIF.
IF line_exists( return[ type = 'E' ] ) OR line_exists( return[ type = 'A' ] ).
" İş hatası: veri yanlış. Tekrar denemek sonucu değiştirmez.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' DESTINATION 'ERP_PROD'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' DESTINATION 'ERP_PROD'
EXPORTING
wait = abap_true.
ENDIF.Bu kodda üç şey kritik. BAPI'ler kendi kendine commit etmez; BAPI_TRANSACTION_COMMIT aynı destination ile, yani aynı RFC oturumunda çağrılmalıdır. RETURN tablosu kontrol edilmeden yapılan commit, hatalı belgeyi yarım bırakabilir. Ve teknik hata ile iş hatası ayrı ele alınmalıdır: veri hatası olan bir çağrıyı otomatik tekrar denemek, aynı hatayı yüz kez üretmekten başka işe yaramaz.
Cevabın hemen gerekmediği ama teslimin garanti olması gereken durumlarda senkron RFC yerine bgRFC (background RFC) tercih edilmelidir: çağrı kuyruğa alınır, karşı sistem kapalıysa daha sonra iletilir ve kuyruk tipine göre sıra korunur. Eski tRFC ve qRFC'nin yerini alan modern altyapı budur; izleme ekranı SBGRFCMON'dur.
OData: SAP'yi Dışarıya Açmak
Bir Fiori uygulaması, bir mobil uygulama veya bir web portalı SAP verisini anlık okuyup yazacaksa doğru araç OData'dır. S/4HANA'da yeni servisler CDS ve RAP ile yazılır; aynı iş nesnesi bir UI binding ile Fiori'ye, bir Web API binding ile dış sistemlere açılabilir. Böylece dış sistem de Fiori kullanıcısıyla aynı doğrulamalardan geçer.
Servisin nasıl kurulduğunu OData V4 ve CDS yazısında, iş kurallarının nasıl yazıldığını RAP rehberinde anlattım. Entegrasyon açısından iki uyarı yeterli:
- OData toplu aktarım aracı değildir. Gece yüz bin kaydı sayfa sayfa OData ile çekmek mümkündür ama hem SAP'yi hem karşı tarafı gereksiz yorar. Toplu veri için replikasyon, dosya veya analitik çıkarım araçları daha uygundur.
- Dış tüketiciye ayrı servis açın. Fiori için yazılmış bir UI servisini dış sisteme vermek, ekran ihtiyacı değiştiğinde entegrasyonu kırar. Web API binding'i ve ayrı bir projeksiyon, sözleşmeyi bağımsız tutar.
ABAP'tan Dışarıya REST Çağrısı
Türkiye'deki projelerde çok sık görülen bir senaryo bu yöndedir: SAP'nin bir kargo firmasının, bir bankanın veya bir e-belge entegratörünün API'sini çağırması. Aşağıdaki örnek bir sevkiyatı taşıyıcı API'ye gönderir. Adres ve kimlik bilgileri kodda değil, SM59'daki HTTP destination'dadır:
TRY.
DATA(destination) = cl_http_destination_provider=>create_by_http_destination(
i_name = 'Z_CARRIER_API' ).
DATA(client) = cl_web_http_client_manager=>create_by_http_destination( destination ).
DATA(payload) = xco_cp_json=>data->from_abap( shipment
)->apply( VALUE #( ( xco_cp_json=>transformation->underscore_to_camel_case ) )
)->to_string( ).
DATA(request) = client->get_http_request( ).
request->set_uri_path( '/v1/shipments' ).
request->set_header_field( i_name = 'Content-Type' i_value = 'application/json' ).
" Aynı sevkiyat iki kez gönderilirse karşı taraf ikinci kaydı oluşturmasın
request->set_header_field( i_name = 'Idempotency-Key' i_value = shipment-shipment_id ).
request->set_text( payload ).
DATA(response) = client->execute( if_web_http_client=>post ).
DATA(status) = response->get_status( ).
DATA(body) = response->get_text( ).
client->close( ).
IF status-code <> 201.
log_error( external_id = shipment-shipment_id
text = |Taşıyıcı API { status-code } döndü: { body }| ).
ENDIF.
CATCH cx_http_dest_provider_error cx_web_http_client_error INTO DATA(error).
log_error( external_id = shipment-shipment_id
text = error->get_text( ) ).
ENDTRY.Hata, ekranda kaybolan bir mesaj olarak değil, uygulama günlüğüne (SLG1) yazılır. Released BALI sınıflarıyla bu birkaç satırdır; günlük nesnesi (ZINTEGRATION) önceden tanımlanmalıdır:
METHOD log_error.
TRY.
DATA(log) = cl_bali_log=>create_with_header(
cl_bali_header_setter=>create( object = 'ZINTEGRATION'
subobject = 'CARRIER'
external_id = CONV #( external_id ) ) ).
log->add_item( cl_bali_free_text_setter=>create(
severity = if_bali_constants=>c_severity_error
text = CONV #( text ) ) ).
cl_bali_log_db=>get_instance( )->save_log( log = log ).
CATCH cx_bali_runtime.
" Günlük yazılamasa bile asıl işi durdurma
ENDTRY.
ENDMETHOD.Bu örnekte bilinçli olan üç karar
Destination: URL, sertifika ve kimlik bilgisi yapılandırmada; test ve canlı sistem aynı kodla farklı adreslere gider. Şifreyi kodda veya bir Z tablosunda tutmak hem güvenlik hem denetim sorunudur. Idempotency anahtarı: ağ zaman aşımında istek karşı tarafa ulaşmış olabilir; tekrar denediğinizde çift kayıt oluşmamasını sağlar (karşı API destekliyorsa). External ID: SLG1'de sevkiyat numarasıyla arama yapılabilir; destek ekibi hatayı belgeden bulur.
Olay Tabanlı Entegrasyon
"Talep onaylandığında İK sistemine, bordro sistemine ve bildirim servisine haber ver" gibi bir ihtiyacı üç ayrı senkron çağrıyla çözmek, SAP'yi üç sistemin de ayakta olmasına bağımlı kılar. Olay tabanlı yaklaşımda SAP yalnızca "talep onaylandı" olayını yayınlar; kimin dinlediğini bilmez.
Güncel S/4HANA sürümlerinde bunun yolu RAP business event'leridir. Olay behavior definition'da tanımlanır:
define behavior for ZR_LeaveRequest alias LeaveRequest
// ... diğer tanımlar
{
event LeaveApproved;
}ve kaydetme aşamasında — veri gerçekten kalıcı olurken — yayınlanır. Bu, RAP rehberindeki with additional save senaryosudur:
METHOD save_modified.
RAISE ENTITY EVENT zr_leaverequest~LeaveApproved
FROM VALUE #( FOR request IN update-leaverequest
WHERE ( Status = 'A' AND %control-Status = if_abap_behv=>mk-on )
( %key = request-%key ) ).
ENDMETHOD.Olayın dışarıya ulaşması için bir event binding ve bir olay aracısı (SAP Event Mesh, Advanced Event Mesh veya kurumun kullandığı başka bir broker) gerekir. Olayı kaydetme aşamasında yayınlamak önemlidir: işlem geri alınırsa olay da hiç çıkmaz, dinleyiciler var olmayan bir onaya tepki vermez.
Noktadan Noktaya mı, Middleware mı?
İki sistem ve tek bir akış varsa doğrudan bağlantı genellikle yeterlidir ve daha az parça demektir. Middleware (SAP Integration Suite, SAP PO veya başka bir entegrasyon platformu) şu durumlarda kendini öder:
- Aynı veri birden çok sisteme gidiyor ve her biri farklı format istiyor.
- Format dönüşümü, yönlendirme kuralları veya protokol çevirisi (IDoc → REST, dosya → OData) gerekiyor.
- Bütün akışları tek yerden izlemek, uyarı üretmek ve yeniden işlemek isteniyor.
- Kurum dışı ortaklarla EDI gibi standart protokoller konuşuluyor.
Hâlâ SAP PO kullanan kurumlar için not: SAP'nin açıkladığı bakım takvimine göre PO 7.5'in ana bakımı 2027 sonunda sona eriyor. Yeni akışları PO'da büyütmek yerine Integration Suite'e geçiş planının parçası olarak tasarlamak mantıklıdır; güncel tarihleri SAP'nin bakım stratejisinden teyit edin.
Hata Yönetimi ve İzleme
Bir entegrasyonun kalitesi, her şey yolundayken değil, bir şey bozulduğunda belli olur. Tasarım aşamasında şu dört soruya cevap verilmiş olmalıdır:
1. Teknik mi, iş hatası mı?
Zaman aşımı, bağlantı hatası, karşı tarafın 503 cevabı: tekrar denenebilir. Eksik müşteri, kapalı dönem, geçersiz malzeme: tekrar denemek işe yaramaz, birinin veriyi düzeltmesi gerekir. İki hata türü farklı kuyruklara ve farklı kişilere gitmelidir.
2. Tekrar deneme güvenli mi?
Aynı mesajın iki kez işlenmesi çift belge üretiyorsa, otomatik tekrar deneme bir hatayı başka bir hataya çevirir. Alıcı tarafta tekil anahtar kontrolü veya idempotency anahtarı bu riski kapatır.
3. Hata kime, nasıl ulaşıyor?
Uygulama günlüğüne yazılan ama kimsenin bakmadığı bir hata, hiç yazılmamış bir hatadan farksızdır. Ya bir izleme ekranı düzenli kontrol edilmeli ya da kritik hatalar e-posta veya uyarı olarak sorumluya gitmelidir.
4. Bir belgenin yolculuğu izlenebiliyor mu?
SAP belge numarası, IDoc numarası, karşı sistemin referansı ve günlük kaydı birbirine bağlanmalıdır. "Bu sipariş karşıya ulaştı mı?" sorusu birden çok ekranda arama gerektiriyorsa, ilk ciddi olayda saatler kaybedilir.
| Teknoloji | İzleme | Yeniden işleme |
|---|---|---|
| IDoc | WE02, WE05 | BD87 |
| tRFC / qRFC | SM58, SMQ1, SMQ2 | Aynı ekranlardan |
| bgRFC | SBGRFCMON | SBGRFCMON |
| Gateway / OData | /IWFND/ERROR_LOG, /IWFND/TRACES | İstemci tarafında |
| Özel HTTP çağrıları | SLG1 (uygulama günlüğü) | Sizin tasarladığınız mekanizma |
Tablonun son satırına dikkat: kendi yazdığınız REST entegrasyonlarında yeniden işleme mekanizması yoktur, siz kurarsınız. Basit ama etkili bir yol, gönderilemeyen kayıtları durumuyla birlikte bir tabloya yazıp periyodik bir arka plan işiyle tekrar denemektir.
Senaryoya Göre Hızlı Karar Tablosu
| Senaryo | Önerilen yaklaşım |
|---|---|
| Fiori veya web uygulaması SAP verisini anlık okuyup yazacak | OData V4 (CDS + RAP) |
| Dış sistem SAP'de belge oluşturacak ve sonucu hemen bekliyor | RAP üzerinde Web API binding; SAP'ler arasında BAPI over RFC |
| SAP sistemleri arasında ana veri dağıtımı | IDoc / ALE |
| Yüksek hacimli belge akışı, gecikme kabul edilebilir | IDoc veya bgRFC; çok yüksek hacimde dosya |
| SAP bir dış API'yi çağıracak (kargo, banka, e-belge) | HTTP istemcisi + destination + uygulama günlüğü |
| Bir değişiklik birden çok sisteme duyurulacak | RAP business event + olay aracısı |
| Çok sistem, format dönüşümü, merkezi izleme | Integration Suite (veya mevcut middleware) |
Sık Yapılan Hatalar
Senkron zincirler kurmak
Kullanıcı kaydet'e basar, SAP A sistemini çağırır, A sistemi B'yi çağırır. Zincirdeki en yavaş halka bütün akışın hızını, en kırılgan halka bütün akışın erişilebilirliğini belirler. Kullanıcının sonucu hemen görmesi gerekmiyorsa zinciri asenkron bir adımla kırın.
Kimlik bilgisini kodda veya tabloda tutmak
Kodda yazılmış bir API anahtarı, transport ile her sisteme ve kaynak koda erişimi olan herkese gider. Kimlik bilgileri SM59 destination'larında veya communication arrangement'larda, sertifikalar STRUST'ta tutulmalıdır.
Başarıyı yalnızca HTTP 200 ile ölçmek
Bazı API'ler iş hatasını 200 cevabının gövdesinde döndürür. Sözleşmeyi okuyun; durum kodunun yanında cevap gövdesindeki sonuç alanını da kontrol edin.
Entegrasyonu ekranın içine gömmek
Dış API çağrısını doğrudan kullanıcı kaydının içinde yapmak, karşı taraf yavaşladığında SAP ekranını da yavaşlatır ve hata durumunda kaydın kendisini riske atar. Belgeyi kaydedin, gönderimi ayrı bir adıma (bgRFC, arka plan işi, olay) bırakın.
Test ortamında canlı API'ye bağlanmak
Test sisteminden canlı kargo veya banka API'sine giden bir çağrı, gerçek bir gönderi veya gerçek bir ödeme talimatı üretebilir. Her ortamın kendi destination'ı olmalı ve sistem kopyalamalarından sonra destination'lar kontrol listesinin ilk maddesi olmalıdır.
Sonuç
SAP entegrasyonunda "en iyi teknoloji" yoktur; senaryoya uyan teknoloji vardır. IDoc hâlâ belge taşımanın en izlenebilir yoludur, RFC hâlâ SAP'ler arası anlık çağrının en kısa yoludur, OData SAP'yi uygulamalara açmanın, HTTP istemcisi dış API'lere ulaşmanın, olaylar ise sistemleri birbirinden ayırmanın yoludur.
Seçimi belirleyen, teknolojiden önce sorulan sorulardır: cevap hemen mi gerekiyor, mesaj kaybolursa ya da iki kez gelirse ne olur, hata kime ulaşacak? Bu soruların cevabı netse, teknoloji seçimi çoğu zaman kendiliğinden ortaya çıkar. Entegrasyon projelerinde sunduğum kapsamı entegrasyon hizmet sayfasında bulabilirsiniz.
Entegrasyon mimarisi, mevcut akışların gözden geçirilmesi ve ABAP tarafı geliştirmeler için destek alın.
Ön Görüşme Talep Et