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.

  1. İnternal Table Oluşturulması
  2. İnternal Table’ın veri ile doldurulması
  3. Field Catalog oluşturulması
  4. 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
OTHERS3.
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
OTHERS2.
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 :D

ABAP Document – Örnek Programlar

Eğer Abap’ı öğrenmek için örnek programlar arıyorum diyorsanız. Transaction’a ABAPDOCU Yazarak SAP’nin Abap’ı öğretmek için tasarladığı sayfada örnekleri inceleyebilirsiniz :)

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?

  1. TYPESBEGIN OF tab,
  2. num TYPE i,
  3. name(30TYPE c,
  4. END OF tab.
  5. TYPES: mytab TYPE STANDARD TABLE OF tab.
  6. DATA: wa TYPE tab,
  7. 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  ****
TYPESBEGIN OF tab,
num TYPE i,
name(30TYPE 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  ****
TYPESBEGIN OF tab,
num TYPE i,
name(30TYPE 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

Sonraki Sayfa »