21 Nisan 2009 Salı
ABAP : ALV validasyonu, IS_VALID ?
Değiştirilebilir hücrelerin olduğu bir ALV de, ekrana girilen değerler uygun mu değil mi diye kontrol etmek için CHECK_CHANGED_DATA metodu ile kullanacağımız bir parametre mevcut, E_VALID parametresi.
Örneğin, sayı alanına text girip bir butona basarsanız ALV otomatik olarak size hata loglarının olduğu bir popup çıkaracaktır. Fakat PAI metodları çalışmaya devam edecektir. Yani sizin koyduğunuz bir butonun arkasında bir PERFORM mevcut ise, hataya rağmen çalışacaktır. Bunu engellemek için ekranda butona basıldıktan sonra, değiştirilebilir hücrelerde ki değerleri almak için kullandığımız CHECK_CHANGED_DATA metodundan bir parametre daha alıyoruz. IS_VALID parametresi.
Eğer ALV de ki değerler uygun ise, size X değilse boş döndürecektir. Örnek olarak;
******************************************************
DATA : lv_valid .
CLEAR lv_valid .
CALL METHOD alv_grid->check_changed_data
IMPORTING
e_valid = lv_valid.
** giriş geçerli ise
IF lv_valid = 'X' .
ENDIF .
******************************************************
Uğur Özdemir'euradan 100 puan veriyoruz, zira birde ALV classının içinde IS_VALID var ki tek başına niye çalışmıyor diye tüm günümü yedi. CHECK_CHANGED_DATA'da ki E_VALID imdadıma yetişti.
Ayrıca buradan kodları çalıp kendi sitesinde kendi yapmış gibi gösteren, sonra çıkıp "buradan çalıp başka yerlerde kullanıyorlar" diyen kişiler; dombilidir , taocudur, ver kurtulcudur, öyledir böyledir, atari salonlarında ki "ver gülüm geçiyim daha çok oynarsın" diyenlerdendir, çocukların topunu kesen amca ruhludur.
14 Nisan 2009 Salı
ABAP : Selection Screen Variant Secimi
ALV'de kaydedilen variantları selection screen içinden seçip direk olarak seçtiğimiz düzenin yani variantın gelmesini istiyorsak çok kısa bir işlem yapmamız gerekecektir.
Öncelikle, seçim ekranında ki parametremizi tanımlayalım.
TYPE-POOLS: SLIS.
PARAMETERS : p_vari TYPE slis_vari.
ALV'ye göndereceğimiz parametreyi tanımlayalım. (Ekrandan seçtiğimiz varianti ALV'de kullanabilmek için)
DATA:
IS_VARIANT LIKE DISVARIANT.
Daha sonra raporumuza ait variantları getirmesi için bir fonksiyon çağırmamız gerekiyor. Öncelikle seçim ekranında ilgili parametremiz için F4 tuşuna basılınca çalışacak formları yaratalım.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_VARI.
PERFORM ALV_VARIANT_F4 CHANGING P_VARI.
START-OF-SELECTION.
.
.
.
END-OF-SELECTION.
Formu yazalım.
FORM ALV_VARIANT_F4 CHANGING PA_VARI.
DATA: RS_VARIANT LIKE DISVARIANT.
RS_VARIANT-REPORT = sy-repid.
RS_VARIANT-USERNAME = SY-UNAME.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
IS_VARIANT = RS_VARIANT
I_SAVE = 'A'
IMPORTING
ES_VARIANT = RS_VARIANT
EXCEPTIONS
OTHERS = 1.
IF SY-SUBRC = 0.
PA_VARI = RS_VARIANT-VARIANT.
ENDIF.
ENDFORM. "alv_variant_f4
İşlemler bittikten sonra, ALV'yi çağıran formumuzun içinde
is_variant-variant = p_vari.
yazmamız gerekecektir. Bu , ekrandan seçtiğimiz variantı, is_variant değişkenine atacaktır.
ALV'yi çağıran fonksiyonumuzda diğer parametlerin yanında IS_VARIANT değişkenini de gönderdiğimiz zaman, ekrandan seçilen variantın direk ALV'ye atandığını ve raporun ona göre geldiğini göreceğiz :=).
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
.
.
.
IS_VARIANT = IS_VARIANT
TABLES
.
.
.
Deveye sormuşlar boynun niye eğri diye, artık o konuyla ilgili gündeme gelmek istemiyorum demiş.
Evet sevgili ABAPçılar sizde iyi bir çocuk olursanız belki şirinleri bile görebilirsiniz :=)
22 Ocak 2009 Perşembe
ABAP : Error when opening an RFC connection
EXPORTING
ABSOLUTE_URI = URI
RFC_DESTINATION = 'SAPHTTP'
TABLES
RESPONSE_ENTITY_BODY = ILINE[] "BLANKSTOCRLF = '/'
RESPONSE_HEADERS = RESPONSE_HEADERS.
3 Ocak 2009 Cumartesi
ABAP : Internal Table Performans Karsilastirma
Merhabalar,
Daha önceki yazımda, ITAB ile ilgili teknik bilgiler vermiştim. Bu yazıda ise internal table için performans konularına değineceğim. Öncelikle basit bir program yazıyoruz, tablolara yazma ve okuma zamanları tutan ve ekrana yazan basit bir program.
Aşağıda görüldüğü gibi, STANDARD, SORTED ve HASHED olmak üzere üç tablo tipini de tanımlıyoruz.
Öncelikle ekrandan girilen kadar satırı tablolarımıza yazıyoruz.

