26 Aralık 2008 Cuma

ABAP : Internal Table tipleri , ozellikleri ve teknik bilgiler

Merhabalar,
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

Satınalma siparişini yaratmak için Batch Input yerine BAPI kullanmak en mantıklı ve en hızlı yoldur.
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

Rapor ekranımızda, örneğin ALV ekranında bir işlem öncesi bazı değerleri almamız gerekebilir.
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.

4 Kasım 2008 Salı

ABAP : Dinamik Select Sorgusu

Sorgumuzda ki alanları dinamik olarak oluşturmamız ve select sorgusunu buna göre yapmamız gerekebilir.
Bunun için yapmamız gerken;
stype_fields
tipinde bir tablo yaratmak ve sütun isimlerini içine eklemektir.

Örnek;

TYPES :
BEGIN OF stype_fields,
fieldname TYPE name_feld,
END OF stype_fields

*ITAB ımızı tanımlayalım.
DATA:
gt_itab type standard table of MSEG with header line.


* Dinamik sorgu için kullanacağımız field isimlerinin bulunduğu
* tablo
data : g_t_fields type standard table of stype_fields.

* burada sütun isimlerini kafamıza göre belirliyoruz

append 'MSEG~ANLN1' to g_t_fields.
append 'MSEG~ANLN2' to g_t_fields.
append 'MSEG~APLZL' to g_t_fields.
append 'MSEG~AUFNR' to g_t_fields.
append 'MSEG~AUFPL' to g_t_fields.


* Select sorgumuz

select (g_t_fields)
into corresponding fields of table gt_itab
from MSEG.


İyi çalışmalar & attığınız paslara şutlara dikkat edin. :=)

ABAP : ALV ' de trafik isiklari kullanimi

ALV ekranında trafik ışıkları kullanımının iki tane yolu vardır. Bu metodlardan en kolayı, ALV çağırırken kullandığımız is_layout parametresini kullanmaktır.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING
it_fieldcat = gt_fcat

is_layout = layout

....
.... Internal table tanımlanırken, trafik ışıklarını göstermemiz için ek bir alan koymamız gerekir;
DATA : layout TYPE slis_layout_alv . "alv grid'in layout parametresi için.
DATA:
begin of gt_itab occurs 0,

icon_field(1) type c,
...

...
...
yapmamız gereken, internal tablomuzda LOOP yapıp, icon_field alanını doldurmaktır.


gt_itab-icon_field = 3. "yeşil ışık
gt_itab-icon_field = 2. "sarı ışık

gt_itab-icon_field = 1. "kırmızı ışık


Daha sonra yapmamız gereken, ALV_GRID i çağırmadan önce,

layout değişkenimiz için;

layout-lights_tabname = 'GT_ITAB'.
layout-lights_fieldname = 'ICON_FIELD'.


değerlerini göndermektir.

11 Ekim 2008 Cumartesi

ABAP : Submit Report Via Selection Screen

Bir rapor içerisinden başka bir raporu çağırmak istediğimiz de; yani çağırıp sonucu görüntülemek veya çağırıp ekran değerlerini set etmek istediğimizde kullanmamız gereken metod;


SUBMIT

VIA SELECTION SCREEN

WITH SELECTION-TABLE

AND RETURN.


*programda back tuşuna basıldığında progamdan çıkmayıp ana ekranı görüntülemesi *için RETURN kullanılmalı.


Yukarıda ki kod; raporu çağıracak ekran değerlerini et edecek ve duracaktır. Eğer; SUBMIT edip raporu görüntülemesini istiyorsak ; "VIA SELECTION SCREEN" kısmını kaldırmamız gerekecektir. Böylece, bir raporun içersinden başka bir raporu çağırmış ve raporun çıktısını görüntülemiş oluruz.

kısmı ise, diğer raporun ekranında bulunan seçimleri set etmek için kullanılan tablodur.


DATA:

seltab TYPE TABLE OF rsparams,

seltab_line LIKE LINE OF seltab .


