FB sql sorgu

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Üye
Mesajlar: 26
Kayıt: 23 Kas 2005 01:45

FB sql sorgu

Mesaj gönderen »

Programı lazarusta yazıyorum ve Veri tabanı olarak FB 3,0 kullanıyorum. Firebird bağlantısı için zeos kullanıyorum. URUN_AGACI adında bir procedure yazdım. DataModule1 de Urun_Agaci adında bir Query im var SQL inde ise "select * from URUN_1 where K_NO in (:K)" yazıyor Veritabanında bulunan URUN_1 tablomda sorgum çalışacak.

URUN_1 tablosu ise
K_NO integer
BAG varchar
ADI varchar
alanlarından oluşuyor.

Kod: Tümünü seç

begin
for
select K_NO, BAG,ADI from URUN_1
where urun_1.K_NO in (1002,1008,1009)
into :k_no, :bag, :adi
do
  suspend;
end
yukarıdaki URUN_AGACI procedurunu FB çalıştırınca sorunsuz çalışıyor. 1002,1008 ve 1009. kayıtları gösteriyor. Ben Lazarustan bu kayıtları aşağıdaki şekilde çağırıyorum. (Procedure aşağıdaki şekilde değiştirilip deneniyor) Denemek için Edit3.text içerisine "1002,1008,1009" yazdığımda sorgu hata veriyor. Ama aynı bilgileri Direk FB içerisinden çalıştırdığımda sorunsuz çalışıyor.

Kod: Tümünü seç

begin
for
select K_NO, BAG,ADI from URUN_1
where urun_1.K_NO in (:K)
into :k_no, :bag, :adi
do
  suspend;
end

Kod: Tümünü seç

  DataModule1.Urun_Agaci.Close;
  DataModule1.Urun_Agaci.SQL.Clear;
  Datamodule1.Urun_Agaci.SQL.Add('select * from URUN_AGACI ('+#39+Edit3.Text+#39+')');
  DataModule1.Urun_Agaci.Open;   
ama lazarustan aşağıdaki şekilde çağırdığımda çalışıyor.

Kod: Tümünü seç

  DataModule1.Urun_Agaci.Close;
  DataModule1.Urun_Agaci.SQL.Clear;
  Datamodule1.Urun_Agaci.SQL.Add('select * from URUN_AGACI (1002)');
  DataModule1.Urun_Agaci.Open;   
aşağıdaki şekilde yine çalışmıyor

Kod: Tümünü seç

  DataModule1.Urun_Agaci.Close;
  DataModule1.Urun_Agaci.SQL.Clear;
  Datamodule1.Urun_Agaci.SQL.Add('select * from URUN_AGACI (1002,1008)');
  DataModule1.Urun_Agaci.Open;   
Yapmaya çalıştığım aslında bir ürün ağacının alt birimlerini diğer tablodan çağırmaya çalışmak. nasıl bir yol önerirsiniz.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: FB sql sorgu

Mesaj gönderen freeman35 »

where yazmazsan hata avermesi normal.
where urun_1.K_NO in (:K) K parametredir ve tek bir değer alır, string İFADE DEĞİL. Yani '1002' BİR değerdir, '1002,1008' de BİR değerdir, İFADE değildir.
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 !!!
Üye
Mesajlar: 26
Kayıt: 23 Kas 2005 01:45

Re: FB sql sorgu

Mesaj gönderen »

Sayın freeman35,
"where yazmazsan hata vermesi normal." ifadesindeki Where şartını nereye yazmam lazım. Ayrıca örneğin '1002,1003,1008,1009,1015' gibi bir değeri procedurümden nasıl çağırabilirim. Yardımcı olursanız sevinirim.
Üye
Mesajlar: 26
Kayıt: 23 Kas 2005 01:45

Re: FB sql sorgu

Mesaj gönderen »

SQL kodunu şu şekildede denedim

Kod: Tümünü seç

begin
for
select K_NO, CARI_KOD, TARIH, FATURA_TURU, G_TOPLAM from fatura
where fatura.cari_kod in (select urun.bag from urun)
into :k_no, :cari_kod, :tarih, :fatura_turu, :g_toplam
do
  suspend;
end
urun.bag alanının değeri '1008' olduğunda sorgu çalışıyor.
urun.bag alanının değeri '1008,1009' olduğunda yine çalışmıyor.
sayın freeman35'in dediği DEĞER, İFADE olayına gelirsek birden fazla kaydı çağırmam için bunu değere nasıl dönüştürüp parametreye atayabilirim. Yada yukarıdaki örnekteki gibi diğer tablomdaki alanın değeri ile nasıl çağırabilirim.
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Re: FB sql sorgu

Mesaj gönderen anemos »

"for execute statement" deneyin bence.
Üye
Mesajlar: 26
Kayıt: 23 Kas 2005 01:45

Re: FB sql sorgu

Mesaj gönderen »

Sayın anemos,
procedure ve lazarus tarafında aşağıdaki şekilde düzenleyince çalıştı. Denemek için Lazarusta Edit3.Text ekledim ve programı çalıştırıp tektin içerisine sorguyu yapıştırıp çalıştırdım sorunsuz çalıştı. Vakit ayırıp cevap yazan arkadaşlara teşekkürler ederim.

Kod: Tümünü seç

begin
for
EXECUTE STATEMENT :ft
into :k_no, :cari_kod, :tarih, :fatura_turu, :g_toplam
do
  suspend;
end

Kod: Tümünü seç

  DataModule1.Urun_Agaci.Close;
  DataModule1.Urun_Agaci.SQL.Clear;
  Datamodule1.Urun_Agaci.SQL.Add('select * from URUN_AGACI ('+#39+Edit3.Text+#39+')');
  DataModule1.Urun_Agaci.Open;
Cevapla