Smart Forms’a Giriş – 0
Bu makalemde smartformslar hakkında bilgi verip diğer makalelerimde ise adım adım smartforms nasıl oluşturulur bilgi vereceğim. Bu makaleyi daha önce yazmam gerekirdi yalnız smartforms’tan anlayan bilir ki : smartforms tek makaleye sığmayacak birşeydir.
Smartforms’u 2 açıdan incelemeliyiz. Biri tasarım kısmı diğeri ise Code kısmıdır. Önce Oluşturacağımız formun tasarımını yapmalıyız. Tasarımı yaparkende formun kullanacağı parametleri belirleriz. Ardından bu parmetreleri smartformsa oluşturacağımız kod ile göndeririz. Smartformu göstermek için ise SSF_FUNCTION_MODULE_NAME isimli fonksiyon kullanılır.
Smartformsun tasarımını yaparkende code yazabileceğimiz yerler mevcuttur. Ama bu tavsiye edilmez performansı düşürür
Smartforms uygulama açısından Cystal Reportsa benzemektedir. Her ne kadar cystal reports .NET’te rapor hazırlamak için kullanılsa da cystal Reports’u ise yakın zamanda SAP satın almıştır
Abap – Chain Statements
Abap Programlama dilinde adından da anlaşılacağı gibi zincir durumları sözkonusudur. Nitelemek gerekirse :
WRITE ‘merhaba’.
WRITE ‘Abap’.
WRITE ‘ben geldim’.
yazmak yerine aşağıdaki gibi yazılabilir.
WRITE: ‘merhaba’,
‘Abap’,
‘ben geldim’.
Yine Aynı şekilde syntax olarak birbirine benzeyen alt alta satırlar varsa :
SUM = SUM + 1.
SUM = SUM + 2.
SUM = SUM + 3.
SUM = SUM + 4.
bu desenide şöyle yazabiliriz.
SUM = SUM + : 1, 2, 3, 4.
Gördüğünüz gibi benzer durumları zincir yapıp birleştirdik.
SAP’de bulunan Demo Alv Programları
Sap’de bulunan demo alv programları abap geliştiriciler için şahane kaynaklardır. Aşağıda bulunan Demo alv programlarının listesini incelemenizi tavsiye ederim
ALV List
| Sample program on REUSE_ALV_LIST_DISPLAY which demonstrate interactive alv, how to show icon on alv, how to show checkbox on alv, how to put hotspot, all these options are available on selection-screen. | BALVSD01 |
| Simple sample program to demonstrate the use of REUSE_ALV_LIST_DISPLAY. | BALVSD02 |
| Sample program for Hierarchical ALV List using REUSE_ALV_HIERSEQ_LIST_DISPLAY. | BALVHD01 |
| Sample program on how to use REUSE_ALV_POPUP_TO_SELECT. This FM gives popup to user with ALV List to select a particular row. | BALV_POPUP_TO_SELECT |
| Sample program on how to create multiple ALV on same report using block list technique. Fm used for block list alv are REUSE_ALV_BLOCK_LIST_INIT, REUSE_ALV_BLOCK_LIST_APPEND, REUSE_ALV_BLOCK_LIST_DISPLAY | BALVBT01 |
| Sample program on REUSE_ALV_GRID_DISPLAY | BALVSD02_GRID |
Application Log Demo programs
| Simple Sample Code to create and display Application Log | SBAL_DEMO_01 |
| Demo program to show all possible formats of displaying Application log | SBAL_DEMO_04 |
Report Object Oriented ALV Grid using class CL_GUI_ALV_GRID
| Processing Print Events | BCALV_GRID_01 |
| Display Detail List in Dialog Box Container, Interaction in OO grid adding listener for double click event | BCALV_GRID_02 |
| Detail List in Dialog Window, displaying a second ALV Control in a dialog dynpro. | BCALV_GRID_03 |
| Display Exceptions (LEDs or Traffic Lights) | BCALV_GRID_04 |
| Add a Self-Defined Button to the Toolbar | BCALV_GRID_05 |
| Define Self-Defined Context Menu | BCALV_GRID_06 |
| Define a Menu in the Toolbar | BCALV_GRID_07 |
| Define a Menu with Default Pushbutton | BCALV_GRID_08 |
| Saving Options for Layouts | BCALV_GRID_09 |
| Load a layout before list display | BCALV_GRID_10 |
| Test for new layout function modules | BCALV_GRID_11 |
Data Input using Object Oriented ALV Grid using class CL_GUI_ALV_GRID
| Switch on and off the ready-for-input status of the entire grid | BCALV_EDIT_01 |
| Define ready-for-input status at cell level | BCALV_EDIT_02 |
| Verification of modified cells | BCALV_EDIT_03 |
| Delete and append rows | BCALV_EDIT_04 |
| Checkboxes | BCALV_EDIT_05 |
| Dropdown Listbox at Column Level | BCALV_EDIT_06 |
| Dropdown Listbox at Cell Level | BCALV_EDIT_07 |
| Integrate Non-Standard F4 Help | BCALV_EDIT_08 |
Object Oriented ALV Tree using class CL_GUI_ALV_TREE
| ALV Tree Control: Build Up the Hierarchy Tree | BCALV_TREE_01 |
| ALV Tree Control: Event Handling | BCALV_TREE_02 |
| ALV Tree Control: Use an Own Context Menu | BCALV_TREE_03 |
| ALV Tree Control: Add a Button to the Toolbar | BCALV_TREE_04 |
| ALV Tree Control: Add a Menu to the Toolbar | BCALV_TREE_05 |
| ALV tree control: Icon column and icon for nodes/items | BCALV_TREE_06 |
Alv için structure Oluşturulması
Struct bir biçimdir. C’de oluşturduğumuz struct ile bir tutabiliriz. İçinde hangi nesnelerin olması gerektiğini bildirdiğimiz bir biçimdir. Şimdi Struct oluşturmak için Adım adım neler yapıldığını anlatacağım. Structlarda Tablolar gibi datadictionaryden ulaşılan varlıklardandır.
Önce SE11 ile Data Dictionary’e ulaşalım. DataType’ı seçip ZVOLKANS_MUSTERI_ADRES yazalım ve create edelim. Öümüze çıkan pop-uptan structure’ı seçip devam edersek. Orda Database tablosu oluşturduğumuz pencereye benzeyen bir pencere görürsünüz. Orda Database tablosunu oluşturuyormuş gibi fieldları girmeliyiz. MANDT fieldı olmamalı biz mandt’yi sadece tablo oluştururken kullanıyoruz.
Ordaki Fieldlara sıra ile aşağıdakileri yazıyoruz ve Structure’ı aktif ediyoruz.
Field name DataElement
KUNNR KUNNR
NAME1 NAME1
ADRNR AD_ADDRNUM
ADRNAME1 AD_NAME1
CITY1 CITY1
STREET AD_STREET
TEL_NUMBER AD_TLNMBR1
Alv’nin Genel Çalışma Mantığı
Data Dictionary ve internal table’dan bahsettikten sonra bugün Alv’den bahsedeceğim. DataDictionary ve internal table’ı bilmek direk alv öğrenebilmek için yeterli değildir. Öncelikle sizde Abap’ın syntax’ını öğrenip basit write komutları ile pratikler yapmalısınız.
Alv’nin de temel yapıtaşı internal tabledır. Önce Alv’ye uygun bir structure yapılır ve ondan internal table oluşturulur, sonra bu internal veritabanından çekeceğimiz veriler ile doldurulur. Elimizde içi dolu bir internal table olduktan sonra internal table’ın bir fieldCatalog denilen internal table’ını oluştururuz. Field Catalog Alv’nin ekranda nasıl gösterileceğini belirlediğimiz bir internal tabledır. Sonra veri dolu internal table ve field catalog REUSE_ALV_GRID_DISPLAY Fonksiyonuna gönderilir. Bu fonsiyon çağrıldıktan sonra ise alv ekranda gösterilmiş olur.
- İnternal Table Oluşturulması
- İnternal Table’ın veri ile doldurulması
- Field Catalog oluşturulması
- Alv’nin ekranda gösterilmesi
Bu Kod Alv’nin Genel yapısını Özetlemek içindir. Eğer structure nasıl oluşturulur bilmiyorsanız. Onuda makale olarak ilerde ekleyebilirim.
REPORT zvolkan_musteri_adres_blog.
************************* General Type *********************************
* Alv’nin tipi silis Alvdir. Bu mutlaka olmak zorunda
TYPE-POOLS: slis.
*************************** Tables *********************************
* İnternal Table’ı oluşturduğumuz structure ve kullandığımız table’lar
TABLES: kna1, adrc,zvolkans_musteri_adres.
*************************** Constants *****************************
CONSTANTS: gc_alv_item_table TYPE slis_tabname
VALUE ‘GT_ALV’, “Alv’de gösterileck itab ismi
gc_program_name LIKE sy-repid
VALUE ‘ZVOLKAN_MUSTERI_ADRES’, “Program İsmi
gc_structure_name LIKE dd02l-tabname
VALUE ‘ZVOLKANS_MUSTERI_ADRES’. “Structure adı
**** Data and İnternal Table *****
DATA: gt_alv TYPE TABLE OF zvolkans_musteri_adres WITH HEADER LINE.
DATA: gt_flcat TYPE slis_t_fieldcat_alv. “Field Catalog tanımlanıyor.
DATA: gwa_flcat LIKE LINE OF gt_flcat. “ Field Catalog’un’ın Work areası
PERFORM get_data.
PERFORM make_field_catalog.
PERFORM display_alv.
FORM get_data .
SELECT kna1~kunnr kna1~name1
kna1~adrnr adrc~city1 “adrc~name1
adrc~street adrc~tel_number
UP TO 100 ROWS
INTO TABLE gt_alv
FROM kna1
INNER JOIN adrc ON kna1~adrnr = adrc~addrnumber.
ENDFORM. “ get_data
FORM make_field_catalog.
CALL FUNCTION ‘REUSE_ALV_FIELDCATALOG_MERGE’
EXPORTING
i_program_name = gc_program_name
i_internal_tabname = gc_alv_item_table
i_structure_name = gc_structure_name
CHANGING
ct_fieldcat = gt_flcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
ENDFORM. “ make_field_catalog
FORM display_alv .
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = gc_program_name
it_fieldcat = gt_flcat
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. “ display_alv
Field Catalogu oluşturmak için REUSE_ALV_FIELDCATALOG_MERGE fonsiyonunu kullandım. Field Catolog manuel ve yarı otomatikte oluşturulabilir. REUSE_ALV_GRID_DISPLAY yerine List display fonsiyonuda kullanılabilir. Eğer GRID’i LIST olarak değiştirip REUSE_ALV_LIST_DISPLAY fonsiyonunu kullanıp ekranın nasıl değişeceğini gözlemleyebilirsiniz.
Structure nasıl oluşturduğumu görmek için “Alv için Structure” makalesinde bulabilirsiniz.
http://volkanbekci.wordpress.com/2008/07/25/alv-icin-structure-olusturulmasi/
SAP’de Debug Yapma
Merhabalar Sap’ye yeni başlayanlar için yazılarıma son sürat devam ediyorum
SAP’de F8 ile program başlatılır. Kaynak kodunuzda herhangi biryere BREAK-POINT. yazarsanız. Sizin programınızı kullanan herkes break’e düşer. Programın nerde udrmasını istiyorsanız oraya BREAK <kullanıcıAdı>. yazın.. Ben BREAK volkan. yazarım. Debugta cursor breake gelince F5 yaparsanız program tek komut ilerler. F6′da tek komut ilerler ama F6′ya bastığınızda Eğer bir fonsiyon gibi birşey çalışıyorsa içine girmez. F5′le fonksiyonun içinide görebilirsiniz. Eğer yanlışlıkla istemediğiniz bir fonsiyonun içine girdiyseniz F7 ile çıkabilirsiniz. F8 ise bir sonraki breake kadar veya program bitene kadar çalıştırır.
Ayrıca! Debug yapmak dataların içerisini görmek içindir eğer siz dataya debug anında çift tıklarsanız datanın içeriğini gözlemleyebilirsiniz. .NETte debug yaparken tüm veriler debugta nasıl değiştiğini listelenmiş olarak görürsünüz. SAP’de debug yaparken Verinin üzerine çift tıklamanız gerekmektedir.
Sistemde bulunan demo_mod_tech_perform_list isimli program debugı görmek için güzel bir örnek, Bu örneği verdim çünkü orda çalışan programın çalışma stilide benim ilk defa gördüğüm bir stil
Tabi biz bu programın herhangi bir yerine birşey yazamıyoruz. Bu yama olur. Programı abap editörde açıp sol kenardaki boşluğa tıklarsanız diğer dillerde yaptığımız gibi sıradan bir breakpoint koymuş oluruz.
Transaction code alanına /h yazarsanız bir sonraki işleminiz için SAP debugger açılır. SAP bize kendi kodlarını izleme sanşı vermiştir. Ayrıca hatırlatma yarar var. SAP’nin abap kodlarını görebilirsiniz. ABAP open sourcedur
Internal Tables
Muhakkak bir abapçıyı en çok ilgilendiren ve adı gibi bilmesi gerekenlerin başında Internal Tables gelir. Abapta en çok kullanılan internal tablelar Bizim Ado.NET ten bildiğimiz bir tablodur aslında. Veritabanının üzerinde direk işlem yapamayacağımız için internal tablelar kullanılır. Üç tür İnternal table vardır:
- Standart İnternal Table
- Sorted İnternal Table
- Hashed İnternal Table
Ben yeni bir abapçı olduğum için daha çok standart tableları kullandım. Sorted ve Hashed table’da kullanılır. Eğer yapacağınız internal table’a milyonlarca veri dolacaksa sorted veya hashed internal kullanmak daha iyidir.
İnternal Table Nasıl Oluşturulur?
- TYPES: BEGIN OF tab,
- num TYPE i,
- name(30) TYPE c,
- END OF tab.
- TYPES: mytab TYPE STANDARD TABLE OF tab.
- DATA: wa TYPE tab,
- itab TYPE mytab.
Önce Bir tip belirledik tipimizde num bir integer, name ise 30 karakter büyüklüğünde bir stringdir. 2sini birleştirince bir structure oluşturmuş olduk. Type sadece bir şekildir içinde veri olmaz ama 6. satırda bir DATA oluşturduk. Data artık içini doldurabileceğimiz bir nesnedir. wa datasının içine yalnızca bir veri atabiliriz. Bunu table gibi kullanmak için bir table tipi oluşturmalıyız. Eğer table tipini oluşturduğumuz tabloyu data olarak tanımlarsak bu data artık internal table olur. Deneme amaçlı Ben bir internal table programı oluşturdum. Sizde kendiniz internal table için programlar yazabilirsiniz
REPORT zvolkan_itabs.
**** Bir type oluşturduk ****
TYPES: BEGIN OF tab,
num TYPE i,
name(30) TYPE c,
END OF tab.
**** Table isminde bir tip bu dedik
TYPES: mytab TYPE STANDARD TABLE OF tab.
**** İnternal table ile work areamızı oluşturduk
DATA: wa TYPE tab,
itab TYPE mytab.
DO 10 TIMES.
wa-num = 11 - sy-index.
wa-name = ‘VOLKAN’.
APPEND wa to itab.
ENDDO.
LOOP AT itab into wa .
WRITE : / wa-num, wa-name.
ENDLOOP.
WRITE / ‘**********************************************’.
**** İtab Sıralanıyor
SORT itab BY num ASCENDING.
LOOP AT itab into wa .
WRITE : / wa-num, wa-name.
ENDLOOP.
Header Line
Header Line internal table’a konulan başlık satırıdır. Work area tek satır bir alandır. Bu alanın internal table eklenmesi olarak düşünebilirsiniz.
Yukarda yazdığım aynı kodu wa olmadan header line ile birlikte şöyle yazacaktık. İnternal table’ı oluştururken sadece DATA itab TYPE mytab WITH HEADER LINE. demiş olduk.
REPORT zvolkan_itabs.
**** Bir type oluşturduk ****
TYPES: BEGIN OF tab,
num TYPE i,
name(30) TYPE c,
END OF tab.
**** Table isminde bir tip bu dedik
TYPES: mytab TYPE STANDARD TABLE OF tab.
**** İnternal table ile work areamızı oluşturduk
DATA itab TYPE mytab WITH HEADER LINE.
DO 10 TIMES.
itab-num = 11 - sy-index.
itab-name = ‘VOLKAN’.
APPEND itab.
ENDDO.
LOOP AT itab.
WRITE : / itab-num, itab-name.
ENDLOOP.
WRITE / ‘**********************************************’.
**** İtab Sıralanıyor
SORT itab BY num ASCENDING.
LOOP AT itab.
WRITE : / itab-num, itab-name.
ENDLOOP.
Daha Detaylı Bilgi için Sap’nin sitesine burdan ulaşabilirsiniz.
Data Dictionary Örnek Tablo oluşturulması
Yeni bir Database tablosu oluşturmak için transaction alanına SE11 yazın ve enter’a basın. Bizim oluşturacağımız tablolarda Programlar gibi Z ile başlamalıdır. Tablo alanına ZOGRENCI yazın ve create tuşuna basın. Önce tabloda zorunlu alanları doldurmak zorundayız. Tablomuzun kısa açıklamasını yazıp Delivery Class’ı A – Data browser/ Table View Maintenance’ı X seçelim.
Sonra Fields tabına geçerek ilk alan adını yazalım. İlk Alan adımız Mandt olmak zorunda. Üst birimi temsil eder mandt! Biz eğer tablo oluşturacaksak ilk field mutlaka mandt ve dataelement mandt olmak zorunda
Ekranda initial values yazan yeride işaretleyelim. Bu tabloya eklenen recordta mutlaka mandt dolu olması gerektiğini gösterir.
İkinci Alan olarak ise ID Yazalım. Data element kısmını gelince Predefined type butonuna tıkyalın. Tıkladığınızda göreceksinizki Dataelement ismi yazmak yerine Direk field’ın tipini kendimiz yazabileceğiz. F4′e tıklarsak giriş yardımı penceresi açılır.
Biz ID için numc karakterini seçiyoruz. ID olarak hem integer hem string girebilmeliyiz, Ayrıca bu tabloya kaç karakter girebilmeliyiz bunu belirten bir sayı numc’in yanına yazıyoruz. Mesela İstanbul Üniversitesinin okul numaralarını tutmak için 10 haneli numc yeterli . İnitial values’i ve keyi bu alanda da seçmeliyiz. anartarsız ve mandtsiz tablo olmaz. Pek nadir tablo mandtsiz olur. Bizim yaptığımız her tabloda mandt olmalı.
Öğrencinin adını ve soyadı name and surname olarak giriniz.
Öğrencinin adı için name1 data elementini seçtik. name1 zaten sistemde varolan bir dataelementtir.
Şimdi surname için biz kendimiz bir data element oluşturalım. Dataelement yazan yere ZSURNAME yazıp Üzerine çift tıklayın. Tabledan çıkmadan bize değişikleri kaydedip kaydetmeyeceğini soruyo yes diyelim. Bize yeni bir dataelement oluşrmamız gerektiğini sorar bunada yes diyerek ilk data elementimizi oluşturacağımız ekrana geçelim. Domainin kısa açıklamasını yazıp Predefined seçeneğini seçip datatype’ı char uzunluğunu 40 yapalım. Sonra Field label yazan yere gelerek. Uzunlukları farklı farklı yazalım.
Sonra mum işaretine tıklayarak dataelementimizi aktif hale getirelim. Sonra geri dönerek tableımıza geri gidelim. Eğer ilerde field 40 karaktere yetmezse predefined type ile boyutunu 50 yapabiliriz. Eğer dataelementi değiştirirsek Ona bağlı tüm tablolarda field uzunluğu değişir. Buda SAPnin güzel yanlarından biridir.
Şimdi tablomuza cins Fieldı ekleyelim. DataElementi ise ZSEX olsun. ZSEX dataelementini oluşturalım. Bu sefer bu dataelementi bir domain ile bağlayalım. Domain ismine ZDOMSEX ismini verip çift tıklayalım.
Domainin kısa açıklamasını yazdıktan sonra karakter tipini char uzunluğunu 1 verelim. Sonra value range tıklayıp F-Bayan, M-Erkek yazalım.
Domaini aktif hale getirelim. Domaini aktif hale getirirken çıkan pencerede zsex’i de seçersek aynı anda ikiside aktifleştirilmiş olur. Sonra tablomuza Geri Dönelim. Bu arada Birşeyi unuttuk. Dataelementin açıklamasını yazmadık..onuda siz yazıverin
CNSYT Cinsiyet Gibi..
En son tablomuzu aktif yapmaya çalışalım. Bir hata almış olmalısınız. Çünkü table’ın henüz technical settings denilen ayarları yok. Onu menüden GOTO-> Tecnihcal settings Orda data classı APPL0 ve Size kategoriyi 0 seçiniz. Size kategory tabloda kaç kayıt olacağı ile ilgilidir. Tabloda kaç kayıt olacağını önceden tahminen oraya yazarsanız büyük performance farklılıkları görebilirsiniz.
Bir sonraki yazımda Bu tabloya öğrencinin boyunu ve boyunun cinsini ekleyeceğim. boyu metre ve inch olabilir.

