IBQuery Insert,Append

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
Kullanıcı avatarı
CiTiZEN
Üye
Mesajlar: 1163
Kayıt: 06 Oca 2008 04:15

IBQuery Insert,Append

Mesaj gönderen CiTiZEN »

Selamlar arkadaşlar, veritabanına bağlı uygulamalarımızda BDE ve Access den sonra Firebird e geçiş yapmıştık, eski veritabanlarında insert gibi komutlar kullanmıştık,firebird de de bu zamana kadar aşağıdaki (2. sorumdaki) kodları kullanmaıştık fakat firebirdde yeni başladığımız proje bazında yanlışlık olmaması için sizden
1-Insert
Append
ve birde SQL kodları ile kayıt girişi vs. yapılabiliyormuş sanırım bu kodlar arasındaki farklar ile ilgili bilgi vermenizi rica ediyorum.
Birde
2-Kullandığım bileşenler Firebird veritabanı, ibx bileşenleri (ibquery) ve delphi 2007, bunlara bağlı olarak kayıt ekleme, düzenleme vs. işlemleri sırası ile

Kod: Tümünü seç

a-IBQuery.insert (veya yukardaki sorunun cevabına göre değişebilir)
b-IBQuery.edit
c-IBQuery.delete
d-IBQuery.post
e-IBQuery.cancel
bu şekilde yapıyorduk bunların dışında bunlardan daha faydalı olacağını düşündüğünüz işlem kodları varsa onlarıda paylaşmanızı rica ederim.
UWESIS CORPORATION
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: IBQuery Insert,Append

Mesaj gönderen Battosai »

Faydasını bilemem ama tüm Query bileşenlerinin ortak yapısıdır bunlar...Bunlardan farklı olarak kayıt girişi ve güncellemeleri SQL ile yapabilirsin bazı durumlarda ihtiyaç olabilir...Yani bunlardan farklı bir yapı yok...
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: IBQuery Insert,Append

Mesaj gönderen emin_as »

ibquery daha çok stored procedure, view veya select sorgularında kullanılır. Eğer veritabanına ekleme, silme vs yapacaksan ibdataset i tercih etmelisin. Çok daha kapsamlı işlevlere sahiptir ve yerleşik generator desteği de vardır.

Ibdataset in kullanımı basittir.
1- Öncelikle select ile okunacak bilgilyi belirlersin. select * from personel gibi
2- Daha sonra ibdatasetin üzerinde sağ düğmeyi tıklayıp, dataset editor u açarsın. Buradan ana indeksini ve güncelleme yapılacak alanları ayrı ayrı seçip, generate sql i tıklarsın. Dataset editor, senin için update, insert ve delete sql lerini ayrı ayrı oluşturacaktır.
3- Ibdataset i uygun bir transaction a baglarsın.

Kod: Tümünü seç

read_committed
rec_version
nowait
Transaction da bu tanımları yaptıktan sonra, sorunsuz bir biçimde ibdateset i kullanabilirsin. Transactionlarla ugraşmana gerek kalmaz, ibdataset bu işlemi senin için yapacaktır.

Generator field in varsa (auto incremenet için) kullandığın generatoru, field i ve kaç artmasını istedğini yazıp, hangi durumda generatoru kullanacağını belirtebilirsin. Eger generatoru auto increment için kullanacaksan, on new recordu seçmelisin ve ayrıca trigger kullanman gerekmez, generator u iki kez artırmış olursun.

IBquery readonly table işlemleri veya update, insert gibi sqlleri çalıştırmak için uygundur. DBEdit, DBGrid gibi bileşenlerle ekleme, düzenleme yapacaksan, ibdataset kullanmalısın.
Kullanıcı avatarı
CiTiZEN
Üye
Mesajlar: 1163
Kayıt: 06 Oca 2008 04:15

Re: IBQuery Insert,Append

Mesaj gönderen CiTiZEN »

