Delphiden Params'a nasıl NULL ataması yaparım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Delphiden Params'a nasıl NULL ataması yaparım

Mesaj gönderen Yusuf AYDIN »

Selamünaleyküm...

Delphi 7 kullanıyorum
Interbase içinde tarih ararlıklarındaki hareketlere göre toplamlar veren bir procedure yazdım. Procedure içinde iki tarihide params olarak aldım. IB Expert içinden ve SQL içinden çalıştırdım.

Procedure içinde tarihler Null ise kontrolünü yaptım. Ama delphi içinden Params alanına Null değerini atamıyorum.
Mutlaka ki params la geçmeliyim Sql.Add ile çalıştıramam....

Bilgilisi olanlardan cevap vermelerini rica ediyorum...
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Eğer bir parametre seti tanımlanıyorsa bunları nill bırakmak pek sevimli bir yol değil. Kullanıldığı yerler var ama özel bir anlamı olmalı. Genel olarak bir /değişken parametre yaratılınca başlangiç değerleri set etmek çok kullanışlı oluyor.

İki tarih arasında sorgulama yapacak bir procedure yazmış olduğunuzu, fakat zaman zaman, bu parametreleri nil gönderek tüm tabloyu hesaplamak istediğinizi algıladım. Nill göndermek yerine çok eski bir tarihi ya da çok ileri bir tarihi gönderebilirsiniz. Ya da parametreleri bos string olarak gönderip, procedur icersinde ayrı bir sorgu satırı çalıştırbilirsiniz.

Kolay Gelsin,
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Safak Bey in soylediklerine katilmakla birlikte null degeri gonderebilmek icin emin olamamakla birlikte TField"daki Clear metodu gibi bir moted vardi diye hatirliyorum. Su an delphi olmayan bir makinada oldugum icin bakma sansim yok. FieldByName('PARAMETRE').Clear
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

Params.Clear işlemi normal çalışmıyor...
Clera işlemi değeri null yapmıyor... sadece Delphinin de tanımlanmamış pozisyonuna bürünüyor.


Uyguladığım Çözüm:

Şafak beyin önerisi ve Fahrettin beyin onayıyla, ilk tarihi çok küçük (30.12.1899) son tarihi ise (31.12.2999) olara parametre atamasını yaparak çözdüm...


Cevap veren arakadaşlara teşekkürler....

Bu procedure işlemini çalıştırmanın yolu olarak uyguladım. Ama hala Date tipi Params'a Null Nasıl atama yapılabileceğini bilmiyorum.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

Merhaba...

Kontrol işlemini tarih alanları null ise değilde tanımladığın üçüncü bir parametrenin değerine göre yaptırsan olmazmı?

Ben o şekilde kullanıyorum.

kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

bende aynı problemle karşılaşmıştım ama ben sql yazabiliyordum. SQL i runtime oluşururken eğer parametre nin null gitmesi gereken yerde SQL i IS NULL olarak yazdırmıştım. Procedure içindende if lerle yapmıştm bunu.
Anlamadığımsa SQL yamadan neden yapman gerek? kodu sen yazıyorsan ki öle olmalı Table yerine query kullanıp yazabilirsin. sadece database'i değiştirebiliyorsan view yada procedure yazabilirsin diye düşünüyorum
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

freeman35ve daha önceden de neden SQL yazamadığımı soran arkadaşlara cevap:

Midas kullanılıyor. Yapı bir başkası tarafından oluşturulmuş. ben üzerine modüller yazıyorum.

Kısaca sistemi özetliyeyim. Nedeninide anlatmış olcağıma inanıyorum.

Server ve Client üzerinde dbExpress bileşenleri kullanılmıştır.

Server üzerinde SQLQueryPlus ile SQLConnectionPlus üzerinden GDB bağlantısı gerçekleştirilirken ilgili querye bağlanan DataSetProvider ile Clientlara yayım yapılmaktadır.

Client üzerinden ClientDataSetProvider ile SocketConnection üzerinden Server üzerindeki DataSetProvider a bağlantı kurulmaktadır.
ClientDataSetProvider ise DataSourse ile diğer bileşenlerle haberleşmesi sağlanmaktadır.

Şimdi Server üzerindeki SQLQuery'nin SQLni nasıl değiştireceğimi bilmiyorum. Bunu araştırmak yerine acilen yapmak gereken hedeflerim vardı. Bu nedenlede Procedure yazmak ve params aktarmak aklıma gelen ilk çözğmdü. Params her zaman (özellikle toplu sonuçlarda) hızlılık açısından doğru bir çözümdür.

SQLe yazmakta önemli çok öenmli yazmayı henüz araştırmadığım içinde şuan birkaçtane Query fazladan koymak zorunda kaldım.

Şimdi. bu konuda daha ayrıntılı bir cevap verdiğime inanıyorum. Esas sıkıntımın serverdaki SQLe Query yazmak olduğunu biliyorum.

Bunu bir başlık altında sorsam belki daha doğru olurdu diyede düşünüyorum...

Bukonuda bilginiz varsa ve paylaşırsanız çok sevinirim.

Cevap verende de vermeyenden de Allah razı olsun.