*Örneğin ekranımızda so_tarih isminde bir select-option olsun ve çağıracağımız programda so_date isminde bir select-option olsun;


seltab_line-selname = 'SO_DATE'.

seltab_line-kind = 'S'.

*buradan aşağısı için, tanımladığınız select-option da

*loop yaparak move-corresponding de diyebilirsiniz

seltab_line-sign = 'I'.

seltab_line-option = 'BT'.

seltab_line-low = so_tarih-low.

seltab_line-high = so_tarih-high.

APPEND seltab_line TO seltab.


*Ayarları set ettikten sonra programı çağırmak kalacaktır


SUBMIT rapor_denem_1

VIA SELECTION SCREEN

WITH SELECTION-TABLE seltab

AND RETURN.


Örnek;


SUBMIT RFSSLD00 WITH SD_KTOPL-LOW = P_KTOPL
WITH SD_SAKNR IN S_RACCT
WITH SD_BUKRS-LOW = P_BUKRS
WITH B_MONATE IN S_MONAT
WITH SD_GJAHR-LOW = P_GJAHR
WITH P_ZMIZAN = 'X'
AND RETURN .



İyi çalışmalar & attığınız paslara şutlara dikkat edin.

1 Ekim 2008 Çarşamba

.NET : Function Grabber

Merhabalar,
ABAP programcılarının çok işine yarayacağını düşündüğüm Function Grabber'ı yakında buradan yayınlıyacağım. Program şuanda bitmiş durumda , sadece nasıl süslesem diye bakıyorum :).
Program; SAP a bağlanıp ekrana girdiğiniz fonksiyon tüm Import Export ve Table parametrelerini okuyarak, ilgili değişkenleri otomatik olarak tanımlamakta ve isterseniz tabloları dolduracak formlarıda otomatik olarak yazmaktadır. Aşağıya birkaç tane resim ekliyorum bakabilirsiniz.



İyi çalışmalar & Attığınız paslara, şutlara dikkat edin!





25 Eylül 2008 Perşembe

.NET : This row already belongs to another table

.NET'te , elimizdeki iki DATATABLE içinde loop yapıp, birinin değerlerini diğerine atmak istediğimizde;
This row already belongs to another table
gibi bir hata vermektir. Yani;
C#
foreach
(DataRow row in dt1.Rows){
if(......){
dt2.Rows.Add(row);
}
}

VB.net
for each row as datarow in dt1.rows
if .... then
dt2.rows.add(row)
endif.
next.
İşlemini yapamamaktayız. Sebebi ise ADD metodunu kullandığımızda, dt1 in referanslarıyla dt2 ye ekleme yapmaya çalışmasıdır.
Burada kullanacağımız metod, datatable nesnesinin IMPORTROW metodudur.

Örnek;

C#
DataTable dt1 = ds.Tables[0];
DataTable dt2 = new DataTable();

dt2 = dt1.Clone(); "sütünların aynı olması için clone şart
foreach(DataRow row in dt1.Rows){
if(......){
dt2.ImportRow(row);
}
}
VB.NET
dim dt1 as datatable = ds.tables(0)
dim dt2 as new datatable

dt2 = dt1.clone
for each row as datarow in dt1.rows
if ..... then
dt2.ImportRow(row)
endif
next


iyi çalışmalar & attığınız şutlara paslara dikkat edin :).

23 Eylül 2008 Salı

ABAP : En hizli BADI bulma yontemi

Bir transaction içindeki BADI'leri bulmak için yapacağınız işlem sırasıyla;
SE37 ye gidin,

Fonksiyon adına SXV_GET_CLIF_BY_NAME yazıp içine girin.
Kodun içine bir break-point koyun.
Yeni bir pencere açarak transaction kodunuzu yazın.
Yazıp ENTER tuşuna bastığınızda otomatik olarka break-point'e düşecektir
Burada ki , EXIT_NAME BADI'nin adını verecektir.
Yapacağınız her işlemde buraya düşer ve o transactiondaki işlemlere ait
BADI'leri kolaylıkla bulabilirsiniz.

