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.


12 Haziran 2009 Cuma

ABAP : Macro - Ayin Son Gunu

Selamlar,
Ayın son günüyle beraber tarihi hesaplamak için, Last_Day_Of_Month gibi fonksiyonlar mevcuttur, fakat bunu yapmak yerine, ufak bir işlemle ayın son gününü hesaplayabiliriz.
Yapacağımız şey ;
Elimizdeki tarihin gününü 01 e çekmek, arkasından 31 eklemek, günü tekrar 1'e çekmek ve daha sonra 1 çıkarmak :)
bu ufak işlemle o ayın son günüyle beraber tarihe ulaşmış oluruz.
Makroya gelince;


DEFINE SON_GUN.
&1+6(2) = '01'.
&1 = &1 + 31.
&1+6(2) = '01'.
&1 = &1 - 1.
END-OF-DEFINITION.

data:
lv_tarih type d.

lv_tarih = sy-datum.
son_gun lv_tarih.

Bitirirken;
Bir önceki yazımda yazdığım Hakkari ile ilgili yazıya devam edelim ;
Zeydan Kurtuluş; her santimine bolca kar, bolca yağmur ve bolca ağıt düşen Hakkari'yi ve Hakkari'nin çocuklarını bakın nasıl tanımlıyor.

Hiçbir gün öylesine yaşanmaz Hakkari'de… İnsan hakkı değil, zorunluluktur çalışmak. Kimse yalnızca kadın, erkek ya da çocuk değildir... Çobandır, korucudur, çiftçidir, öğretmendir.. Avcıdır, yolcudur yeri geldiğinde.. Yaylaya çıkılacak, dağlara tırmanılacak, sürüler korunacaktır… Küçük kardeşlere bakılacak, tezekler kışa hazırlanacak, koyunlar kırkılacak , koyunlar-keçiler sağılacak , köprüler geçilecektir her gün, yine yine yine… Uzak hayaller, yakın dertlerle daha da uzaklaşsa da bu kentte, söğüt yaprağıyla ıslık çalmayı, can simidine dönüşen pet şişelerle Zap Suyunda yüzmeyi, iki direği, bir parça toprağı futbol sahasına çevirmeyi, hayata gol atmayı bilir çocuklar..




11 Haziran 2009 Perşembe

ABAP : Makrolar

Selamlar, makroların ne olduğunu anlatmaya gerek yok sanırım her programlama dilinde nerdeyse aynı şeyleri yapıyorlar.
ABAP'ta makrolara gelince ;

REPORT ZMAKRO.

DATA: sonuc TYPE I,
deger1 TYPE I VALUE 1,
deger2 TYPE I VALUE 2.

DEFINE ISLEM.
SONUC = &1 &2 &3.
CIKTI &1 &2 &3 SONUC.
END-OF-DEFINITION.

DEFINE CIKTI.
WRITE: / 'SONUC &1 &2 &3 =', &4.
END-OF-DEFINITION.

ISLEM 1 + 2.
ISLEM 3 ** 4.
ISLEM deger2 - deger1.


Programı çalıştırdığımızda sonuçlardan zaten nasıl çalıştığını göreceğiz.
Örneğin ISLEM makrosu, 1. , 2.ve 3. parametreyi alarak SONUC için işleme tabi tutuyor . CIKTI isimli makro ise SONUC'u da alarak ayrı bir işleme tabi tutuyor ve ekrana yazdırıyor.
Şöyle bir çıktı olacaktır.

SONUC 1 + 2 = 3
SONUC 3 ** 4 = 81
SONUC DEGER2 - DEGER1 = 1

Bitirirken; yine bir konuya değinelim;
TRT1 de "Gönlümün Sağ Alt Köşesi" isimli bir belgesel vardı; Hakkari belgeseli.
Kurtuluş Zeydan , yani yapımcısı, şunları söylemişti yapıtı için, ne de güzel söylemiş :).

"Bizler, karayolları haritasını ikiye katlayıp, yaz tatillerine, kayak keyiflerine çıkarken, 'Wellcome Bodrum, wellcome Uludağ'larla karşılanırken, 'Hoşça kal' dediğimiz topraklar vardır, haritanın diğer yanında. Şova dönüşmeyen sessiz acıların, gösterişten uzak coşkuların, kader sanılanak doğan çocukların, inceldiği yerden kopan hayatların, ikisi bir araya gelmeyen yakaların, yine de başı dik, alnı açık insanların kentidir Hakkari… Her santimine bolca kar, bolca yağmur ve bolca ağıt düşen Sağ Alt Köşesidir Gönlümün...


