Sil Sql Bulma

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Sil Sql Bulma

Mesaj gönderen greenegitim »

Merhaba,
Programımda fatura modülünde kaydedilen faturalar carihareket tablosuna aktarılıyor ilginç bir durumla karşılaştım kaydedilen faturanın carihareket tablosunda ki kaydı siliniyor (her kaydın değil rastgele kayıtların 3-5 gün önceki kayıtlar gibi)faturada ve stokhareketlerinde kayıt duruyor ama cariharekete siliniyor defalarca kontrol etim carihareketeki evrakid alanına fatura tablosunda ki autoinc olan id değeri ni yazdırıyorum silerken carihareketen evrakturu fatura olup evrakid si old.faturaid olanı sildiriyorum ama hala o carihareketen neden nasıl hangi koddan dolayı silindiğini bullamadım delete trigerında log da tuturuyorum bana lazım olan şey.

carihareketen kayıt silindiği zaman o kaydı silen sql kodunu bulmak delete from carihareket where evrakid='10' şeklindemi başka bir sql kodu girilerekmi silindi yani hatamı nerede yapıyorum onu bulmak için silinen kaydın sildirten sql ini de bir yerde tutmak istiyorum.
Mücadele güzelleştirir!
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Sil Sql Bulma

Mesaj gönderen freeman35 »

foreingkey kullanmanı tavsiye ederim. Ben öyle yapıyorum. Primarykey kullandığın için master ı sildiğinde master a bağlı tüm detay tablolar silinecektir. yani herhanbi bir sql e ihtiyacın kalmıyor. güzel tarafıda transaction commit yada rollback işlemi detaylarıda kapsıyor.
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 !!!
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Sil Sql Bulma

Mesaj gönderen greenegitim »

Hocam evrakid alanına faturada ki id alanını foreignkey ile bağlayamam kasa hareketindeki id yide buraya alıyorum evrak türü ve id ye göre silme yaptırıyorum evrak turu koymazsam kasa hareketinde de id si 15 olan kayıt var faturada da
Mücadele güzelleştirir!
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Sil Sql Bulma

Mesaj gönderen freeman35 »

tasarımını anlamadım :) eğer yeni tasarlıyorsan, Bir master table oluştur, şöyle düşün, yanılmadıysam ticari programdan bahsediyorsun, burada önemli olan cari nin aldığı verdiğidir. Dikkat ! para dahil her şey, fatura, irsaliye, tahsilat, tediye vs bunların ortak noktası nedir? yani master table yapabileceğimiz özellikler, cari_id, evrak_tipi, seri, sira vs. vs ve pr_key. diğer table lara "master_id" ekle ve bunu foreingkey ile bağla. eğer tahsilata da detay ekelmek istersen, mesela çek bilgisi, buda başka bir table diyelim. bunu da "tahsilat" table a bağla, yani bu durumda, master table tahsilat olur. çek tablosuna da bir detay eklemek gerekirs mantık aynı olacak. durum şuna benziyecek
(en master :) ) "Master Table" --> Tahsilat --> Çekler --> çeklerinde detayı
"-->" foreingkey leri temsil ediyor. Bu durumda hangi table dan bir row u sildiğinde, yukarıdaki şemaya göre sağa doğru foreingkey ler ile bağlı tüm kayıtlar silinir.
Bu Foreingkey ile tam tembel işidir, ben bu yapıyı kullanırım hep (işin kolayını tembele sor demişler :) ) foreingkey olmassa, beforedelete trigger ları oluşturup, masterı silmeden önce detayı silmek en doğru çözüm olacaktır, ama burada hata kontrolü where lerin yazılması vs gibi angaryalar çıkacaktır.
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 !!!
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Sil Sql Bulma

Mesaj gönderen esistem »