Öncelikle, tablolarımızdan okurken WITH TABLE KEY metodunu kullanıyoruz, burada table_line bizim için key bir alan, daha sonra süreleri ekrana yazdırıyoruz.
Aşağıda görüldüğü gibi bu sefer INDEX ile okuyoruz ve okuma sürelerini ekrana yazıyoruz.
Programımızı açıp öncelikle 100 değerini giriyoruz ve 100 kayıt için yazma ve okuma değerlerini ekrana yazdırıyoruz.
INSERT değerlerine bakarsak, SORTED table için diğerlerinden biraz fazla olduğunu görebiliriz, çünkü verileri sürekli sıralı tuttuğu için değer girerkende veriyi sırayı bozmadan sokmaya çalışacaktır.
Görüldüğü üzere, With Key metoduyla okurken STANDARD tablonun değerinin bir hayli yüksek olduğu gözümüze çarpmaktadır fakat INDEX yöntemi ile okumaya çalışırsak , okuma hızının çok düşük olduğu yine görülecektir.
Sayıyı 1000 e kadar yükseltiriyoruz ve çalıştır tuşuna basıyoruz.
Diğer değerlerin pek değişmediği fakat STANDARD tablodan WITH TABLE KEY metoduyla okuma değerinin çok fazla yükseldiği yine görülecektir, INDEX ile okuma metodunda değer yine sabit kalmaktadır.
HASH table için okuma değeri yine neredeyse aynıdır, daha önceki yazımda bahsettiğim gibi HASHED tablolarda okuma değerleri kayıt sayısından bağımsızdır.
Sayıyı 5000'e yükseltiyoruz ve tekrar çalıştırıyoruz.
Görüldüğü gibi STANDARD tablodan okuma değerinin çok fazla yükseldiği diğer değerlerin yine çok fazla değişmediği görülür.

Test sonuçlarında, STANDARD tablodan WITH TABLE KEY metoduyla veri okumanın bir facia olduğunu görüyoruz, INDEX ile okuma tekniğinde ise değerin değişmediğini ve gayet hızlı bir biçimde okunduğunu görebiliyoruz. HASHED tablolarda değerin değişmediği yine SORTED tablolarda çok fazla oynama olmadığı basit bir biçimde görülmektedir.
ABAP programlarımızda, ihtiyaçlarımıza göre doğru internal table biçimini seçmek programlarımızı oldukça hızlandıracaktır.
Dikkat edelim çanak çömlek patlamasın.
İyi çalışmalar
Modülcülerle paslı oynayıp gol yememeye çalışın.
Yeni yıl da geldi, temiz kod yazın, yeni bir sayfa açın, kendinizi düzene sokun adam olun akıllı olun.
26 Aralık 2008 Cuma
ABAP : Internal Table tipleri , ozellikleri ve teknik bilgiler
Bu yazıda basit olarak internal table özellikleri, tipleri ve onlara özgü durumları anlatacağım. Daha çok teknik tarafı ile ilgilidir, yani bir ITAB nasıl kullanılır veri nasıl atılır , okunur ve değiştirilebilir yazısı değildir.


Internal tableları index table ve hashed table diye ikiye ayırabiliriz. Yine Index tablelar kendi içinde, standard ve sorted olarak ikiye ayrılır. Hepsinin kendine has özellikleri mevcuttur, veri okuma, yazma, arama hızları hepsinin farklıdır. Yine alanlara ulaşım, tekil kayıtlılık, çok kayıtlılık özellikleri yine hepsinin farklıdır. Bunlara kısa kısa değinmeye çalışacağım.
Standard ve Sortab tablolar için en hızlı ulaşım index ile ulaşımdır. Sorted tablo her zaman verileri sıralanmış olarak tutar ve ulaşım için "binary search" metodunu kullanır. Verilere ulaşım hızı, kayıt sayısına bağlı olmakla birlikte logaritmik bir artış gösterir. Hashed tablolarda ise durum farklıdır, verilere ulaşım sadece anahtar alan ile olur ve kayıt sayısı önemli değildir, sabittir. Hashed tablolarda verilere ulaşım hızını etkileyen faktör key alanın uzunluğudur.
Programlarımızda, DATA diye başlayıp tablo tanımladığımızda tüm özelliklerini, key alanlarını vermemiz gerekir yani bir "complete type definition" yapılması gerekir. Sadece STANDARD TABLE tanımı yapılırken buna gerek yoktur,
Örneğin,
DATA: ITAB type table of struc dediğimizde aslında bu
DATA : ITAB TYPE STANDARD TABLE of struc WITH NON-UNIQUE DEFAULT KEY ile aynı anlama gelmektedir.
HASHED tablolar mutlaka UNIQUE tanımlanmalıdır, SORTED tablolar ise hem UNIQUE hemde NON-UNIQUE tanımlanabilir.
Tabloları okurken, WITH KEY metodu kullanımına dikkat etmemiz gerekir. Çünkü burada herhangi bir alanı kullanabilir, eğer kullandığımız alan gerçekten KEY değilse, o zaman sorted ve hashed tablolara ulaşım hızı standard tablolara ulaşım hızıyla aynı olacaktır ve yavaş olacaktır. Anahtar alanı tanımlanmış tablolarda okuma yapılacaksa, WITH TABLE KEY metodu kullanılmalıdır, eğer KEY alan tanımlanmamışsa ve bu metod kullanılmak istenirse Syntax error hatası görülecektir.
ITAB'larla alakalı bazı teknik bilgilier
- 32 bitlik mimaride, teorik maksimum boyut 2 GB olabilir.
- Pratikte, 500 MB veri tutabilir.
- Tablo başına 4.000.000.000 satır veri tutulabilir.
RAM'inizin yetmediği durumlarda, karşılaşacağınız ABAP hatası ; TSV_TNEW_PAGE_ALLOC_FAILED.
ITAB'ımızın , bellekte ne kadar yer tuttuğunu merak ediyorsak, SETTINGS sekmesinden, table memory display seçeneğini aktif etmemiz gerekir. DEBUG ederken, aşağıdaki gibi ITAB'ın bellekte ne kadar yer kapladığını görmemiz mümkündür.

