SP ile kayiti update etme veya yeni ekleme

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
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

SP ile kayiti update etme veya yeni ekleme

Mesaj gönderen Burhan_ast »

Arkadaslar merhaba,

Sql server 2000 kullaniyorum ve burda X databasimde TBL_Stok tablom var

Bu tabloda yaklasik 40 000 kayit var, merkezden bana merkezin stok tablolari geliyor txt formatinda, simdi yapmam gereken su bu txt tablosundaki kayitlar eger TBL_stok tablomda var ise tum alanlari yeni gelen bilgileri koyup degistirmem eger yok isede yeni kayit ekleyerek bu bilgileri girmem lazim, Bunu delphi ile yaptim.

Txt tablsoundaki kayit kadar bir dongu ve dongu icin kayit varsa duzenle yoksa ekle seklinde kontroller koydum, fakat performans cok dusuk kaliyor, tum tablolari yaklasik 2 saat icinde yapabiliyorum,

Bunu acaba stored procedur ile yapabilirmiyim, yardimci olursaniz memnun olurum, kilit alan olarak Stok_kodu alanini kullaniyorum.


Tsk,

Burhan Cakmak
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
Sp ile yapabilirsin
temel mantık şu şekilde olacak
1.önce gelen kaydın olupolmadığını kontrol ettireceksin
bu nun için select count(*) ..... şeklinde bir select yapıp sonucu bir değişkene aktarırsın.
2.eğer kayıt varsa update
3. else insert işlemi yapılacak.

ben fb de yapıyorum. sqlserver kullanmadım ama mantık bu şekilde.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selam,

Source'unu görsek, sana daha iyi fikir verebiliriz sanıyorum.

Bakalım ne kullanmışsın nasıl yazmışsın.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Mesaj gönderen Burhan_ast »

Merhaba,

Sayin aslangeri isin mantiginda ve calisma yontemini ben biliyorum, fakat daha once hic bir SP yazmadigim icin nasil kod yazacagimi bilmiyorum, bana kisa bir kod yazabilirseniz memnun olurum.

Ayrica sayin Kuri_TLJ, kullandigim kod asagidaki sekilde ve problemsiz calisiyor ama, 150 tablo var yuzbinlerce satir olan tablolar bunlar, ayrica 20 sube ile carpinca her sube 3 saat suruyor buda cok fazla bir sure bunu delphi ile degilde SP tanimlayip, SP'ye parametre gondererek yapsam sure dusermi ve mumkunse bana basit bir SP kodu yazabilirse arkadaslar memnun olurum...

Saygilar...

Kod: Tümünü seç

Procedure Restoret1(Tableadi,Dosyadi:string);
var 
i:longint;
fields:widestring; 
aa1,ii:integer;
aa:tfieldtype;
alanturu,alanadi,header1:string;
yuzde,yuzde1:real;
str1:string[2];
sqlword:widestring;
uz:integer; 
gecici:widestring;

begin

if islemvar=false then 
Begin
deletefile(dosyadi);
exit;
end;

probackup1.progressbar1.stepby(1);
probackup1.progressbar1.stepit;
probackup1.progressbar1.position:=ctstat;
yuzde:=(ctstat/tablesayisi)*100;
yuzde1:=round(yuzde);
probackup1.label6.Caption:='% '+floattostr(yuzde1);
probackup1.statusbar1.panels[0].text:=tableadi;
application.ProcessMessages;

// Table i dosya dan okuyoruz ...

probackup1.adoquery1.SQL.Clear;
probackup1.adoquery1.LoadfromFile(dosyadi);
probackup1.adoquery1.Open;

probackup1.adoquery1.First;
for i:=0 to probackup1.adoquery1.RecordCount-1 do begin

probackup1.adoquery2.SQL.Clear;
probackup1.adoquery2.SQL.Add('select * from '+tableadi+' where LOGICALREF = '+probackup1.adoquery1.FieldByName('LOGICALREF').asstring);
probackup1.adoquery2.open;