Selam,
Benim kullandığım yapının aynını kullanıyorsun, bu tip yapıda karşılacağın en büyük sorunla baş başasın sanırım. Şimdi Fatura için bir generatorun vardır mutlaka, ayrıca çek/senet, irsaliye, (varsa kasa işlemleri) içinde ayrı ayrı generatorlerin vardır. Buna keza, fatura, irsaliye, kasa, çek/senet kaydederkende insert ile cari hareket tablosuna kayıt atıyosundur, bunların her biri artan kodlarla gittiği için mutlaka bir veya birkaçı aynı id yi alacaktır, en küçük bir yanlış kodlamada mesela sende olduğu gibi (muhtemelen hata budur) çek idsi ile fatura aynı olduğunda cari hareket tablosundan evrak id=xxx olanı sil dediğinde, çek/senet, fatura, kasa hareketi vs.vs. aynı olan bütün kayıtlar silinir, bunu önlemek için ben şu yolu kullanıyorum.

Kendi programımda ;
Fatura, Çek, Senet, Kasa vs. için GEN_CARI_ICIN diye bir generator oluşturup saydığım tabloların hepsinde kodları bundan arttırıp oluşturuyorum böylece işlemid (evrakid) hiçbir zaman aynı olmuyor dolayısı ile yanlış kaydı silme diye bir durum oluşmuyor (Fakat bu seferde kapalı fatura kaydetmesinde sorunla karşılaşabilrisiniz.). Sizde afterdelete kodunda bir hata yoktur ama afterinsert kodunda hata olabilir. Yada diğer tabloların tiriggerlarında hata olabilir, diğer tablolardaki işlem türünü belki yanlışlıkla fatura olarak giriyorsunuzdur.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Sil Sql Bulma

Mesaj gönderen greenegitim »

@freeman35 hocam foreingkey leri ben şirketler tablosun da kullanıyorum 2015 şirketi silindiğinde kullanıcılar hariç hiç bir tabloda kayıt kalmıyor ben @esistem arkadaşımızın mantığında programda ilerledim @esistem hocam carihareket tablosunda KAYITMODULU alanım var bu alana da fatura/kasa gibi değerler geliyor delete trigerlarında örnek fatura için trigerım aşağıda bunun dışında faturanın iptal edilmesi durumu içinde delphi içinden ayrı sql ile sildiriyorum bir yerde yanlışım yapıyorum ama o case i bulamıyorum

Kod: Tümünü seç

delete from faturahareketi
where 
faturahareketi.faturaid = old.id and
old.firmaid = old.firmaid;

delete from stokhareketi
where stokhareketi.kayitmodulu = 'FATURA' and
stokhareketi.evrakid = old.id and
old.firmaid = old.firmaid;

  delete from carihareket where
  carihareket.firmaid = old.firmaid and
  carihareket.kayitmodulu = 'FATURA' and
  carihareket.evrakid=old.id;

  delete from kasa where old.firmaid=old.firmaid and
  kasa.kayitmodulu='FATURA' and kasa.evrakid=old.id;

  delete from aciklamalar where
  aciklamalar.firmaid=old.firmaid and
  aciklamalar.evrakid=old.id and
  aciklamalar.kayitmodulu='FATURA';
  
Mücadele güzelleştirir!
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Sil Sql Bulma

Mesaj gönderen esistem »

Kod: Tümünü seç

delete from carihareket where
  carihareket.firmaid = old.firmaid and
  carihareket.kayitmodulu = 'FATURA' and
  carihareket.evrakid=old.id;
Kodda bir problem yok hocam, olsa olsa yanlış silinen kayıtlarım dediğin kayıtlarda kayitmodu FATURA olarak kaydedilmiş olmalı ki onlarıda siliyor. Diğer tablolardaki After insert triggerlarını kontrol et bence, kopyala yapıştır yaptıysan 1-2 tanesinin kayitmodulu FATURA olarak kalmış olabilir.

Kod: Tümünü seç

delete from faturahareketi
where 
faturahareketi.faturaid = old.id and
old.firmaid = old.firmaid;

delete from stokhareketi
where stokhareketi.kayitmodulu = 'FATURA' and
stokhareketi.evrakid = old.id and
old.firmaid = old.firmaid;
Bu arada Yukarıdaki kodlarda bi hata yokmu? neden " old.firmaid=old.firmaid " yazıyosun onu anlamadım?
En son esistem tarafından 14 Oca 2016 06:30 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Sil Sql Bulma

Mesaj gönderen esistem »

Birde şimdi aklıma geldi, alış ve satış faturalarını ayrı tablolarda tutuyorsan oda sorun olabilir, her ikiside kayıtmodulu FATURA olarak görünür ve aynı koda denk geldiğinde hem alış hemde satış hareketini siliyor olabilir.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Sil Sql Bulma

