12 Mart 2012 Pazartesi

Yeni hayat!

Epeydir yazmıyordum buraya, hevesim mi kaçtı nedir bilemedim, artık taşındım da,
http://www.bilencekic.com adresinden yazılara ulaşabilirsiniz. ABAP'ı da cebe koyduktan sonra BI teknolojilerine el attım.
How-to-guide'ları gibi yazmaktan da vazgeçtim, neyse siteye girince görürsünüz.

13 Temmuz 2011 Çarşamba

ABAP : Exception condition "CNTL_ERROR" raised

Bir job içerisinde batch input veya submit kullanılıyorsa ve arka tarafta bir dialog ekranda bir takım özel kontroller tetikleniyorsa,

A RAISE statement in the program "CL_GUI_CUSTOM_CONTAINER=======CP" raised the
exception
condition "CNTL_ERROR".
Since the exception was not intercepted by a superior
program, processing was terminated.


Hatası alabiliriz burada standard program submit ediliyorsa, RBDPROCESS gibi IDOC işleme programı örneğin, bunu yapmanın tek yolu programı kopyalayıp, Z'li bir kopyasında dialog ekranın çağırıldığı yeri commentlemektir :), en azından ben böyle çözdüm, yoksa işinizi yapsa bile her halukarda ST22 ye bir log düşüyor. İster batchde sy-batch = '' deyin ister submit ederken export list to memory deyin her halukarda hata alıyorsunuz eğer bunu yapmazsanız.

1 Haziran 2011 Çarşamba

ABAP: Leave to list-processing ve ALV

bir köşede dursun diyerekten yazıyorum, alv sonrası write komutunu çalıştırmak için (örneğin batch sonrası dönen mesajları yazdıran hazır bir şablonumuz var ) leave to list-processing kullanmak gerekir. amma velakin, bu komutu çalıştırdın sonra bizim gui statusumuz alv'nin gui statusu olarak karşımıza çıkar ve butonların çalışmadığını doğal olarak ekrandan çıkamadığımızı görürüz. Bunu aşmak için ;

LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
SET PF-STATUS space.
SUPPRESS DIALOG.
* write komutlarımız *

LEAVE SCREEN.

1 Ekim 2010 Cuma

ABAP : Smartform Karakter Limiti

Merhabalar,

Uzun zamandır yazmıyorum zira İTÜ ile boğuşuyordum sonunda mezun oldum ve akabinde düzenli bir iş hayatına başladım, oh be kurtuldum derslerden, sevdiğim işe döndüm.


Soruna gelince, SMARTFORM'a export ettiğimiz karakter alanları eğer 255'i geçiyorsa çıktıya yazdıramazsınız. Yani, bir alan içeresinde 300 karakter var ve siz çıktıya
&alan&
olarak yazarsanız, sadece 255 karakterinin çıktığını göreceksiniz.

Bunu çözmek için, ABAP tarafında 255 karakterlik parçalara ayırmak yerine, çıktı üzerinde,




&alan(255)& &alan+255(255)& &alan+510(255)&


yazarak, karakterlerinizin çıktığını göreceksiniz.

1 Eylül 2009 Salı

ABAP : Dinamik Internal Table

Merhabalar;
Bu yazıda, dinamik olarak itab oluşturma ve göstermeyi anlatacağım, aslında anlatmayacağım direk kodu koyacağım en güzeli debug ederek öğrenmek. Zira bu kod çok işinize yarayacaktır. Kendimden örnek vermem gerekirse, bir tabloda bulunan şantiyeleri ve bir ekrandan o şantiyelerin bağlı olduğu cinslere girilen tutarların kümüle olarak ekranda gösterilmesi istendi. Yani tabloya satır satır girilen şantiyeler ALV'nin satır değil sütunlarını oluşturacaktı yani elimde kaç sütun var belli değildi ayrıca adamlar eğer yeni şantiye girerse otomatik olarak ALV'ye sütun olarak gelecek ve onların bağlı olduğu cinslere girilen paralarda otomatik olaraka dağıtılacaktı ve bir cins birden fazla şantiyeye bağlı olabiliyordu. Sonuç olarak Cinsler satırları şantiyeler ise sütunları oluşturdu ve paralar otomatik olarak dağıtıldı. İnternetten bana yardımcı olan kodu aynen yazıyorum buradan örnek olarak yapabilirsiniz.