çok teşekkür ediyorum arkadaşlar ancak bazı sorunlarım daha var bunlar;
eski projelerde kayıt girişi gibi işlemleri query den kayıt hesabı toplama gibi işlemleri de ibtable dan yapıyoduk ancak bu durumda işin içine 3 bileşen girecek
kayıt girişi vs. işlemleri için ibdataset, filtreleme işlemleri için ibquery ve toplamlar için de ibtable bu 3 bileşeni mutlaka eklemem gereklimi?
1-Eğer gerekliyse bu 3 bileşen birbiri ile orantılı çalışır mı?
2-Bu 3 bileşen yerine bana aynı işlemleri yapacak daha kararlı bir yol gösterebilir misiniz?
3-ibdataset de ekleme, düzenleme, silme işlemleri standart kodlarla mı yapılıyor (insert, edit, delete vs.) yoksa ayrı yöntemleri var mı?
UWESIS CORPORATION
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: IBQuery Insert,Append

Mesaj gönderen emin_as »

Eger filtreleme yapacagın dosyalarda düzenleme, ekleme yapacaksan ibdataset i dogrudan kullanabilirsin.

Kod: Tümünü seç

ibdataset1.Active:=false;
ibdataset1.selectsql.text:=' select * from personel where grup = '001'   and bolum='satis' ;
ibdataset1.Active:=True;
Yukarıdaki işleme benzer şekilde dilediğin gibi filtreleme yapabilirsin. Genellikle Ibquery i lookup dataset ler için kullanıyorum. Ibquery, edit, insert gibi işlemlerin yapılmayacagı ama dbgrid veya benzeri bileşenlere bağlanıp, ileri - geri gidilmesi gereken durumlar için son derece uygun. Hesaplama için genel olarak ibsql i kullanıyorum. Ibsql sadece next yöntemini destekler ve daha çok hızlı sorgu yapmak veya stored procedure çalıştırmak için uygundur.

Ibtable dan uzak dur, ibtable sadece uyumluluk olsun diye konmuş bir bileşendir ve tüm kayıtları getirdiği için ciddi performans sorunları vardır. Ibtable i zorunlu kalmadıkça kullanmamalısın.

Ibdataset in içinde insert, update ve delete için ayrı sqller var. İstersen bunları elle de düzenleyebilirsin.
Kullanıcı avatarı
CiTiZEN
Üye
Mesajlar: 1163
Kayıt: 06 Oca 2008 04:15

Re: IBQuery Insert,Append

Mesaj gönderen CiTiZEN »

Hocam teşekkür ederim filtreleme işlemini şu şekilde yapıyorum

Kod: Tümünü seç

IBDataSet1.Active:=False;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Text:=('select* from EXAMPLE_TABLE where '+ComboBox1.Text+' like "'+Edit1.Text+'%"');
IBDataSet1.Active:=True;
ayrıca ekleme, silme gibi işlemler içinde dataset editorden sql ler oluşturdum (modify, insert, delete, refresh) "ibdataset.insert" gibi klasik kodlarla buton altından yapıyorum şimdilik sorun yok gibi, dblookupcombo içinde query kullanıyorum (dataset ile pek başarılı olmadı ya desteklemiyor yada atladığım yerler var) tek sorun ibsql ile bir alanı toplayamadım table ile yapmama rağmen ibsql e oldukca yabancıyım bu konuda yardımlarınızı bekliyorum.

Kolay Gelsin.
UWESIS CORPORATION
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: IBQuery Insert,Append

Mesaj gönderen emin_as »

Tek bir hesaplama için aşagıdaki kodu kullanabilirsin

Kod: Tümünü seç

  ibsql1.Transaction.StartTransaction;  // ibsql1 e baglı transaction çalıştırılmalıdır. 
  ibsql1.SQL.Text:='select sum(alanadi) from '+tabloAdi;  // sql bilgisi verilir
  ibsql1.ExecQuery;  // sql sorgu çalıştırılı için bunu kullanmalısın
  if ibsql1.RecordCount > 0 then
     tablosayi:=ibsql1.Fields[0].AsInteger  // bilgileri fields  ile alabilirsin
  else tablosayi:=0;
  ibsql1.Close;  // işlem bittikten sonra ibsql kapatılmalıdır
Eğer bir tabledan liste aktaracaksan şöyle bir yöntem izlemelisin.

