1

Konu: sql update yaparken başka tabloya göre filtreleme nasıl olur?

İyi günler,
Çetin H. SQL'e o kadar bulaştırdı ki, işi gücü bıraktım, eski kodları SQL server şeklinde elden geçiriyorum.
Aşağıdaki kod ile kulağı tersten gösteriyor hissine kapıldım.
- Önce nakit ve nakit_ tablolarından değişecek ref (referans noları) buluyorum. tarih sorgusu nakit tablosunda yapılıyor.
- Sonra o referansları update komutu ile nakit_ tablosunda ilgili kolonu değiştiriyorum.

tek UPDATE komutu ile nakit ten tarihi filter ederek nakit_.kimid leri değiştirebilirmiyim ??

Visual Fox Pro
LOCAL lnGir, komut

TEXT TO komut NOSHOW
SELECT DISTINCT nkt..nakit_.ref, kimid
FROM nkt..nakit_ INNER JOIN
     nkt..nakit ON nkt..nakit_.ref = nkt..nakit.ref
WHERE (nkt..nakit_.kimid=?VAL(This.Parent.liKim.Value)
  AND nkt..nakit.tarih BETWEEN ?DTOS(This.Parent.ilktar.Value) AND ?DTOS(This.Parent.sontar.Value) )
ENDTEXT
 
m.lnGir = SQLSTRINGCONNECT(SQL_BAGLANTI)
IF SQLEXEC(m.lnGir,m.komut)<0
  anaform.hatagöster
ENDIF
 
m.Xrefler="0"
SCAN
  SCATTER FIELDS ref MEMVAR
  m.Xrefler=m.Xrefler+","+ALLTRIM(STR(ref))
ENDS
 
*SCAN
*  SCATTER FIELDS ref MEMVAR
*  SQLEXEC(m.lnGir,"UPDATE nkt..nakit_ SET kimid = ?VAL(This.Parent.liKim1.Value) WHERE (nkt..nakit_.ref = ?m.ref)")
*ENDS   && aşağıdakine alternatif
 
TEXT to lcStatement1 TEXTMERGE noshow
UPDATE nkt..nakit_ SET kimid = ?VAL(This.Parent.liKim1.Value)
   where nkt..nakit_.ref IN (<<m.Xrefler>>)
ENDTEXT
 
IF 0>SQLExec(lnGir, m.lcStatement1)
  anaform.hatagöster
ELSE
  WAIT WINDOW TIMEOUT 2 "hesap transferi tamamlandı"
ENDI
SQLDISCONNECT(m.lnGir)
VFP9 SP2

2

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

cool

Kaba olarak ilk cevrim:

Visual Fox Pro
LOCAL lnGir, lcStatement1

 
TEXT to lcStatement1 TEXTMERGE noshow
UPDATE nkt..nakit_ SET kimid = ?m.liKim1
   where nkt..nakit_.ref IN (
SELECT nak.ref
FROM nkt..nakit_ nak
INNER JOIN
     nkt..nakit nak2 ON nak.ref = nak2.ref
WHERE ( nak.kimid=?m.liKim
  AND nak2.tarih BETWEEN ?m.ldIlkTarih and ?m.ldSonTarih )
   )
ENDTEXT
 
m.lnGir = SQLSTRINGCONNECT(SQL_BAGLANTI)
 
liKim = VAL(This.Parent.liKim.Value)
ldIlkTarih = This.Parent.ilktar.Value
ldSonTarih = This.Parent.sontar.Value
liKim1 = VAL(This.Parent.liKim1.Value)
 
IF SQLExec(m.lnGir, m.lcStatement1) < 0
  anaform.hatagöster()
ELSE
  WAIT WINDOW TIMEOUT 2 "hesap transferi tamamlandý"
ENDI
SQLDISCONNECT(m.lnGir)

Update komutunda ayni tablo iki kere geciyor ve o nedenle daha da kisaliyor ancak tureyen (derived diye geciyor boyle cevirdim) tablolara ornek olsun diye senin orijinal "komutu" oraya tasidim.

Not: Dikkat  val(), dtos() gibi fonksiyonlar yerine onlari disari alip sonuc degerlerini kullanmakta fayda var (faydadan ziyade iceride olursa calisir mi, hic denemedim bilmiyorum). Bu arada dtos() gibi cevirimleri yapma, ? olunca parametrik gidyor nasil olsa, tarih tipi uygun sekilde cevirilir (SQL server'da da tarihsaat degil mi).

3

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

çok teşekkür ederim - vizyon olarak çözüm şekli çok önemli idi.

Bir sorum daha var: sql exp 2005 i firma serverine nasıl kurabilirim ?, benim terminalden yapamadım !

VFP9 SP2

4 Son düzenleyen, cetinbasoz (15.01.2009 23:54:15)

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

Bildigim kadarıyla servera administrator olarak girip oyle yapman lazım. Oraya kurmadan kendi makinene kur, programlarini yaz gelistir. Oraya kuruldugu zaman datanin transferi (SQL serverdan SQL servera), uygulamanin datayi oradan kullanmasi filan neredeyse tek satirlik isler. Is oraya gelir de zorlanirsan, soz uzaktan baglantiyla yardim ederim:)

(Tek satirlik derken aslinda o kadar da basit olmuyor her zaman ama zor da degil, uygulamanda degisen hemen hemen hicbir sey yok - baglanti bilgisi programin icine sabit olarak yazilmadiysa).