Kolay gelsin & attığınız paslara şutlara dikkat edin.

20 Eylül 2008 Cumartesi

.NET : Zula

İş ve okuldan arta kalan zamanda kodladığım ve paylaşıma yönelik olan ZULA isimli projemi yakında yayına geçiriyorum. Program genel olarak paylaşmaya yönelik olup döküman , kod ya da diğer hertürlü veri paylaşımına uygundur. Bitmesine birkaç satır kodluk zaman kaldı :=).
Tüm işler arkada kullanılan bir webservis ile yürümektedir direk veritabanı ulaşımı olmadığı için hem hızlı hem güvenli olmaktadır. Program aynı zamanda güncel sürümünü internet aracılığıyla kontrol edip, yeni bir sürüm var ise otomatik olarak onu indirmekte ve açılırken en güncel sürümüyle açılmasını sağlamaktadır. Ayrıca yakın bir zamanda, SAP'a direk bağlanıp istediğinz bir programı tüm strucure,include ve diğer Z li ögelerle birlikte indiren bir Report Downloader ve hiç kod yazmadan rapor üretebileceğiniz bir ABAP Generator yayınlıyacağım.
Bir kaç ekran görüntüsünü göstermek gerekirse;


7 Eylül 2008 Pazar

.NET : Unable to find manifest signing certificate in the certificate store.

Bilgisayarımıza format attıktan sonra veya başka biryerden projemizi kendimize kopyaladığımızda, .NET te yazdığımız windows projelerimizi açıp, build etmek istersek;
"Unable to find manifest signing certificate in the certificate store. "
gibi bir hatayla karşılaşabiliriz.
Bu hata yüzünden projemiz build edilmeyecektir.
Düzeltmek için tek yapmamız gereken, Solution Explorer'dan projemize sağ tıklayıp
oradan Properties sekmesine tıklarız. Açılan pencereden Signing sekmesine gelip
"Create Test Certificate" butonuna tıklarsak, sorunun çözüldüğünü görürüz.

İyi çalışmalar :=)

SQL : Management Studio Kurulumu Sorunu

SQL 2005 Developer Edition ya da SQL 2005 Enterprise Edition kurarken,
eğer daha öncesinde bir SQL 2005 Express Edition kurulu ise (elle kurduysak
veya Visual Studio kurulumundan gelen bir SQL 2005 Express Edition varsa)
SQL 2005 Developer Edition veya diğerini kurarken, her nekadar Database Service'leri
kurulsada Management Studio'nun kurulmadığını, kurulumu sadece Management Studio'yu kurmak için
tekrar başlattığımızda ise karşımıza;
"The SQL Server 2005 Express Tools are installed. To continue, remove the SQL Server 2005 Express Tools"
gibi bir hatayı verdiğini ve Management Studio kurulmadığını görürüz.
Bunu aşmak için , Visual Studio 2008 i tekrar kaldırsanız veya SQL'i tamamen kaldırsanız ve tekrar kurmaya çalışsanız
yine aynı sorunla karşılacaksınız. Regedit ile oynarak bu sorun çözülse de ;
Bunu aşmak için "Microsft Windows Installer CleanUp Utility" adında bir tool geliştirmiş.

İlgili tool ; http://support.microsoft.com/kb/290301/en-us adresinden indirilebilir.

İndirdikten sonra tek yapmanız gereken, "SQL 2005 Express Edition Tools" sekmesine tıklayıp "Remove" tuşuna basmak.

Tekrar SQL 2005 Developer Edition kurduğumuzda, Management Studio'nun da kurulduğunu göreceğiz.

İyi çalışmalar :=)

5 Eylül 2008 Cuma

ABAP : TRY ENDTRY kullanimi

Hata yakalama, yazdığımız programın büyüklüğüne göre çok önemli olan bir konudur (aslında her zaman önemlidir ama bakmayın üşeniyoruz :) ). Özellikle ABAP için user-exitleri yazarken veya herhangi bir programımızda hata çıktığında programımızın patlamadan , hataya rağmen çalışmasını istiyorsak TRY ENDTRY bizim için vazgeçilmez bir yapıdır.