Kod: Tümünü seç

  ibsql1.Transaction.StartTransaction;  // ibsql1 e baglı transaction çalıştırılmalıdır. 
  ibsql1.SQL.Text:='select ad,soyad from personel ';  // sql bilgisi verilir
  ibsql1.ExecQuery;  // sql sorgu çalıştırılı için bunu kullanmalısın
  while not ibsql1.eof do
  begin
     strAdi := ibsql1.Fields[0].Asstring;
     strSoyadi:=ibsql1.Fields[1].Asstring;
     ibsql1.Next; // Next kullanabilirsin, ama sadece next
  end;
  ibsql1.Close;  // işlem bittikten sonra ibsql kapatılmalıdır
Ibsql dbgrid gibi bileşenlere baglanamaz, çünkü data üzerinde tek yönlü ilerleyebilirsin, bunun en önemli avantajı çok büyük bilgi oldugunda tüm bilgiler hafızaya yüklenmeyecek, sıra sıra okuyarak gidebilirsin. Normalde ibdataset gibi bileşenler de tüm bilgiyi bir anda yüklemez, ama bilgi üzerinde ilerledikçe hafıza şişmeye başlar, çünkü eski bilgileri de hafızada tutarlar, oysa ibsql öyle değildir. Ibsql büyük tablolardaki bilgiyi program yoluyla analiz etmek için son derece uygundur. Next ile ilerleyebilirsin, eof ile sonunu kontrol edebilirsin ve fields ile bilgiyi alabilirsin.

Not: Eger sorgunda like 'DENE%' kullanıyorsan, bunun yerine starting with i tercih edebilirsin
1-) select * from ogrenci where adi like 'AH%'
2-) select * from ogrenci where adi starting with 'AH'
İkinci yöntem daha avantajlıdır ve adi alanını kullanan indeks varsa, dogrudan onu kullanıp çok hızlı sonuç döndürür. Pekçok kişi bu tür detaylara dikkat etmeden nasılsa makina hızlı vs diye optimizasyonları gözardı ediyor. Daha sonra 10.000, 20.000 kayıt girilip, veritabanına 5-6 kişi baglanınca, bu kötü kodlama yüzünden, networkte performans olumsuz etkileniyor. Basit bir program bile olsa, bunun internet üzerinden kullanılabilecegini düşünerek tasarlamak gerekiyor. Kullanıcının dar bir bantgenişliği olabilir, o nedenle mümkün oldugunca hızlı sonuç veren ve sunucuyu fazla yormayacak şekilde kodlama en iyisidir.
Kullanıcı avatarı
CiTiZEN
Üye
Mesajlar: 1163
Kayıt: 06 Oca 2008 04:15

Re: IBQuery Insert,Append

Mesaj gönderen CiTiZEN »

hocam merhabalar çok teşekkür ederim ancak şu şekilde denedim, sorguların sonucu boş döndü hata yaptığım yerler mi mevcut?

Kod: Tümünü seç

IBDataSet1.Active:=False;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Text:=('select * from EXAMPLE_TABLE where '+ComboBox1.Text+' starting with "'+Edit1.Text+'%"');
IBDataSet1.Active:=True;
UWESIS CORPORATION
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: IBQuery Insert,Append

Mesaj gönderen emin_as »

Starting with de % işaretini kullanmamalısın. Boş dönmesi o nedenle normal.

select * from personel where adi starting with 'ME' // ME ile başlayanlar getirilir, MEHMET, METIN vs gibi
select * from personel where adi starting with 'ME%' // adı ME% ile başlayanlar getirilir, yüzde işareti de aramaya katılır
Kullanıcı avatarı
CiTiZEN
Üye
Mesajlar: 1163
Kayıt: 06 Oca 2008 04:15

Re: IBQuery Insert,Append

Mesaj gönderen CiTiZEN »

-malesef yine boş dönü zaten yukardaki satırda da edit1.text+'%' demiştim denedim ama olmadı
-bir de hocam toplama için verdiğiniz ikinci kod küsüratlı sayıları toplamıyor eklemem gereken başka şeyler de mi var
onuda şu şekilde kullanıyorum

Kod: Tümünü seç

var tablosayi:integer;
begin
if IBSQL1.Transaction.Active=False then
  ibsql1.Transaction.StartTransaction;  // ibsql1 e baglı transaction çalıştırılmalıdır.
  ibsql1.SQL.Text:='select sum (FIELD4) from EXAMPLE_TABLE';  // sql bilgisi verilir
  ibsql1.ExecQuery;  // sql sorgu çalıştırılı için bunu kullanmalısın
  if ibsql1.RecordCount > 0 then
     tablosayi:=ibsql1.Fields[0].AsInteger;  // bilgileri fields  ile alabilirsin
 else tablosayi:=0;
  label1.Caption:=IntToStr(tablosayi);
  ibsql1.Close;  // işlem bittikten sonra ibsql kapatılmalıdır
UWESIS CORPORATION
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: IBQuery Insert,Append

Mesaj gönderen emin_as »

% olmayacak, yani % işareti koyarsan starting with yanlış çalışır.

Küsüratlı sayıları topluyor, ama inttostr yapinca kusuratı yuvarlıyorsun.

1- % işaretini kaldır.
2- kodun söyle degiştir

Kod: Tümünü seç

 
var
 tablosayi : double; // eger kusurat istiyorsan 
  ......
    tablosayi:=ibsql1.Fields[0].AsDouble;
  ...
  label1.Caption:=FormatFloat('#,##0.000',tablosayi); // inttostr olmaz format float kullancaksin

Tek satirda yapmak istersen

Kod: Tümünü seç

if ibsql1.RecordCount > 0 then
     label1.Caption:=FormatFloat('#,##0.000',ibsql1.Fields[0].AsDouble);  // bilgileri fields  ile alabilirsin
Kullanıcı avatarı
CiTiZEN
Üye
Mesajlar: 1163
Kayıt: 06 Oca 2008 04:15

Re: IBQuery Insert,Append

Mesaj gönderen CiTiZEN »

hocam çok teşekkür ederim % olmadan da denemiştim ama olmamıştı şimdi farkına vardım başka hatam varmış, geceleri uyumayınca insan baya bi garip oluyo :) şu anda her iki sistemde çalışmakta buyrun çözüm:

Filtreleme için:

Kod: Tümünü seç

IBDataSet1.Active:=False;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Text:='select * from EXAMPLE_TABLE where FIELD2 starting with "'+Edit1.Text+'"';
IBDataSet1.Active:=True;
IBDataset Toplama için:

Kod: Tümünü seç

var tablosayi:double;
begin
if IBSQL1.Transaction.Active=False then
  ibsql1.Transaction.StartTransaction;  // ibsql1 e baglı transaction çalıştırılmalıdır.
  ibsql1.SQL.Text:='select sum (FIELD4) from EXAMPLE_TABLE';  // sql bilgisi verilir
  ibsql1.ExecQuery;  // sql sorgu çalıştırılı için bunu kullanmalısın
  if ibsql1.RecordCount > 0 then
    tablosayi:=ibsql1.Fields[0].AsDouble  // bilgileri fields  ile alabilirsin
 else tablosayi:=0;
 label1.Caption:=FormatFloat('#,##0.000',tablosayi);
  ibsql1.Close;  // işlem bittikten sonra ibsql kapatılmalıdır
veritabanına bağlanıp verileri ibdataset ile alıyorum ve dbgrid gibi bileşenlerde kullanıyorum - veri girişi-düzenleme-silme gibi işlemleri de ibdataset ile yapıyorum, dblookuplistbox'a da ihtiyacım olursa ibquery ile kullanıyorum, toplama gibi işlemleride ibsql ile hallediyorum son sorum bu yaptıklarım doğrumudur?Yani bu yöntemlerin bu şekilde kullanımı doğrumudur?

Kolay Gelsin.
UWESIS CORPORATION
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: IBQuery Insert,Append

Mesaj gönderen emin_as »

Evet en iyisi bu şekilde kullanmak.
Ibdataset : Düzenlem-ekleme vs için,
Ibquery : Salt okunur sonuçlar almak için,
ibsql : Hesaplama türü hız gerektiren işlemler için.
Kullanıcı avatarı
CiTiZEN
Üye
Mesajlar: 1163
Kayıt: 06 Oca 2008 04:15

Re: IBQuery Insert,Append

Mesaj gönderen CiTiZEN »

peki hocam çok teşekkür ediyorum bu konu benim için son derece önemli idi sayenizde çözüm buldum
Kolay Gelsin
UWESIS CORPORATION
Cevapla