SQL : Job History Goruntuleme

Selamlar,
Job histroy'i hızlı görüntüleme için ufak bir script buldum bir blog sitesinde :=) oradan alaraktan buraya yazıyorum zira benimde işime epey yarayacaktır. Adamın yazdığına göre kendiside bir yerden almış bir proje esnasında :=). Kaynak anonim oluyor yani. Halk dilinde söylenir dururmuş bu script, söyleyeni belli olmayan türküler gibi.

select job_name, run_datetime, run_duration
from
(
select job_name, DATEADD(hh, -7, run_datetime) as run_datetime,
SUBSTRING(run_duration, 1, 2) + ':' + SUBSTRING(run_duration, 3, 2) + ':' +
SUBSTRING(run_duration, 5, 2) AS run_duration
from
(
select DISTINCT
j.name as job_name,
run_datetime = CONVERT(DATETIME, RTRIM(run_date)) +
(run_time * 9 + run_time % 10000 * 6 + run_time % 100 * 10) / 216e4,
run_duration = RIGHT('000000' + CONVERT(varchar(6), run_duration), 6)
from msdb..sysjobhistory h
inner join msdb..sysjobs j
on h.job_id = j.job_id
) t
) t
order by job_name, run_datetime

Bitirirken Tatar Ramazan'dan bahsedelim, Tatar Ramazan'ı bilirsiniz :=) . Onu Türk öykücülüğüne kazandıran Kerim Korcan'dır.
Kendisi o kitap için;

“Ben üniversite kürsülerinde vatandaşların hak ve hukuk eşitliği için ağlayan ama içeride insanların anasını ağlatan adaleti, tekmil ters uygulamalarıyla mahpushanede cürmü meşut ettim, suçüstü yakaladım. Madem ki adalet mülkün temelidir, ben de toplum sorunlarına, başlangıç olarak oradan yaklaşmayı uygun buldum.

diye bahseder.

Tatar Ramazan, Türk öykücülüğünün en çıplak gerçekçi kahramanı olduğu gibi; Doğulu yaşam biçiminin, mertliğin ve cesaretin, onurun ve ozanlığın, zulme karşı direncin ve başkaldırının da ender kişiliklerindendir.


Mehmet Altun ise kitap için gayet yerinde bir tespit yapar;

"İnce Memed" in sıska bedeni ve esmer yüzü Torosların zulmüne nasıl başkaldırıyorsa; "Tatar Ramazan" ın sarı saçları, çakmak gözleri ve geniş omzuna yüklediği anlamlı isyanı da mahpusluğun zulmüne o denli başkaldırıyor.
Mehmet Altun

ABAP : Selection Screen Toolbar'ina Buton Ekleme

Selamlar,
Selection screenimizde, execute tuşunun yanına eğer kendi butonumuzu koymak ve başka işlemler yaptırmak istiyorsak, çok kısa bir işlem yapmamız gerekli;

gerekli table
parametresini yazalım.
TABLES: sscrfields.
butonda gözükecek texti tanımlayalım
INITIALIZATION.
MOVE 'buton 1' TO sscrfields-functxt_0n."
n burada 1 den 5 e kadar olabilir.

arkasından bunu ekleyelim,

SELECTION-SCREEN FUNCTION KEY n.

butona basınca düşeceği eventi tanımlayalım;
AT SELECTION-SCREEN.
IF sy-ucomm = 'FC0n'." <<<
....
ENDIF.

Bitirirken; Machbet'ten bir alıntı yapalım;
Machbet'in ağzından Lady Machbet öldüğünde dökülen sözler ;

Yarın...Yine yarın...Yine yarın...
Sürüklenip gidiyor böyle bu boş bu yaşam,
Kayıtlı zamanın son hecesine kadar...
Yaşam dediğin yürüyen bir gölge,
Bir garip oyuncu;
Bir hışım sahnede dolanıp boy gösteriyor;
Sonra haber çıkmıyor zavallıdan.
Yaşam bir masal; kaçığın birinin anlattığı .
Şamata ve öfke dolu baştan başa;
Hiçbir anlamı yok.


William Shakespeare büyük adam valla.

9 Haziran 2009 Salı