Bir sonraki yazımda, bu ITAB tiplerinin performanslarını karşılaştıracağız.
iyi çalışmalar.
Attığınız şutlara paslara dikkat edin.
20 Aralık 2008 Cumartesi
ABAP : Satinalma Siparisi Yaratma
Dolduracağımız bir kaç ana tablonun dışında tek yapmamız gereken, BAPI_PO_CREATE fonksiyonunu çağırmaktır.
Örnek;
Data: int_pohead like BAPIEKKOC,
int_poitem like BAPIEKPOC occurs 0 with header line,
int_posched like BAPIEKET occurs 0 with header line,
int_ret like BAPIRETURN occurs 0 with header line.
Data: d_purchord like BAPIEKKOC-PO_NUMBER.
Move: 'NB' to int_pohead-DOC_TYPE,
'1000' to int_pohead-PURCH_ORG,
'001' to int_pohead-PUR_GROUP,
'0000001234' to int_pohead-vendor,
'00010' to int_poitem-po_item,
'Material' to int_poitem-material,
'Material' to int_poitem-pur_mat,
'1000' to int_poitem-plant,
'00010' to int_posched-PO_ITEM,
'20080531' to int_posched-DELIV_DATE,
'2' to int_posched-QUANTITY.
* Miktarları he zaman schedule tablolarına giriyoruz
hem Satınalma Siparişi BAPI si için hemde satış siparişi bapileri için.
Append int_poitem.
Clear int_poitem.
APPEND int_posched.
CLEAR int_posched.
CALL FUNCTION 'BAPI_PO_CREATE'
EXPORTING
PO_HEADER = int_pohead
SKIP_ITEMS_WITH_ERROR = ' '
IMPORTING
PURCHASEORDER = d_purchord
TABLES
PO_ITEMS = int_poitem
PO_ITEM_SCHEDULES = int_posched
RETURN = int_ret .
16 Aralık 2008 Salı
ABAP : POPUP ile ekrandan deger alma
Satış siparişi yarattığımızı varsayalım;
ALV de ilgili satır için girilmesi gereken başlık verilerini POPUP ile kullanıcıya sorup rahat bir şekilde gereken değerleri alabiliriz.
Kullanacağımız fonksiyon POPUP_GET_VALUES

Örnek kod:
*Fields tablosunu, ekrana koyacağımız parametreler için kullanıyoruz.
data : fields like sval occurs 0 with header line .
fields-tabname = 'VBAK' .
fields-fieldname = 'AUART' .
fields-field_obl = 'X' .
append fields . clear fields .
fields-tabname = 'VBAK' .
fields-fieldname = 'VKORG' .
fields-field_obl = 'X' .
append fields . clear fields .
fields-tabname = 'VBAK' .
fields-fieldname = 'VTWEG' .
fields-field_obl = 'X' .
append fields . clear fields .
fields-tabname = 'VBAK' .
fields-fieldname = 'SPART' .
fields-field_obl = 'X' .
append fields . clear fields .
call function 'POPUP_GET_VALUES'
exporting
popup_title = 'Ek değerleri giriniz'
start_column = '5'
start_row = '5'
tables
fields = fields[]
exceptions
error_in_fields = 1
others = 2.
* Değerleri okumak için tanımladığımız değişkkenlere, read table
* metoduyla değerlerimizi atarız
if fields[] is not initial.
read table fields with key fieldname = 'AUART' .
gv_auart = fields-value .
read table fields with key fieldname = 'VKORG' .
gv_vkorg = fields-value .
read table fields with key fieldname = 'VTWEG' .
gv_vtweg = fields-value .
read table fields with key fieldname = 'SPART' .
gv_spart = fields-value .
endif.