Örneğin, sıfıra bölmelerden kaynaklanan hatalarda veya bir Z'li tablomuzun bir satırını güncellerken oluşabilecek problemlerde programın bir şekilde çalışmasını ve ekrana RUN TIME ERROR hatasını getirmesini istemiyorsak
aşşağıdaki yapıyı kullanabiliriz.
Özellikle user-exit yazarken, SAP standart programının patlamasını engelleriz.

REPORT ZTEST_001.

*Örneğin aşşağıda sıfıra bölmeden kaynaklanan bir hata var fakat program
*Run Time Error vermeden çalışmaya devam edecektir.
*Burada ki CX_ROOT , tüm hataları tutabilen genel bir sınıftır.

data: lv_i type i.
data OREF type ref to CX_ROOT.

TRY
lv_i = 10 / 0.
CATCH CX_ROOT into OREF. "burada OREF'in içi CX_SY_ZERODIVIDE olarak dolacaktır.
write 'hata'.

ENDTRY.
write: / 'program devam ediyor'.

3 Eylül 2008 Çarşamba

ABAP : OO ALV'de yapilan degisiklikleri yakalama

Herhangi bir screende kullanacağımız OO ALV'nin düzenlenebilir sütunlarında herhangi bir değişiklik yaptığımızda , yakalamak için kullanacağımız basit bir metod mevcut.

    CALL METHOD cl_alv_dilim->check_changed_data.

Burada ki cl_alv_dilim , bizim 

Data: 
 cl_alv_dilim TYPE REF TO cl_gui_alv_grid.

şeklinde tanımladığımız GRID'in adı. Dikkat etmemiz gereken, bu metodun çalışması için bir screendeki  container için sadece bir ALV eşleştirmek , aksi halde bu metod çalışmayacaktır. Yani bir screendeki bir container için, if koşuluyla birden fazla ALV atarsak bu metod çalışmaz.

Yukarıda ki metod çalıştırıldığında, Internal Table içinin değiştiğini göreceğiz.

28 Ağustos 2008 Perşembe

ABAP : ALV de box ve checkbox kullanimi

Kullandığımız ALV'de sol kısımda seçim yapmak için sadece bir kutu veya tık atabilmemiz için checkbox kullanmamız gerekebilir.
Kutu kullanıldığımız zaman, tıklanan kutuları yakalamak için bir fonksiyon ya da metod çağırmamız gerekemez fakat checkbox kullandığımız da check_changed_data isimli bir metod çağırmamız gerekir.

İkisini de örneklersek;
Öncelikle , interal table tanımalasında mutlaka char1 tipinde bir değişkenimiz olmalı.
Mesela;
data:
begin of gt_itab occurs 0,
box(1) type c,
.
.
.
end of gt_itab.

Sadece kutu kullanacaksak;

DATA : layout TYPE slis_layout_alv .
layout-box_fieldname = 'BOX'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = layout
.burada diğer export parametreleri yollanacak
.
TABLES
t_outtab = gt_itab.


Seçilen satırları görmek içinse;

DATA ref1 TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref1.
CALL METHOD ref1->check_changed_data.

yukarıdaki kod, reuse_alv'mizi, OO_ALV gibi convert edip, check_changed_data metodunu çağırmamızı sağlar.

Checkbox kullanımı içinse yapmamız gereken, manuel field katalog oluştururken (eski gönderdiklerimde bulabilirsiniz) checkbox seçeneğine X değerini göndermemiz.

http://bilencekic.blogspot.com/2008/07/abap-fieldcatalog-oluturma.html

DATA : gt_fcat TYPE slis_t_fieldcat_alv,
gf_fcat LIKE LINE OF gt_fcat.

gf_fcat-checkbox = 'X'.
gf_fcat-edit = 'X' *eğer edit sekmesine X koymazsak checkbox a tıklanamaz