Önce tanımlamalar ve dynamic internal table' ın yaratılması;

TYPE-POOLS: slis.
FIELD-SYMBOLS: <t_dyntable> TYPE STANDARD TABLE, “ Dynamic internal table name
<fs_dyntable>, “ Field symbol to create work area
<fs_fldval> type any. “ Field symbol to assign values
PARAMETERS: p_cols(5) TYPE c. “ Input number of columns
DATA: t_newtable TYPE REF TO data,
t_newline TYPE REF TO data,
t_fldcat TYPE slis_t_fldcat_alv,
t_fldcat TYPE lvc_t_fcat,
wa_it_fldcat TYPE lvc_s_fcat,
wa_colno(2) TYPE n,
wa_flname(5) TYPE c.

* Create fields .
DO p_cols TIMES.
CLEAR wa_it_fldcat.
move sy-index to wa_colno.
concatenate 'COL'
wa_colno
into wa_flname.
wa_it_fldcat-fieldname = wa_flname.
wa_it_fldcat-datatype = 'CHAR'.
wa_it_fldcat-intlen = 10.
APPEND wa_it_fldcat TO t_fldcat.
ENDDO.

* Create dynamic internal table and assign to FS
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = t_fldcat
IMPORTING
ep_table = t_newtable.
ASSIGN t_newtable->* TO <t_dyntable>.
* Create dynamic work area and assign to FS
CREATE DATA t_newline LIKE LINE OF <t_dyntable>.
ASSIGN t_newline->* TO <fs_dyntable>.


Daha sonra fieldcatalogları oluşturma ve değer atama;

DATA: fieldname(20) TYPE c.
DATA: fieldvalue(10) TYPE c.
DATA: index(3) TYPE c.
DO p_cols TIMES.
index = sy-index.
MOVE sy-index TO wa_colno.
CONCATENATE 'COL'
wa_colno
INTO wa_flname.
* Set up fieldvalue
CONCATENATE 'VALUE' index INTO
fieldvalue.
CONDENSE fieldvalue NO-GAPS.
ASSIGN COMPONENT wa_flname
OF STRUCTURE <fs_dyntable> TO <fs_fldval>.
<fs_fldval> = fieldvalue.
ENDDO.
* Append to the dynamic internal table

APPEND <fs_dyntable> TO <t_dyntable>.


bu da gösterme kısmı ; evet adam abidik gubidik yerlerde data tanımlamaları yapmış ama düzenlersiniz artık :=) sadece örnek olsun diye kopyala yapıştır yapıyorum.

DATA: wa_cat LIKE LINE OF fs_fldcat.
DO p_cols TIMES.
CLEAR wa_cat.
MOVE sy-index TO wa_colno.
CONCATENATE 'COL'
wa_colno
INTO wa_flname.
wa_cat-fieldname = wa_flname.
wa_cat-seltext_s = wa_flname.
wa_cat-outputlen = '10'.
APPEND wa_cat TO fs_fldcat.
ENDDO.

* Call ABAP List Viewer (ALV)
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = fs_fldcat
TABLES
t_outtab = <t_dyntable>.


kaynak: buyrun
Evet, bu kod dynamic olarak itab yaratma konusunda oldukça işinize yarayacaktır zira beni büyük bir işten kurtarmıştı, umarım sizi de kurtarır.

Bitirirken;
Ece Temelkuran'ın bir yazısından ve Can Dündar'ın bir şiirinden alıntı yapacağım.

