Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
İki Tablo Arasında Veri Aktarma Ve Silme
#1
Arkadaşlar merhaba daha öncede yardımcı olduğunuz benim hala bitiremediğim bir kantar programım vardı işlerim dolayısıyla ancak boş olduğum zamanlarda yazmaya devam edebiliyorum neyse bir konu da daha yardımımlarınızı bekliyorum şimdi 1_TARTIM adında araçların plakası giriş tarihi geliş gidiş yeri gibi ve daranın tutulduğu tablom var bu tabloya araç girdiğinde bu bilgileri geçici olarak kaydediliyor. Birde 2_TARTIM adında tablom var araç ikinci gelişinde 2. tartım kısmına geçiyorum 1. tartımda girip 1_tartım tablosuna kaydedilen bilgileri otomatik ilgili alanlara dolduruyorum ve ilave olarak aracın çıkış tarihi brüt ağırlık net ağırlık bilgilerini ayarlayıp 2_tartım tablosuna kayıt ediyorum.

Size sormak istediğim ben araç geldiğinde 2. tartım olayını gerçekleştirip kaydet butonuna bastığım anda geçici tabloda yani 1_tartım tablosundaki ilgili plakanın 1. tartım kayıdı silinsin bunu yapabilirmiyim yada şöyle yapsan daha iyi pratik olur diye tavsiyeleriniz varmıdır. yardımlarınız için şimdiden teşekkür ediyorum.

Delphi 10.3 rio 
Acces veritabanı kullanıyorum.
Cevapla
#2
- Modüler olarak tabii ki yapabilirsiniz. 

Önemli NOT : Denemelerinizi test tablolarında yapınız. Emin olduktan sonra projenizde uygulayınız. Toplu veri silmek söz konusu olduğundan kaza olmasın diye uyarmak isterim  Idea
* Kazayı engellemek için size kodları ayırarak yazıyorum, ilk kodu çalıştırın hangi kayıtlar etkilenecek onu görün ondan sonra silmeyi onaylayın. 

Şimdi konuya dönelim :

- İkinci tablodaki verinin "tarih/saat/plaka" üçlüsü ile eş olan tüm kayıtları birinci tablodan tek bir SQL cümlesi ile silebilirsiniz. Bunu işlemi yapan bir procedure oluşturun, iki nolu tabloya her giriş yapıldığında bu procedure'ü çalıştırın.

- SQL cümleniz görece basit, 

- Tablolarınızda benzersiz bir alan veya AUTOINC alan vb. mevcut değil mi her kayıt ile farklı olarak artan/değişen bunu anahtar olarak kullanacaksınız. Temsili olarak buna KaySiraNo diyeyim.


Şimdi belirli tarihler aralığındaki benzer kayıtları nasıl bulacağınızı içeren bir SELECT yazalım.

SELECT a.KaySiraNo
FROM    ( 1_TARTIM a
LEFT JOIN 2_TARTIM b on ( a.[Plaka] = b.[Plaka] AND a.[Tarih] = b.[Tarih] AND a.[Saat] = b.[Saat] ) )
WHERE 1=1
AND a.[Tarih] BETWEEN #01/01/2020# AND #01/01/2021#
AND b.[Plaka] <> null


Bunu çalıştırdığınızda size ilgili tarih aralığındaki 1_TARTIM ve 2_TARTIM içindeki eş/ikiz kayıtların, 1_TARTIM tablosuna ait olanlarının kayıt numara listesi getirecektir. 

* Yani siz eğer geçici tablonuz olan 1_TARTIM içindeki kayıtları iki nolu tabloya INSERT etmişseniz liste dolu gelecektir. 

* Bu kayıt nolarını içeren 1_TARTIM tablosundaki kayıtları silmek için bu kodu parantez içine alıp aşağıdaki şekilde bir DELETE satırı eklenmeli.

DELETE 1_TARTIM.* FROM 1_TARTIM
WHERE  1_TARTIM.KaySiraNo in
(
SELECT a.KaySiraNo
FROM    ( 1_TARTIM a
LEFT JOIN 2_TARTIM b on ( a.[Plaka] = b.[Plaka] AND a.[Tarih] = b.[Tarih] AND a.[Saat] = b.[Saat] ) )
WHERE 1=1
AND a.[Tarih] BETWEEN #01/01/2020# AND #01/01/2021#
AND b.[Plaka] <> null
)


bu kod size bir şey ifade etti mi ?  

* İçerideki SELECT size iki tabloda da aynı anda "PLAKA", "TARIH", "SAAT" eş olan kayıtları bulup onların benzersiz kayıt numarasını listeleyecek. Daha da odaklanmak için için alan sayısını çoğaltabilirsiniz.

