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. :=)