İhtiyarlamak azizim, gitmek korkusuyla başlar. içine bir şüphe düşüyorsa kapıyı çarpıp çıkacakken, duraksıyorsan, işte tam o an, yaşlanır insan.
yeni bir başlangıç yapmak için üstat, önce boşlukta durabilmesin. boşlukta "kalmaktan" kortuğun zaman, işte tam o an, bir daha yeni bir şeye başlayamayacak kadar ihtiyarlar, çökersin.
insan, sevgili arkadaş, zaman içinde yaşlanmaz aslında. bir ikindi, zamanın nasıl da geçtiğini düşündüğünde, düşündüğü bütün o zamanların yükü üzerine bindiğinde ihtiyarlar. tam o ikindi gitmeye karar verirse, şöyle yeniden "ne yapmalı?" yaylasına çıkıverirse dirilir yeniden...

...bazen hepimiz büyük bir havaalanındaki, annesiz-babasız yola çıkmış çocuklara benziyoruz. boynumuza asılmış isimlerimizle, ipli torbaların içinde pasaportlarımızla bir kalabalığın içinde gideceğimiz yönleri bulmaya çalışıyoruz. doğru uçağa binmeye uğraşıyoruz hepimiz. bazen kaybolup hangi yöne gidiyorsa büyük kalabalık, o tarafa doğru akıyoruz. hepimiz bir sürü, şaşkın çocuğuz.
azizim, pek seveni yoktur ama ben bayılırım havaalanlarına. çünkü "hiçbir yerdir" oralar. bütün yönlerin tam ortası, yolların yuvası. sadece çantan ve sen varsındır, bir de dünyanın en pahalı kahvesi. tek yapman gereken ne tarafa gideceğini düşünmektir. anonsların peşinden koşturan insanlara bakarak gönül gezdirmektir işin: nereye gideyim?
azizim, daha ne olsun? gidiyorsan hayatta 1-0 öndesindir zaten!
Ece Temelkuran

ve her zamanki gibi şiirle bitiriyoruz;

Bugunlerde herkes gitmek istiyor. Küçük bir sahil kasabasina,
bir baska ülkeye,daglara, uzaklara...
Hayatindan memnun olan yok. Kiminle konussam ayni sey...
Her seyi, herkesi birakip gitme istegi.
Öyle ''yanina almak istedigi üç sey'' falan yok.
Bir kendisi.
...
Can Dündar'ın gitmek isimli şiirinden.

19 Ağustos 2009 Çarşamba

ABAP : Internal Table Loop Performansi

İç içe loop, sık sık kullandığımız bir yapıdır.
Örneğin, FI tarafında BKPF den okuduğumuz her belgenin BSEG'de ki kalemi için
bir işlem yapmamız gerekebilir.
Bu, en kötü yöntem olarak şöyle yapılabilir; (aslında en kötü değil, zira bazen loop metodunda ki where koşundan hızlı olabiliyor nedenini sonraki yazılarda yayınlıyacağım)

LOOP AT lt_bkpf INTO ls_bkpf.
LOOP AT lt_bseg INTO ls_bseg.
lv_counter = lv_counter + 1.
IF ls_bseg-BUKRS = ls_bkpf-BUKRS AND
ls_bseg-BELNR = ls_bkpf-BELNR AND
ls_bseg-GJAHR = ls_bkpf-GJAHR.
* kodlar *
ENDIF.
ENDLOOP.
ENDLOOP.



burada gereksiz bir çok belgeye girecek ve sistem kaynaklarını epey sömürecektir.


LOOP AT lt_bkpf INTO ls_bkpf.
LOOP AT lt_bseg INTO ls_bseg WHERE
BUKRS = ls_bkpf-BUKRS AND
BELNR = ls_bkpf-BELNR AND
GJAHR = ls_bkpf-GJAHR.
lv_counter = lv_counter + 1.
* kodlar *
ENDLOOP.
ENDLOOP.


