2012-10-25 96 views
7

kayıtları sil katılmak: TADOQuery tabloları katılın - takın i sol dış kullanarak iki farklı tablolardan kayıtları çekin tek <code>TADOQuery</code> kullanılması sonucunda

Select M*, D.* from Courier M Left outer join Courier_VT D on M.Courier_Identifier = D.FK_Courier_Identifier 

başarıyla benim MSSQL DB alan güncellemeleri göndermek için bir TDBGrid kullanmak . yabancı anahtar referans ( Courier_Identifier ile FK_Courier_Identifier) Ben bir kayıt eklediğinizde bir hata alıyorum olduğundan

,

sütuna 'FK_Courier_Identifier', masa Courier_VT değer Null Ekle olamaz; i göndermeden önce FK_Courier_Identifier için Courier_Identifier atamanız gerekir biliyorum ama nasıl ve nerede yapmak nasıl o

yapmak yok, sütun boş

izin vermez ama rekor Kurye tabloda gönderilirse Bu senaryoda \ Delete kayıtları silinsin mi? Tek bir TADOQuery kullanarak elde etmek mümkün mü?

+3

'Unique Table' ADO dynamic özelliğini kullanabilirsiniz. olası bir çoğaltma [burada] (http://stackoverflow.com/questions/7981718/adodataset-deleting-from-joined-table). Ancak, 'Insert' \' Update' parçasının çalışıp çalışmadığından emin değilim (bunu şu anda doğrulayamıyorum). Ve ben 'BeforePost' üzerinde 'FK_Courier_Identifier' belirtmeniz gerektiğine inanıyorum. – kobik

cevap

1

AFAIK TADOQuery, birden çok tablo birleştirildiğinde ekleme/silme/güncelleştirme deyimlerini işleyemiyor. Bunun arkasındaki sebep, hangi tabloyu güncellemesi gerektiğini veya nasıl yapılacağını bilmemesidir.

Diğer veritabanı erişim bileşenleriyle olağan yaklaşım, her bir DML cümlesi için bir özellik sağlamaktır (ODAC components bir örnektir) veya sorgunuza bağlı ikinci bir "güncelleştirme SQL" bileşeni eklemeniz gerekir. DML cümleleri (Zeos, bu yaklaşımı kullanan bileşenlerin bir örneğidir).

Bunu söylediyseniz, muhtemelen en iyi seçeneğiniz, senaryoyu iyileştirmek için BeforeDelete ve BeforePost olay işleyicilerini kullanmaktır. Temel olarak bunları DML cümlesi vermek, bazı saklı proc veya sql bileşenleriyle yürütmek ve sonra olay işleyicisini iptal etmek için kullanırsınız. Daha fazla bilgi ve kod örneği için bu SO question'a verilen cevabı kontrol edin.


DÜZENLEME: En kod güncellemeleri işlemek ve yorumunuzda dediğiniz gibi siler eğer, o zaman sorun yalnızca (daha dikkatli soruyu okumalıymışım takılması hakkında FK_Courier_Identifier atama ile yatıyor .. .) kullanarak, OnBeforePost olay işleyicisi kullanarak çözebilir ki: elbette

procedure TMyForm.MyADOQueryBeforePost(Sender: TObject); 
begin 
    MyADOQuery.FieldByName('FK_Courier_Identifier').AsString := CourierId; 
end; 

, sen önce de eklenmesi söz biliyorsun ki ben alanı varchar olduğunu varsayarak am burada beri bu kodu uyarlamak gerekir ve Kurye kimliğinin değerini veritabanı.

HTH

+0

ADOQuery, güncelleme \ delete işlemlerini yapabiliyor ancak ekleme yapamıyor, bağlantılarınıza bakıyorum teşekkürler! – user1775091

+0

Yorumunuzu okuduktan sonra cevabımı düzenledim. Umarım şimdi daha iyi yardımcı olur! –