ABAP : iki tarih arasi farki saat cinsinden hesaplama

Selamlar, bu ara epey yazı yazmaya başladım malum okul bitti,
neyse;
az önce ihtiyacım olduğu ve yaptıktan sonra hem bana daha sonra hem de size yardımcı olacağından iki tarih arasında ki saat farkını şöyle hesaplarız;

DATA: l_basla TYPE t,
l_bit TYPE t,
l_baslangic_tarihi TYPE d,
l_bitis_tarihi TYPE d,
l_saat TYPE p DECIMALS 2.

l_basla = p_starttime.
l_bit = p_endtime.
l_baslangic_tarihi = p_bas.
l_bitis_tarihi = p_bit.

l_saat = ( ( l_bitis_tarihi - l_baslangic_tarihi ) * 24
+ ( l_bit - l_basla ) / 3600 ).

Bitirirken, Kral Lear'da ki meşhur Piç Edmund'un tiratından bir kısım yazalım;


Tiratlar Kral Lear /EdmundEDMUND :
Ey tabiat! Benim tanrım sensin! Ben senin kanunlarına kul köleyim...
...Hele şumektup istediğim tesiri yapsın, hele yalanım muvaffak olsun, piç Edmund meşru Edgar'ı nasıl altedermiş, o zaman görürüz. Büyüyorum artık... Yükseliyorum. Hadi tanrılar, koruyun piçleri!

ABAP : Debugging