burada ki algoritmada nispeten daha az döngü olacaktır ve bir öncekine göre daha hızlı bir yöntemdir çünkü LOOP dan sonra kullandığımız WHERE koşulu döngü sayısını azaltacaktır.
Peki daha fazla hızlandırılamaz mı ? Tabiki hızlandırılır :)
Nasıl mı ?
Mintax'la canım mintaxla bende yıkarım mintaxla.

Çok basit olarak Önce sort ederiz daha sonra BSEG , ITAB'ını read table ile okuyabiliriz.
Loop yaparken cursor mantığını kullanabildiğimiz için, sy-tabix ile ilgili satırı hızlı bir biçimde

alabilirz.
şöyleki

SORT lt_bkpf BY BUKRS BELNR GJAHR.
SORT lt_bseg BY BUKRS BELNR GJAHR.
LOOP AT lt_bkpf INTO ls_bkpf.
READ TABLE lt_bseg TRANSPORTING NO FIELDS WITH KEY
BUKRS = ls_bkpf-BUKRS
BELNR = ls_bkpf-BELNR
GJAHR = ls_bkpf-GJAHR.
CHECK sy-subrc = 0.
LOOP AT lt_bseg INTO ls_bseg FROM sy-tabix.
lv_counter = lv_counter + 1.
* kodlar *
AT END OF GJAHR.
EXIT.
ENDAT.
ENDLOOP.
ENDLOOP.



Yukarıda ki read table metoduna BINARY SEARCH ekleyerek, daha hızlı bir biçimde okuma yapabiliriz :=)
Şöyleki ;

SORT lt_bkpf BY BUKRS BELNR GJAHR.
SORT lt_bseg BY BUKRS BELNR GJAHR.
LOOP AT lt_bkpf INTO ls_bkpf.
READ TABLE lt_bseg TRANSPORTING NO FIELDS WITH KEY
BUKRS = ls_bkpf-BUKRS
BELNR = ls_bkpf-BELNR
GJAHR = ls_bkpf-GJAHR BINARY SEARCH.
CHECK sy-subrc = 0.
LOOP AT lt_bseg INTO ls_bseg FROM sy-tabix.
lv_counter = lv_counter + 1.
* kodlar *
AT END OF GJAHR.
EXIT.
ENDAT.
ENDLOOP.
ENDLOOP.

******* Sonradan gelen edit

Bunu da kendim test ederken buldum, üsttekinden biraz hızlı ama pointer mantığından biraz yavaş sonuç veriyor fakat yine de güzel :=).

LOOP AT lt_bkpf INTO ls_bkpf.
LOOP AT lt_bseg INTO ls_bseg FROM w_index.

IF ls_bseg-belnr NE ls_bkpf-belnr or
ls_bseg-bukrs ne ls_bkpf-bukrs or
ls_bseg-gjahr ne ls_bkpf-gjahr.

w_index = sy-tabix.
EXIT.
else.
* kodlar *
lv_counter = lv_counter + 1.
ENDIF.
ENDLOOP.
endloop.
******* *************************************


field symbol kullanarak (C de ki pointer mantığı) performansı biraz daha artırabiliriz.

SORT lt_bkpf BY BUKRS BELNR GJAHR.
SORT lt_bseg BY BUKRS BELNR GJAHR.
LOOP AT lt_bkpf ASSIGNING <ls_bkpf>
READ TABLE lt_bseg TRANSPORTING NO FIELDS WITH KEY
BUKRS = <ls_bkpf>-BUKRS
BELNR = <ls_bkpf>-BELNR
GJAHR = <ls_bkpf>-GJAHR BINARY SEARCH.
CHECK sy-subrc = 0.
LOOP AT lt_bseg ASSIGNING <ls_bseg> FROM sy-tabix.
lv_counter = lv_counter + 1.
** kodlar **
AT END OF GJAHR.
EXIT.
ENDAT.
ENDLOOP.
ENDLOOP.

kaynak : Ivan Femia.


