Sql ile ilişkili tablolardan kayıt silmek
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Sql ile ilişkili tablolardan kayıt silmek
case application.MessageBox('Kayıt çıkartılacaktır onaylıyormusunuz', 'SİLİNİYOR', MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) of
IDYES: Begin
//ShowMessage('Sistem Çalışıyor');
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('DELETE from TEKLIFLER.DBF, SATIR.DBF where TEKLIF_NO =: Sil');
Query1.ParamByName ('Sil').Value := Query1.FieldByName('TEKLIF_NO').Value;
Query1.ExecSQL;
Query1.Open;
End;
End
Arkadaşlar şöyle bir kodum var burada amacım iki tabloda bulunan ilişkili kayıtları master ve detail kayıtları silmek ama bir türlü beceremiyorum nerede hata yaptığımıda bulamıyorum yardımcı olursanız sevirim iyi çalışmalar.
IDYES: Begin
//ShowMessage('Sistem Çalışıyor');
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('DELETE from TEKLIFLER.DBF, SATIR.DBF where TEKLIF_NO =: Sil');
Query1.ParamByName ('Sil').Value := Query1.FieldByName('TEKLIF_NO').Value;
Query1.ExecSQL;
Query1.Open;
End;
End
Arkadaşlar şöyle bir kodum var burada amacım iki tabloda bulunan ilişkili kayıtları master ve detail kayıtları silmek ama bir türlü beceremiyorum nerede hata yaptığımıda bulamıyorum yardımcı olursanız sevirim iyi çalışmalar.
Yanlış hatırlamıyorsam bir sql içinde iki tablodan birden kayıt silemezsin.
Query1.SQL.Add('DELETE from TEKLIFLER.DBF, SATIR.DBF where TEKLIF_NO =: Sil');
şeklinde değil
Query1.SQL.Add('DELETE from SATIR.DBF where TEKLIF_NO =: Sil');
ve
Query1.SQL.Add('DELETE from TEKLIFLER.DBF where TEKLIF_NO =: Sil');
şeklinde iki kere çalıştırmalısın
kolay gelsin
Query1.SQL.Add('DELETE from TEKLIFLER.DBF, SATIR.DBF where TEKLIF_NO =: Sil');
şeklinde değil
Query1.SQL.Add('DELETE from SATIR.DBF where TEKLIF_NO =: Sil');
ve
Query1.SQL.Add('DELETE from TEKLIFLER.DBF where TEKLIF_NO =: Sil');
şeklinde iki kere çalıştırmalısın
kolay gelsin
asavaş doğru hatırlıyor. O yazdığın procedure yi iki defa iki ayrı tablo için çalıştır. İki tablodan aynı SQL text ile kayıt silemezsin. Tek tek silmelisin.
Sevgiler...
Sevgiler...
Geçip gideriz bizde ağızsız,dilsiz ve sorgusuz
İstanbul gibi düşeriz iki kıtaya birden...
En aşağılık düş, en büyük sevdadan belki
Erkek ölümler; bir uzun iç çekişle büyür göğsümüz
İstanbul gibi düşeriz iki kıtaya birden...
En aşağılık düş, en büyük sevdadan belki
Erkek ölümler; bir uzun iç çekişle büyür göğsümüz
asavas ve sair'in tamamen dogru olan soylediklerine ilaveten baska bir genel cozum de su sekilde olabilir.
Eger trigger destekleyen bir veritabani kullaniyorsaniz master tablonun delete trigger'ina detaydaki satirlari silen bir kod yazarsaniz Delphi tarafindan sadece Master'i silecek kodu yazmaniz yeterli olur.
Ornek triiger kodunu Sybse ASA iin yaziyorum asagi yukari butun veritabanlarinda benzer kod ile ayni is yapilabilir.
Delete from SATIR where TEKLIF_NO=oldrows.TEKLIF_NO
Eger trigger destekleyen bir veritabani kullaniyorsaniz master tablonun delete trigger'ina detaydaki satirlari silen bir kod yazarsaniz Delphi tarafindan sadece Master'i silecek kodu yazmaniz yeterli olur.
Ornek triiger kodunu Sybse ASA iin yaziyorum asagi yukari butun veritabanlarinda benzer kod ile ayni is yapilabilir.
Delete from SATIR where TEKLIF_NO=oldrows.TEKLIF_NO
Mükemmel
Çok Sağolun hepinize teşekkür ederim.
tüm söylenenlere ilaveten master table in beforedelete event ında o kayıta bağlı detail leri sildirebilirsin.
olayı
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('DELETE from tablo1')
Query1.SQL.Add('where TEKLIF_NO = :Sil');
Query1.ParamByName ('Sil').Value := Query1.FieldByName('TEKLIF_NO').Value;
Query1.ExecSQL;
yada
olayı
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('DELETE from tablo1')
Query1.SQL.Add('where TEKLIF_NO = :Sil');
Query1.ParamByName ('Sil').Value := Query1.FieldByName('TEKLIF_NO').Value;
Query1.ExecSQL;
yada
Kod: Tümünü seç
Tablo1.First;
while not Tablo1.EOF do
Tablo1.Delete; // detail kayıtı silip bir sonraki kayıta geç.
Yaw deniyorum olmuyor
Arkadaşlar bir yerde hata yapıyorum ama nerede çözemedim.
Hata mesajı şu project project1.exe raised exception class EDatabaseError with message 'Query1 Field 'Sil' is of an unknown Type process stopped. Use step or run to continue
Hata mesajı şu project project1.exe raised exception class EDatabaseError with message 'Query1 Field 'Sil' is of an unknown Type process stopped. Use step or run to continue
Olmuyor
Arkadaşlar onuda denedim olmuyor. Ne yaparsam yapayım hata veriyor. Bu olayı SQL ile yapmak istiyorum. Bana bu konuyla ilgili ufak yapılmış örnek gönderirseniz sevinirim. Silme işlemiyle ilgili.
mavsar'in dedigi sekilde sorun olmamasi lazim. :sil seklinde yazdiktan sonra Query componentinin Params ozelligine girip orada gorunen sil parametresinin tipini secmeniz gerekiyor.
Bu sekilde sorun olmamali.
Eger varsa yazdiginiz kodu ve nerede tam olarak ne hata verdigini yazarsaniz bi care bulmaya calisiriz...
Bu sekilde sorun olmamali.
Eger varsa yazdiginiz kodu ve nerede tam olarak ne hata verdigini yazarsaniz bi care bulmaya calisiriz...
Arkadaşlar bu olaya çare buldum ama ne yazıkki SQL koduyla değil bulduğum çareyi yazıyorum.
case application.MessageBox('Kayıt çıkartılacaktır onaylıyormusunuz', 'SİLİNİYOR', MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) of
IDYES: Begin
Query2.First;
while not Query2.Eof do
Begin
if Query1TEKLIF_NO.Value = StrToInt(Query2TEKLIF_NO.AsString) Then
Query2.Delete;
Query2.Next;
End;
Query3.First;
While not Query3.Eof do
Begin
if Query1TEKLIF_NO.Value = Query3TEKLIF_NO.Value then
Query3.Delete;
Query3.Next;
End;
End;
Burada Query1 il Query2 aynı tabloyu gösteriyor. SQL koduyla bir yerde hata yapıyorum ama hatayı bir türlü çözemedim. İsteyen arkadaşlara projemi mail ile gönderebilirim.
case application.MessageBox('Kayıt çıkartılacaktır onaylıyormusunuz', 'SİLİNİYOR', MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON2) of
IDYES: Begin
Query2.First;
while not Query2.Eof do
Begin
if Query1TEKLIF_NO.Value = StrToInt(Query2TEKLIF_NO.AsString) Then
Query2.Delete;
Query2.Next;
End;
Query3.First;
While not Query3.Eof do
Begin
if Query1TEKLIF_NO.Value = Query3TEKLIF_NO.Value then
Query3.Delete;
Query3.Next;
End;
End;
Burada Query1 il Query2 aynı tabloyu gösteriyor. SQL koduyla bir yerde hata yapıyorum ama hatayı bir türlü çözemedim. İsteyen arkadaşlara projemi mail ile gönderebilirim.
Query.Delete den sonra Query.Next demeye gerek yok. zaten otomatik olarak aktif kayıt silinince cursor bir sonraki kayıtın üzerine gelir.
Ayrıca birbirine bağlı master-detail tablolarda silme yapmak için yukarıda bahsettiğim yöntem gayet kullanışlıdır. Oracle, interbase gibi veritabanları için en uygunu before delete trigger i. kod için örneğin paradoks veya dbisam için kullanacaksan; master tablonun beforedelete yordamında detail tablodaki ilişkili tüm kayıtları silebilirsin. detaildekiler silindikten sonra da master tablodaki kayıt silinir.
Ayrıca birbirine bağlı master-detail tablolarda silme yapmak için yukarıda bahsettiğim yöntem gayet kullanışlıdır. Oracle, interbase gibi veritabanları için en uygunu before delete trigger i. kod için örneğin paradoks veya dbisam için kullanacaksan; master tablonun beforedelete yordamında detail tablodaki ilişkili tüm kayıtları silebilirsin. detaildekiler silindikten sonra da master tablodaki kayıt silinir.
Query.Delete
Yalnız Query.Delete bir sorguya bağlı olduğu için Query.next dedim çünü silme işlemi gercekleşmezse kayıt ilerlemeyecektir.
Ayrıca senin bahsettiğin yöntem daha başarılı olabilir ama uygulayamadığım için bu yöntemi tercih ettim bahsettiğin yöntemle ilgili ufak bir uygulama gönderirsen incelerim. Bir yerde yanlış yapıyorum ama neresi çözemiyorum.
Ayrıca senin bahsettiğin yöntem daha başarılı olabilir ama uygulayamadığım için bu yöntemi tercih ettim bahsettiğin yöntemle ilgili ufak bir uygulama gönderirsen incelerim. Bir yerde yanlış yapıyorum ama neresi çözemiyorum.