ABAP EĞİTİM SETİ ABAP Temel Bilgiler Fonksiyon Modülleri ABAP Kitaplığı Diyalog Programlama ABAP Objeleri Smart Forms
1
İçindekiler İçindekiler
2
Abap Temel Bilgiler
3
Başlangıç Ekranı
3
Geliştirme Ekranı
4
Genel Bilgiler
5
Söz Dizimi Yapısı - Syntax
6
İşlem Sonucu – Return Statement
7
Veri Tipleri 8 Aritmetik İşlemler
10
Structure Yapısı
12
Kelime İşlemleri
15
Veri Atama – Move & Write 16 Field Symbols
19
Kontrol Mekanizmaları – If & Case 20 Döngü Mekanizmaları
22
Dahili Tablolar – Internal Tables Alt Rutin İşlemleri
25
34
Fonksiyon Modülleri 37 Temel Bilgiler
37
Fonksiyon Grupları 41 Diyalog Programlama Seçim Ekranları Listeler
47
Ekranlar
50
Mesajlar
56
Abap Kitaplığı
43 43
58
Temel Bilgiler
58
Tablo Oluşturma
64
View Oluşturma
73
Tablo Bakım Ekranı 77 SE16
81
Smart Forms 85 Veri Gönderme İşlemi
93
Smart Styles 95
2
ABAP Temel Bilgiler Başlangıç Ekranı SAP’ da gerekli güncellemeleri ve yeni uygulamaları yapmak için ‘SE38’ işlem kodunu kullanarak ‘Abap düzenleyici’ ekranına giriş yaparız. Bu ekranın görüntüsü aşağıda görüldüğü gibidir:
-Resim A1-
Bu ekranı numaralar üzerinden özetleyecek olursak; 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12)
Programın sözdizimi kontrolü (Sytnax check). Programın aktifleştirilmesi. Programın çalıştırılması. Programın nerelerde-hangi programlar içinde kullanıldığı. Programın içinde kullanılan verilerin bilgilerini görüntüleme. Abap editör yardım düğmesi. Programı silme düğmesi. Programın başka bir kopyasını oluşturma düğmesi. Programı yeniden adlandırma düğmesi. Program içinde hata ayıklama düğmesi. Program içinde varyant ile hata ayıklama düğmesi. Program için hazırda bulunan varyantların görüntülenmesi.
Geliştirme Ekranı 3
Abap düzenleyici’ de geliştirme yaptığımız ekrana göz atacak olduğumuzda temelinde notepad’ a benzeyen bir kelime işlemci ara yüzüne sahiptir.
-Resim A2-
Notepad’dan farklı olarak karşımıza gelen ekranda gözümüze çarpanlar; 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12)
Programın düzenleme – görüntüleme modu arasında geçiş tuşu. Etkin olan ve etkin olmayan sürümler(version) arası geçiş tuşu. Programın içinden veya dışından, başka bir nesneye erişim tuşu. Enhancement kodlamaları. Programın sözdizimi kontrolü (Sytnax check). Programın aktifleştirilmesi. Programın çalıştırılması. Nesne listesi görüntüleme tuşu. Dolaşma penceresi. Programın içine kontrol noktası oluşturma tuşu. Programın içine kullanıcıya özel kontrol noktası oluşturma tuşu. Programın içine dışarıdan aktarma yaparak sorgu, fonksiyon, kontrol mekanizması vs. oluşturmaya yardımcı tuş. 13) Programın kod satırlarının belli bir standarda göre düzenleme tuşu. 14) Programın durumunu gösteren kısım. Bizim örnek resmimizde program aktif olmayan(Inactive) durumdadır.
Genel Bilgiler Abap programlama diline dair genel birkaç bilgi verecek olursak, bu bilgileri şu şekilde özetleyebiliriz;
Abap’ ta önceden tanımlı veri tipleri vardır, bu veri tiplerini kullanarak program satırlarını ve bütün bir programı oluştururuz. 4
Abap’ ta çevrilebilen metin yapısını kullanarak, birden fazla dilde çalışan programlar oluşturabiliriz. Abap’ ta kullanılan OPEN SQL yapısı sayesinde, program satırlarından veri tabanına direkt erişim sağlanır. Abap programlama dili her geçen gün daha da gelişmektedir ve program yapısı yenilendiğinde eğer eski bir kodlama kullanılıyorsa, bu eski kodlamanın çalışmasını yeni program yapısı engellemez.
5
Sözdizimi Yapısı – Syntax
-Resim A3-
Abap programlama dili yazdığımız talimatların işleme sokulmasıyla çalışır. Yazdığımız her talimat satırı “keyword” dediğimiz tanımlayıcılar ile başlar ve “nokta” ile biter. Talimat satırlarındaki kelimelerin en azından bir boşluk ile birbirinden ayrılması gerekmektedir. Talimat satırları iç içe gelecek şekilde yazılabilir. Talimat satırları birden fazla satır olacak şekilde yazılabilir. Aynı zamanda bir satırda birden fazla talimat yazılabilir. Abap’ ta kodlama yaparken yazılan kod Büyük-Küçük(Case Sensitive) harfe duyarlı değildir. Abap’ ta bir satıra yorum ekleme yapacağımızda satırın başlangıcına yıldız (*) koyarız. Resim A3’de bulunan örneğimizde daha kolay ayırt edilmesi amacıyla tanımlayıcıları büyük harf ile yazmışken diğerleri küçük harf kullanarak belirttik. Kodlama yaparken, kodun iyi görünmesi açısından; Büyük-Küçük harf ayrımı veya blokların birbirinden ayrılması için Resim A2’ de 13 numara ile görünen “Pretty Printer” tuşunu kullanabiliriz. Menü’ den ise: Yardımcı Programlar->Ayarlar->Abap Editör->Pretty Printer ile ulaşabiliriz.
6
İşlem Sonucu – Return Statement
-Resim A4-
Yazdığımız bazı talimat satırları işleme sokulduktan sonra sistem bize işlemin ne kadar başarılı olduğunu rakamsal olarak döner ve bu rakamsal döngüyü “sy-subrc” isimli sistem alanının içine yazar. Bir işlemden sonra bu döngü sonucunda sistem alanında (sy-subrc) içinde yazan rakam sıfır (0) ise yaptığımız işlem başarılı olmuş demektir. Örnek: Resim A4’ de 13ncü satırda veri tabanına erişim yapıyoruz ve veri çekiyoruz daha sonra ise 16ncı satırda işlemi başarı ile gerçekleştirdik mi diye sistem alanını (sy-subrc) kontrol ediyoruz.
7
Veri Tipleri Abap programlama dilinde işlem yapmak için diğer programlama dillerinde olduğu gibi veri objelerini kullanırız. Abap’ ta bir veri objesini tanımlarken genellikle “DATA” kelimesiyle başlarız ve bunu “TYPE” kelimesiyle tamamlarız. Örneğin:
-Resim A5-
Abap’ ta kullanılan verilerin hepsinin temelinde Ön tanımlı Abap tipleri kullanılır. Bunların yanında program içinde kullanım için daha karmaşık yapıda olan veri tipleri de yaratılabilir. Abap’ ta, ek olarak, Abap kitaplığında (SE11 – SE16) tanımlanmış olan global veri tiplerini de kullanabiliriz. Ön tanımlı ABAP tiplerini şemasal olarak gösterecek olursak:
-Resim A6-
Resim A6’ da gösterilen ABAP tiplerinden d, t, i, f, string, xstring program içinde direkt olarak kullanılabilir. Bu tiplerin içinde string ve xstring tiplerinin diğerlerinden farklı olarak özelliği uzunluklarının dinamik olarak program içinde oluşmasıdır. Ek olarak bu iki tip için uzunluk bir kriter değildir.
Bunların dışında kullandığımız veri tipleri olan: c, n ve x 8
Uzunluk bilgisi tanımlama sırasında eklenmelidir. İzin verilen karakter aralığı 1’ den 65535’ e kadardır. Eğer bir nesne yaratırken uzunluk bilgisi tanımlanmaz ise sistem otomatik olarak uzunluğu 1 olarak tanımlar.
p
Uzunluk bilgisi ve ondalık kısım bilgileri tanımlama sırasında belirlenmelidir. Eğer bir nesne yaratılırken uzunluk bilgisi tanımlanmaz ise sistem otomatik olarak 8 baytlık (ki oda, 15 haneli bir rakama eşit oluyor) bir veri uzunluğu tanımlar ve ondalık kısım için 0 değerini atar.
Örnek veri tanımlamaları: DATA text1(20) TYPE c." 20 karakterlik bir veri öğesi DATA text2 TYPE string." string tipinde veri öğesi DATA number TYPE i." integer tipinde veri öğesi DATA number2(5) TYPE n." 5 karakterlik number tipinde veri öğesi DATA num_dec TYPE p DECIMALS 2." decimal tipinde veri öğesi DATA date TYPE d." date tipinde veri öğesi DATA time TYPE t." time tipinde veri öğesi text1 = 'The number'." uzunluk önceden 20 karakter tanımlı number = 100." ön tanımlı veri aralığı -2.147.483.648 den +2.147.483.647 a kadar number2 = 12345." 5 karakterlik rakamsal veri öğesi text2 = 'is an integer.'." uzunluk dinamik olarak atanıyor num_dec = '1234.55'." virgülden sonra iki rakam olabilir date = '20091230'." yıl ay gün şeklinde atama yapılır (YYYYAAGG) time = '125901'." saat dakika saniye şeklinde atama yapılır (SSDDSS)
9
Aritmetik İşlemler
-Resim A7-
ABAP dilinde standart dört işlem yapısı kullanılır. Integer türü verilerde aritmetik işlem yaptığımızda sistem her zaman ondalık sistemin uygun gördüğü şekilde yuvarlama yapar. Örneğin: DATA int TYPE i.
int = 4 / 10. int = 5 / 10.
" sonuç: 0 " sonuç: 1
Integer veri türünde yapılan işlemler, floating point verilerinde yapılan işlemlere göre daha hızlı bir şekilde çalışır.
10
-Resim A8-
Packet number tipinde olan veri tiplerinin uzunluğu bayt türünden verilir. Her bir rakamı yarım bayt temsil eder. Son bayt ise artı ve eksi işareti için ayrılmıştır. Ondalık alan boyutu DECIMALS eki ile belirlenir. Maksimum ondalık alan boyutu 15 yâda eksi 1 değeri. Bunun sebebi ise en azından virgülden önce bir rakam olması gerektiğidir. Ondalık rakam işlemleri kesin sonuçlu işlemler için kullanılmaktadır. Packed number tipinde olan veriler doğru yuvarlama yapılan ya da ondalık alanların önemli olduğu, kesin sonuçlara ulaşılacak olan, iş hesaplamaları için daha uygundur. Bu yapı algoritma olarak kâğıt ve kalem kullanmaya benzer, bir farkı yoktur.
11
Structure Yapısı
-Resim A9-
ABAP programlama dilinde ön tanımlı veri tipleri dışında STRUCTURE dediğimiz yapılar kullanırız. Bu yapıları tanımlarken TYPES kelimesi ile başlarız ve BEGIN OF - END OF kelimeleri ile devam ederiz. BEGIN OF - END OF kullanımı, içine tanımlama yapılan bir blok gibi çalışır. Bu blokların içine ise STURCTURE’ ın içine koymak istediğimiz ister ön tanımlı veri tipi olsun ister başka bir STRUCTURE’ ın veri alanı olsun veri öğelerini yerleştiririz. Bir STRUCTURE’ ın veri öğesine erişirken kullanım şekli şu şekildedir: structure_name-comp_name.
12
-Resim A10-
Bir structure içinde başka bir structure tanımlayarak NESTED STRUCTURE oluşturabiliriz. Oluşturduğumuz alt structure yapısına tamamen ulaşabiliriz: structure_adı-alt_structure_adı. Bunun yanında tek bir alanına da ulaşabiliriz: structure_adı-alt_structure_adı–veri_ogesi. Structure yapısına istediğimiz kadar alt structure ekleyebiliriz. Structure yapısına dinamik veri öğeleri atayabiliriz. Bunlar; ön tanımlı veri tipleri, internal tablo (Itab)veya referans olabilirler. Bu yapılara DEEP STRUCTURE diyoruz. Ek olarak deep structure yapısında bazı sınırlamalar getirilmektedir. Mesela bir SELECT sorgusunun INTO kısmına denk gelecek şekilde deep structure kullanamayız çünkü her parçaya tek ulaşılması gerekmektedir.
13
-Resim A11-
Bazı durumlarda nested structure kullanamayız, örneğin: Veri tabanında bulunan bir tablo yapısını FLAT STRUCTURE dediğimiz düz şekilde ele almamız gerekiyor. Yada kullanıcı menüleri kullanırken bu yapılarda tablo tipi veri alanı kullandığımız için bu tip kullanımlarda basit yapılar kullanmak zorunda oluyoruz (Örneğin, SAP List Viewer yapısı yada Table Control yapısı). Bu gibi durumlarda yine structure’ ı bir bütün olarak ele almak isteyebilirsiniz. Bunu yapmak için ise INCLUDE kullanıyoruz: Temelde yatan mantık ise bir structure içine ayrı şekilde olmayan şekilde başka bir structure alanlarını eklemek. DATA: BEGIN OF structure_adı, ... . INCLUDE STRUCTURE alt_structure_adı AS ad. DATA: ... , END OF structure_adı.
Böyle bir yapıya erişirken ise kullanım şekli structure_adı-ad şeklinde olmaktadır. Teknik olarak incelediğimizde ise bu yapı nested structure değildir.
14
Kelime İşlemleri
-Resim A12-
Resim A12 de görünenler içerisinde TRANSLATE ve CONDENSE dışında bütün durumlar sistem alanı olan sy-subrc’ yi dolduruyor. (SEARCH aynı zamanda sistem alanı olan sy-fdpos alanına da karakterin bulunduğu konumu atıyor.) Bir kelimenin uzunluğunu bulmak için ise standart fonksiyon olan STRLEN() kullanılmaktadır. SPLIT komutu kullanımında SPLIT ... INTO TABLE
yapısını kullanmaktayız.
15
Veri Atama – Move & Write MOVE: ABAP’ ta aynı yapıda olan veri tipleri eşit olduğunda veri atamaları yapılır. MOVE fonksiyonu normal eşitlik mekanizması gibi işlemektedir.
-Resim A13Örnek program satırları: DATA: number TYPE p DECIMALS 2, count TYPE i. MOVE '5.75' TO number. count = number.
MOVE-CORRESPONDING: Structure yapılarında veri atama işlemlerinde bir structure dan diğer bir structure a veri atamasında aynı yapıya sahip olmayan fakat aynı elemanlara sahip olan structure yapıları olabilir. Böyle durumlarda movecorresponding kullanımı gereklidir. Kullanım şekli: MOVE-CORRESPONDING struc1 TO struc2. Örnek program satırları: DATA: BEGIN OF address, firstname(20) TYPE c VALUE 'Fred', surname(20) TYPE c VALUE 'Flintstone', initials(4) TYPE c VALUE 'FF', street(20) TYPE c VALUE 'Cave Avenue', number TYPE i VALUE '11', postcode(5) TYPE n VALUE '98765', city(20) TYPE c VALUE 'Bedrock', END OF address. DATA: BEGIN OF name, surname(20) TYPE c, firstname(20) TYPE c, initials(4) TYPE c,
16
title(10) TYPE c VALUE 'Mister', END OF name. MOVE-CORRESPONDING address TO name. NOT: MOVE fonksiyonunun daha geniş kapsamlı kullanımı ve çevirme kuralları kullanımı için ABAP sözdizimi (syntax) dokümantasyonu kullanılmalıdır.
WRITE: Write komutu ile bir veri öğesi içinde bulunan veriyi mevcut sayfaya yazmaya yarar. Örneğin: Örnek kodlama: DATA text1(10) TYPE c VALUE 'The number'. DATA text2 TYPE string VALUE 'is an integer.'. DATA number TYPE i VALUE 7. WRITE text1. WRITE number. WRITE text2. Örnek ekran görüntüsü:
-Resim A14-
Write komutunun kullanım formatı şu şekildedir: Kullanacağımız veri öğemiz “dobj” olsun, buna göre; WRITE {[AT] [/][pos][(len|*|**)]} dobj [dahili_format_secenegi] [harici_format_secenegi] [listeler] [QUICKINFO kısabilgi].
Dahili Format Seçeneği (int_format_options): Dahili format seçeneği kullanıldığında, veri objesinin yapısıyla ilgili değişiklikleri amaçlar.
Harici Format Seçeneği (ext_format_options): Harici format seçeneği kullanıldığında veri objesinin çıktı düzeyinde vereceği görüntüyü ve fonksiyonları amaçlar. Örnek kodlama: DATA text1(10) TYPE c VALUE 'The number'." DATA text2 TYPE string VALUE 'is an integer.'.
DATA num_dec TYPE p DECIMALS 2 VALUE '1.99'.
WRITE text1. WRITE num_dec DECIMALS 0. WRITE text2 COLOR = 4 QUICKINFO 'son satır'.
17
Örnek ekran görüntüsü:
-Resim A15-
NOT: WRITE fonksiyonunun daha geniş kapsamlı kullanımı ve çevirme kuralları kullanımı için ABAP sözdizimi (syntax) dokümantasyonu kullanılmalıdır.
WRITE TO: “Write to” komutu bir veri öğesi içindeki veriyi başka bir veri öğesinin içine yazmaya yarar. Bunu yaparken hedef veri öğesinin tipi karakter tiplerinden (C, N, D veya T) biri olmalıdır. Örnek kodlama: DATA text1(10) TYPE c. DATA num_dec TYPE p DECIMALS 2 VALUE '6.99'. WRITE num_dec DECIMALS 1 TO text1.
18
Field Symbols
-Resim A16-
Bir veri öğesine direkt erişim olmadığında, mesela veri atamalarını dinamik olarak kullanmak istediğimizde field-symbols nesnelerini kullanırız. Bu sayede ulaşmak istediğimiz veri öğesine field-symbols yapısı ile ulaşabiliriz. Bir veri öğesini field-symbols nesnesine atama yaparken “ASSIGN” kelimesini kullanırız. Bir field-symbols tanımlandığında genellikle TYPE ANY yapısı kullanılır. Bu sayede program içinde atama yapılan verinin tipi ‘runtime’ dediğimiz programın çalıştığı anda alınır. Bir field-symbol’ e veri ataması yaparken kullanılan nesnelerin tiplerinin uyumluluğundan emin olunmalıdır.
Örneğin: DATA: date TYPE d VALUE '19991231', time TYPE t. FIELD-SYMBOLS: TYPE d, TYPE t. ASSIGN: date TO , time TO . = . " Syntax hatası döner
Diğer taraftan takip eden kod satırı runtime hatası verir: FIELD-SYMBOLS: TYPE ANY, TYPE ANY.
Bir field-symbol’ e veri ataması yapılıp yapılmadığını IS ASSIGNED kontrolü ile anlayabiliriz.
UNASSIGN komutu ile field-symbol’ ün atama yaptığı noktayı boşaltma işlemi gerçekleşiyor dolayısıyla bu komuttan sonra hiçbir yeri işaret etmiyor.
19
Kontrol Mekanizmaları – If & Case Her programlama dilinde olduğu gibi ABAP’ ta da kontrol mekanizmaları vardır. Bu kontrol mekanizmaları program içinde belli noktalarda işlemleri kontrol ederek bir sonraki işlemi tanımlamamıza olanak sağlar. Bu kontrol mekanizmalarını başlıklar halinde inceleyecek olursak:
IF: Bu kontrol mekanizması işlem bloklarının (statement_block) tanımlanması ile çalışır. Bu işlem bloklarında mantıksal eşleşmeler (log_exp) kullanılarak istenilen kontroller yapılarak işlem bir sonraki aşamaya kaydırılır. Bir IF bloğunda birden fazla işlem bloğu tanımlayabiliriz.
IF bloğu formatı şu şekildedir: IF log_exp1. [statement_block1] [ELSEIF log_exp2. [statement_block2]] ... [ELSE. [statement_blockn]] ENDIF.
Mantıksal Eşleşmeler: Abap’ ta iki veri öğesi karşılaştırıldığında bazı kriterler kullanırız: EQ = NE <> >< LT < LE <= GT > GE >=
Anlamı eşittir eşittir eşit değildir eşit değildir eşit değildir küçüktür küçüktür küçük yada eşittir küçük yada eşittir büyüktür büyüktür büyük yada eşittir büyük yada eşittir -Tablo A1-
Karşılaştırma prosedürü şu şekildedir: Rakamsal veriler (tip I,F ve P) ve rakamsal stringler (tip N) içerdiği değerlere göre karşılaştırılır. Diğer veri tipleri için (C,T,D ve X) karşılaştırma solda sağa doğru çalışır. Solda bulunan verinin ilk karakterinin büyüklük durumuna göre karşılaştırma sistem tarafından yapılır. Tarih karşılaştırmalarında (D) ileri bir tarih diğerinden daha büyüktür. Hexadecimal veri tiplerinde ise bayt değerlerine göre karşılaştırma yapılır.
20
CASE: Bu kontrol mekanizması, bir veri öğesinin içeriğine göre belirlenen işlem bloklarının çalışmasını sağlar. CASE . WHEN [OR OR ...] WHEN .[OR OR ...] WHEN [OR OR ...] WHEN ... ...... WHEN OTHERS. ENDCASE.
Yukarıdaki yapıda WHEN koşulu veri öğesinin içerdiği değerin eşleştiği durumlarda işlem bloklarını devreye sokar. WHEN OTHERS koşulu, eğer değeri hiçbir eşleşme yakalayamaz ise devreye girer. Son işlem bloğu ENDCASE koşulu ile bitirilmelidir. Örnek program kodlaması: DATA: TEXT1 TEXT2 TEXT3 STRING
VALUE 'X', VALUE 'Y', VALUE 'Z', VALUE 'A'.
CASE STRING. WHEN TEXT1 OR TEXT2. WRITE: / 'String is', TEXT1, 'OR', TEXT2. WHEN TEXT3. WRITE: / 'String is', TEXT3. WHEN OTHERS. WRITE: / 'String is not', TEXT1, TEXT2, TEXT3. ENDCASE. Ekran görüntüsü şu şekildedir: String is not X Y Z
21
Döngü Mekanizmaları LOOPS: Loop denilen döngü yapılarında işlem blokları birbirini takip eden şekilde bir veya daha fazla sayıda işleme sokulur. ABAP programlama dilinde dört çeşit döngü vardır:
Koşulsuz döngüler DO döngüsü. Koşullu döngüler WHILE döngüsü. Internal tabloları ve belirli bir Dataset’ i kullanan LOOP döngüsü. Veri tabanından çekilen Dataset’ i kullanan LOOP döngüsü.
KOŞULSUZ DÖNGÜLER: Bir işlem bloğunu koşulsuz olarak bir veya daha fazla kere çalıştıran döngülerdir. Bu döngünün yapısı şu şekildedir: DO [ TIMES] [VARYING FROM NEXT ]. ENDDO.
Bu tip bir döngüde eğer eklentiler olmazsa işlem blokları bir çıkış noktası olan EXIT veya STOP görene kadar çalışmaya devam eder. Bu döngü içinde TIMES eki kullanıldığında ise değeri kadar döngü çalışır. Eğer değeri 0 veya eksi bir değer ise döngü çalışmaz. Döngü içinde TIMES eki kullanılmadığında, döngüden çıkış için EXIT yada STOP eklerinden en az birinin kullanıldığından emin olunmalı. VARYING eki kullanıldığında ise döngü her seferinde değerine yeni bir veri ataması yapar. Örneğin: DATA: BEGIN OF TEXT, WORD1(4) VALUE 'B', WORD2(4) VALUE 'is', WORD3(4) VALUE 'a', WORD4(4) VALUE 'loop', END OF TEXT. DATA: STRING1(4), STRING2(4). DO 4 TIMES VARYING STRING1 FROM TEXT-WORD1 NEXT TEXT-WORD2. WRITE STRING1. IF STRING1 = 'is'. STRING1 = 'was'. ENDIF. ENDDO. SKIP. DO 2 TIMES VARYING STRING1 FROM TEXT-WORD1 NEXT TEXT-WORD3 VARYING STRING2 FROM TEXT-WORD2 NEXT TEXT-WORD4. WRITE: STRING1, STRING2. ENDDO. Ekran Görüntüsü: This is a loop
22
KOŞULLU DÖNGÜLER: Eğer bir döngüyü kesin bazı koşullara göre çalıştırmak istiyorsak aşağıdaki yapıyı kullanırız: WHILE [VARY FROM NEXT ]. ENDWHILE.
herhangi bir karşılaştırma kriteri olabilir. WHILE ile ENDWHILE arasındaki işlem bloğu doğru olduğu sürece veya bir çıkış eki olan EXIT veya STOP görene kadar çalışmaya devam eder. SY-INDEX veri öğesi döngünün kaç defa çalıştığının bilgisini tutar. VARYING eki DO döngüsünde olduğu gibi çalışır. Örneğin: DATA: LENGTH TYPE I VALUE 0, STRL TYPE I VALUE 0, STRING(30) TYPE C VALUE 'Deneme yazısı'. STRL = STRLEN( STRING ). WHILE STRING NE SPACE. WRITE STRING(1). LENGTH = SY-INDEX. SHIFT STRING. ENDWHILE. WRITE: / 'STRLEN: ', STRL. WRITE: / 'Kelime uzunlugu:', LENGTH. Çıktının görüntüsü şu şekildedir: Deneme yazısı STRLEN: Kelime uzunluğu:
11 11
Yukarıda bulunan örnekte bir kelimenin karakter uzunluğunun WHILE döngüsü içinde nasıl yazıldığını inceledik. Bu örnekte kelime boş değerler içerene kadar döngü her çalıştığında bir karakter sola kaydırılıyor.
23
DÖNGÜLERDEN ÇIKIŞ İŞLEMİ: ABAP programlama dilinde standart olarak bazı çıkış durumları tanımlanmıştır, bu çıkış durumları zamanından önce döngülerden çıkış işlemi için kullanılır.
Koşulsuz çıkış durumları: Bu gibi durumlarda CONTINUE durumunu kullanırız. Sistem bu durumu gördükten sonra mevcut işlem bloğu durdurulur ve döngü bir sonraki aşamaya geçer. Örneğin: DO 4 TIMES. IF SY-INDEX = 2. CONTINUE. ENDIF. WRITE SY-INDEX. ENDDO. Ekran çıktısı: 1 3 4
Koşullu çıkış durumları: Bu tür çıkış durumlarında, işlem bloğu içerisinde CHECK yapısını kullanırız. Eğer CHECK kontrolü sonrasında eşitlik sağlanmazsa döngü bir sonraki aşamaya geçer. Örneğin: DO 4 TIMES. CHECK SY-INDEX BETWEEN 2 and 3. WRITE SY-INDEX. ENDDO. Ekran çıktısı: 2 3
Döngüden EXIT ile çıkış: Bir döngüden herhangi bir koşula bağlı kalmadan ve acil olarak çıkmak gerektiğinde işlem bloğunda EXIT durumunu kullanırız. Bu çıkış kullanıldığında program döngü çıkışından (ENDDO, ENDWHILE, ENDLOOP, ENDSELECT) sonra işleme devam eder.
24
Dahili Tablolar – Internal Tables Dahili tablolar (ITAB) ABAP’ ta hafıza üzerinde çalışan, belli bir structure kullanarak veri çekme ve işleme için kullanılır. Itab içinde bulunan veri hafızada satır olarak tutulur ve her satır aynı tiptedir. Abap programlama dilinde kullanılan Dahili Tablolar diğer programlama dillerinde bulunan Array yapısına bir karşılıktır. ABAP’ ta belirli bir tipte bulunan veri bloklarını işleyecek olduğumuzda ITAB yapısını kullanmalıyız.
Veri tipi olarak Dahili Tablolar: Bir dahili tablonun veri yapısı o dahili tablonun satır tipine, anahtar alanlarına ve tablo tipine göre belirlenmiş olur.
Satır Tipi: Bir dahili tablonun satır tipi herhangi bir veri tipi olabilir. Normal olarak bunun için bir structure kullanılır. Structure’ ın her elemanı dahili tablo içinde bir sütun demektir. Yinede, bir satır tipi öntanımlı veya başka bir dahili tablo olabilir.
Anahtar (KEY): Anahtar tablo satırlarını tanımlar. Dahili tablolar için iki çeşit anahtar bulunmaktadır, kullanıcı tanımlı olanlar ve standart tanımlı olanlar. Anahtarın UNIQUE veya NON-UNIQUE olacağı belirlenebilir. UNIQUE key olan bir dahili tabloda tekrarlanan kayıtlar bulunamaz.
Tablo Tipi (Table Type): Tablo tipi ABAP’ ın belli başlı tablo kayıtlarına erişimini sağlar. Dahili tablolar üç alana ayrılır: Standart Tablolar, Sorted Tablolar ve Hashed Tablolar. Hashed tabloda tabloya erişim sadece anahtar (Key) alan üzerinden yapılmaktadır. Diğer tablo tiplerinde ise anahtar alan veya tablo indeksine göre erişim yapılabilir. NOT: Dahili Tablo yapılarının daha kapsamlı açıklamaları için ABAP sözdizimi (syntax) dokümantasyonu kullanılmalıdır.
Dahili Tablo Yaratmak (ITAB): Diğer veri tipleri gibi, ITAB yaratmak için TYPE veya LIKE ekini kullanırız, TYPES ekini kullanarak lokal olarak yeni bir ITAB yapısı da oluşturabiliriz. TYPES TYPE|LIKE OF [WITH ] [INITIAL SIZE ].
TYPE veya LIKE ekinden sonra işlem şu şekilde yapılanır: OF [WITH ]
TYPE eki dahili tablonun tablo tipini , satır tipini ve anahtar alanını belirler.
25
TABLO TİPİ : Tablo tipini takip eden resimde görüldüğü gibi tanımlayabiliriz:
-Resim A17-
GENEL TABLO TİPLERİ: INDEX TABLE İndeks yapısı ile erişim sağlayan tablo yapıları. ANY TABLE Bu tip tablo yapıları sadece field symbol yapısı kullanılarak yapılabilir. Bu sebepten dolayı indeks erişimi bu tip tablo yapıları için mümkün değildir.
ÖZELLEŞTİRİLMİŞ TABLO TİPLERİ: STANDARD TABLE veya TABLE Standart tablo yapıları yaratmak için kullanılır. SORTED TABLE Sorted tablo yapıları yaratmak için kullanılır. HASHED TABLE Hashed tablo yapıları yaratmak için kullanılır. Özelleştirilmiş tablo yapıları sayesinde, sistemin tablo kayıtlarına anahtar alanlar üzerinden nasıl ulaşılacağı belirlenir. Arama yapıldığında, standart tablolar için linear arama, sorted tablo yapısı için binary arama, hash tablolar için ise bir hash algoritması kullanır.
SATIR TİPİ : Satır tipi için: Abap ön tanımlı tipi, lokal olarak tanımlı bir tip veya ABAP Kitaplığından (ABAP DICTIONARY) bir veri tipi kullanılabilir. Bu şekilde satır tipi tanımlandığında eğer veri özelliklerini kendimiz tanımlamazsak sistem başlangıç değerleri ile satır tipini oluşturur. 26
ANAHTAR : Anahtar alanın tanımlanması şu şekilde olur: [UNIQUE|NON-UNIQUE] KEY ... [UNIQUE|NON-UNIQUE] KEY TABLE LINE [UNIQUE|NON-UNIQUE] DEFAULT KEY
Bir anahtar alan belirlemek isteğe bağlıdır. Eğer bir anahtar alan belirlenmez ise sistem otomatik olarak bir anahtar alan belirler. UNIQUE veya NON-UNIQUE ekleri tabloda tekrarlayan girdiler olup olmayacağı konusunda belirleyici rolü üstlenir. Örnek Tablo Tanımlamaları: TYPES: BEGIN OF LINE, COLUMN1 TYPE I, COLUMN2 TYPE I, COLUMN3 TYPE I, END OF LINE. TYPES ITAB TYPE SORTED TABLE OF LINE WITH UNIQUE KEY COLUMN1.
Örnekte, sistem LINE yapısında bir ITAB tanımlıyor. Bu ITAB Sorted Tablo olarak yaratılıyor ve COLUMN1 alanını anahtar alan olarak atıyor. Bu sayede tablo içerisinde tekrarlanmayan veriler olması amaçlanıyor. TYPES: BEGIN OF LINE, COLUMN1 TYPE I, COLUMN2 TYPE I, COLUMN3 TYPE I, END OF LINE. TYPES ITAB TYPE SORTED TABLE OF LINE WITH UNIQUE KEY COLUMN1. TYPES: BEGIN OF DEEPLINE, FIELD
TYPE C,
TABLE1
TYPE VECTOR,
TABLE2
TYPE ITAB,
END OF DEEPLINE. TYPES DEEPTABLE TYPE STANDARD TABLE OF DEEPLINE WITH DEFAULT KEY.
TYPE veya LIKE eklerini kullanarak yarattığımız dahili tablolara ek olarak DATA ekini kullanarak da dahili tablo yapıları oluşturabiliriz.
27
DATA eki ile dahili tablo yapısı: DATA TYPE|LIKE OF WITH [INITIAL SIZE ] [WITH HEADER LINE].
Dahili tabloya INITIAL SIZE eki ile dilediğimiz miktarda hafıza alanı ayırabiliriz. Ek olarak WITH HEADER LINE ekini kullandığımızda dahili tabloya “work area” dediğimiz çalışma alanı atamış oluruz. Bu çalışma alanı sayesinde dahili tablonun satır tipinde bir çalışma alanı oluşturulur ve tablo işleme sokulduğunda tablo içindeki veriler o çalışma alanı üzerinden işleme sokulur.
DAHİLİ TABLO İŞLEMLERİ: DAHİLİ TABLO ATAMALARI: MOVE işlemi dahili tablolar için de daha önceden tanımladığımız şekilde çalışır. MOVE TO .
Veya aynı işlemi gören: = .
Yukarıda bulunan her iki komut bir tablonun bütün içeriğini diğer tabloya atar. Eğer HEADER LINE dediğimiz çalışma alanını kullanıyorsak, tablo ile çalışma alanının aynı ismi taşıdığını unutmamamız gerekir. Dolayısıyla tablo içeriğini atamak istiyorsak tablo adından sonra bu iki parantezi [] kullanmayı unutmamalıyız. Örneğin: DATA: BEGIN OF LINE, COL1, COL2, END OF LINE. DATA: ETAB LIKE TABLE OF LINE WITH HEADER LINE, FTAB LIKE TABLE OF LINE. LINE-COL1 = 'A'. LINE-COL2 = 'B'. APPEND LINE TO ETAB. MOVE ETAB[] TO FTAB. LOOP AT FTAB INTO LINE. WRITE: / LINE-COL1, LINE-COL2. ENDLOOP.
Ekran çıktısı şu şekildedir: AB Yukarıda bulunan örnekte LINE tipinde ETAB ve FTAB isimli iki tane STANDARD tablo oluşturuyoruz. ETAB tablomuzun çalışma alanı bulunmakta. APPEND komutu ile ETAB tablosunu doldurduktan sonra, ETAB’ ın bütün içeriğini FTAB tablosuna atıyoruz. İşlem bloğundaki parantezlere dikkat edilmesi gerekmektedir. DAHİLİ TABLO SIFIRLAMALARI: Diğer veri öğelerinde olduğu gibi, dahili tablolarda sıfırlama işlemlerini: CLEAR . Bu komuttan sonra tablosuna sistem geri yükleme yapar. Bu geri yükleme sonrasında tablo içinde hiç satır bulunmaz.
28
Eğer tabloyu WITH HEADER LINE eki ile yaratmışsak, tablo ile çalışma alanının isimlerinin aynı olduğunu unutmamamız gerekir ve tablo içeriğini temizlemek istiyorsak parantezleri [] kullanmalıyız. CLEAR []. REFRESH .
CLEAR komutunda tablonun daha önceden kullandığı hafıza alanı korunur. REFRESH komutu ise sadece tablo alanını temizler ve çalışma alanını etkilemez. Eğer tablo için kullanılan hafıza alanını serbest bırakmak istersek FREE .
komutunu kullanırız. DAHİLİ TABLO SIRALAMALARI (SORTING): Program içinde kullandığımız tabloları içindeki verilere göre sıralayabiliriz. Anahtar alana göre sıralama yapmak için aşağıdaki kod yapısını kullanırız: SORT [ASCENDING|DESCENDING] [AS TEXT] [STABLE].
Standart olarak tablo büyük değere doğru (ASCENDING) sıralanır. Sıralama düzeni tablonun standart anahtar alanlarına göre yapılır. ASCENDING ve DESCENDING komutlarını kullanarak sıralama düzenini seçebiliriz. Eğer anahtar alan dışında başka alanlara göre sıralama yapmak istiyorsak takip eden yapıyı kullanırız: SORT [ASCENDING|DESCENDING] [AS TEXT] [STABLE] BY [ASCENDING|DESCENDING] [AS TEXT] ... [ASCENDING|DESCENDING] [AS TEXT].
Örnekte, tablo bizim belirlediğimiz ve alanlarına göre sıralanır. BELİRLİ SATIRLARA GÖRE İŞLEM YAPMA: Aşağıda bulunan işlemler tablonun tek bir satırı için yapılabilir:
Tabloyu satır satır doldurmak Tabloyu içeriğine satır satır erişmek Belirli satırları düzenlemek Belirli satırları silmek
ÇALIŞMA ALANI İLE ERİŞİM: Belirli tablo kayıtlarına erişerek yapılan işlemlerde, tabloda bulunan veri ile direkt olarak çalışıyor olmayız. Bunun yerine başka bir veri öğesini çalışma alanı olarak atarız ve onun üzerinde çalışırız. Bu veri tipi tablo yapısı ile aynı olmak durumundadır. Tablodan bir kayıta erişim yaptığımızda, o kayıtın içerdiği verileri bir çalışma alanına atarız ve program içinde o veriyi kullanırız.
29
-Resim A18-
SATIR EKLEME: TEK BİR SATIR EKLEME: Tabloya tek bir satır eklemek istediğimizde takip eden yapıyı kullanırız: INSERT INTO TABLE .
Ekleme yapılan verinin tipi tablo ile aynı olmak zorundadır aksi takdirde sistem ekleme işlemini gerçekleştiremez. Sistem başarılı bir ekleme işlemi gerçekleştirirse SY-SUBRC değeri 0 olur fakat gerçekleştiremezse SY-SUBRC değeri 4 olur.
BİRDEN FAZLA SATIR EKLEME: Bir dahili tabloya birden fazla satır eklemek istediğimizde takip eden yapıyı kullanırız: INSERT LINES OF [FROM ] [TO ] INTO TABLE .
Tablonun yapısına göre değişmek üzere, bu komut kullanıldığında tabloya satır ekleme işlemi bir döngü içinde satır satır ekleme yapmaya göre ortalama olarak 20 kat daha hızlı çalışmaktadır.
TABLO SATIRLARINI OKUMA: Tablodan tek bir satır okumak istediğimizde takip eden yapıyı kullanırız: READ TABLE .
ARAMA KRİTERİ BELİRLEME: Tablodan bir kritere göre veri okumak istediğimizde takip eden yapıları kullanırız: READ TABLE FROM .
Veya READ TABLE WITH TABLE KEY = ... = .
İlk kullanım şeklinde anahtar alanların verileri çalışma alanının anahtar alanlarından alınır. Bunun olması için ise veri öğesinin tipinin ile aynı olması gerekir. İkinci kullanım şeklinde ise arama yapılacak her anahtar alan için verileri kendimiz belirleriz. 30
FARKLI BİR ALANA GÖRE ARAMA KRİTERİ BELİRLEME: Tablonun anahtar alanı dışında başka bir alana göre arama yapmak istediğimizde takip eden yapıları kullanırız: READ TABLE WITH KEY = .
veya READ TABLE WITH KEY = ... = .
İlk kullanım şeklinde tablonun satır tipinin tamamı arama kriteri olarak kullanıldı. İkinci kullanım şeklinde ise arama kriteri değerleri arasındaki herhangi bir tablo alanına göre oluştu.
SATIR DEĞİŞTİRME: Dahili tablo yapısında bir satırı değiştirmek için takip eden yapı kullanılır: MODIFY TABLE FROM [TRANSPORTING ...].
Bu komutun çalışması için ile satır tipi olarak aynı yapıda olması gerekmektedir. Eğer bir değişiklik varsa sistem değişiklik olan satırları günceller. TRANSPORTING ekini kullanarak anahtar olmayan alanlardaki atama işlemleri mümkün olur.
KOŞULLU SATIR DEĞİŞTİRME: Belli bir koşula göre güncelleme yapmak istediğimizde takip eden yapıyı kullanırız: MODIFY FROM TRANSPORTING ... WHERE .
SATIR SİLME: Tablodan satır silmek için kullanılan yapılar: DELETE TABLE FROM .
Veya DELETE TABLE WITH TABLE KEY = … = .
şeklindedir. İlk yapıda silme işlemi, anahtar alan verileri çalışma alanı olan dan alınarak yapılmaktadır. İkinci yapıda ise anahtar alanları ve değerlerini kendimiz belirleyerek silme işlemini gerçekleştirmekteyiz.
BELİRLİ BİR KRİTERE GÖRE BİRDEN FAZLA SATIR SİLME: Tablodan bazı koşullara göre birden fazla veri silme işlemi için: DELETE WHERE .
yapısını kullanırız. TEKRARLANAN KAYIT SATIRLARINI SİLME: Tabloda bulunan veriler içerisinde tekrarlanan kayıtlar varsa ve bunları silmek istiyorsak: DELETE ADJACENT DUPLICATE ENTRIES FROM [COMPARING ... |ALL FIELDS].
Yapısını kullanırız.
DÖNGÜ İÇERİSİNDE TABLO KULLANIMI: Dahili tablolar için döngü mekanizmalarını kullanabiliyoruz. 31
LOOP AT . ENDLOOP.
Yukarı bulunan yapıda tablo satırları okunur ve işlem bloğunda tanımlanan sıraya göre işleme sokulur. ekini kullanarak işleme sokulacak tablo satırlarını belirlediğimiz koşullara göre sınırlayabiliriz. ÇALIŞMA ALANI KULLANMA: Tablo satırlarını bir çalışma alanına atayarak işlem yapmak için eki takip eden şekilde doldurulur: LOOP AT INTO .
Döngü her çalıştığında tablonun bir satırı çalışma alanı olan içine atanır ve tanımlanan işlem bloğunda işleme sokulur.
APPEND İŞLEMİ: Bir indeks tablosuna satır eklemek için takip eden yapıyı kullanırız: APPEND TO .
Üstteki yapıda satır tipi olan yapısı a eklenir. Bunun yanında INITIAL LINE eki kullanılarak a boş bir satır eklenebilir.
BİRDEN FAZLA APPEND İŞLEMİ: Bir indeks tablosuna dahili tablonun satırlarını eklemek için takip eden yapıyı kullanırız: APPEND LINES OF TO .
Yukarıda bulunan yapıda in içindeki bütün veriler ye eklenir. in satır tipi ile aynı olmak zorundadır.
INDEX KULLANIMI: Dahili tablolarda INDEX kullanarak satır eklemesi, satır okuma, satır değiştirme ve satır silme işlemleri gerçekleştirilebilir. Satır ekleme işlemleri için kullanılan yapı: INSERT INTO [INDEX ].
Bu kullanımda içinde ile belirtilen satıra eklenir. Satır okuma işlemleri için kullanılan yapı: READ TABLE INDEX . Bu kullanım şeklinde ile belirtilen satır kısmında belirlenen kritere göre okunur. Satır değiştirme işlemleri için kullanılan yapı: MODIFY FROM [INDEX ] [TRANSPORTING ... ]. Bu kullanım şeklinde içinde ile belirlenen satır içinde bulunan veriye göre değiştirilir. ile yapısal olarak birbirinin aynı olmak zorundadır. Satır silme işlemleri için kullanılan yapı: DELETE [INDEX ].
32
Bu kullanım şeklinde içinde ile belirtilen satır silinir.
HEADER LINE olmadan tablo işlemleri HEADER LINE ile tablo işlemleri Tabloya göre değişmeyen işlemler INSERT INTO TABLE . COLLECT INTO . READ TABLE ... INTO . MODIFY TABLE FROM ... MODIFY FROM ...WHERE ... DELETE TABLE FROM . LOOP AT ITAB INTO ...
INSERT TABLE ITAB. COLLECT . READ TABLE ... MODIFY TABLE ... MODIFY ... WHERE ... DELETE TABLE . LOOP AT ITAB ...
INDEX tabloları için kullanılabilen işlemler APPEND TO . INSERT INTO ... MODIFY FROM ...
APPEND . INSERT ... MODIFY ... -Tablo A2-
NOT: INDEX kullanımı ile çoklu satır işlemleri için ABAP sözdizimi (syntax) dokümantasyonu incelenmelidir.
33
Alt Rutin İşlemleri – Form & Perform Alt rutinler (FORM) ABAP programlama dilinde tanımladığımız işlem yöntemidir. Tanımladığımız alt rutinleri başka programlar içinden de çağırabilmekteyiz. Alt rutin ile yapılan işlemler lokal olarak program içinde kullanılmaktadır. Eğer sistem içinde çalışabilen bir yapı kurmak istiyorsak FUNCION BUILDER ekranını kullanmamız gerekmektedir.
ALT RUTİN TANIMLAMA: FORM [USING ... [VALUE(][)] [TYPE |LIKE ]... ] [CHANGING... [VALUE(][)] [TYPE |LIKE ]... ]. ... ENDFORM.
Yukarıda bulunan yapıda alt rutinin ismi olarak tanımlanıyor. İsteğe bağlı olan USING ve CHANGING kullanımları parametreleri belirliyor. Yaratılan alt rutinler programın sonlarında yer almaktadır.
ALT RUTİNLERDE LOKAL VERİLER: Alt rutinlerde TYPES ve DATA ile tanımlanan veriler alt rutin sona erdiğinde sistem tarafından silinir. Her alt rutin kendi çalışma alanına sahiptir. Bu sebepten dolayı eğer global bir veri ile aynı ismi taşıyan bir veri lokal olarak alt rutin içerisinde tanımlanırsa, global olan veri alt rutin içerisinde kullanılamaz duruma gelir. Bu yüzden alt rutin içerisinde veri tanımlandığında l_ ile başlayan isimler kullanılması kullanım açısından daha faydalı olur. Örnek kodlama: TYPES WORD(10) TYPE C. DATA TEXT TYPE WORD. TEXT = '1234567890'. WRITE / TEXT. PERFORM DATATEST. WRITE / TEXT. FORM DATATEST. TYPES WORD(5) TYPE C. DATA TEXT TYPE WORD. TEXT = 'ABCDEFGHJK'. WRITE / TEXT. ENDFORM. Bu kod satırları çalıştığında ekran çıktısı şu şekildedir: 1234567890 ABCDE 1234567890
34
ALT RUTİN PARAMETRELERİ: FORM USING ... [TYPE |LIKE ] ... CHANGING ... [TYPE |LIKE ] ...
USING ve CHANGING parametrelerinin kullanım amacı, alt rutin içerisine kullanmak veya değiştirmek için veri göndermek. USING parametresi ile gönderilen veriler alt rutin içerisinde kullanılmaktadır, CHANGING parametresi ile gönderilen veriler ise alt rutin içerisinde değiştirilebilmektedir. FORM TABLES ... [TYPE |LIKE ] ...
Alt rutin içerisine gönderilen standart ve çalışma alanı olan bir tablo olarak tanımlanıyor ve alt rutin içerisine gönderiliyor. Eğer çalışma alanı olmayan bir tablo alt rutin içerisine gönderilirse sistem lokal olarak bir çalışma alanı ataması yapar.
ALT RUTİNLERİ SONLANDIRMA: Bir alt rutin normal olarak ENDFORM durumda sonlanır fakat alt rutini daha erken sonlandırmak istersek CHECK veya EXIT komutlarını kullanırız. EXIT kullanıldığında alt rutin koşulsuz olarak sonlandırılır, CHECK kullanıldığında ise alt rutin belli koşullara göre sonlandırılır. Örneğin: PERFORM TERMINATE. WRITE 'Program sonu. FORM TERMINATE. WRITE '1'. WRITE '2'. WRITE '3'. EXIT. WRITE '4'. ENDFORM.
İşlemin ekran görüntüsü şu şekildedir: 1 2 3 Program sonu
ALT RUTİNLERİ ÇAĞIRMA: Alt rutinleri çağırmak için aşağıdaki yapı kullanılmaktadır: PERFORM... [USING ... ... ] [CHANGING... ... ].
USING ve CHANGIN kullanımlarında alt rutine giriş yapan parametrelerin giriş sırası çok önemlidir.
35
Alt rutinleri örnekleri: DATA: DATE1 DATE2 STRING1(6) STRING2(8) NUMBER1 NUMBER2 COUNT1 COUNT2
TYPE D, TYPE T, TYPE C, TYPE C, TYPE P DECIMALS 2, TYPE P, TYPE I, TYPE I.
PERFORM TYPETEST USING DATE1 STRING1 NUMBER1 COUNT1. SKIP. PERFORM TYPETEST USING DATE2 STRING2 NUMBER2 COUNT2. FORM TYPETEST USING NOW TXT TYPE C VALUE(NUM) TYPE P INT TYPE I. DATA: T. DESCRIBE FIELD NOW TYPE T. WRITE: / 'Type of NOW is', T. DESCRIBE FIELD TXT LENGTH T. WRITE: / 'Length of TXT is', T. DESCRIBE FIELD NUM DECIMALS T. WRITE: / 'Decimals of NUM are', T. DESCRIBE FIELD INT TYPE T. WRITE: / 'Type of INT is', T. ENDFORM. Programın ekran çıktısı şu şekildedir: Sum of Sum of
2 and 7 and
4 is 11 is
6 18
36
Fonksiyon Modülleri Temel Bilgiler Fonksiyon modülleri, fonksiyon grupları altında tanımlanan ve ABAP içinde herhangi bir programdan çağırılabilen işlem yöntemleridir. Fonksiyon grupları fonksiyon modülleri için taşıyıcı görevi görmektedir.
FONKSİYON MODÜLLERİNİN ÇAĞIRILMASI: Bir ABAP programı içerisinde fonksiyon modülü çağırılacağı zaman CALL FUNCTION komutunu kullanırız. Temel yapısı şu şekildedir: CALL FUNCTION [EXPORTING f1 = a1.... fn = an] [IMPORTING f1 = a1.... fn = an] [CHANGING f1 = a1.... fn = an] [TABLES f1 = a1.... fn = an] [EXCEPTIONS e1 = r1.... en = rn [ERROR_MESSAGE = rE] [OTHERS = ro]].
Yukarıda bulunan yapıyla ilgili olarak:
Fonksiyonun ismini kısmında tanımlanır. EXPORTING kısmından sonra zorunlu olan (NON-OPTIONAL) alanlara uygun verileri atamak gerekmektedir. IMPORTING kısmından sonra ise fonksiyonun programa gönderdiği veriler, aynı tipte olan veri öğeleri atanarak alınır. CHANGING ve TABLES kısımları için yukarıda bahsedilen prosedürler geçerlidir.
FONKSİYON MODÜLLERİNİN YARATILMASI: Fonksiyon modüllerini (Fonksiyonları) yaratırken ABAP Workbench üzerinde çalışan Function Builder (SE37) kullanılır.
-Resim A19-
Yukarıda bulunan resim fonksiyon modüllerinin yaratıldığı ekranın görüntüsüdür. İşlevsellik olarak SE38 ekranı ile aynı yapıya sahiptir. Fonksiyon yaratma esnasında sistem bizden fonksiyonun bağlı olacağı fonksiyon grubunu ve fonksiyonun kısa tanımını ister.
37
-Resim A20-
Fonksiyonun bağlı olduğu grubu ve kısa tanımını belirttikten sonra fonksiyon için gerekli olan içe aktarım (IMPORT), dışa aktarım (EXPORT), değiştir (CHANGING), tablolar (TABLES) ve istisna (EXCEPTIONS) parametreleri isteğe göre doldurulur. Fonksiyonlar sistem içerisinde herhangi bir yerde kullanıldığı için, parametre aralığı sadece sistemde tanımlı veri tipleri olabilir. Bunlar ABAP ön tanımlı veri tipleri, sistem tanımlı veri tipleri ve ABAP kitaplığında tanımlı olan veri tipleri olabilir. Bir veri öğesine referans verildiğinde LIKE eki kullanılamaz.
-Resim A21-
Yukarıda görünen resimde IMPORT kısmında bulunan veriler fonksiyon içerisine aktarılmaktadır.
38
-Resim A22-
EXPORT kısmında olan veriler dışarıya aktarılacak olan verileri içermektedir. EXCEPTIONS kısmında ise fonksiyon içerisinde bir hata olursa ve fonksiyon buna göre sonlanırsa, hatanın nerede alındığı konusunda belirlediğimiz kriterler doğrultusunda bize yol gösterir. SOURCE CODE kısmına ise fonksiyonda kullanacağımız ABAP kodlamalarını yazıyoruz. Örnek bir fonksiyon kodlaması: FUNCTION READ_SPFLI_INTO_TABLE. *"-----------------------------------------------------------*"*"Local interface: *" IMPORTING *" VALUE(ID) LIKE SPFLI-CARRID DEFAULT 'LH ' *" EXPORTING *" VALUE(ITAB) TYPE SPFLI_TAB *" EXCEPTIONS *" NOT_FOUND *"-----------------------------------------------------------SELECT * FROM SPFLI INTO TABLE ITAB WHERE CARRID = ID. IF SY-SUBRC NE 0. MESSAGE E007(AT) RAISING NOT_FOUND. ENDIF. ENDFUNCTION. Bu fonksiyonun program içerisinde çağırılması ise: REPORT DEMO_FUNCTION_MODULE. PARAMETERS CARRIER TYPE S_CARR_ID. DATA: JTAB TYPE SPFLI_TAB, WA LIKE LINE OF JTAB. CALL FUNCTION 'READ_SPFLI_INTO_TABLE' EXPORTING ID = CARRIER IMPORTING ITAB = JTAB EXCEPTIONS NOT_FOUND = 1
39
OTHERS = 2. CASE SY-SUBRC. WHEN 1. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO. WHEN 2. MESSAGE E702(AT). ENDCASE. LOOP AT JTAB INTO WA. WRITE: / WA-CARRID, WA-CONNID, WA-CITYFROM, WA-CITYTO. ENDLOOP.
40
Fonksiyon Grupları Her fonksiyon modülü sistemde tanımlanmış bir fonksiyon grubuna bağlı olmak zorundadır. Fonksiyon grupları fonksiyonlar için bir taşıyıcı görevi görmektedir. Sistemde yeni bir fonksiyon grubu tanımlamak istediğimizde SE80 ekranından yeni bir fonksiyon grubu oluşturabilmekteyiz.
-Resim A23-
Fonksiyon grubunun adını yazdıktan sonra görüntüle tuşunu kullanıyoruz, eğer sistemde böyle bir fonksiyon grubu mevcut değilse karşımıza çıkan ekranda istenen bilgileri tamamlayarak fonksiyon grubunu yaratabiliriz.
-Resim A24-
41
-Resim A25-
Yukarıda bulunan resimde görüldüğü gibi gerekli olan bilgileri sağladıktan sonra ve SAVE tuşu ile kayıt işlemini yapıyoruz. Yarattığımız fonksiyon grubunu artık fonksiyonlarımız için kullanabiliriz.
42
Diyalog Programlama Seçim Ekranları Seçim ekranları programda kullanıcılara seçim kriteri girmelerine yardımcı olur. Büyük bir tablodan veri çekerken belirtilen kriterler sayesinde tam olarak istenilen verinin elde edilmesini sağlar. Seçim ekranında tek değer, çoklu seçim, aralık girilebilir.
-Resim A26-
Ekranda girilen değerler varyant olarak saklanıp tekrar kullanılabilir. Sistem tarafından otomatik veri tipi kontrolü gerçekleştirilir. Örneğin tarih alanına karakter tipinde giriş yapılırsa sistem hata mesajı verir. Giriş alanı veri elemanı (data element) veya tablo alanı ile tanımlandıysa;
Giriş Yardımı (F1 yardımı) Olası Giriş Yardımı (F4 yardımı), (veri elemanına arama yardımı bağlanmışsa)
kullanılabilir. Ayrıca alan açıklamaları için kitaplık referansı (dictionary referance) alınabilir. Bu durumda alan açıklaması, tanımlandıysa kullanıcının sisteme giriş yaptığı dilde görüntülenir. 43
-Resim A27-
Seçim metinlerinin yönetimi GİT METİN ÖĞELERİSEÇİM METİNLERİ (GOTOTEXT ELEMENTSSELECTION TEXTS) menüsünden yapılabilir.
TEK SEÇİM KRİTERİ (PARAMETERS): PARAMETERS TYPE PARAMETERS LIKE
Şekillerinde tanımlanır. Sistem seçim ekranında tek değer girişine izin verir. Tanımlanan parametre programda SELECT sorgusunun WHERE cümlesinde veri sınırlama kriteri olarak kullanılabilir. DATA wa_carrid TYPE spfli-carrid. PARAMETERS p_airline LIKE wa_carrid. SELECT carrid FROM spfli INTO wa_carrid WHERE carrid = p_airline. WRITE / wa_carrid. ENDSELECT.
Parametrelere DEFAULT anahtar sözcüğü ile başlangıç değeri atanabilir. PARAMETERS: value TYPE i DEFAULT 100, name TYPE sy-uname DEFAULT sy-uname, date TYPE sy-datum DEFAULT '20090627'.
Giriş alanı OBLIGATORY anahtar sözcüğü ile zorunlu alan haline getirilebilir. Kullanıcı bu alanı doldurmadan programı çalıştıramaz. PARAMETERS field(10) TYPE c OBLIGATORY.
Seçim ekranında CHECKBOX veya RADIOBUTTON tanımlanabilir. Checkbox seçilmemiş ise boşluk ‘ ‘, seçilmişse ‘X’ değeri parametreye atanır. Radiobutton’da ise gruptan sadece bir seçenek seçilebilir. Seçili parametrenin değeri ‘X’, diğerleri boşluktur. PARAMETERS: a AS CHECKBOX, b AS CHECKBOX DEFAULT 'X'. PARAMETERS: r1 RADIOBUTTON GROUP rad1, r2 RADIOBUTTON GROUP rad1 DEFAULT 'X', r3 RADIOBUTTON GROUP rad1,
44
s1 RADIOBUTTON GROUP rad2, s2 RADIOBUTTON GROUP rad2, s3 RADIOBUTTON GROUP rad2 DEFAULT 'X'.
DEĞER KÜMELERİ (SELECT-OPTIONS): SELECT-OPTIONS FOR Şeklinde tanımlanır. Seçim ekranında aynı veri tipinde iki giriş alanı ve karmaşık seçim kümeleri yaratmaya yarayan bir buton görüntülenir. Select-Options ile dört kolonlu bir dahili tablo yaratılmış olur:
sign: Bu alan girilen değerin dahil mi (I), hariç mi (E) tutulacağını belirtir. option: Operatör alanı (EQ, NE, LE, LT, GE, GT, BT, NB, CP, NP). low: Alt limiti veya tek değeri tutar. High: Üst limiti tutar.
Tanımlanan parametre programda SELECT sorgusunun WHERE cümlesinde veri sınırlama kriteri olarak kullanılabilir. DATA wa_carrid
TYPE spfli-carrid.
SELECT-OPTIONS s_airline LIKE wa_carrid. SELECT carrid FROM spfli INTO wa_carrid WHERE carrid IN s_airline. WRITE / wa_carrid. ENDSELECT.
Seçim opsiyonlarına başlangıç değeri atanabilir. DATA wa_spfli TYPE spfli. SELECT-OPTIONS airline FOR wa_spfli-carrid DEFAULT 'AA' TO 'LH' OPTION nb SIGN i.
Giriş alanı OBLIGATORY anahtar sözcüğü ile zorunlu alan haline getirilebilir. Kullanıcı bu alanı doldurmadan programı çalıştıramaz. SELECT-OPTIONS s_airline LIKE wa_carrid OBLIGATORY.
NO-EXTENSION ile çoklu değer veya çoklu aralık seçimi engellenebilir. Kullanıcı tek değer veya tek aralık seçebilir. SELECT-OPTIONS airline FOR wa_spfli-carrid NO-EXTENSION.
Seçim kriteri olarak aralık girilmesi NO INTERVALS ile engellenebilir. DATA wa_spfli TYPE spfli. SELECT-OPTIONS airline FOR wa_spfli-carrid NO INTERVALS.
SEÇİM EKRANI OLAYLARI Seçim ekranında Enter tuşlandığında, ekrandaki bir butona basıldığında veya menü fonksiyonu çalıştırıldığında önce otomatik veri tipi kontrolü gerçekleştirilir. Veri tipi hatalı girildiyse sistem hata mesajı verir. Doğru tipte veriler girilmişse AT SELECTION-SCREEN olay bloğu çalışır. Program yürütüldüğünde ise sıradaki (START-OF-
45
SELECTION) bloğu çalışır. Veri tipi dışındaki değer kontrolleri AT SELECTION-SCREEN bloğunda gerçekleştirilir.
SEÇİM EKRANI TASARIMI Benzer kriterlerin gruplanması, birden fazla elemanın aynı satırda görüntülenmesi gibi tasarımla ilgili konularda SELECTION-SCREEN anahtar sözcüğü kullanılır. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(10) text-001. PARAMETERS: p1(3) TYPE c, p2(5) TYPE c, p3(1) TYPE c. SELECTION-SCREEN END OF LINE.
-Resim A28SELECTION-SCREEN BEGIN OF BLOCK rad1 WITH FRAME TITLE text-002. PARAMETERS r1 RADIOBUTTON GROUP gr1. PARAMETERS r2 RADIOBUTTON GROUP gr1. PARAMETERS r3 RADIOBUTTON GROUP gr1. SELECTION-SCREEN END OF BLOCK rad1.
-Resim A29-
46
Listeler Listeler minimum programlama yapılarak verilerin görüntülenmesi için kullanılır. Dilden bağımsızdır, metinler ve başlıklar sisteme giriş dilinde görüntülenebilir.
Renk ve simge eklenerek ekranda görüntülenebilir Çıktı alınabilir Internet ya da İntranette yayımlanabilir. Sistem listeleri HTML formatına otomatik dönüştürür. Yerel dosyalarda harici kullanım için saklanabilir.
Listelere Liste Başlığı ve dört satıra kadar Sütun Başlığı eklemek için iki yöntem mevcuttur:
ABAP Editöründe: Git Metin Öğeleri Liste Başlıkları menüsünden Listeden: Programı kaydedip, aktifleştirdikten sonra bir kere çalıştırarak başlık yönetim ekranına Sistem Liste Liste Başlığı menüsünden ulaşılabilir. Bu yöntemde liste ekranda göründüğü için başlıkların hizalaması daha kolay yapılabilir. Yeni başlıklar program tekrar çalıştırıldığında görüntülenir.
Çalıştırılabilir programlarda listeler içinde bulundukları olay bloğu çalıştıktan sonra görüntülenirler. Bir bloğun liste içermesi için WRITE, SKIP veya ULINE cümlesi barındırması gerekir. Çalıştırılabilir programlarda satır detayları ile ilgili işlemler için AT LINE-SELECTION olay bloğu kullanılır. Program ilk çalıştığında sy-lsind sistem değişkeninin değeri 0’dır. AT LINE-SELECTION olay bloğunun çalışıp detay listesinin ekrana gönderilmesinin ardından sy-lsind değeri 1 artırılır. Bir önceki seviyeye geri dönüldüğünde ise sy-lsind 1 azaltılır.
-Resim A30-
-Resim A31-
47
Örnek program çalıştırıldığında ekran görüntüsü şekildeki gibidir:
-Resim A32-
Satıra çift tıklanarak AT LINE-SELECTION bloğu çalıştığında ise aşağıdaki çıktı elde edilir.
-Resim A33-
Varsayılan rapor satır genişliği 83 karakter, sayfa uzunluğu 60.000 satırdır. Bu değerler REPORT cümlesinde LINESIZE ve LINE-COUNT ile değiştirilebilir. REPORT ztest_program LINE-SIZE 80 LINE-COUNT 7.
TOP-OF-PAGE olayı ile sayfa başlıkları yaratılabilir. Genellikle program çalıştırılırken girilen sorgu kriterlerinin görüntülenmesi için kullanılır. İlk WRITE, SKIP veya ULINE cümlesiyle karşılaşıldığında çalışır. Listeler için biçim (FORMAT) seçenekleri:
COLOR INVERSE HOTSPOT INPUT RESET
[ON|OFF] [ON|OFF] [ON|OFF] [ON|OFF]
Satır arka plan rengini belirler Arka plan/metin rengini tersine çevirir Tek tıklama ile AT LINE-SELECTION olayı çalışır Giriş alanı Tüm biçimleri varsayılan değere döndürür
FORMAT ile yapılan biçim ayarları bir sonraki WRITE cümlesinden itibaren etkin olur ve FORMAT COLOR OFF veya FORMAT RESET ile sonlandırılana kadar (aynı olay bloğu içinde) etkin kalır. Her yeni olay bloğunda biçim ayarları sıfırlanır.
48
WRITE CÜMLESİ SENTAKSI: WRITE {[AT] [/][pos][(len|*|**)]} dobj [int_format_options] [ext_format_options] [list_elements]. AT: çıktı konumu (pos) ve uzunluğu (len) tanımlamaya yarar. int_format_options: Dahili biçim seçenekleri
LEFT-JUSTIFIED|CENTERED|RIGHT-JUSTIFIED: Metnin hizalaması için kullanılır. Sağa dayalı, sola dayalı
veya ortalanmış seçilebilir.
WRITE: /(60) 'Left' LEFT-JUSTIFIED, /(60) 'Center' CENTERED, /(60) 'Right' RIGHT-JUSTIFIED. NO-GAP: Elemanlar arasındaki boşluğu kaldırır. WRITE: 'No' NO-GAP, 'Gap'. UNDER other_dobj: Çıktı other_dobj’un yazıldığı kolondan itibaren yazdırılır. DATA: carrid TYPE spfli-carrid, connid TYPE spfli-connid. WRITE: 10 'Carrier', 40 'Connection'. ULINE.
SELECT carrid connid FROM spfli INTO (carrid, connid). WRITE: / carrid UNDER 'Carrier', connid UNDER 'Connection'. ENDSELECT. NO-ZERO: Alanın değeri 0 ise boşluk ‘ ‘ yazılır. WRITE float NO-ZERO. DD/MM/YY: Kullanıcı profilinde önceden tanımlanmış tarih biçiminden etkilenmemek için kullanılır. Tarih
alanı WRITE ifadesinde belirtilen biçimde yazılır.
WRITE sy-datum YYMMDD. AS SYMBOLS, AS ICON: Listede sembol veya simge görüntülemek için kullanılır. Ancak INCLUDE
veya INCLUDE ifadesi de koda eklenmelidir.
SAYFA DÜZENİ İLE İLGİLİ KONULAR:
NEW-PAGE: Listede yeni sayfa yaratır. NEW-LINE: Liste çıktısında bir alt satıra geçmeye yarar. WRITE / ile aynı işlevi görür. RESERVE LINES: Sayfanın sonunda n satır boşluk bırakır. SKIP : n satır boşluk bırakır. SKIP TO LINE : İmleci sayfadaki n. satıra konumlandırır. POSITION : İmleci satırın n. kolonuna konumlandırır.
49
Ekranlar Ekranda giriş alanları, çıktı alanları, radyo butonları, checkbox, botunlar kullanılarak tasarım yapılabilir. Kullanıcıdan veri okumak ve veri görüntülemek için kullanılır. Bütün ekranlar aşağıdaki bilgilere sahiptir:
Attributes: 4 basamaklı sayıdan oluşan ekran adı, tanımı, ekran türü gibi bilgiler. Layout: Ekranda yer alan elemanlardan oluşur. Element List: Ekran öğelerinin konum, boyut, veri tipi gibi özelliklerini içerir. Flow Logic: Ekran görüntülenmeden önceki PROCESSING BEFORE OUTPUT (PBO) ve kullanıcı hareketinden sonraki PROCESSING AFTER INPUT (PAI) işlemlerinin yönetimi yapılır.
Ekranlar programdan CALL SCREEN . komutuyla çağrılır. Ekran numarasına çift tıklayarak yaratılabilir.