bitirirken;
Deprem, bizim için "yaşama alışmalıyız" la biten bir cümlenin ilk kelimesidir sadece.Bu günlerde yine sık duyar olduk bu kelimeyi. 17 Ağustos 1999'un deprem görüntüleri geliyor bir yandan, telsiz konuşmaları...
Bu topraklarda çabuk unutulur acı, kederli bir mecburettir sanki acıyı unutmak. Ya o acıyı birinci dereceden yaşayanlar ? Bingöl depreminde ki Anneler mesela ?
İnsan aslında ölür değil mi, çocuğu ölünce?
Unutulmuş olamaz; yatılı okuldan öğrencilerin tabutlarla dağılışı. Bir gece, uykusunda çocukların dağılıveren bir okul binasının altında kalışı, unutulmuş olamaz.

Parasız yatılı başka bir şeydir Doğu'da. Ben görmüştüm, Diyarbakır'da anneler çocuklarını alıp getirip yalvarırlar; "Benimkini de alın okula!", ağlarlar. çünkü, karnı doysun diye. Bu bahtsız topraktan kurtulsun, adam olsun diye. Gelecek kış veremden, sonraki yaz sarılıktan ölmesin diye. Çocuklar giderler. Parasızlıktan ailelerini aylarca görmeye gelemezler. Evlerine döndüklerinde fiyaka yapmak için mahallede birazcık okul formasıyla gezerler. Okulda dayağın en beterini yeseler de, geceleri korkup altlarına etseler de, annelerini çok özleseler de ağızlarını açıp tek bir kelime etmezler. Çünkü onlar, bu toprakların "şanslı" çocukları olduklarını bilirler. Başka "kurtulma" şansları yoktur, sonbahar gelince tıpış tıpış yeniden okula giderler. Ayakkabılarının önleri açılsa da aylarca bunu kimseye söyleyemezler. İncecik enselerinden bir ağır hayat geçer, hiç ses etmezler. Oralarda çocuklar müthiş erken büyürler. Kocaman gözlerinde büyük adamların efkârını gezdirirler. Buralardakiler bunu pek bilmezler.
Belki de bu yüzden çocuklara bol duran isimleri verirler buralarda. Şehabettin, Abdullah, Tacettin... Belki de, öldüklerinde, çocuk oldukları iyice tınlamasın kalanların kulağında diye "amca" isimleri takıyorlar bebeklere!

Siz hiç ölü çocuk gördünüz mü? Tıpkı ölü kuşlara benzerler. Dünyanın en yumuşak şeyidir ölü serçeler, ürkütücü yumuşaktırlar. Artık hiç telaşlı değildirler, göz kapakları bu yüzden ilk kez görünürler. ölü çocuklar da öyledir. Gördünüz mü hiç bilmem, ilk toprağı babaları atar üzerlerine. çocuğunuzun üzerine toprak attığınızı bir kez içinizden geçirsenize...


Yazı; parasız yatılı başka birşeydir doğuda kısmından itibaren Ece Temelkuran'ın çeşitli yazılarını harmanlayarak yazılmıştır.


Bingöl ile başladık şiirimiz de Bingöl ile alakalı olsun;
Kemalettin Kamu'nun Bingöl çobanları isimli şiirinden;

...Anam bir yaz gecesi doğurmuş beni burda
Bu çamlıkta söylemiş son sözlerini babam
Şu karşıki bayırda verdim kuzuyu kurda
"Suna"mın başka köye gelin gittiği akşam...

1 Ağustos 2009 Cumartesi

ABAP : En kisa yoldan ALV gosterimi

Bir ay boyunca yaz okuluyla uğraştık, bloga yazamadık artık vakit geldi :=) .
Bu yazıda, en kısa kodla alv gösterme işlemine değinelim.
Burada OO ABAP'ın nimetlerinden yararlanıyoruz ve nimet demişken, OO ABAP'ı üç kere öpüp başımıza koyuyoruz.