ABAP : BAPI yada BATCH INPUT mesaj tablosunu popup olarak gosterme

Batch input yada bapi sonrası dönen mesaj tablosunu popup olarak güzel bir biçimde göstermek için kullanacağımız iki adet fonksiyon mevcut (bildiğim). Fakat dikkat edilmesi gereken, bapi için olan fonksiyon (convert edilirse batch input içinde kullanılabilir) 6.0 dan sonra mevcuttur . 6.0 dan eski versiyonlar için kullanacağımız fonksiyon;

data: BEGIN OF gt_mess occurs 0,
MSGID LIKE SY-MSGID,
MSGTY LIKE SY-MSGTY,

MSGNO LIKE SY-MSGNO,

MSGV1 LIKE SY-MSGV1,
MSGV2 LIKE SY-MSGV2,
MSGV3 LIKE SY-MSGV3,
MSGV4 LIKE SY-MSGV4,

LINENO LIKE MESG-ZEILE,
END OF gt_mess.
CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
* EXPORTING
* I_MSGID =

* I_MSGTY =
* I_MSGNO =
* I_MSGV1 =

* I_MSGV2 =
* I_MSGV3 =

* I_MSGV4 =
* I_LINENO =
TABLES

I_MESSAGE_TAB = gt_mess.

Oluşacak popup şu şekilde olacaktır.



***************************************************
6.0 da kullanacağımız fonksiyo ise;

data:
it_return LIKE TABLE OF bapiret2 WITH HEADER LINE.


CALL FUNCTION 'RSCRMBW_DISPLAY_BAPIRET2'
TABLES
it_return = it_return.

27 Ağustos 2008 Çarşamba

ABAP : ALV de yapilan degisiklikleri alma

Kullandığımız ALV içersinde değiştirilebilir satır,hücre veya checkbox kullandığımızda ve bunlara uygulanan değişiklikleri almaya çalıştığımızda kullanacağımız basit bir metod mevcuttur.

USER_COMMAND formumuzun içerisinde , ekranda bir butona bastığımızda ve formumuzun içine düşürdüğümüzde.

DATA ref1 TYPE REF TO cl_gui_alv_grid.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = ref1.

CALL METHOD ref1->check_changed_data.

buradan sonra internal table kontrolu yaparsak, ekrandaki değişiklikleri aldığını görürüz.

ABAP : Domain icinde ki degerleri&textleri okuma


Bir domain içersindeki değerlerinizin açıklamalarını okumanız gerekebilir. Örneğin ALV de listelerken
01
02
03
gibi değerler yerine onların domain içersinde bulunan (eğer varsa) değerleri almamız gerekebilir.

Bunun için kullanacağımız bir den fazla fonksiyon mevcuttur, bir örneği aşşağıda bulabilirsiniz.

FORM
read_dom_text USING
p_domname like DD07L-DOMNAME
p_domvalue like DD07L-DOMVALUE_L
CHANGING

p_text like DD07T-DDTEXT.

CALL FUNCTION 'FI_CUST_READ_DOMVALUETEXT'

EXPORTING

domname = p_domname
"domain adını buraya yazıyoruz örnek: ''ZSDIC_BLT"
domvalue = p_domvalue
"hangi değerin textini alacaksak onun value değeri örnek: "01"
spras = sy-langu "dil
IMPORTING

ddtext = p_text

EXCEPTIONS
TEXT_NOT_FOUND = 1

VALUE_NOT_FOUND = 2
OTHERS = 3 .
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.

ENDFORM.

12 Ağustos 2008 Salı

ABAP : Smartform Cagirma

Smartform tasarlama işlemi bittikten sonra , çağırma aşamasında dikkat etmemiz gereken;
fonksiyonumuzu smartformda üretilen /1BCDWB/SF00000031 kodlarıyla çağırmamak.
"Call Function /1BCDWB/SF00000031
Exporting
...
...
Importing
..."
Bu metod sadece canlı ve test serveri aynı ise sorun çıkarmayacaktır. Diğer türlü yani serverlar farklı ise her formumuz için test serverında üretilen numara, canlı server da farkı olacaktır. Programımızda direk numara ile çağırdığımız için doğal olarak canlıda bulamayacaktır ve hata verecektir. Bu durumu şöyle çözebiliriz;

