SAP, yavaş yavaş ERP ürünlerini HANA teknolojisine uygun geliştirmeye devam ediyor. En kritik konulardan biriside klasik MRP yerine artık “MRP Live” olarak yeni bir ekran haline getirmesi. HANA’nın hızından faydalanmak ve verim sağlayabilmek adına MRP Live kullanılabilir durumda.

Bu tarz değişimlerin ve yeniliklerin her zaman avantajları olduğu gibi dezavantajları da olmuştur. Özellikle işin mutfağında yer alanlar için çok önemli bu değişimler. MRP Live’ın getirdiği en büyük avantaj hız ve performansken, en büyük dezavantajı da geliştirme sürelerinin uzaması. Basit bir müşteri talebi için bile onlarca satır kod yazmamız gerekebilir. Bu durum ihtiyaca göre değişecektir tabiki ancak genel olarak gelen talepleri karşılarken geliştirmelerimiz, önceki haline göre bizler için zaman kaybını da beraberinde getirecek gibi duruyor. Bu durumun hem böyle hızlı işlem yapması ama yavaş bir çalışma metodoloji olmasının sebebi de AMDP BADI alt yapısıdır.

AMDP (ABAP Managed Database Procedure) veritabanı seviyesinde sorgular yazmamızı ve veritabanı işlemleri yapmamızı sağlayan bir stored prodecure’dır. HANA ve ABAP 740 ile gelen bu özellik bizlere inanılmaz bir hız kazandırırken ABAP dilinden koptuğumuz ve tamamen SQL’e geçtiğimiz için ABAP’ın o güçlü yönlerini kullanamıyoruz maalesef. ABAP’ı kullanamamak bizlere geliştirmeler sırasında vakit kaybettiriyor. Ancak beraberinde büyük bir hız ve performansta geliyor. Bu durum müşteriler için süper bir şeyken danışmanlar ve ABAPçılar için çok sevinilecek bir şey olmayacak gibi.

MRP Live işlem kodu MD01N. Bu işlem kodu çalıştırıldığında klasik MRP BADI’leri sağlıklı bir şekilde çalışmıyor çünkü arka tarafta SAP tamamen AMDP kullanmış. Loglamaların yapılmasından, mesaj yönetimine ve ilgili ihtiyaçların belirlenip yaratılması, veritabanı tablolarına kayıtların atılması, güncellenmesi ve silinmesi gibi birçok veritabanı operasyonu tamamen AMDP üzerinden ilerliyor. Dolasıyıla SAP de bizlere yine belli hareket alanı tanımak için BADI uyarlamaları yapmış ancak bu BADI’lerde AMDP BADI olarak çalışmaktadır. Klasik bir ABAP class’ı olarak görünebilir ama herhangi bir şekilde içerisine ABAP yazılamadığı için yeniliklere artık açık olup öğrenmenin vakti geldi demektir.

Çok fazla teori işlemeden SAP HANA MRP Live BADI kullanımını uygulamaya başlayalım.

Enhancement spot: ES_PPH_MRP_BADI

PPH MRP Badi
PPH MRP Badi

Yukarıda gördüğünüz gibi BADI özelliklerinde AMDP BADI olarak seçili durumda. Altındaki tüm BADI tanımları için aynısı geçerli. SE18 üzerinden BADI implementasyonunu yaparsanız otomatik olarak SAP bir class yaratıyor ve içine ilgili metotları ekliyor. Ancak normal bir class olarak oluşturuyor. AMDP metotları içerisinde kendisi belirtmiyor. Bu yüzden implementasyonu yarattıktan sonra herhangi bir değişiklik yapmadan aktif etmeye çalışırsanız hata alırsınız. Bu noktada ilgili BADI metotlarını AMDP metot olarak değiştirmeniz gerekiyor. Bunu da ancak ECLIPSE kullanarak yapabilirsiniz. SAP GUI üzeirnden AMDP metot oluşturamıyoruz. Tamamen yeni özellikler ve alt yapılar olduğu için yeni platformlara uygun geliştirilmiş ve bu özellikleri artık SAP GUI tarafında geliştirmemizi istemiyor SAP.

İhtiyacınızı belirledikten sonra ilgili BADIyi seçip implementasyonu bugüne kadar yaptığınız şekilde yapın ve daha sonra sadece kaydedin.

Eclipse üzerinde oluşturduğunuz class’ı açın ve metotların başına aşağıdaki şekilde belirtmemiz gereken birkaç tanım var. Bu tanımlar ihtiyaca duruma göre değişir ama ben en genel haliyle yazıyorum. AMDP hakkında daha detaylı araştırma yaparsanız, diğer opsiyonlarını da öğrenebilirsiniz.

[ABAP]
class zpp_001_mrp_live_run_badi definition
public
final
create public .

public section.

interfaces if_badi_interface .
interfaces if_pph_mrp_run_badi .
interfaces if_amdp_marker_hdb .
protected section.
private section.
endclass.

class zpp_001_mrp_live_run_badi implementation.
method if_pph_mrp_run_badi~mdps_adjust
by database procedure for hdb language sqlscript options read-only.
— Mükemmel kodlarımız
begin sequential execution
end;
endmethod.

method if_pph_mrp_run_badi~planord_before_update_adjust
by database procedure for hdb language sqlscript options read-only.
— Mükemmel kodlarımız
begin sequential execution
end;
endmethod.

method if_pph_mrp_run_badi~purreq_before_update_adjust
by database procedure for hdb language sqlscript options read-only.
— Mükemmel kodlarımız
begin sequential execution
end;
endmethod.
endclass.
[/ABAP]

