Sql ile ilişkili tablolardan kayıt silmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Sql ile ilişkili tablolardan kayıt silmek

Mesaj gönderen husonet »

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.

Kullanıcı avatarı
asavas
Moderator
Mesajlar: 41
Kayıt: 10 Haz 2003 01:45

Mesaj gönderen asavas »

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

sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

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...
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

Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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

Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mükemmel

Mesaj gönderen husonet »

Çok Sağolun hepinize teşekkür ederim.

Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

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

Kod: Tümünü seç

Tablo1.First;
while not Tablo1.EOF do  
  Tablo1.Delete;  // detail kayıtı silip bir sonraki kayıta geç.

Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Yaw deniyorum olmuyor

Mesaj gönderen husonet »

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

Kullanıcı avatarı
calvan
Üye
Mesajlar: 119
Kayıt: 16 Haz 2003 05:10

Mesaj gönderen calvan »

büyük ihtimal sil in önüne : koymamışsındır

delete from table_adı where degisken = :sil

şeklinde olmalı

mavsar

Mesaj gönderen mavsar »

calvanın dediklerine ilaveten : koyduktan sonra params tan uygun datatype seçmen gerek

Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Olmuyor

Mesaj gönderen husonet »

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.

Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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...

Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

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.

Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

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.

Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Query.Delete

Mesaj gönderen husonet »

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.

Cevapla