************************************************************

DATA:
fm_name TYPE rs38l_fnam.

CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZTST_DummyForm' * formumuzun adı
IMPORTING
fm_name = fm_name *burası bize formumuzun kodunu döndürüyor
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.

IF sy-subrc <> 0.
WRITE: / 'ERROR 1'.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

*formumuzu çağıralım
CALL FUNCTION fm_name
EXPORTING
...

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ABAP : Manuel Yazici Secme

Zaman zaman belirli yazıcılara toplu çıktılar gönderip daha sonra ekranlarınızdan çıkmadan işlemlerinize devam etmeniz istenebilir veya yazıcıyı tüm işlemlerinizin başında seçip ona göre devam etmeniz gerekebilir.
Bu aşamada yapacağınız manuel olarak yazıcıyı seçtirmenizdir.

Bir screen yaptığınızı ve
p_yazici LIKE tsp01_sp0r-rqdestl,
tipindeki p_yazici degiskenini eklediğinizi varsayıyorum.

Daha sonra smartform'u çağırmadan değişkenlerimizi tanımlamamız ve gereken atamaları yapmamız gerekir.


DATA:
g_out TYPE ssfcompop,
control TYPE ssfctrlop.

..
..

DATA:
lv_yazici(8) TYPE c,
lv_kname(4) TYPE c.



SELECT SINGLE patype kname FROM sh_prin INTO
(lv_yazici, lv_kname)
WHERE lname = p_yazici.


g_out-tdprinter = lv_yazici..
g_out-tddest = lv_kname.

control-device = 'PRINTER'.

Smartformumuzu çağırırken bu değerleri göndermeyi unutmayalım.

**********************************************
CALL FUNCTION xxx

EXPORTING
control_parameters = control
output_options = g_out
user_settings = '' *manuel ayarlarda burası boş gönderilmi

**********************************************

29 Temmuz 2008 Salı

ABAP : Hotspot Click Degeri

ALV içersinde kullandığımız bir hotspot'un tıklanan değerini almak için, User_Command formumuza ufak bir değişken eklememiz yeterli olacaktır.


FORM user_command USING u_ucomm LIKE sy-ucomm us_selfield TYPE slis_selfield. "#EC

data: lv_belnr type belnr.

*slis_selfield ALV'de ki cursor pozisyon bilgisini tutan tiptir.

lv_belnr = us_selfield-value. "tıklanan değeri value alanı tutacaktır.
endform.

SAP : Sistem Tabloları

Hepsi olmasada, bir şekilde en çok kullanabileceğiniz tablolar;