Mesaj gönderen greenegitim »

Biraz paranoyaklık yapıp log tablosunda yeni kayıtları/ düzenlemeleri de tuturmaya karar verdim cariharekete kayıt silindiği o saate diğer tablolarda ne eklenmiş silinmiş düzeltilmiş sorunu bullana kadar tuturacağım sorun olduğunda log tablosunda o saate başka neler yapılmış onları kontrol edeceğim artık.
Mücadele güzelleştirir!
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Sil Sql Bulma

Mesaj gönderen esistem »

Aslında carihareket tablosunu etkileyen modullerin her birinden 5-10 kayıt girip daha sonra carihareket tablosunda guruplayarak kayıtmodulu=FATURA olup aynı koda ait olanların adedini alsan sorunu hemen görürsün gibime geliyor.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Sil Sql Bulma

Mesaj gönderen greenegitim »

hocam gördüm faraza cariharekete evrakid si 177 olan 2 kayıt var biri fatura diğeri kasa modülünden o faturayı değiştir kaydet dediğimde diyelim yanlış kodladımm kasa hareketini silmesi lazım silmedi belki kasada yapınca siliyordur dedim denedim silmedi (şu abi benim bilgisayarda sorunsuz çalışıyor durumu gibi oldu :) ) mutlaka bir yerde bir yanlışım var ama aklıma gelen testlerde çıkmadı en iyisi o faturanın carihareketeki kaydı silindiği saate kim nerde neler yapmış izlemek logu detaylandırmak bulunca da eminim çok komik bir hatam çıkacak :mrgreen:
Mücadele güzelleştirir!
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Sil Sql Bulma

Mesaj gönderen freeman35 »

Hala yukarıda anlattığım mantığı kullanmanda ısrarcıyım :) var olan programını değiştirmeden sadece firebird kısmında değişikliklede halledebilirsin. Neyse. Hala varsayım üstüne yazıyorum, old. kullandığına göre bu yukarıda yazdığın kod afterdelete trigger ıdır, bu hangi table ında ? yada her table ında var mı? carihareket, faturahareketi, kasa vs hepsinde varsa yada hangilerinde varsa, hepsi birbirini tetikler, triggerlarının çalışma sırasını kontrol et bence.

(GENELE söylüyorum)
Neden tip vs gibi kriterlerde string kullanırsınız? varchar 10-15 karakter harcamak yerine sadece byte tipinde bir alan la 255 tane tip elde edersiniz, yetmedimi smallint 65535 tip sanırım yeter. String ile sayı alanlarının order ın çok hız farkı vardır, order ı where olarak düşünün, buda performans demektir. Delphide raporlarda kolay oluyor diyenlere, bu alanları join le bir table dan alabilirsiniz. yani evraktipleri diye bir tabloya string ne isteniyorsa eklersiniz. Vertabanlarında string lerle işlem yapmayın, stringlerin son kullanıcı için anlamı olsun.
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 !!!
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Sil Sql Bulma

Mesaj gönderen greenegitim »

Hocam tasarım da çok yanlışım var kabul ediyorum bu yüzden veritabanı tasarımı için kitap aldım okudukça kendime sövüyorum :mrgreen: :mrgreen: dediğiniz mantık ve kitaptan okuyup ta gördüğüm yanlışlarım için sıfırdan bir veritabanı tasarlayıp sıfırdan delphi7 değilde son versiyonlardan birini kullanarak ve gereksiz hiç bir component kullanmadan ilerleyeceğim zaten büyük bir proje değil ve sadece çalıştığım şirkete kullanılıyor cari,stok,kasa,fatura,sipariş, modeller modülü var yıl sonu devrinden sonra yeni programla ilerletirim.
Mücadele güzelleştirir!
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Sil Sql Bulma

Mesaj gönderen greenegitim »

evet hatamı buldum kasada bir trigerda kayıtmodulu='KASA' yazmayı unutmuşum ayniid faturanın da id si olduğundan carihareket ten siliyormuş okuyup okuyup görmemek bu olsa gerek :mrgreen:
Mücadele güzelleştirir!
Cevapla