Selamlar, debuglamanın ne olduğunu anlatmaya gerek yok heralde, zaten rapor düzeltirken epey haşır neşir olacaksınız. Debuga başlamak için normalde transaction yerine /h yazılıp enter'a basılır ve ne işlem yapılacaksa devam edilir ve debuga düşülür. /h nin dışında ufak tefek farklı kodlar da vardır. Şöyle ki ;

  • "/h" en genel debuglama kodu
  • "/hs" sistem ve dynpro debuglama
  • "/ha" sadece abap debuglama
  • "/hx" debugu bitirme.

  • Evet bu kadar.

    Çok kısa olduğu için bu yazı, bir şiirle bitirme gereği duymuyorum ama kısa birşey alıntılayım.
    Orhan Veli rakıyı çok severmiş hatta bu "rakı şişesinde balık olsam" mısralarını da o sebepten yazmıştır diye düşünüyorum :).
    Neyse;


    ...Orhan Veli, rakısına çok değer verirdi; Nazım Hikmet için açlık grevine girdiğimiz günlerde, avare avare dolaşırken bana demişti ki, "Rakı yok, meze yok, dolaş babam dolaş". Bir gün de Oktay Rifat, çok içtiği için Orhan Veli'yi uyaracak olmuş, "Böyle içersen, sonra kadınla yatamazsın" demiş; Orhan da elindeki kadehi göstererek, "Ya bu daha güzelse?" diye yanıtlamış onu...
    Melih Cevdet

    8 Haziran 2009 Pazartesi

    ABAP : Webservis yaratma


    Selamlar,
    Webservis yaratma konusunda epey mail aldım ve sonunda resimli olarak anlatan bir yazı yazmaya karar verdim :).
    Webservis candır efendim, hertürlü heryerden ulaşılabilir, baba yarısıdır. Kullanın , kullandırtın. İnsanı mutlu eder.
    Orhan Veli'nin dediği gibi "bir de rakı şişesinde balık olsam" diyesi gelir insanın .
    Gelelim, webservis yaratmaya,
    buyrunuz resimli anlatım aşağıdadır.

    SE37 ye gidip bir fonksiyon yaratıyoruz.




    RFC olmasına DİKKAT EDİYORUZ.


    PASS VALUE kısmını tıklıyoruz

    Kodumuzu yazıyoruz ve aktive etmeyi unutmuyoruz

    SE80'den gidip packagemizi buluyoruz ve sağ tıklayıp menülere ulaşıyoruz.



    Function modul olarka yaratıyoruz.


    Az önce yarattığımız fonksiyonun adını veriyoruz.

    Release tıkını atıyoruz, attıktan sonra kendi aktif edecektir, yok olmaz ise WSCONFIG ve WSADMIN gerekli aktivasyon işlemlerini yapabiliriz.






    WSADMIN i açıyoruz

    Fonksiyonumuzu buluyoruz

    WEB SERVICE > WSDL yi seçiyoruz

    Devam..

    SAP kullancı adı ve şifremizi giriyoruz.



    Gördüğümüz üzere WSDL hali karşımıza geldi, şifre sormasını istemiyorsak programımızdan çağırırken, Credentials ayarlarını setlemeyi unutmuyoruz :=) . 
    Hadi kolay gelsin.

    Yazımızı bir Orhan Veli şiiri ile bitirelim.

    DEDİKODU 

    Kim söylemiş beni 
    Süheyla'ya vurulmuşum diye? 
    Kim görmüş, ama kim, 
    Eleni'yi öptüğümü, 
    Yüksek kaldırımda, güpe gündüz? 
    Melahat'i almışım da sonra 
    Alemdara gitmişim, öyle mi? 
    Onu sonra anlatırım, fakat 
    Kimin bacağını sıkmışım tramvayda? 
    Güya bir de Galataya dadanmışız; 
    Kafaları çekip çekip 
    Orada alıyormuşuz soluğu; 
    Geç bunları, anam babam, geç; 
    Geç bunları bir kalem; 
    Bilirim ben yaptığımı. 
    Ya o, Mualla'yı sandala atıp, 
    Ruhumda hicranını söyletme hikayesi?

    Orhan Veli




    7 Haziran 2009 Pazar

    SQL : T-SQL ile text dosyasi okuma

    Selamlar,
    Bir prosedürün içinden bir text dosyasına ulaşmanız gerekebilir. Genellikle, bir yerden okunan verileri windows service ile yazdığınız dizinden okumanız gerekebilir (bana gerekti ordan biliyorum).
    Onun içinde yapmanız gereken;

    declare @o int, @f int, @t int, @ret int
    declare @line varchar(8000)
    exec sp_oacreate 'scripting.filesystemobject', @o out
    exec sp_oamethod @o, 'opentextfile', @f out, 'c:\deneme.txt', 1
    exec @ret = sp_oamethod @f, 'readline', @line out
    while( @ret = 0 )
    begin
    print @line
    exec @ret = sp_oamethod @f, 'readline', @line out end




    Hadi kolay gelsin.
    Bir Yelda Karataş şiiriyle bitireyim ya da özgeçmişi mi demeli..

    YELDA KARATAŞ

    Zonguldak’ta doğdu.
    Denizi ve defne kokusunu unutamıyor.
    Ellerine ve gökyüzüne inanmayı yatılı okulda öğrendi.
    Bütün çocukları seviyor, bütün renkleri…
    Ama bütün insanları asla!
    Bu nedenle, şarkı sözü, deneme yazıyor.
    Bu nedenle bazı filmlere ağlıyor, bazı müziklerde
    Tüyleri diken diken…
    Bu nedenle şiir yazıyor.
    O’nun ilk kitabı bu.


    Kalın olarak yazdığım kısım ne güzel de olmuş.

    SQL : Hangi Prosedur Hangi Tabloyu Kullanmis

    Selamlar,
    Mevcut veritabanınızda bir tabloda değişiklik yapmak istediğiniz, hangi prosedürlerin etkilenebileceğini görmek için kağıtla kalemle uğraşmaya, hangi tablo hangi prosedürü kullanıyor tarzında dökümantasyoncuklar yapmak yerine, basit bir sorgu ile hangi tablonuz hangi prosedürlerde geçmiş şöyle öğrenebilirsiniz;

    SELECT o.name, t.TABLE_NAME, c.text
    FROM syscomments c
    JOIN sysobjects o
    ON c.id = o.id
    JOIN INFORMATION_SCHEMA.Tables t
    ON c.text LIKE '%'+t.TABLE_NAME+'%' and
    table_name = 'tablo_adı'

    4 Haziran 2009 Perşembe

    ABAP : SPOOL TO PDF Convert ve Download

    Selamlar,
    Bir çıktıyı PDF e dönüştürmenin çeşitli yöntemleri mevcuttur. Bunlar;
    -Spool numarasının direk PDF e dönüştürmek
    -Çıktının OTF 'sini alarak PDF e dönüştürmek.

    Benim anlatacağım direk spool numarasından PDF e dönüştürme metodudur.
    Hatta arkasından dönüşmüş PDF'i de bilgisayara kaydetmeyi göstereceğim :=).
    Arkasından da gaymaklı ekmek gadayıfı eheh.

    * Spool to PDF conversions

    data: gd_spool_nr like tsp01-rqident,

    gd_destination like rlgrap-filename,

    gd_bytecount like tst01-dsize,

    gd_buffer type string.

     

     

     data : it_pdf_output like tline occurs 0 with header line.

     data: numbytes type i,

    pdfspoolid like tsp01-rqident,

    it_mess_att like solisti1 occurs 0 with header line.

     

     

    data:

         p_padest like  tsp03-padest.

     

    p_padest = 'ZHP2'.

      call function 'CONVERT_OTFSPOOLJOB_2_PDF'

        exporting

          src_spoolid         = gd_spool_nr     "buraya spool numarasını yazıyoruz

          dst_device          = p_padest

        importing

          pdf_bytecount       = numbytes

          pdf_spoolid         = pdfspoolid

        tables

          pdf                 = it_pdf_output

        exceptions

          err_no_otf_spooljob = 1

          others              = 12.

     

     

     

     

     

    *--- DOWNLOAD TO PC {bu form için kerem köseoğlu'na teşekkür ediyoruz }

      data:

          p_file like rlgrap-filename  .

      data cancel.

      p_file = 'C:\temp\file.pdf'.

      perform download_w_ext tables it_pdf_output

      using p_file

      '.pdf'

      'BIN'

      numbytes

      cancel.

     

     

     

     

    FORM download_w_ext

     TABLES datatab

    USING

    filename LIKE rlgrap-filename

    value(extension) TYPE c

    mode TYPE c

    bin_filesize TYPE i

    cancel TYPE c.

     

     

    DATA: name TYPE string,

    path TYPE string,

    fullpath TYPE string,

    ext TYPE string,

    filter TYPE string,

    size TYPE i,

    uact TYPE i.

     

    IF mode <> 'ASC' AND mode <> 'BIN'.

    sy-subrc = 1. EXIT.

    ENDIF.

    CLEAR cancel.

    ext = extension.

    IF ext(1) = '.'.

    SHIFT ext.

    ENDIF.

    name = filename.

    IF name IS INITIAL.

    name = 'test.*'.

    REPLACE '$' WITH ext INTO name.

    ELSEIF name NA '.'. "name has no extension, add ext

    CONCATENATE name '.' ext INTO name.

    ENDIF.

    filter = '(*.$)|*.$|'.

    REPLACE '$' WITH ext INTO filter.

    REPLACE '$' WITH ext INTO filter.

     

    fullpath = name.

     

    CALL FUNCTION 'GUI_DOWNLOAD'

    EXPORTING

    bin_filesize = bin_filesize

    filename = fullpath

    filetype = mode

    TABLES

    data_tab = datatab

    EXCEPTIONS

    file_write_error = 1

    no_batch = 2

    gui_refuse_filetransfer = 3

    invalid_type = 4

    no_authority = 5

    unknown_error = 6.

    filename = fullpath.

    ENDFORM. "download_w_ext


    .NET : Globalization Ayarlari

    Selamlar,
    Geliştirdiğiniz windows uygulamasında, eğer Globalization ayarlarının manuel olarak ayarlanmasını ve heryerde aynı olmasını istiyorsanız yapacağız işlem çok basit. Program.cs nin içersiğinde birazdan vereceğim kodları yapıştırmanız yeterli :=). 
    Aksi halde, Globalization ayarlarına dikkat etmeden yazdığınız programda veri girişleri kendi bilgisayarınızda farklı iken müşterinin bilgisayarında farklı olacaktır. Örneğin ondalık ayırımı bizde farklı iken en-US Globalization ayarlarında farklı olmaktadır.

    Program.cs de;
    using System.Globalization;

     import ettikten sonra,


            [STAThread]
            static void Main()

    içine;

                CultureInfo c = new System.Globalization.CultureInfo("en-GB");    
                System.Threading.Thread.CurrentThread.CurrentCulture = c;
                System.Threading.Thread.CurrentThread.CurrentUICulture = c;

    yazmanız yeterlidir.

    Hadi kolay gelsin iyi çalışmalar. :=)

    29 Mayıs 2009 Cuma

    SQL : An INSERT EXEC statement cannot be nested.

    vaeeeey okuyucular selam :=)
    yine bir sorunla karşı karşıyayız,
    malum MSSQL de uzun prosedürler yazarken, ayak işlerini başka prosedürlere yaptırmamız gerekebiliyor. Fakat , iç içe çağırdığınız prosedürlerde, eğer çağırdığınız prosedür başka bir prosedür çağırıyor ve bir #temp tabloya veri sokuyorsa ve sizin çağırdığınız prosedürde kendi içinde veri sokuyorsa, ve sizde son prosedürde bir temp tabloya veri sokuyorsanız (tamam biraz karışık oldu ).
    An INSERT EXEC statement cannot be nested.

    diye bir hata verecektir.
    Çözümü de GLOBAL TEMP TABLE kullanmaktır,
    Bazı sitelerden OPENROWSET gibi abidik gubidik, sorgu sırasında dahi SQL bağlantısı açan, uzun karışık yöntemler mevcuttur,
    boşverin onları gülün geçin "hmm fevkalede" gibi yapmacık tepkiler verip uzaklaşın ordan :).

    Nedir peki GLOBAL TEMP TABLE ;
    Küreselleşen dünyada ki küreselleşmiş temp table yani;
    efendim normalde tanımlarken #temp yazmıyor muyuz?
    bunda sadece ##temp yazacağız, o kadar :=).
    Yani arasında ki fark, rakıyı tek içmekle duble içmek arasında ki fark kadar.

    Yani çağırdığımız prosedürlerden birinin sonucunu global temp tabloya atacağız ve son prosedürden çağırma işlemini ve arkasından drop işlemini yapacağız. Normalde temp tablolar prosedürle işiniz bitince otomatik droplanırken, bunda bağlantı kapanınca droplanıyor, siz her ihtimale karşı işiniz bitince drop edin :)


    Örnek; (benim örneğim değil, kendimin ki baya uzun )

    create proc test1
    as

    select orderid, customerid, employeeid from ##temp2

    go
    create proc test2
    as
    create table ##temp2 (orderid int ,
    customerid char(5), employeeid int)

    insert into ##temp2 exec test3
    go

    create proc test3
    as
    select top 100 orderid, customerid,
    employeeid from orders
    go

    exec test2
    exec test1

    go
    drop proc test1, test2, test3
    drop table ##temp2
    go

    ----

    Son söz ;
    Ainesi iştir prosedürün, koda bakılmaz.

    2 Mayıs 2009 Cumartesi

    ABAP : Smartform'da pencereyi son nesne olarka ayarlama


    Merhabalar,
    Smartform'da yaratılan bir pencerenin son nesne olarak gelmesi,
    yani 5 sayfalık bir çıktıda 5. sayfanın sonunda gelmesi yada 1 sayfalık bir çıktıda, sayfanın sonunda gelmesi için yapmanız gereken, pencerenin koşullar sekmesinde 
    "yalnızca ana pencerenin sonundan sonra" ve "yalnızca bölümün sonunda" seçeneğini tıklamaktır.
    Vay efendim son nesne olarak çıktı ama 2 sayfalık çıktılarda ikisinde de çıktı sorunu veya
    son nesne oldu ama sadece ilk sayfada çıktı sorunu yok artık ,
    sonra vay ben duymadım vay ben görmedim demeyin.

    Piyonları doğru yere koyun hadi iyi çalışmalar.


    23 Nisan 2009 Perşembe

    ABAP : SAP NETWEAVER 7.0 ABAP TRIAL VERSION

    Merhabalar, sap netweaver 7.0-7.1 abap trial version kurulumu ile ilgili bazı mailler alıyorum, özellikle hata aldıkları
    ve kurulumu yapamadıkları yönünde. Karşınıza muhtemelen;

    WARNING:could not delete temporary file C:\DOCUME~1\pc\LOCALS~1\Temp\ismp003\4410326

    gibi hatalar çıkmaktadır. Bu hata tamamen JAVA'dan kaynaklı bir sorundur. Düzeltmek için yapmanız gerekenler, "Regional Settings / Bölgesel Ayarlar" dan , ayarları Turkish ya da Türkçe den, English ya da İngilizce'ye çekmektir. 
    Bunu JAVA neden yapıyor bilmiyorum ama bu sorun JAVA tabanlı bir çok yazılımda karşımıza çıkmaktadır. Örneğin, Adobe Flex ile kodlarınızı derlerken veya bazı oyunlarda :) sorun olarak karşımıza çıkmakta saç baş yoldurmaktadır.
    Hadi iyi çalışmalar, piyonları doğru yere koyun akıllı oynayın.