Query ve UpdateSQL
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
Query ve UpdateSQL
Selamun Aleykum,
Herkese hayırlı günler.
Benim başım bu UpdateSQL ile belada. Forumda daha once Husonet in benzer bir sorusu var, Delphinin Helpine de baktım fakat çare bulamadım. Şöyle açıklıyım;
DBGrid içerisine Query yardımı ile 3 ayrı tablonun bazı elemanlarını yerleştirdim.
Query1 : SQL : SELECT
Cari.Kodu, SutCari.Adi,
Sut.SutTar, Sut.SMik, Sut.SFiy, Sut.SOdenen, Sut.Sguntut, Sut.Skalan,
Yem.Yem, YemGir.YMik, Yem.YFiy, Yem.YemTar, Yem.Ytut
FROM Cari, Sut, Yem
ORDER BY Cari.Kodu
Tablo yapıları:
Cari : Kodu (*) , Adi (index) , Adres , Tel , Fax
Sut : Ssira , Kodu , SutTar , Smik , Sfiy , Sodenen , GirSguntut , GirSkalan
Yem : Ysira , Kodu , Yem ,Ymik , Yfiy , YemTar , Ytut
Ve bu alanlar yardımı ile DBGrid te kullanıcının kayıt girmesini / Silmesini ve Değiştirmesini istiyorum. Bunun için de TUpdateSQL kullanıyorum. Ve şu ayarlamaları yaptım.
Query1: UpdateObject = UpdateSQL1
DBGrid1: Options : dgCancelOnExit = False
Bununla ilgili kullandığım kodlar ise şunlar:
procedure TFrmDBGrid.FormCreate(Sender: TObject);
begin
Query1.Open;
end;
procedure TFrmDBGrid.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Query1.close;
Query1.cachedupdates:=true;
Query1.Open;
end;
procedure TFrmDBGrid.Query1AfterPost(DataSet: TDataSet);
begin
if (Query1.state=dsedit) or (Query1.state=dsinsert) then
Query1.ApplyUpdates;
end;
procedure TFrmDBGrid.FormDestroy(Sender: TObject);
begin
Query1.Close;
end;
Programı çalıştırıyorum, kayıt yapıyorum ve çıkıp geri döndüğümde ise kayıtlar uçmuş oluyor.
Ayrıca kodlar ile oynadığım zaman da ,
( Cannot modify a read only dataset )
ve bazende
( Class EDBEngineError with message ‘ invalid parameter ’ )
hatalarını aldım.
Birde kafama takılan şu var: UpdateSQL in editörünü açtığımda Table Names de 3 ayrı tabloyu da seçiyorum ve Update Fields lerini belirleyip GenerateSQL ile SQL lerini oluşturuyorum, OK deyip çıkıyorum. Bundan sonra UpdateSQL in properties inden Delete / Insert / Modify özelliklerine bakıyorum ve sadece tek bir tablunun SQL ifadelerini görüyorum. Yani diğer 2 tabloyu işleme katmıyor.
Birtürlü içinden çıkamadım , yardımcı olabilecek arkadaşlar lütfen !!
Not: Delphi7 ve Paradox kullanıyorum.
Saygılar,
Oğuz Öztürk.
Herkese hayırlı günler.
Benim başım bu UpdateSQL ile belada. Forumda daha once Husonet in benzer bir sorusu var, Delphinin Helpine de baktım fakat çare bulamadım. Şöyle açıklıyım;
DBGrid içerisine Query yardımı ile 3 ayrı tablonun bazı elemanlarını yerleştirdim.
Query1 : SQL : SELECT
Cari.Kodu, SutCari.Adi,
Sut.SutTar, Sut.SMik, Sut.SFiy, Sut.SOdenen, Sut.Sguntut, Sut.Skalan,
Yem.Yem, YemGir.YMik, Yem.YFiy, Yem.YemTar, Yem.Ytut
FROM Cari, Sut, Yem
ORDER BY Cari.Kodu
Tablo yapıları:
Cari : Kodu (*) , Adi (index) , Adres , Tel , Fax
Sut : Ssira , Kodu , SutTar , Smik , Sfiy , Sodenen , GirSguntut , GirSkalan
Yem : Ysira , Kodu , Yem ,Ymik , Yfiy , YemTar , Ytut
Ve bu alanlar yardımı ile DBGrid te kullanıcının kayıt girmesini / Silmesini ve Değiştirmesini istiyorum. Bunun için de TUpdateSQL kullanıyorum. Ve şu ayarlamaları yaptım.
Query1: UpdateObject = UpdateSQL1
DBGrid1: Options : dgCancelOnExit = False
Bununla ilgili kullandığım kodlar ise şunlar:
procedure TFrmDBGrid.FormCreate(Sender: TObject);
begin
Query1.Open;
end;
procedure TFrmDBGrid.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Query1.close;
Query1.cachedupdates:=true;
Query1.Open;
end;
procedure TFrmDBGrid.Query1AfterPost(DataSet: TDataSet);
begin
if (Query1.state=dsedit) or (Query1.state=dsinsert) then
Query1.ApplyUpdates;
end;
procedure TFrmDBGrid.FormDestroy(Sender: TObject);
begin
Query1.Close;
end;
Programı çalıştırıyorum, kayıt yapıyorum ve çıkıp geri döndüğümde ise kayıtlar uçmuş oluyor.
Ayrıca kodlar ile oynadığım zaman da ,
( Cannot modify a read only dataset )
ve bazende
( Class EDBEngineError with message ‘ invalid parameter ’ )
hatalarını aldım.
Birde kafama takılan şu var: UpdateSQL in editörünü açtığımda Table Names de 3 ayrı tabloyu da seçiyorum ve Update Fields lerini belirleyip GenerateSQL ile SQL lerini oluşturuyorum, OK deyip çıkıyorum. Bundan sonra UpdateSQL in properties inden Delete / Insert / Modify özelliklerine bakıyorum ve sadece tek bir tablunun SQL ifadelerini görüyorum. Yani diğer 2 tabloyu işleme katmıyor.
Birtürlü içinden çıkamadım , yardımcı olabilecek arkadaşlar lütfen !!
Not: Delphi7 ve Paradox kullanıyorum.
Saygılar,
Oğuz Öztürk.
Selamlar,
Bildiğim kadarı ile, UpdateSQL'ler aynı anda sadece bir tabloyu Update eder. Çoklu tablodan elde edilen result setlere (yani Joined Tables) işlem yapmaz. Bu sebeple kurgulamanızı bunun üzerine yapınız.
Zaten siz bu tarz bir Query'i açmaya çalıştığınızda (Dikkat edin, RequestLive'ini True edin) size ya hata verecektir, yada Table is readonly gibi bir mesaj verecektir.
Kolay Gelsin.
Bildiğim kadarı ile, UpdateSQL'ler aynı anda sadece bir tabloyu Update eder. Çoklu tablodan elde edilen result setlere (yani Joined Tables) işlem yapmaz. Bu sebeple kurgulamanızı bunun üzerine yapınız.
Zaten siz bu tarz bir Query'i açmaya çalıştığınızda (Dikkat edin, RequestLive'ini True edin) size ya hata verecektir, yada Table is readonly gibi bir mesaj verecektir.
Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
RequestLive=True yaptım , dediğiniz gibi hata veriyor. Zaten ben de RequestLive=False çalışıyorum.
Fakat eğer dediğiniz gibi UpdateSQL'ler aynı anda sadece bir tabloyu Update ediyor ise;
Neden UpdateSQL in editöründe ki TableNames de Query de belirttiğim 3 tablonun da ismi var?
Ayrıca sitedeki makelede UpdateSQL birden fazla
Eğer dediğiniz gibi ise;
'Çoklu tablodan elde edilen result setlere (yani Joined Tables) işlem yapmaz. Bu sebeple kurgulamanızı bunun üzerine yapınız.'
ifadessini daha somut bir şekilde açıklayabilirmisiniz ?
Saygılar,
Oğuz ÖZTÜRK
Fakat eğer dediğiniz gibi UpdateSQL'ler aynı anda sadece bir tabloyu Update ediyor ise;
Neden UpdateSQL in editöründe ki TableNames de Query de belirttiğim 3 tablonun da ismi var?
Ayrıca sitedeki makelede UpdateSQL birden fazla
Eğer dediğiniz gibi ise;
'Çoklu tablodan elde edilen result setlere (yani Joined Tables) işlem yapmaz. Bu sebeple kurgulamanızı bunun üzerine yapınız.'
ifadessini daha somut bir şekilde açıklayabilirmisiniz ?
Saygılar,
Oğuz ÖZTÜRK
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
Verdiğiniz cevap için sağolun,
RequestLive=True yaptım , dediğiniz gibi hata veriyor. Zaten ben de RequestLive=False çalışıyorum.
Fakat eğer dediğiniz gibi UpdateSQL'ler aynı anda sadece bir tabloyu Update ediyor ise;
Neden UpdateSQL in editöründe ki TableNames de Query de belirttiğim 3 tablonun da ismi var?
Ayrıca sitedeki makelede UpdateSQL birden fazla Query için kullanılır diyor (Benim anladığım kadarı ile)
Eğer dediğiniz gibi ise;
'Çoklu tablodan elde edilen result setlere (yani Joined Tables) işlem yapmaz. Bu sebeple kurgulamanızı bunun üzerine yapınız.'
ifadesini daha somut bir şekilde açıklayabilirmisiniz ?
Saygılar,
Oğuz ÖZTÜRK
RequestLive=True yaptım , dediğiniz gibi hata veriyor. Zaten ben de RequestLive=False çalışıyorum.
Fakat eğer dediğiniz gibi UpdateSQL'ler aynı anda sadece bir tabloyu Update ediyor ise;
Neden UpdateSQL in editöründe ki TableNames de Query de belirttiğim 3 tablonun da ismi var?
Ayrıca sitedeki makelede UpdateSQL birden fazla Query için kullanılır diyor (Benim anladığım kadarı ile)
Eğer dediğiniz gibi ise;
'Çoklu tablodan elde edilen result setlere (yani Joined Tables) işlem yapmaz. Bu sebeple kurgulamanızı bunun üzerine yapınız.'
ifadesini daha somut bir şekilde açıklayabilirmisiniz ?
Saygılar,
Oğuz ÖZTÜRK
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
Selamlar,
UpdateSQL'i CachedUpdates'i True olan ResultSetler'de kullanabiliyorsunuz ve UpdateSQL'in Helpinde birkaç küçük not var ordan alıntı yapıyorum.
Ama yine de biraz açıklayayım. Her bir UpdateSQL sadece 1 table'a işlem yapabilir. Yani sizin result setinizde eğer 1'den fazla table'dan sonuç dönüyor ise ne yazık ki UpdateSQL Nesnesi buradaki ANA table'a hitab eder. Bunları aşabilmek için sizin kaç table'ınız var ise (Update Edilmek istenen kaç table var ise) o kadar adet UpdateSQL objesi koymanız gerekiyor ve Runtime'da bu koyduğunuz UpdateSQL nesnelerine Dataset ataması yapmanız lazım. Designtime'da maalesef bu yok.
Hepsinin Update, Delete, Insert cümlelerini atamanız gerekiyor. Sonra, sonrası zaten alıntıda anlatılıyor
Kolay Gelsin
UpdateSQL'i CachedUpdates'i True olan ResultSetler'de kullanabiliyorsunuz ve UpdateSQL'in Helpinde birkaç küçük not var ordan alıntı yapıyorum.
UpdateSQL'in helpinde sağ üst bölümde Using TUpdateSQL yazan bir link var oraya tıklayınca açıklamaları geliyor. yukarıdaki alıntı da oradan. Ayrıca Use Multiple Update Objects linkini de tıkılarsanız nasıl kullanabileceğinizi açıklıyor.Note: Sometimes, you need to use multiple update objects. For example, when updating a multi-table join or a stored procedure that represents data from multiple datasets, you must provide one TUpdateSQL object for each table you want to update. When using multiple update objects, you can’t simply associate the update object with the dataset by setting the UpdateObject property. Instead, you must manually call the update object from an OnUpdateRecord event handler (when using the BDE to cache updates) or a BeforeUpdateRecord event handler (when using a client dataset).
Ama yine de biraz açıklayayım. Her bir UpdateSQL sadece 1 table'a işlem yapabilir. Yani sizin result setinizde eğer 1'den fazla table'dan sonuç dönüyor ise ne yazık ki UpdateSQL Nesnesi buradaki ANA table'a hitab eder. Bunları aşabilmek için sizin kaç table'ınız var ise (Update Edilmek istenen kaç table var ise) o kadar adet UpdateSQL objesi koymanız gerekiyor ve Runtime'da bu koyduğunuz UpdateSQL nesnelerine Dataset ataması yapmanız lazım. Designtime'da maalesef bu yok.
Hepsinin Update, Delete, Insert cümlelerini atamanız gerekiyor. Sonra, sonrası zaten alıntıda anlatılıyor
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
gözüme takıldı
AfterPost, post işleminden sonra tetiklenir zaten, yani state browes gelir dolayısı ile bu kod çalışmaz. Onun yerine,
bunu kullanılması daha iyi olur.
Kolay gele
bu kodda hata varprocedure TFrmDBGrid.Query1AfterPost(DataSet: TDataSet);
begin
if (Query1.state=dsedit) or (Query1.state=dsinsert) then
Query1.ApplyUpdates;
end;
AfterPost, post işleminden sonra tetiklenir zaten, yani state browes gelir dolayısı ile bu kod çalışmaz. Onun yerine,
Kod: Tümünü seç
if Query1.UpdatesPending then Query1.ApplyUpdates;
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 !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
S.A.
Arkadaşlar ben bu UpdateSQL i bir türlü halledemedim, 3-4 gündür uğraşıyorum olmadı.En son önerilerinizden sonra şunları yaptım. 1 Query de update edilmesi gereken 3 tane tablom var.
Bunun için 3 ayrı UpdateSQL im var ve kodla bu 3 ayrı UpdateSQL i Query me bağlamaya çalışıyorum.(Sanırım sorunda burda, bağlayamıyorum) İşlemler ise DBGrid üzerinde cereyan ediyor.
Bu kodlar herhangi bir hata vermiyor, ama istediğim Update ide yapmıyor.
Bu konuda yardımlarınızı bekliyorum.
Saygılar,
Oğuz ÖZTÜRK
Arkadaşlar ben bu UpdateSQL i bir türlü halledemedim, 3-4 gündür uğraşıyorum olmadı.En son önerilerinizden sonra şunları yaptım. 1 Query de update edilmesi gereken 3 tane tablom var.
Bunun için 3 ayrı UpdateSQL im var ve kodla bu 3 ayrı UpdateSQL i Query me bağlamaya çalışıyorum.(Sanırım sorunda burda, bağlayamıyorum) İşlemler ise DBGrid üzerinde cereyan ediyor.
Kod: Tümünü seç
procedure TFrmDBGrid.Query1BeforeOpen(DataSet: TDataSet);
begin
Query1.CachedUpdates:=true;
end;
procedure TFrm.Query1UpdateRecord(DataSet: TDataSet;
UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
if (updatekind=ukmodify) or (updatekind=ukinsert) or (updatekind=ukdelete) then
begin
with (Dataset as TBDEDataset) do
(UpdateObject as TUpdateSQL).Apply(Updatekind);
UpdateAction:=uaApplied;
end;
end;
procedure TFrm.Query1BeforeInsert(DataSet: TDataSet);
begin
if Query1.UpdateObject=UpdateSQL1 then
begin
UpdateSQL1.insertSQL.Add('insert into CariKay (Kodu, Adi)');
UpdateSQL1.insertSQL.Add('values (:Kodu, :Adi)');
end;
if Query1.UpdateObject=UpdateSQL2 then
begin
UpdateSQL2.insertSQL.Add('insert into SutGir (SutTar, SMik, SFiy, SOdenen, Sguntut, Skalan)');
UpdateSQL2.insertSQL.Add('values (:SutTar, :SMik, :SFiy, :SOdenen, :Sguntut, :Skalan)');
end;
if Query1.UpdateObject=UpdateSQL3 then
begin
UpdateSQL3.insertSQL.Add('insert into YemGir (Yem, YMik, YFiy, YemTar, Ytut)');
UpdateSQL3.insertSQL.Add('values (:Yem, :YMik, :YFiy, :YemTar, :Ytut)');
end;
end;
procedure TFrm.Query1BeforeDelete(DataSet: TDataSet);
begin
if Query1.UpdateObject=UpdateSQL1 then
begin
UpdateSQL1.DeleteSQL.Add('delete from CariKay');
UpdateSQL1.DeleteSQL.Add('where Kodu=:OLD_Kodu and Adi=:OLD_Adi');
end;
if Query1.UpdateObject=UpdateSQL2 then
begin
UpdateSQL2.DeleteSQL.Add('delete from SutGir');
UpdateSQL2.DeleteSQL.Add('where Kodu=:OLD_Kodu');
end;
if Query1.UpdateObject=UpdateSQL3 then
begin
UpdateSQL3.DeleteSQL.Add('delete from YemGir');
UpdateSQL3.DeleteSQL.Add('where Kodu=:OLD_Kodu');
end;
end;
procedure TFrm.Query1BeforeEdit(DataSet: TDataSet);
begin
if Query1.UpdateObject=UpdateSQL1 then
begin
UpdateSQL1.ModifySQL.Add('update CariKay');
UpdateSQL1.ModifySQL.Add('set Kodu=:Kodu,Adi=:Adi');
UpdateSQL1.ModifySQL.Add('where Kodu=:OLD_Kodu and Adi=:OLD_Adi');
end;
if Query1.UpdateObject=UpdateSQL2 then
begin
UpdateSQL2.ModifySQL.Add('update SutGir');
UpdateSQL2.ModifySQL.Add('set SutTar=:SutTar,SMik=:SMik,SFiy=:SFiy,SOdenen=:SOdenen,Sguntut=:Sguntut,Skalan=:Skalan');
UpdateSQL2.ModifySQL.Add('where Kodu=:OLD_Kodu');
end;
if Query1.UpdateObject=UpdateSQL3 then
begin
UpdateSQL3.ModifySQL.Add('update YemGir');
UpdateSQL3.ModifySQL.Add('set Yem=:Yem,YMik=:YMik,YFiy=:YFiy,YemTar=:YemTar,Ytut=:Ytut');
UpdateSQL3.ModifySQL.Add('where Kodu=:OLD_Kodu');
end;
end;
Bu konuda yardımlarınızı bekliyorum.
Saygılar,
Oğuz ÖZTÜRK
A.S.
Yaptığın temel mantık hatası şurda, BeforeInsert, BeforeEdit veya BeforeDelete Eventlerinde UpdateSQL'lere SQL Cümlesi atıyorsun. Buna gerek yok.
Mantık şu olmalı,
Ana Query'yi açmadan önce, UpdateSQL'lerinin, önce Dataset'lerini atayacaksın sonra Insert, Update ve Delete SQL'lerini atayacaksın sonra Query'ini açacaksın.
UpdateSQL'ler senin adına Insert,Update ve Delete gerçekleştirecek
Ana Query'i Post ettiğinde diğerleri de otomatik olarak post edecektir. Ancak Ana Query'ini close etmeden önce ApplyUpdates ve CommitUpdates yapman gerekiyor.
Tekrar bir kontrol et bakalım...
Anlaşılmayan bir yer var mı?
Kolay Gelsin.
Yaptığın temel mantık hatası şurda, BeforeInsert, BeforeEdit veya BeforeDelete Eventlerinde UpdateSQL'lere SQL Cümlesi atıyorsun. Buna gerek yok.
Mantık şu olmalı,
Ana Query'yi açmadan önce, UpdateSQL'lerinin, önce Dataset'lerini atayacaksın sonra Insert, Update ve Delete SQL'lerini atayacaksın sonra Query'ini açacaksın.
UpdateSQL'ler senin adına Insert,Update ve Delete gerçekleştirecek
Ana Query'i Post ettiğinde diğerleri de otomatik olarak post edecektir. Ancak Ana Query'ini close etmeden önce ApplyUpdates ve CommitUpdates yapman gerekiyor.
Tekrar bir kontrol et bakalım...
Anlaşılmayan bir yer var mı?
Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
Hayırlı geceler abi,
Dediğiniz gibi kontrol ettim, ve aşağıdakileri yaptım. Ama şimdi de DBGrid e hiç bilgi giremiyorum,
‘Cannot modify a read-only dataset’ hatasını veriyor.
Önceden en azından birkez de olsa bilgi girebiliyordum, şimdi o da YOK
Neler oluyor bu gıride anlamıyom, her dediğini yaptık . (Query =Açık , Datasource bağlı)
Olmuş mu
Dediğiniz gibi kontrol ettim, ve aşağıdakileri yaptım. Ama şimdi de DBGrid e hiç bilgi giremiyorum,
‘Cannot modify a read-only dataset’ hatasını veriyor.
Önceden en azından birkez de olsa bilgi girebiliyordum, şimdi o da YOK
Neler oluyor bu gıride anlamıyom, her dediğini yaptık . (Query =Açık , Datasource bağlı)
Olmuş mu
Kod: Tümünü seç
procedure TFrmDBGrid.FormCreate(Sender: TObject);
begin
Query1.Close;
Query1.CachedUpdates:=true;
with UpdateSQL1 do begin
if DataSet=Query1 then
begin
insertSQL.Clear;
insertSQL.Add('insert into SutCariKay (Kodu, Adi)');
insertSQL.Add('values (:Kodu, :Adi)');
insertSQL.Clear;
DeleteSQL.Add('delete from SutCariKay');
DeleteSQL.Add('where Kodu=:OLD_Kodu and Adi=:OLD_Adi');
ModifySQL.Clear;
ModifySQL.Add('update SutCariKay');
ModifySQL.Add('set Kodu=:Kodu,Adi=:Adi');
ModifySQL.Add('where Kodu=:OLD_Kodu and Adi=:OLD_Adi');
end;
end;
with UpdateSQL2 do begin
if DataSet=Query1 then
begin
insertSQL.Clear;
insertSQL.Add('insert into SutGir (SutTar, SMik, SFiy, SOdenen, Sguntut, Skalan)');
insertSQL.Add('values (:SutTar, :SMik, :SFiy, :SOdenen, :Sguntut, :Skalan)');
DeleteSQL.Clear;
DeleteSQL.Add('delete from SutGir');
DeleteSQL.Add('where Kodu=:OLD_Kodu');
ModifySQL.Clear;
ModifySQL.Add('update SutGir');
ModifySQL.Add('set SutTar=:SutTar,SMik=:SMik,SFiy=:SFiy,SOdenen=:SOdenen,Sguntut=:Sguntut,Skalan=:Skalan');
ModifySQL.Add('where Kodu=:OLD_Kodu');
end;
end;
with UpdateSQL3 do begin
if DataSet=Query1 then
begin
insertSQL.Clear;
insertSQL.Add('insert into YemGir (Yem, YMik, YFiy, YemTar, Ytut)');
insertSQL.Add('values (:Yem, :YMik, :YFiy, :YemTar, :Ytut)');
DeleteSQL.Clear;
DeleteSQL.Add('delete from YemGir');
DeleteSQL.Add('where Kodu=:OLD_Kodu');
ModifySQL.Clear;
ModifySQL.Add('update YemGir');
ModifySQL.Add('set Yem=:Yem,YMik=:YMik,YFiy=:YFiy,YemTar=:YemTar,Ytut=:Ytut');
ModifySQL.Add('where Kodu=:OLD_Kodu');
end;
end;
Query1.Open;
end;
procedure TFrmDBGrid.FormDestroy(Sender: TObject);
begin
Query1.Close;
end;
procedure TFrmDBGrid.Query1BeforeClose(DataSet: TDataSet);
begin
if Query1.State in [dsEdit, dsInsert] then
Query1.Post;
if Query1.UpdatesPending then
begin
Query1.ApplyUpdates;
Query1.CommitUpdates;
end;
end;
Selamlar,
Yaw ben de denedim olmadı !... Delphi >Help'te oluyor hem de otomatik yapılıyor filan diyor ama olmadı.
Ancak Internette arama yaptığımda Delphi 2,3,4 için yapılmış bir TMultiUpdateSQL componenti buldum. Onun linkini vereyim.
Aslında kısmi manuel olarak yapılabilir sanırım. Denemek lazım (Yani OnUpdateRecord Eventinde UpdateSQL'ler kendin manuel Exec Ettirirsen olur gibime geliyor.
Ayrıca bu özellik Delphi6'dan sonra gelmiş. Bir de Delphi7'ye bakacağım belki bir bug vardır..
http://www.delphi32.com/vcl/1405/
link yukarıda
Kolay Gelsin.
Yaw ben de denedim olmadı !... Delphi >Help'te oluyor hem de otomatik yapılıyor filan diyor ama olmadı.
Ancak Internette arama yaptığımda Delphi 2,3,4 için yapılmış bir TMultiUpdateSQL componenti buldum. Onun linkini vereyim.
Aslında kısmi manuel olarak yapılabilir sanırım. Denemek lazım (Yani OnUpdateRecord Eventinde UpdateSQL'ler kendin manuel Exec Ettirirsen olur gibime geliyor.
Ayrıca bu özellik Delphi6'dan sonra gelmiş. Bir de Delphi7'ye bakacağım belki bir bug vardır..
http://www.delphi32.com/vcl/1405/
link yukarıda
Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Selamlar,
Çözdüm
Kod şu şekilde olacak.
UpdateSql'lerdeki yazılı olanlar ise,
Tabloların Structure'ları ise
Kodlar Delphi 5,6 ve 7'de çalışıyor test ettim.Table'lar, MS-SQL Server'da yapıldı.
Senin yaşadığın sıkıntı benimki ile aynı oldu, yani bir tane kayıt atıyor ama gerisi gelmiyor ve Table is readonly hatası veriyor. Bunu da aslında, UpdateAction'a çıkışta değer atamadığımız için yapıyormuş. Delphi7 Helpte oraya dikkat edilmesi gerektiği not düşülmüş 6'da yok böyle bir not. Herhalde konu ile ilgili çok soru sorulmuş bunu da yazmışlar.
İlgili Application'ı sana zip edip göndereyim, mail adresine bir bakacağım.
Kolay Gelsin.
Kılıcımı kapatiiim (czwoooaaaannnn...)
Çözdüm
Kod şu şekilde olacak.
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Open ;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Query1.ApplyUpdates ;
Query1.CommitUpdates ;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
UpdateSQL1.DataSet := Query1;
UpdateSQL2.DataSet := Query1;
UpdateSQL3.DataSet := Query1;
end;
procedure TForm1.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;
Kod: Tümünü seç
--UPDATESQL 1 İÇİN
update TABLO1
set
T1KOD = :T1KOD,
T1SAYI1 = :T1SAYI1
where
T1KOD = :OLD_T1KOD
insert into TABLO1
(T1KOD, T1SAYI1)
values
(:T1KOD, :T1SAYI1)
delete from TABLO1
where
T1KOD = :OLD_T1KOD
--UPDATESQL 2 İÇİN
update TABLO2
set
T2KOD = :T1KOD,
T2SAYI1 = :T2SAYI1
where
T2KOD = :OLD_T1KOD
insert into TABLO2
(T2KOD, T2SAYI1)
values
(:T1KOD, :T2SAYI1)
delete from TABLO2
where
T2KOD = :OLD_T1KOD
--UPDATESQL3 İÇİN
update TABLO3
set
T3KOD = :T1KOD,
T3SAYI1 = :T3SAYI1
where
T3KOD = :OLD_T1KOD
insert into TABLO3
(T3KOD, T3SAYI1)
values
(:T1KOD, :T3SAYI1)
delete from TABLO3
where
T3KOD = :OLD_T1KOD
Kod: Tümünü seç
CREATE TABLE [dbo].[TABLO1] (
[T1KOD] [char] (10) COLLATE Turkish_CI_AS NOT NULL ,
[T1SAYI1] [int] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TABLO2] (
[T2KOD] [char] (10) COLLATE Turkish_CI_AS NOT NULL ,
[T2SAYI1] [int] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TABLO3] (
[T3KOD] [char] (10) COLLATE Turkish_CI_AS NOT NULL ,
[T3SAYI1] [int] NULL
) ON [PRIMARY]
Senin yaşadığın sıkıntı benimki ile aynı oldu, yani bir tane kayıt atıyor ama gerisi gelmiyor ve Table is readonly hatası veriyor. Bunu da aslında, UpdateAction'a çıkışta değer atamadığımız için yapıyormuş. Delphi7 Helpte oraya dikkat edilmesi gerektiği not düşülmüş 6'da yok böyle bir not. Herhalde konu ile ilgili çok soru sorulmuş bunu da yazmışlar.
İlgili Application'ı sana zip edip göndereyim, mail adresine bir bakacağım.
Kolay Gelsin.
Kılıcımı kapatiiim (czwoooaaaannnn...)
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
Abi Allah kılıcına zeval vermesin, . Duasıcıyız...
Sağolasın epey bir uğraşmıssın benim için.
Bizim bu Erdemli / Mersin de seçimler çok hararetli geçti, son 2 gündür çalışamadım. Araba kornaları kafa - beyin bırakmadı.
Gönderdiğiniz bilgiler ışığında çalışacağım.
Bu arada E-postam: oguzozturk74@yahoo.com
Saygılar
Oğuz ÖZTÜRK
Sağolasın epey bir uğraşmıssın benim için.
Bizim bu Erdemli / Mersin de seçimler çok hararetli geçti, son 2 gündür çalışamadım. Araba kornaları kafa - beyin bırakmadı.
Gönderdiğiniz bilgiler ışığında çalışacağım.
Bu arada E-postam: oguzozturk74@yahoo.com
Saygılar
Oğuz ÖZTÜRK
-
- Kıdemli Üye
- Mesajlar: 574
- Kayıt: 01 Şub 2004 12:29
- Konum: Erdemli - MERSİN
S.A.
Ben birden fazla tabloyu Update etmekten vazmı geçsem acaba.(Yanlış bir tasarım mı yapıyorum )
Bir türlü olmadı. Nerde hata yapıyorum anlamadım. Adımız Updateçiye çıkacak.
Abi şimdi bütün dediklerinizi yaptım, kendime göre varyasyonlar da denedim ve en son Gride bilgi girip çıktıktan sonra şu hatayı veriyor: Exception Class Edatabase Error with message ‘ Update failed ’
Sizinde anladığınız gibi, ‘update başarısız’ diyor. Hatanın olduğu yer ise OnUpdateRecord olayının içinde yani
Satırlarında görüküyor. Şimdi diyeceksiniz : Git UpdateSQLin DeleteSQL,ModifySQL ve InsertSQL lerini kontrol et. Aynen dediğiniz gibi bütün SQL ifadelerini kendi tablolarıma uyarladım.
Ben delphi7 kullandığım için verdiğiniz linkteki bileşeni yükleyemedim , çünkü Delphi4 için yazılmış . Başka bir yerden Delphi5 için olanını buldum O da olmadı.
Yardım lütfen...
Saygılar
Oğuz ÖZTÜRK
Ben birden fazla tabloyu Update etmekten vazmı geçsem acaba.(Yanlış bir tasarım mı yapıyorum )
Bir türlü olmadı. Nerde hata yapıyorum anlamadım. Adımız Updateçiye çıkacak.
Abi şimdi bütün dediklerinizi yaptım, kendime göre varyasyonlar da denedim ve en son Gride bilgi girip çıktıktan sonra şu hatayı veriyor: Exception Class Edatabase Error with message ‘ Update failed ’
Sizinde anladığınız gibi, ‘update başarısız’ diyor. Hatanın olduğu yer ise OnUpdateRecord olayının içinde yani
Kod: Tümünü seç
UpdateSQL2.SetParams(UpdateKind);
UpdateSQL2.ExecSQL(UpdateKind);
Ben delphi7 kullandığım için verdiğiniz linkteki bileşeni yükleyemedim , çünkü Delphi4 için yazılmış . Başka bir yerden Delphi5 için olanını buldum O da olmadı.
Yardım lütfen...
Saygılar
Oğuz ÖZTÜRK