ADCPPerson/Address assignment (central address administration)
ADIRACCESSTable to store keys for TADIR objects
ADR2Telephone numbers (central address admin.)
ADRPPersons (central address administration)
APQDDATA DEFINITION Queue
APQIQueue info definition
D010SINFABAP- Information about ABAP program source code
E071Change and Transport System- Object Entries of Requests/Tasks
E07TChange and Transport System- Short Texts for Requests/Tasks
ENLFDIRAdditional Attributes for Function Modules
INDXSystem table INDX
NASTMessage Status
STXHSTXD SAPscript text file header
T005Countries
T005STaxes- Region (Province) Key
T005UTaxes- Region Key- Texts
T006Units of Measurement
T015MNames of the months
T247Month name and short text
T777ABuilding Addresses
TADIRDirectory of Repository Objects
TBTCOJob status overview table
TBTCPBatch job step overview
TFDIRFunction Module
TFTITFunction Module Short Text
TSP03LSpool- Long device names
TSTCSAP Transaction Codes
TSTCTTransaction Code Texts
TUTYPUser Types in Current Price List in SAP System
TUZUSSpecial versions
TVARVTable of variables in selection criteria
TVDIRView Directory
US930Data Relevant to Measurement for User Master Record
USR01User master record (runtime data)
USR02Logon data
USR04User master authorizations
USR06Additional Data per User
USR14Surchargeable Language Versions per User
USR21Assign user name address key
ARCH_OBJObjects for archiving and reorganization
BTCUEDDescription of user event IDs for background processing
BTXSUPBBSI- Upgrade-Information
CCCFLOWClient Copy Control Flow
DBSTATCDB Optimizer Control (Statistics Creation)
DEVACCESSTable for development users
DEVLOBSOLETE- Do not use (See TCETRAL)
E070Change and Transport System- Header of Requests/Tasks
E070LCTS- Index for Assigning Numbers to Requests/Tasks
INSTVERSDocumentation for installation Status and History
PAT03Patch Directory
SDBACDBA Action Table
T100Messages
TAPLTProgram Application Long Texts
TASYSOBSOLETE- Do not use, see TCEDELI
TDEVCDevelopment Classes
TEMSETemp Sequential table.
TLOCKChange and Transport System- Lock Table
TNAPRProcessing programs for output. Can be very handy to find the print program for a SAPScript.
TNASTPrinted output control table
TPFETTable of profile parameters
TPFHTProfile header, administration data for profiles in DB
TPROTTable contains all DD tables to be logged
TRBATCommunication Table for Transport Control
TRDIRTTitle texts for programs in TRDIR
TRESNTable of Naming Conventions in ABAP Workbench
TRJOBJob ID for Coordinating Batch-ABAP/UNIX for Transports
TSP03CSpool- Device Description Extension
TST03TemSe data
TSYSTOBSOLETE- Do not use (see TCESYST)
TWSYSOBSOLETE- Do not use (See TCETRAL)
USOBTRelation transaction - authorization object
USR03User address data
USR05User Master Parameter ID
USR12User master authorization values
USR40Table for illegal passwords
USR41User master- Additional data
UST04User masters
VARITVariant texts
VARIDVariant directory
D010TABTable for Use Report---Tables
DD02LSAP tables
DD02TR/3 DD- SAP table texts
DD03LTable Fields
DD03TDD- Texts for fields (language dependent)
EDIDCIDOC Control Records
EDIDOTShort description of IDoc types
EDID2IDOC segments (version 3.1)
EDID4IDOC segments (version 4.6)
EDSEAEDI- Table of all segments of current release
VRSX2Central Table for Version Management (Report Source)
TSE05Can add parameters to the INSERT COMMAND (IC). Then, when you insert command, your info appears in the editor. Useful for comment blocks, common section of code, etc.
CDPOSChange document items
CDHDRChange document header
T529Agoverns the foreground sequence of infotypes the system will use to prompt the user during online and batch processing. You will have to code your BDC to follow that sequence of creating infotypes.
T588Zgoverns the dynamic event processing that will only take place during online user inputs. For BDC's you will have to create separate BDC's to handle any infotypes that are inserted dynamically by this table.
T588MInfotype Screen Control

28 Temmuz 2008 Pazartesi

ABAP : Malzeme Olcu Donusumu

Malzemelerle uğraşırken zaman zaman ölçü dönüşümü yapmamız gerekebilir. Örneğin 1 KG kaç M2 ya da
5 Koli kaç Adet yapar gibi.
Bu çevirimleri yapmak için, MARC tablosuna gidip dönüşümlerle uğraşmak yerine;

MD_CONVERT_MATERIAL_UNIT

Fonksiyonunu kullanabiliriz.

Örnek;


DATA:
pmatnr LIKE mara-matnr,
pmein1 LIKE mara-meins,
pmein2 LIKE mara-meins,
pmeng1 LIKE ekpo-menge,
pmeng2 LIKE ekpo-menge.

CLEAR : pmatnr, pmein1, pmein2, pmeng1, pmeng2.


CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
i_matnr = pmatnr "malzeme numaramız
i_in_me = pmein1 "dönüşecek ölçü birimi
i_out_me = pmein2 "hangi ölçüye dönüşecek ?
i_menge = pmeng1 "miktar
IMPORTING
e_menge = pmeng2 "dönen miktar
EXCEPTIONS
error_in_application = 1
error = 2
OTHERS = 3.

ABAP : Dialog Ekranini Popup Olarak Cagirma

Normalde , bir dialog ekranını çağırırken basitçe call screen metodunu kullanırırız,
çağırdığımız ekran tüm ekranı kapladığı için, zaman zaman bunun olmasını istemeyiz.
İstediğimiz boyutlarda popup ekranı gibi çağırmak için sonuna starting at komutunu ekleriz. Daha sonra vereceğimiz kordinatlara göre ekran gelecektir.


call screen '0300' starting at 20 11 ending at 70 24.

21 Temmuz 2008 Pazartesi

ABAP : Text Dosyasindan ITAB'a Upload Islemi

TAB Delimeted olarak ayrılmış bir text dosyasını ITAB'a upload etme ve daha sonra yüklenen verileri ALV olarak gösterme işlemi.

REPORT ZDTS_UPLOAD .
type-pools: slis.


datA:
begin of gt_data occurs 0,
ad(10) type c,
soyad(10) type c,
end of gt_grup.




*ALV data declarations
DATA:
fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,

gd_tab_group TYPE slis_t_sp_group_alv,
gd_layout TYPE slis_layout_alv,
gd_repid LIKE sy-repid,
gt_events TYPE slis_t_event,
gd_prntparams TYPE slis_print_alv,
is_variant LIKE disvariant.

DATA : gt_fcat TYPE slis_t_fieldcat_alv,
gf_fcat LIKE LINE OF gt_fcat.

DATA : layout TYPE slis_layout_alv .


PARAMETERS : FILEX LIKE RLGRAP-FILENAME
DEFAULT
'C:\'
OBLIGATORY.

initialization.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILEX .
CALL FUNCTION 'F4_FILENAME'
IMPORTING
FILE_NAME = FILEX .

start-of-selection.
perform read_data. "okuma işlemini yapalım
end-of-selection.

*&---------------------------------------------------------------------*
*& Form read_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text *----------------------------------------------------------------------*
FORM read_data .
data: yol type string. yol = filex.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = yol
FILETYPE = 'ASC'
* HAS_FIELD_SEPARATOR = ' '. "göndermediğiniz takdirde tab delimeted olarak ayarlar

TABLES
DATA_TAB = gt_data
EXCEPTIONS
CONVERSION_ERROR = 1
INVALID_TABLE_WIDTH = 2
INVALID_TYPE = 3
NO_BATCH = 4
UNKNOWN_ERROR = 5
GUI_REFUSE_FILETRANSFER = 6
OTHERS = 7 .
* <-- p2 text *----------------------------------------------------------------------* FORM write_data.
*FCAT'imizi oluşturuyoruz

PERFORM appalv USING 'AD' 'GT_DATA' 'Adı' '' 'X' ''. "ad alanını key alan yaptık
PERFORM appalv USING 'SOYAD' 'GT_DATA' 'Soyadı' '' '' ''.


layout-zebra = 'X' .


CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_fcat
is_layout = layout
is_variant = is_variant
i_save = 'A'
i_callback_program = sy-repid

TABLES
t_outtab = GT_DATA.

ENDFORM. " write_data

*&---------------------------------------------------------------------*
*& Form appalv
*&---------------------------------------------------------------------*
FORM appalv USING p_fn
p_tn
p_txt
p_fix
p_key
p_no_zero .
CLEAR gf_fcat.
gf_fcat-fieldname = p_fn .
gf_fcat-tabname = p_tn .
gf_fcat-seltext_m = p_txt .
gf_fcat-fix_column = p_fix .
gf_fcat-key = p_key .
gf_fcat-no_zero = p_no_zero .

APPEND gf_fcat TO gt_fcat.

ENDFORM. " appalv


*&---------------------------------------------------------------------*