Veri Tabanına Kontrollü Kayıt Yaptırma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
bnyamin
Üye
Mesajlar: 44
Kayıt: 01 Mar 2019 12:55

Veri Tabanına Kontrollü Kayıt Yaptırma

Mesaj gönderen bnyamin »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
EXCELDEKISATIR,i:Integer;
begin
try
exceldosyasi:=CreateOleObject('excel.application');
exceldosyasi.Visible:=false;
exceldosyasi.workbooks.open('C:\Users\senkr\OneDrive\Masaüstü\MASTERDATA.xlsx');
EXCELDEKISATIR:=2;
Repeat
fdquery1.append;
          FDQUERY1.Fields.FieldByName('PARCA_KODU').Value:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,1].value);
          FDQUERY1.Fields.FieldByName('PARCA_TANIMI').value:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,2].Value);
          FDQUERY1.Fields.FieldByName('PARCA_TANIMI_TURK').value:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,3].Value);
          FDQUERY1.Fields.FieldByName('GTIP').value:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,4].Value);
          FDQUERY1.Fields.FieldByName('TICARI_TANIM').value:= (exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,5].Value);
FDQUERY1.Refresh;
inc(EXCELDEKISATIR);
until exceldosyasi.ActiveSheet.cells[EXCELDEKISATIR,2].value='';//boş hücreye kadar oku
exceldosyasi.quit;
exceldosyasi := Unassigned;
FDQUERY1.First;
except
showmessage('DOSYA YOLU HATALI DOSYA YONUN DOĞRU KAYDEDİLDİĞİNDEN EMİN OLUNUZ')
end;
Arkadaşlar merhaba masterdata adında bir excel dosyam var yukarıdaki kod ile bu dosyadan veri tabanına verileri çekiyorum sıkıntı olmuyor. Ancak şöyle bir sorun ortaya çıkıyor excelde 50.000'e yakın veri bulunuyor ve bu verilere sürekli yenileri ekleniyor ve bu excel dosyasından belirli aralıklarla veriler otomatik çekiliyor. Ben geçici ve yanlış bir çözüm olarak şimdilik önce tüm verileri sildirip yeniden veri tabanına ekleme yaptırıyorum. Benim istediğim program önce veri tabanı ile excel dosyasını karşılaştırsın eğer excele yeni kayıt yapılmışsa veri tabanına yeni kayıtları eklesin istiyorum. Bu ve ya benzeri bir işlemin yapılması mümkün müdür? Yardımlarınızı bekliyorum. Bu şekilde değil de şu şekilde yapsan daha doğru olur şeklinde önerilerinizi de bekliyorum.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Veri Tabanına Kontrollü Kayıt Yaptırma

Mesaj gönderen freeman35 »

Basit soru, neyle neyi karşılaştıracaksın? ardışık alan bu yüzden kullanılıyor, primary key dedikleri şey. excel de bunu sağlamalısın ki db de bununla karşılaştırabilesin. O alan da kullanıcının tercihinde olmazsa iyi olur, değiştirilmemeli çünkü. excel makro diyorlardı sanırım öyle bir şey olabilir. GUID varsa excelde iyi olur, yoksada saniye dahil hatta salise dahil zaman bilgisi de olabilir.
Append yada edit ten sonra refresh değil Post kullan
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 !!!
bnyamin
Üye
Mesajlar: 44
Kayıt: 01 Mar 2019 12:55

Re: Veri Tabanına Kontrollü Kayıt Yaptırma

Mesaj gönderen bnyamin »

Bu bilgileri vermediğim için kusura bakmayın karşılaştırma olayı parça numarasına göre yapılacak. Yani benzersiz alan 'PARCA KODU' olacak.Kullandığım veri tabanları ise Firebird ve MSSQL2019'dur.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Veri Tabanına Kontrollü Kayıt Yaptırma

Mesaj gönderen freeman35 »

locate function ı incele, bu tip işlerde cursor konumandırmaya gerek yoksa ben lookup ı trecih ederim
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 !!!
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Veri Tabanına Kontrollü Kayıt Yaptırma

Mesaj gönderen ertank »

bnyamin yazdı: 13 Mar 2024 02:12 Benim istediğim program önce veri tabanı ile excel dosyasını karşılaştırsın eğer excele yeni kayıt yapılmışsa veri tabanına yeni kayıtları eklesin istiyorum. Bu ve ya benzeri bir işlemin yapılması mümkün müdür? Yardımlarınızı bekliyorum. Bu şekilde değil de şu şekilde yapsan daha doğru olur şeklinde önerilerinizi de bekliyorum.
Merhaba,

Böyle birşey mümkün. Birden fazla şekilde de çözüm üretmek mümkün. Çözümlerden biri zaten verilmiş.

Kod: Tümünü seç

if fdquery1.Locate('PARCA_KODU', exceldosyasi.ActiveSheet.Cells[EXCELDEKISATIR,1].value, []) then
// kayıt mevcut, birşey yapmadan devam edilebilir
else
// kayıt yok, append..post ile kayıt edilebilir
Bu yöntem sadece FDQuery1 bütün kayıtları okuyorsa doğru çalışır.

Alternatif yöntem ise FDQuery2 şeklinde ikincil bir sorgu hazırlayıp

Kod: Tümünü seç

select count(1) from tablo where parca_kodu=:kod
benzeri kayıt işlemi öncesinde çalıştırmak ve sorgu değeri kontolü yapmaktır. Değer 1 ise kayıt mevcuttur.

Diğer bir alternatif olarak FirebirdSQL'e özel UPDATE OR INSERT kullanabilirsiniz.
https://firebirdsql.org/refdocs/langref ... nsert.html

Bu SQL kayıt varsa günceller, yoksa ekler. SQLServer tarafında da benzeri sorgu yazılabilir. Ancak şahsen SQLServer tarafını biraz daha karmaşık buluyorum. Doğru kullanımını araştırıp yazmak gerekli.
Cevapla