if probackup1.adoquery2.RecordCount=0 then begin
probackup1.adoquery2.Append;
probackup1.adoquery2.edit;end else probackup1.adoquery2.edit;


for ii:=0 to probackup1.adoquery1.fieldcount-1 do begin

alanadi:=probackup1.adoquery1.Fields.Fields[ii].FullName;

aa:=probackup1.adoquery1.FieldByName(alanadi).DataType;
if aa=ftString then begin
gecici:=probackup1.adoquery1.FieldByName(alanadi).asstring;
for uz:=1 to length(gecici) do if gecici[uz]=#39 then gecici[uz]:=#34;
sqlword:=sqlword+alanadi+'= '+#39+gecici+#39+', ';

end else 
begin
probackup1.adoquery2.FieldByName(alanadi).AsString:=probackup1.adoquery1.FieldByName(alanadi).asstring

end;
end;

probackup1.adoquery2.Post;

if  sqlword <>'' then begin

uz:=length(sqlword);
if sqlword[uz-1]=',' then delete(sqlword,uz-1,1);
sqlword:='update '+tableadi+' set ' +
sqlword+' where LOGICALREF = '+probackup1.adoquery1.FieldByName('LOGICALREF').asstring;
probackup1.adoquery3.SQL.Clear;
probackup1.adoquery3.SQL.add(sqlword);
probackup1.adoquery3.ExecSQL;
probackup1.adoquery3.SQL.Clear;sqlword:='';
end;

probackup1.adoquery1.Next;
probackup1.adoquery2.Next;

end;

// dosyanin isi bitti sil

deletefile(dosyadi);

end;

Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Neden Replication denemiyorsun?

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Adnan Abi ve Arkadaşlar şu Replication nedir ne işe yarar? Nasıl yapılır? Bu kelime bana yabancı geliyor. Açıklama yaparsanız sevinirim.

Teşekkürler.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Özetle,

Replication tekrarlama anlamında olup, RDBMS'lerde birbirinden bağımsız olarak oluşturulmuş database'lerdeki belirli tablelları veya tüm database'i tamamını kapsayacak şekilde eşlenik hale getirme anlamına gelir.

Yani database'ler arasında oluşan kayıt ekleme düzeltme ve silme gibi bir çok işi otomatik olarak replication ile yapabilmektesin.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
fb de yapılmış örnek ama sqlserver syntax ına uyarmı bilmem

Kod: Tümünü seç

CREATE PROCEDURE BIRIMLER_IU (
  ID SMALLINT,
  BIRIMADI VARCHAR(5))
AS
BEGIN
  IF (EXISTS(SELECT ID FROM BIRIMLER WHERE (ID = :ID))) THEN
    UPDATE BIRIMLER
    SET BIRIMADI = :BIRIMADI
    WHERE (ID = :ID);
  ELSE
    INSERT INTO BIRIMLER (
        ID,
        BIRIMADI)
    VALUES (
        :ID,
        :BIRIMADI);
END
Kolay Gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Burhan_ast
Üye
Mesajlar: 143
Kayıt: 15 Haz 2003 08:33
Konum: Almaty, Kazakhstan

Malesef calismadi

Mesaj gönderen Burhan_ast »

Sayin Aslangeri

Kod icin tsk, Fakat SQL Server 2000'de calistiramadim, Sql server kullanan arkadas var ise cevirebilirse memnun olurum.

Replication kullanamam cunku bir cok kontrol yapmam lazim ayni zamanda program icinde,

Saygilar.
Misafir

ÖNCE TEXTİ DATABASE E

Mesaj gönderen Misafir »

SP içinde text dosyadan okuyabileceğini sanmıyorum ama. yine delphi ile text dosyadan okuyup bir temp table a kaydedip sgeri kalan kısmı sp ye bırakmayı düşünebilirsin.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Yanılmıyorsam MS-SQLServer SP'lerinde Text Dosya okuma yazma gibi bir takım fonksiyonlar var oradan da yararlanılabilir.

Şu anda hatırımda değil ama biraz system SP'lerini kurcalamak lazım.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla