Query ve UpdateSQL

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Eğer mümkün ise, Benim yaptığım gibi Update'lerinin SQL'lerini gönder. Bir inceleyelim.

Benim sana gönderdiğim şey çalıştı değil mi?

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Gene şu kılıcını kınından çıkarsan iyi olacak. :)
Nasıl olsa çalışıyor diye senin 8) örneği denemedim. Abi şuan çok acil dışarı çıkıyom, gelince deneyeceğim.

Hatırlatma: Genel projede, SutCariKay tablosuna Müşterinin kayıtlarını yapıyorum ve DBGrid de Query1 ile SutCariKay den sadece Kodu ve Adi nı alıyorum. Diğer iki tablonun (SutGir, YemGir) ise bütün alanlarını alıyorum. Ayrı bir formda da SutCariKay Master tablo olmak üzere iki tane Detay tablo (SutGir, YemGir) ile rapor alacağım.

Kod: Tümünü seç

procedure TFrmDBGrid.BtKapatClick(Sender: TObject);
begin
  Query1.ApplyUpdates;
  Query1.CommitUpdates;
  close;
end;

procedure TFrmDBGrid.FormCreate(Sender: TObject);
begin
 UpdateSQL1.DataSet:=Query1;
 UpdateSQL2.DataSet:=Query1;
 UpdateSQL3.DataSet:=Query1;
end;

procedure TFrmDBGrid.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Query1.close;
end;

procedure TFrmDBGrid.Query1UpdateRecord(DataSet: TDataSet;
  UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
 UpdateSQL1.SetParams(UpdateKind);
 UpdateSQL1.ExecSQL(UpdateKind);
 UpdateSQL2.SetParams(UpdateKind);
 UpdateSQL2.ExecSQL(UpdateKind);
 UpdateSQL3.SetParams(UpdateKind);
 UpdateSQL3.ExecSQL(UpdateKind);
 UpdateAction:=uaApplied;
end;  

procedure TFrmDBGrid.FormShow(Sender: TObject);
begin
 Query1.Open;
end;
* UpdateSQL1 için:

Kod: Tümünü seç

delete from SutCariKay
where
  Kodu = :OLD_Kodu and
  Adi = :OLD_Adi

insert into SutCariKay
  (Kodu, Adi)
values
  (:Kodu, :Adi)

update SutCariKay
set
  Kodu = :Kodu,
  Adi = :Adi
where
  Kodu = :OLD_Kodu and
  Adi = :OLD_Adi
* UpdateSQL2 için:

Kod: Tümünü seç

delete from SutGir
where
  Kodus = :OLD_Kodu

insert into SutGir
  (Kodus, SutTar, SMik, SFiy, SOdenen, Sguntut, Skalan)
values
  (:Kodu, :SutTar, :SMik, :SFiy, :SOdenen, :Sguntut, :Skalan)

update SutGir
set
  Kodus = :Kodu,
  SutTar = :SutTar,
  SMik = :SMik,
  SFiy = :SFiy,
  SOdenen = :SOdenen,
  Sguntut = :Sguntut,
  Skalan = :Skalan
where
  Kodus = :OLD_Kodu
* UpdateSQL3 için:

Kod: Tümünü seç

delete from YemGir
where
  Koduy = :OLD_Kodu

insert into YemGir
  (Koduy, Yem, YMik, YFiy, YemTar, Ytut)
values
  (:Kodu, :Yem, :YMik, :YFiy, :YemTar, :Ytut)

update YemGir
set
  Koduy = :Kodu, 
  Yem = :Yem,
  YMik = :YMik,
  YFiy = :YFiy,
  YemTar = :YemTar,
  Ytut = :Ytut
where
  Koduy = :OLD_Kodu
* Query1 için:

Kod: Tümünü seç

SQL:
 SELECT  
  SutCariKay.Kodu, SutCariKay.Adi,
  SutGir.Kodus, SutGir.SutTar, SutGir.SMik, SutGir.SFiy, SutGir.SOdenen,
  SutGir.Sguntut, SutGir.Skalan,
  YemGir.Koduy, YemGir.Yem, YemGir.YMik, YemGir.YFiy, YemGir.YemTar, YemGir.Ytut
FROM 
 SutCariKay, SutGir, YemGir
CachedUpdates: True

Tablo yapıları:

Kod: Tümünü seç

SutCariKay : Kodu (*) , Adi (index) , Adres , Tel , Fax 
SutGir : Ssira(+*) , Kodus (index), SutTar , Smik , Sfiy , Sodenen , GirSguntut , GirSkalan 
YemGir : Ysira(+*) , Koduy(index) , Yem ,Ymik , Yfiy , YemTar , Ytut 
Saygılar,
Oğuz ÖZTÜRK
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Eğer kodlar yukarıda yazdığın gibi ise, Query1'in SELECT'inde WHERE Clause görülmüyor. Yani neyi neyle join ediyor bilemediği için UpdateFail olabilir. Bir oraya göz at. Yani Cari ile Yem ve Süt table'larını hangi field ile join ediyorsun? (Benim gördüğüm kadarı ile Kodu alanı) buna göre where clause'unu düzenle.

Bak bakalım yine olmaz ise, projeni ve DB'lerini bana zipleyip gönder. Umarım milyon tane komponent kurmmamışsındır :)

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Tamam hocam dediğin gibi where clause unu kullanacağım.
Yine olmaz ise sana zipler gönderirim.
Abi inan yabancı hiçbir bileşen kullanmadım, zararı olur diye. Mesela Gridin içerisine yerleştirdiğim DateTimePicker ler ve DBLookUpComboBox lar falan hep kod ile yapılmış. (Sizin kadar olmasa da, birazcık 8) )

Saygılar.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Estağfurullah,

Ok. Sonucu bekliyorum.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Kendim halledeyim dedim ama, olmadı :(

Zip halini gönderdim, müsait bir zamanınızda bakabilirseniz memnun olurum.

Saygılar.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Key Violation Hatası Almanız doğal. Çünkü SütçüCari table'ında birden fazla aynı kodlu kayıt oluşturmaya kalkıyorsunuz.

Sizin Gridde girdiğiniz kayıtta ikinci bir kez SutcuCari table'ına kayıt atmaya çalışıyor.

Aslında Yapmak istediğiniz şey şu mu,

Mevcut sütçülerden gelen sütlerin girişinin yapılmasını istiyorsanız mantığı değiştirmek gerekiyor.

Yani SütçüCari table'ına UpdateSQL kullanmayacaksınız. Orası sadece LookUp yapılacak bir yer olacak. Bu sebeple de Gridinizin ve Query'nizinin mantığını LookUp yapacak şekilde değiştirmelisiniz.

Siz oradaki olacak mantığı izah ederseniz ben de size çözüm yolunu gösterebilirim (sanırım :) )


Not : Bu arada sourceunuzu inceleyip yazdım yukarıdakileri.
Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Sağolun hocam,

Aynen dediğin gibi :) , önce mevcut sütçüler Cari ye kaydedilecek daha sonra o kişiye ait ( mesela adam hergün süt getiriyor ve yem alıyor ) süt ve yem girişleri olacak. Nasıl bir mantık izleyeyim :?: Yoksa dediğiniz Lookup mantığı yeterli mi :?:
Abi şuan dank etti , dediğin doğru : Gridde girdiğim kayıtta ikinci bir kez SutcuCari table'ına kayıt atmaya çalışıyorum.
Aslında ben bütün Cari kayıtları , Süt Girişlerini ve Yem Girişlerini ayrı formlarda DBEdit ler yardımı ile yapmıştım . Hiçbir sorun da yoktu. Ama adamlar MS Excel i görmüşler ve niye bütün girişleri bizde tek biryerde yapmayalım diye tutturdular.(şerefsiz Billy exceli yapmasa idi bütün bunlar olmazdı :) ) Bir de şunu istiyorlar: Gridi açtıklarında o ana kadar kaydedilmiş bütün satıcıların bir defa görükmesini istiyorlar.(Valla kuşa kurda yem olduk ya :x )

Son birşey: Tablo yapılarım nasıl? 8) mu?

İnşallah anlaşılır olmuştur.
Saygılar
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Girişlerinde LookUp Kullanırsa daha iyi olur (Yani Sütçü Carileri LookUptan Getirmen daha iyi olur9 diğer table'ları da birbirine Join edersin ve sadece iki adet UpdateSQL kullanarak bitirebilirsin.

Ayrıca ben sana ekstra bir mail göndermedim. Aslında şu sıralarda benim adıma oraya buraya mail gönderen bir virüs dolanıyor ama hadi bakalım hayırlısı. Bana da günde belki 15-20 adet mail geliyor. Hiç tanımadığım kişilerden hepsinde de attachment var. Ben direct siliyorum. Bir şekilde biryerler hack edilmiş ve benim adıma (benim gibi milyonlarca insan adına) oraya buraya mail atılıp duruyor.

Yakında kokusu çıkar bu işin.

Not : Pazar günü yanıt yazma ihtimalim şu anda maalesef yok !...

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Tamam hocam dediğin gibi Lookup ile halletmeye çalışacağım.

Mail hakkında ben de şüphelenmiştim zaten. Bana da senin gibi bir çok mail geliyor ve hiçbirini açmadan direk siliyorum. Senin ismini görünce , sendendir diye açtım, Allah tan Yahoo, içinde virüs var diye açtırtmadı(Yahoo nunda günahını almışız :lol: ).

Alıntı:
Not : Pazar günü yanıt yazma ihtimalim şu anda maalesef yok !...

Hocam sakın yanlış anlama ben onu sadece çok sabırsızlandığım için söylemiştim, kötü bir niyetim yoktu. :) Tabiki Pazar günü yazma gibi bir zorunluluğunuz yok, hatta hiçbir gün yazma zorunluluğunuz yok. Allah hepinizden razı olsun bunca işinizin arasında böyle bir hizmet veriyorsunuz. Ben, yaptığınız işlerden dolayı hepinize çok saygı duyuyorum.

Tekrardan minnettarlığımı belirtmek isterim.

Saygılar
Oğuz ÖZTÜRK
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Teveccühünüz için teşekkürler ancak ben de pazar günü yazamadığım için hayıflandığımı anlatmaya çalışmıştım :) Yanlış anlaşıldıysa kusura bakma :oops:

Buradaki tüm arkadaşlar aynı heves ve ilgiyle yardımcı olmaya çalışıyorlar. Bunları tüm arkadaşlarımız adına söylüyorum. Allah hepimizden razı olsun.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

:D AMİNNNN :D
hatice_sevim
Üye
Mesajlar: 50
Kayıt: 17 Haz 2003 09:00
Konum: İstanbul

Mesaj gönderen hatice_sevim »

Merhaba Arkadaşlar;
Bu başlığı gördüğümde tamam aradığımı buldum :lol: dedim ama maalesef yine olmadı benim updatesql işim.
Table 'la kayıt yaparken;

Kod: Tümünü seç

table1.insert;
..dbedit....
table1.apply;
ile kayıt yapabildiğim gibi aynı şeyi query ile yapmak için;
query1.UpdateObject:= UpdateSQL1;
query1.CachedUpdates:= True;
yaptıktan sonra;

Kod: Tümünü seç

database1.StartTransaction
query1.SQL.Clear;
query1.SQL.Add('select * from table_name');
query1.open;
....
query1.insert;
...dbedit....
query1.post;
database1.commit;
ilede kayıt insert etmesi gerekmiyor mu? Çünkü hata falan vermiyor ama kayıtlarda gerçekten insert olmuyor. ApplyUpdates ve CommitUpdates leride query e yazdığımda hata veriyor.
Bu işin olmazsa olmazı nedir? veya benim ekstradan dikkat etmem gereken ne? Delphi 7 ve oracle 9i kullanıyorum
Çok teşekkürler Arkadaşlar...
Hatice SEVİM / BEDAŞ
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba..

- Kayıt için

Kod: Tümünü seç

INSERT INTO veritabani (alan1, alan2) Values (:d0, :d1)
...

Kod: Tümünü seç

Parameters.ParamByName('d0').Value := 'Değer1';
Parameters.ParamByName('d1').Value := 'Değer2';
ExecSQL;
şeklinde kullanmayı tercih etseniz..
Resim
Resim ....Resim
hatice_sevim
Üye
Mesajlar: 50
Kayıt: 17 Haz 2003 09:00
Konum: İstanbul

Mesaj gönderen hatice_sevim »

Peki o zaman DbEdit kullanmamın bir anlamı kalmayacak :cry:
Değil mi? tek tek bütün field ları yazmak zorunda kalmayacak mıyım???

Daha doğru bir kaç yerde Dbedit kullanılmasından bahsediliyor bunu nasıl yapabilirim? Yada benim buradan anladığım yanlış mı?

Teşekkürler arkadaşlar...
Hatice SEVİM / BEDAŞ
Cevapla