* Dışarıdaki DELETE cümlesi ise iç select'in ürettiği bu benzersiz kayıt noları içeren 1_TARTIM içindeki  kayıtları silecek. (2 nolu tabloya dokunulmaz sadece referans alacaktır.)
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#3
Acaba 2 adet tablo yerine tek tabloya kaydetsen yani:
ilk tartımda " insert into ..... " deyip kaydedip;
ikinci tartımda boş veya 2. tartımda girilecek alanları " update...." deyip düzenlesen daha kolay olmazmı?
hangi alanı update edeceğinde ya plakadan ya da @mrmarman hocamın da dediği gibi "AUTOINC" alanından bulunabilir.
Cevapla
#4
Arkadaşlar cevaplarınız için teşekkür ederim Muharrem Arman hocamın söylediklerinden yola çıkarak bir şey düşündüm çok pratik ve gereksiz kod kalabalığı olmuyor diye düşündüm kendimce sakıncaları var mıdır bilmiyorum deneyip göreceğim? Şimdi araç ikinci tartıma geldiğinde 1_tartım tablosundan bilgileri alıyorumya o zaman otomatik artan alanı fiş no diyerek ilgili plakaya ait olanı edit içine alıyorum ve kaydet butonu click prosüdürüne aşağıdaki kodu yazıyorum ancak veri türü uyuşmazlığı hatası alıyorum. sorunu biliyorum ama cevabını yazamadım edite aktarılan sayı string türünde oluyor  ama veritabanı otomatik artan alan  numerik türünde olduğundan uyuşmuyor bunu , yani edite gelen bilgiyi nasıl stringden numeriğe dönüştürebilirim  bu konuda yardımınızı bekliyorum birde düşündüğüm yöntemin sakıncaları olabilirmi uyarılarınıza açığım.

with Query1 do
begin
Close;
SQL.Clear;
SQL.Add('DELETE FROM 1_TARTIM WHERE FIS_NO='''+Edit1.Text+'''');
ExecSQL;
end;
Cevapla
#5
Form editörümüz üzerinde kod biçimlendirme amacı ile kullandığımız 2 adet buton bulunmaktadır. Delphi Logolu olan (Delphi Kod Ekle) buton ile Delphi kodu, Süslü Parantez simgeli buton (Kod Biçimlendirme) ile de diğer dillere ait (SQL'de dahilkodlar eklenerek (aşağıdaki ekran görüntüsünde işaretlenmişir), kod biçimlendirme yapılmaktadır. 

Bu kapsamda;
   

Doğru kod tag'larını kullanarak bize yardımcı olursanız memnun oluruz.
Aksi durumda DelphiCan Forum Kurallarında belirtilen yaptırımlar uygulanacaktır.
İlgi ve anlayışınız için şimdiden teşekkür eder, iyi çalışmalar dileriz.
Cevapla
#6
(27-11-2020, Saat: 15:38)bünyamin68 Adlı Kullanıcıdan Alıntı: SQL.Add('DELETE FROM 1_TARTIM WHERE FIS_NO='''+Edit1.Text+'''');

kodu aşağıdaki gibi deneyebilirmisin..

SQL.Add('DELETE FROM 1_TARTIM WHERE FIS_NO='+Edit1.Text);
Cevapla
#7
Arkadaşlar cevap veren herkese teşekkür ederim sorunu hallettim. Paylaşmış olduğum kodla fiş no adını koyduğum ıd numarası ile değilde direkt plaka no alanı ile silme işlemi gerçekleştirdim. Burda string türünü integer türüne çevirme işlemi yok çünkü plaka no adlı alan zaten string alan dolayısıyla hata almadan silme işlemi yapılıyor. tekrarlanan kayıtlarda olmadığından sıkıntı çıkmyor.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Veri Tabanına Kayıt Yaparken Yazdırma bünyamin68 9 306 19-01-2021, Saat: 13:12
Son Yorum: bünyamin68
  Aynı anda 10.000 farklı cihazdan veri alışverişi yapma. pro_imaj 23 1.448 27-12-2020, Saat: 11:22
Son Yorum: pro_imaj
  [ÇÖZÜLDÜ] Tablodaki verileri belirli bir düzenle memoya aktarma wiseman 8 368 25-12-2020, Saat: 17:14
Son Yorum: hi_selamlar
  Problem - ZKTeco Cihazlardan Anlık Veri Alma mad85 14 2.166 18-12-2020, Saat: 17:34
Son Yorum: engerex
  Parmak izi okuyucudan veri çekmek ermanispir@gmail.com 15 5.241 30-11-2020, Saat: 09:26
Son Yorum: wiseman



Konuyu Okuyanlar: 1 Ziyaretçi