Yakında Horst Keller, ki kendisi ABAP OBJECTS kitabının yazarıdır, abimizden ; OO ABAP için 7 altın kural isimli yazının özetini yayınlıyacağım zira 70 sayfalık bir yazı, kaynağınıda vereceğim isteyen hepsini okusun. OO ABAP'ı gördükçe "biz ne saçlamıyoruz böyle" diyeceksiniz.

Gelelim kodlara;


report z_gostert.
data: o_alv type ref to cl_gui_alv_grid,
gt_bkpf type table of bkpf.
select * from bkpf into table gt_bkpf up to 10 rows.

* ALV objesini yaratıyoruz, burada dikkat etmemiz nokta
* screen0 ı göndermek.
create object o_alv
exporting
i_parent = cl_gui_container=>screen0.

* Structure'a göre otomatik olarak fcat'imiz oluşacaktır

call method o_alv->set_table_for_first_display
exporting
i_structure_name = 'BKPF'
changing
it_outtab = gt_bkpf.

* ALV nin gösterileceği yeni bir selection screen tanımlıyoruz
selection-screen begin of screen 1001.

selection-screen end of screen 1001.

call selection-screen 1001.


diyerek yazımızı "bitirken" bölümü ile bitiriyoruz. Bu sefer edebiyat ile alakalı değil siyaset ile akalı olacak :).

Bitirirken;

Platon'un devlet kitabını şöyle bir karışıtırın.
Sokrates, öğrencileriyle girdiği "lider kim olmalı" tartışmasında, devletin kim tarafından yönetilmesi gerektiği sorusunu sorar öğrencilerine.
Sokrates tabiki devletin filozoflar tarafından yönetilmesi gerektiğini söyler. Öğrencileri hık mık eder,

-Olur mu hocam, felsefeciler biraz deli olur berecemezler,
en akıllılar bile bir süre sonra hizmet edemeyecek hale gelirler.
derler

Sokrates ise suçun filozoflarda değil onları kullanamayanlarda olduğunu söyler.
O zamanlarda, devletin başına erdemli insanlar gelirse, iyi yönetilir diye düşünülüyordu.
Platon aynı kitapta bu liderler için "tanrı o liderlerin mayasına altın katmıştır onlar o yüzden lider olurlar" diye de yazar aynı zamanda. Aslında ta o zamandan kapitalist sisteme de dokundurmuş , o "altın" da şüphesiz , "sermaye" olmalı :). Tabiki bu sermaye lafı Brezilya’daki Lula hükümeti, Bolivya’daki Morales hükümeti , Venezüella'daki Chavez hükümeti gibi ve diğer "gerçek sol" Latin Amerika hükümetleri için pek geçerli değil.
Neyse;
16. yy da Machiavelli yeni bir tanımla ortaya çıktı, bilirsiniz;
"Hükümdar olmak için erdemli bir insan olmaya gerek yoktur, kurnaz olmak kafidir", "İyi özelliklere sahip olmasına gerek yoktur, sadece öyle gözüksün yeter" deyip akabinde siyaseti ve ahlakı birbirinden ayırdı .Başarı gelecekse hertürlü pislik yapılabilir , amaç uğruna herşey mübahtır anlayışını sokarak bir çığır açtı aslında.
Günümüzde de mevcut olan anlayış bu değil mi ? :)

Ülke istediği kadar demokratikleşme girişimlerinde bulunsun istediği kadar "ben değiştim" desin, ahlak ve kültür anlayışını değişmeden, yani mevcut toplumda ki insan modeli değişmeden, bu girişimler ve değişimler hep birer "çaba" veya "geçici başarı" olarak kalacak ve en ufak bir sendelemede diktatörlük vari otoriter yönetime dönme eğilimi gösterecektir.

Edit: Yapamadım; şiir eklemeden duramadım.

Başka türlü bir şey benim istediğim:
Ne ağaca benzer, ne de buluta.
Burası gibi değil gideceğim memleket
Denizi ayrı deniz,
Havası ayrı hava..

Can Yücel'in Değişik isimli şiirinden.