5

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

hazir konusu gelmisken sormak istedigim bir şey var.
bu sql de SKIP, GOTO , SEEK gibi komutlarin yerini tutan komutlar var mi?

6

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

aydinufuk yazdı:

hazir konusu gelmisken sormak istedigim bir şey var.
bu sql de SKIP, GOTO , SEEK gibi komutlarin yerini tutan komutlar var mi?


VFP uzerinden SQL tablolarini kullaniyorsan ( CA,SPT,RV yollarindan biri ile) bu komutlari kullanabiliyorsun

SQL direkt olarak desteklemiyor

7

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

aydinufuk yazdı:

hazir konusu gelmisken sormak istedigim bir şey var.
bu sql de SKIP, GOTO , SEEK gibi komutlarin yerini tutan komutlar var mi?


SQL'de var mi dersen var, ama kullanimi nadir (adi skip, goto ... degil). Sen VFP tarafina datayi alip calisirken sen de cursor var, onda kullanabilirsin.

SQL server uzerinde ise satir bazli degil set bazli dusunmeye calis (pratik olarak select/insert/update/delete komutlarinin SQL versiyonlari).

8 Son düzenleyen, konuka (17.01.2009 07:30:56)

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

cetinbasoz yazdı:

Oraya kurmadan kendi makinene kur, programlarini yaz gelistir. ).


Zaten öyle sevgili Başöz.
allah muhafaza fabrikada en ufak bir beta ruhlu program dolaşsa, iki dakikada bir "program çalışmıyor" diye tepeme gelirler.

cetinbasoz yazdı:

Bildigim kadarıyla servera administrator olarak girip oyle yapman lazım.


bu ifadenizden anladığım; indirdiğim setup dosyasınu servera kopyalayıp serverda admin olarak install edeceğim .
Konuşmuştuk ama bulamadım, sql exp 2005 demonun üst sınırı nedir, Metin B. "zaten o kadar data biriktiren firma para verip alır" benzeri birşey demişti...

sevgiler

VFP9 SP2

9

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

sql exp 2005 demo değil sadece bedava. eski sql express versiyonlarında bir database 2 gb yi geçemiyordu yenisinde 4 gb. ama hangi versiyondan itibaren 4 bilmiyorum. nasılsa bedava olduğuna göre 2008 kullan gitsin.
bence birbirimize "bey-siz" diye hitap etmemize gerek yok. ama öyle istersenİZ öyle konuşuruz... smile

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

10

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

SQL expresslerin hepsinin siniri basindan beri 4Gb:)  2005 oncesı MSDE vardı (SQL 2000 ucretsiz versiyonu) onda 2 Gb idi.

Bence de 2008 kur. Bu zamanda ful versiyonu alan da 2008 alir. Madem sirket icinde yaziyorsun o zaman 2008'in yeniliklerini kullanma luksune de sahipsin:) Ben ne yazik ki 2005 ve hatta 2000'i de dusunmek zorundayim hala:(

2008'den carpici buldugum bazi guzellikler (cok var da hemen aklima gelenler):
Data tiplerinde date, time, spatial, hierarchyid, table (vardi, gelisti) tipleri geldi.
Insert into (...) values (...) komutu ayni anda cok satir insert edecek sekilde gelisti:

SQL
INSERT INTO myTable (myId, myVal)

VALUES
(1,'x1'),
(2,'x2'),
(3,'x3')

FileStream attribute: Bunun sayesinde artik resim, video vs nerede tutulacak diye dusunmuyorum.  Benim acimdan normal SQL server field. Diskte tutuluyor aslinda ama o kismi SQL serverin derdi, erisim vs o yonetiyor.

Merge (iki tabloyu karsilastirarak insert/delete/update, digerinde varsa soyle, yoksa soyle yap gibi)

...

SQL2005/2008 express sinirlari 4Gb database, 1Gb RAM, 1 CPU (sende fazlasi olabilir, o bunlari kullaniyor).

11

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

UPDATE ile ilgili başka bir sorum var, yeni başlık açmadım. Öncelikle yardımlara teşekkür edeyim  ve "senli" yazışmaları daha doğru olduğunu belirteyim (Metin). Maalesef kodları beynimize çakanlar böyle çakmış, anneme bile "siz" demek zorundayım :]

WHERE süzgecini her fielde uygulasam da birden fazla record olabiliyor. yeni bir referans key eklemek çok zor olacak.
ancak ben sadece 1 kayıt değiştirmek istiyorum
yani UPDATE TOP 1 ... SET ....  WHERE ....  benzeri bir komut arıyorum.??
LIMIT 1 komutunu SQL EXP 2005 tanımıyor !

ya da kazmakürek metodlarına girip;
- eğer SELECT WHERE ....  1 den fazla ise
- hepsini DELETE WHERE ....  edecek
- sonra 1 kayıt değiştirilmiş şeklinde, toplam-1 kayıt da önceki şekilde INSERT iterasyonu mu yapmalıyım ?

VFP9 SP2

12

Re: sql update yaparken başka tabloya göre filtreleme nasıl olur?

UPDATE TOP 1 ... SET ....  WHERE ....  benzeri komut:

UPDATE TOP (1) ... SET ....  WHERE ....  smile

Ornek:

SQL
UPDATE top (1) customers SET contact = 'XX' WHERE country = 'USA'