Class’ın içerisinde ek olarak bir tane IF_AMDP_MARKER_HDB interface’ini ekledik ve metotların isimlerinden sonra yukarıdaki gibi tanımları yaptık. Daha sonra içerisine ilgili parametreler doğrultusunda değişikliklerimizi yapıp kodlarımızı yazıyoruz. AMDP metotlarının içi boş bırakılamadığı için bir yorum ve komut yazdım. Begin sequential execution komutu zorunlu yazılması gereken bir şey değildir ben örnek olması açısından onu yazdım.

Kodlarımızı bu şekilde SQLScript ile yazdıktan sonra aktif edip daha sonra yaptığımız BADI implementasyonunu da aktif ediyoruz.

Aşağıda AMDP metot için örnek bir-iki kod paylaşıyorum. HANA SQLScript öğrenip bu tarz noktalarda istediğiniz gibi kodlarınızı yazıp hem HANA’nın performansını kullanabilir hem de standard süreçlere optimizasyonlarınızı gerçekleştirebilirsiniz. Kodlar birbirinden bağımsız kodlardır. Belli bir bütünü ifade etmemektedir. Sadece birkaç yerden kod parçacıklarıdır.

[ABAP]
for pilot_index in 1 .. cardinality(:pilot_mng01) do
miktar_tam = 0;
miktar_kalan = 0;
i = 0;

if :pilot_disls[:pilot_index] = ‘FX’ then
if :pilot_bstfe[:pilot_index] > 0 then
miktar_tam = :pilot_mng01[:pilot_index] / :pilot_bstfe[:pilot_index];
miktar_kalan = mod( :pilot_mng01[:pilot_index], :pilot_bstfe[:pilot_index] );

for i in 1 .. miktar_tam do
yeni_kayit_new_mng01 = cardinality(:pilot_mng01_new) + 1;
pilot_mng01_new[:yeni_kayit_new_mng01] = :pilot_bstfe[:pilot_index];
end for;
if :miktar_kalan > 0 then
if ( :pilot_bstfe[:pilot_index] * ( yuzde / 100 ) ) <= miktar_kalan then yeni_kayit_new_mng01 = cardinality(:pilot_mng01_new) + 1; pilot_mng01_new[:yeni_kayit_new_mng01] = :pilot_bstfe[:pilot_index]; end if; end if; else yeni_kayit_new_mng01 = cardinality(:pilot_mng01_new) + 1; pilot_mng01_new[:yeni_kayit_new_mng01] = 0; end if; elseif :pilot_disls[:pilot_index] = 'EX' then if :pilot_bstma[:pilot_index] > 0 then
miktar_tam = :pilot_mng01[:pilot_index] / :pilot_bstma[:pilot_index];
miktar_kalan = mod( :pilot_mng01[:pilot_index], :pilot_bstma[:pilot_index] );

for i in 1 .. miktar_tam do
yeni_kayit_new_mng01 = cardinality(:pilot_mng01_new) + 1;
pilot_mng01_new[:yeni_kayit_new_mng01] = :pilot_bstma[:pilot_index];
end for;
if :miktar_kalan > 0 then
if :miktar_kalan >= :pilot_bstmi[:pilot_index] and :miktar_kalan <= :pilot_bstma[:pilot_index] then yeni_kayit_new_mng01 = cardinality(:pilot_mng01_new) + 1; pilot_mng01_new[:yeni_kayit_new_mng01] = :miktar_kalan; elseif ( :pilot_bstmi[:pilot_index] * ( yuzde / 100 ) ) < miktar_kalan then yeni_kayit_new_mng01 = cardinality(:pilot_mng01_new) + 1; pilot_mng01_new[:yeni_kayit_new_mng01] = :pilot_bstmi[:pilot_index]; end if; end if; else yeni_kayit_new_mng01 = cardinality(:pilot_mng01_new) + 1; pilot_mng01_new[:yeni_kayit_new_mng01] = 0; end if; end if; end for; [/ABAP] [ABAP] lt_matb_ctrl_del = select ct_matb_ctrl.* from :lt_out as lt_out inner join :ct_matb_ctrl as ct_matb_ctrl on ct_matb_ctrl.matnr <> lt_out.matnr;

lt_out = select * from :lt_out where mng01 <> 0;

found = 0;
select count(*) into found from :lt_out;
if :found > 0 then
ct_result = select * from :lt_out;
end if;

count = 0;
select count(*) into count from :ct_result;
select count(*) into count from :lt_matb_ctrl_del;
if :found > 0 or :count > 0 then
ct_matb_ctrl = select * from :lt_matb_ctrl_del;
end if;
[/ABAP]

[success]Maalesef ki çok daha yeni bir ekran olduğu için BADI leriyle ilgili çok fazla teknik dokümantasyon yok. MRP Live’ın arka tarafını debugladığınızda SAP’nin kodları yazarken ingilizce yorumlar yazdığını göreceksiniz. Oldukça faydalı oluyor kodların arasındaki yorumlar özellikle parametleri ne için kullandıklarını belirtmişler. BADI içerisinde durup stack üzerinden nereden çağırıldığına bakabilirsiniz oralarda ihtiyacınız olan bilgileri edineceksiniz. Bunun içinde ECLIPSE üzerinde debug yapmayı ve AMDP debug yaparken nelere dikkat etmeniz gerektiğini araştırmanız gerekiyor her birisi ayrı ayrı başlıklar zamanım oldukça bende blog üzerinde açıklamaya çalışacağım. MRP Live veya AMDP ile ilgili spesifik sorularınız olursa gönderinin altında da sorabilirsiniz. Elimden geldiğince yanıtlamaya çalışacağım.[/success]