SAP ve DATA Dictionary
Şimdi SAPnin en önemli konularından biri olan database tablolarından bahsetmek istiyorum. Sonra Örnek olarak biz bir tablo oluşturacağız.
SAP bildiğiniz gibi veya bilmiyor olabilirsiniz database üzerine kurulmuş bir hiyerarşi içindedir. Nolmalde SAP kurulurken database olarak Oracle, MsSql,Sybase gibi veritabanlarını desteklemektedir. Ama biz SAP ile uğraşırken arkada veritabanına bilgiler nasıl kaydoluyor bilmemekteyiz. Daha çok biz SAPnin bize verdiği Data dictionary denen sözlüğü kullanmaktayız. Burda oluşturduğumuz tablolar normal veritabanında oluşturduğumuz tablolardan biraz farklıdır. Bu Dictionary Domain-Data Element-Tablo ilişkisi içindedir.
Domain nedir?
Domain aslında bir fielddır. Domaini oluştururken Domainin int mi, string mi, tarih mi ağırlık ölçü birimi mi belirtiriz. Ayrıca domain ile verimiz kaç karakter uzunluğunda olacak decimal ise ondalık kısmının uzunluğu nasıl olacak belirleriz.
Data Element Nedir?
Data element domain ile Table arasında kalan bir geçiş yapısıdır. Burda Fieldı tabloya koyduğumuzda verinin kısa açıklamasını daha kısa açıklamasını, en kısa açıklamasını yazabiliriz
Bu Aslında tamamen raporlama ile alakalıdır. Mesela biz bir ALV raporu yazsak gösterilen alanın başlığı burdan gelmektedir. bu başlık ise alan daraldığında ayrı, alan genişlediğinde ayrı şey yazar
Tablo nedir?
Tablo ise bildiğimiz veritabanı tablosudur. Kendi field adları vardır ve bunlara data elementler veya predefined type dediğimiz typeler veririz. Biz özel bir sebep gerekmedikçe tablo oluşturmayız. Zaten Sap’nin kendi tabloları vardır. Ve Gerçekten Abapı öğrendiğiniz zaman tabloları inceleyerek tablolar arasındaki ilişkiyi anlayarak iş süreçlerini öğrenerek Gerçek bir Abapçı olmaya başlıyorsunuz.
SAP tabloları ile ilgili bir adres ekliyorum.
http://www.erpgenie.com/abap/tables.htm
Zamanla Bu tabloların ne işe yaradığını öğreniyorsunuz. Allah inşallah saç baş yoldurmadan öğrenmeyi nasip eder inşallah
Örnek tablo isimlerini SE11′de tables alanına yazıp Göster derseniz inceleyebilirsiniz. SAPde tablo oluştururken şöyle birşeyde vardır. Siz eğer bir ağırlık uzunluk veya para gibi bir field yazarsanız buna currency/quantity fields denir. Bu alanın ölçü biriminide yine bu tablo içinde belirmeniz gereklidir. Mesela Mara tablosunu açtıysanız BRGEW brüt ağırlık alanını görürsünüz. Bu alan GEWEI Ağırlık birimi alanı ile gösterilmiştir. Demem o ki Eğer currency ve quantity alanınız varsa onun cinsini yine aynı tablodan bir field ile mutlaka belirtmelisiniz.
volkan
Yorum yapın