Kolay Gelsin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Yusuf AYDIN yazdı: Şimdi Server üzerindeki SQLQuery'nin SQLni nasıl değiştireceğimi bilmiyorum.
.....
SQLe yazmakta önemli çok öenmli yazmayı henüz araştırmadığım içinde şuan birkaçtane Query fazladan koymak zorunda kaldım.


Burada ne demek istediginizi tam anlayamadim. Server uzerinde degistiremediginiz SQLQuery nedir bir stored procedure mu yoksa bir view mi? her ikisi icin de alter komutu kullanilabilir....

Kolay gelsin.....
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Verilen cevapları hızlıca okuyup anladığıma göre şöyle bir cevap verebilirim:
parametre ile null göndermek gerektiğinde -1 gönderip

where (degisken1 is null and :par1 = -1) ....

bu şekilde null değerleri de sorgulamış olursun.
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

Fahrettin beyin sorusuna cevap:

Server üzerine koyduğum. SqlQueryPlus ın Sql'ni runtime anında

Query1.SQL.Clear;
Query1.SQL.ADD('Select * from Procedure1(:Deg1,:Deg2)');

Yukarıdaki işlemi Clientdan Server üzerinde nasıl yaparım. Sorumda eksik bırktığım kısım bu sanırım. (SQL cümleciğini nasıl değiştiririm.)

Deg1, Deg2 nin Date olduğunu düşünürsek. Null ataması yapmak yerine;

Query1.SQL.Clear;
Query1.SQL.ADD('Select * from Procedure1('+QuotedStr('NULL')+','+QuotedStr('NULL')+')';

işlemiyle null göndermesini yapabilirim diye düşünmüştüm.

Ama sadece bu değil.
Başka Queryler üzerinde de bu tür Sql ni yazmam gereken yerler var.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Belki biraz ayip olacak ama ben yine pek bir sey anlamadım. Sorun benden de kaynaklanıyor olabilir. Dun gece yorucu bir yolculuk yapmıstım.. Nesye....


SQLQueryPlus sizin kullandıgınız bir delphi componenti midir? Yoksa SQL server uzerindeki bir obje midir?

Ayrica
Server üzerine koyduğum. SqlQueryPlus ın Sql'ni runtime anında

Query1.SQL.Clear;
Query1.SQL.ADD('Select * from Procedure1(:Deg1,:Deg2)');

Yukarıdaki işlemi Clientdan Server üzerinde nasıl yaparım.
demissiniz ama zaten o kod client tarafından yazilan bir kod ornegi... Elimden geldigince yardımcı olabilmek icin biraz desiyorum sorunu. Zira herkesin uzerinde calistigi sistem ve konfigurtasyonları farkli oldugu icin sizdeki durumu algilamak mumkun olamıyor.

Kolay gelsin....
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

walla bende anlamadım.
GDB dediğine göre sanırım bu ya IB yada FB. e ozaman bir procedure yazabilirsin yada view ekleyebilirsin. ozaman database üzerinde istediğini çekersin,
Recep piladerim her zamanki gibi engin tecrübesini konuşturmuş, yazdığı kod da işini görür.
Bağlantı şekline gelincede client tararafında da olsa biyerlere select * ..... diye birşey yazman gerekir en azından. yani ben öyle biliyorum.
dbexpress hiç bakmadım bile o yüzdende aha şurası diyemiyorum, yöntem anlatmaya alışıyorum
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

1. Yapacağınız iş için database üzerinde bir STORED PROCEDURE yazın.

2. STORED PROCEDURE testini Database ortamında yapın. Parametreleri de burada deneyin.
Database içerinde SQL Script olarak parametre atayarak proceduru çalıştırın. ( Eğer ResultSet döndürmüyorsa
EXECUTE PROCEDURE pocedurename 'delphi','forum','20040121' gibi olmalı. ResultSet döndürüyorsa
SELECT x,y,z FROM procedurename WHERE x='delphi', .. gibi olmalı.)

3. Bu bildirimi Delphi ortamından gönderin. Eğer bir result set yoksa direct olarak bu cümleyi gönderebilirsiniz(ExecSql oalabilir) . Bir Result set varsa, ctQuery,ctSotredPorc tarzında bir bileşenle sorguyu gönderebilirsiniz.

İlk denemelerinizde delphi içinden parametre atamayın. Parametreyi içeren stringi hazırlayıp gönderin. ( 2. adımda veri tabanı içerinde sorulamada kullandığınız gibi) Sonra parametreleri istediğniz metodla atarsınız. (zaten string olarak sorgunun içinde hazıramışsanız buna da gerek kalmaz)


Çözüm kaçamaz.

Kolay Gelsin,
Kullanıcı avatarı
Yusuf AYDIN
Üye
Mesajlar: 69
Kayıt: 02 Oca 2004 05:45
Konum: Antalya

Mesaj gönderen Yusuf AYDIN »

Server üzerinde tanımlanan Delphi içinde bir procedure hazırladık. Bu proceduru Clientlar üzerinden çalıştırarak. Querylere ait SQL leri değiştirebiliyoruz.

İlgi gösteren ve Cevap veren tüm arkadaşlara teşekkürler.
Cevapla