Genel hatlarıyla SAP ME PAPI
Üretim işlevselliği sağlayan bir yazılım birimi olan SAP ME PAPI, yeni iş talimatları için business servisleri geliştirilebiliyor, kullanılabiliyor ve genişletilebiliyor.
SAP ME, üretim işlevselliğini business servisler aracılığıyla sunuyor. SFC’leri başlatmak için SfcStartService ve bileşenleri monte etmek için AssemblyService servislerini SAP ME PAPI için uygun örnekler olarak vermek mümkün.
SAP ME Service Extension nedir?
SAP ME Service Extension,üretim süreçlerinin spesifik gereksinimlerini karşılamak için standart bir servis yönteminin davranışını ya da işleyişini değiştiren bir tür servis uzantısı olarak karşımıza geliyor.
SAP ME’deki bir servis (PAPI), SFC, sipariş, yönlendirme ve montaj gibi belirli bir kavram için fonksiyonalite sağlayan bir dizi işleyişi kapsıyor. Her fonksiyon, servisler aracılığıyla özelleştirilebiliyor.
Örneğin, ShopOrderService adlı bir servisimiz, sipariş oluşturmak, başlatmak ve kapatmak için alternatif fonksiyonları sağlıyor. Siparişlerin nasıl oluşturulduğunu, onaylandığını veya kapatıldığını özelleştirmek ya da sürece spesifik eklemeler yapmak için SAP ME Service Extension kullanılıyor.
Servisler amaca göre paket adı verilen gruplar halinde düzenleniyor. Paketler aşağıdaki kurallara göre adlandırılıyor.
com.<sağlayıcı firma adı>.<ürün>.<fonksiyonel isim>
SAP ME beraberinde standart servisleri de getiriyor. Standartla beraber gelen tüm servisler, özel geliştirme ile eklenen servislerden kolayca ayırt edilebilmeleri için yukarıdaki isimlendirmede sağlayıcı firma olarak “sap” ve ürün olaraksa “me” kullanılıyor. Bu sayede, hangi servislerin standart hangilerinin özel servisler olduğunu anlayabilmekteyiz. Örneğin, depo ilgili temel servisler “com.sap.me.inventory” pakedinde bulunuyor.
SAP ME’de her servis iki ana kısımdan oluşuyor. Bunlardan ilki iş kurallarının yazıldığı NWDS sistemindeki kod kısmına denk geliyor. Oluşturulan kod bloğunun SAP ME ile haberleşebilmesi için bir aktivite oluşuturup bağlantısının yapılması gerekiyor. Bu aktivite de ikinci adımı temsil ediyor. Bu iki adımın birleşmesiyle bir servis uzantısı oluşturuluyor.
Genellikle geliştirici, hangi servisi genişleteceğini belirliyor ve servisi oluşturmadan önce ilk olarak servis uzantısının aktivite özelliklerinin belirlendiği IDAT dosyasını oluşturuyor. IDAT dosyasının içerisinde servisin adını, servisin bağlanacağı aktivitenin kullanılabilir/etkin olup olmamasının ve dosya yolu gibi özellikleri belirtiliyor.
Oluşturulan servis uzantıları, aktiviteye bağlı olduğundan dolayı, SAP ME içerisinde birden fazla konumda yinelenerek kullanılabiliyor.
SAP ME Service Extension noktaları
- PRE
Pre, servis çalışmadan hemen önce yapılacak olan işlemleri belirliyor. Örneğin, startSfc başlamadan hemen önce Z’li bir tabloya kayıt atılması vs. gibi.
Bu noktada, servisin başlaması için kullanılan parametreler tezgah, aktivite hatta kullanıcı bazında özelleştirilebiliyor.
- POST
Post, servis çalıştıktan hemen sonra yapılacak olan işlemleri belirliyor. Örneğin, startSfc bittikten hemen sonra Z’li bir tabloya kayıt atılması vs. gibi.
Bu noktada, servis çalışmayı tamamladıktan sonra sonuç olarak döndürülen parametreler tezgah, aktivite hatta kullanıcı bazında özelleştirilebiliyor.
- EXCEPTION
Exception, servis çalışırken hata aldığı durumlarda yapacağı işlemleri belirliyor. Örneğin, servis çalıştığında hata alındığında e-posta atılması gibi özelleştirmeler bu noktalarda yapılabiliyor.
Figure 1 Service Extension Noktaları
SAP ME Service Extension’ın sunduğu avantajları
Örnek üzerinden gidilecek olursa, kendi geliştirdiğimiz bir serviste sıralı olarak findShopOrder -> releaseShopOrder -> startSfc -> completeSfc çalıştırılıyor. ME SDK’in bize kazandırdığı en önemli avantajlardan biri olan “rollback” özelliği, hata durumunda veri tabanında oluşacak veri tutarsızlıkların önüne geçebiliyor olması.
StartSfc servisinin Post noktasında yeni bir servis uzantısı oluşturuluyor. Oluşturulan yeni servis uzantısının görevi, veritabanındaki bir tabloya kayıt atmak olarak karşımıza geliyor. Servise giriş parametresi olarak tezgah bazında bir filtrenin verilmesi gerekiyor. StartSfc servisi başarılı olarak tamamlandığında, veri tabanındaki tabloya kayıt atması sağlanıyor.
Örneğin, completeSfc anında hata alınsa dahi releaseShopOrder ve startSfc işlemlerini rollback yaparken kendi geliştirdiğimiz Post noktasındaki servis uzantısı da rollback olacaktır.
SAP ME Service Extension geliştirmesi örneği
Aşağıdaki görselde, Service Extension’da kullanacağımız ME PAPI servisinin giriş parametreleri görünüyor. Alınacak parametrelerle Service Extension içerisinde manipülasyonlar gerçekleştiriliyor.
Şekil 1 ME PAPI Input Verileri
Oluşturacağımız Service Extension’nın bağlanacağı bir aktivite olması gerekiyor. Bu aktivite, IDAT dosyasında belirleniyor ve daha sonra SAP ME içerisinde Activity Manager’da tanımlanıyor. Aşağıdaki görselde, Service Extension içerisinde kullanacak aktivitenin detayları görüntüleniyor.
Şekil 2 Service Extension Aktivitesi
Aktivite hazır olduğunda, sıradaki işlem Service Extension oluşturuyor. Oluşturulacak Service Extension’ın hangi ME PAPI servisinin başında ya da sonunda olacağının seçilmesi gerekiyor. Akabinde de, Service Extension için oluşturulan aktivitenin seçilmesi de gerekiyor. Tüm seçimler bittikten sonra aşağıdaki görseldeki gibi Service Extension hazır olacak.
Şekil 3 Service Extension Son Hali
ME PAPI servisimiz, kullanıcının girilen isim ve soy isim değerlerini alıyor ve aldığı isim ve soyisim parametrelerinin sadece baş harfelerini alarak yeni bir kullanıcı adı oluşturuyor. Oluşturduğu bu kullanıcı adını da log’luyor. Aşağıdaki görsellerde ise örnek sonuçlar görüntüleniyor.
Şekil 4 Service Extension Sonuç – I
Şekil 5 Service Extension Sonuç – II
Kod bloğu
PreConvertString.Java:
ME PAPI’den alınan Request parametrelerinin manipüle edilip sonuç olarak yazdırıldığı kod satırlarını içeriyor.
@Override
public void execute(Object arg0) throws Exception {
PapiTestRequest papiTestRequest = new PapiTestRequest();
papiTestRequest = (PapiTestRequest) arg0;
String[] splittedNames = papiTestRequest.getFirstName().split(“”);
char firstLetter = splittedNames[0].charAt(0);
char secondLetter;
char thirdLetter = papiTestRequest.getLastName().charAt(0);
if(splittedNames.length >= 2) {
secondLetter = splittedNames[1].charAt(0);
String userName = new StringBuilder().append(firstLetter).append(secondLetter).append(thirdLetter).toString();
SimpleLogger.log(Severity.INFO, Category.SYS_SERVER, loc, PROC, “The complete name is converted successfully. The username is: ” + userName);
return;
}
String userName = new StringBuilder().append(firstLetter).append(thirdLetter).toString();
SimpleLogger.log(Severity.INFO, Category.SYS_SERVER, loc, PROC, “The complete name is converted successfully. The username is: ” + userName);
}
Muhammed Furkan Gerem
SAP MII/ME Consultant