1

Konu: replace all komutu ile ilgili

merhaba dostlar,table da tutulan kayıtlar içerisinde,birden fazla kayıt üzerinde değişiklik yapılacak ise,< replace all> komutu ile değişikliği yapmak mı mantıklıdır,yoksa index sırasına göre konumlanıp bir loop ile gerekli değişikliği yapmak mı?Çok fazla kayıt olduğunda hangisi daha hızlı olur?

En büyük sermaye nakit,nakit sermaye vakittir...

2

Re: replace all komutu ile ilgili

Replace All tüm kayıtları değiştirir. Belirli bir koşul için değişiklik yapacaksan;

Visual Fox Pro
*!* Replace luSahaAdi With luDeger For Kosul

*!* Örnek
Create Cursor curOrnek (cAd C(10), cSoyad C(10), nTip I, cAciklama C(20))
Insert Into curOrnek Values("Tarkan", "Haser", 1, "")
Insert Into curOrnek Values("Fox", "Forum", 2, "")
Insert Into curOrnek Values("Cemal", "Tapan", 1, "")
Insert Into curOrnek Values("VFP", "Forum", 2, "")
Insert Into curOrnek Values("C#", ".Net", 3, "")
 
Replace cAciklama With "Kullanıcılar" For nTip = 1
Replace cAciklama With "Site" For nTip = 2
Replace cAciklama With "Program" For nTip = 3
/o---------------------o\
     www.haser.com
\o---------------------o/

3 Son düzenleyen, ugurlu2001 (12.07.2007 13:46:56)

Re: replace all komutu ile ilgili

neyzen yazdı:

merhaba dostlar,table da tutulan kayıtlar içerisinde,birden fazla kayıt üzerinde değişiklik yapılacak ise,< replace all> komutu ile değişikliği yapmak mı mantıklıdır,yoksa index sırasına göre konumlanıp bir loop ile gerekli değişikliği yapmak mı?Çok fazla kayıt olduğunda hangisi daha hızlı olur?


Visual Fox Pro
CLEA

CLOSE DATABASES
SET DELETED ON
SET SAFETY OFF
SET ENGINEBEHAVIOR 90
 
? TIME()
*/ Toplam Satışlar İçin /*
SELECT 2
USE AMODEL
REPLACE ACIKLAMA WITH SPACE(50) ALL
 
SELECT 1
USE Tmp_Toplam
INDEX ON ModelNo TO Tmp_Toplam
SET ORDER TO TAG AMODEL OF AMODEL.cdx IN AMODEL
SET RELATION TO MODELNO INTO AMODEL ADDITIVE
 
REPLACE ALL Amodel.Aciklama WITH "El: "+ALLTRIM(STR(Tmp_Toplam.Elde))+" -  St: "+ALLTRIM(STR(Tmp_Toplam.Satis))IN Tmp_Toplam
 
Set
* CLOSE DATABASES
? TIME()
 
RETURN

* Yada

Visual Fox Pro
Replace Amodel.ACIKLAMA WITH "istenen değer" ALL FOR "KOŞUL"
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

4

Re: replace all komutu ile ilgili

üsdatlar,ben bu komutun çalışma hızını sormuştum.Bir tabloda 100.000 adet kayıdın olduğu düşünülürse,replace all for... komutu ne kadar performanslı çalışır demek istemiştim.Yoksa klasik yöntemlerle kayıtları index sırasına göre açıp değişiklik yapmak daha mı mantıklıdır?.Benim problemim hız ile ilgili.

En büyük sermaye nakit,nakit sermaye vakittir...

5

Re: replace all komutu ile ilgili

Ben 18,000 kayıtlı bir table da çalışma hızı yönünden memnunum. Kodun çalıştığını neredeyse anlamıyorum.

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

6

Re: replace all komutu ile ilgili

eğer program çok kullanıcılı bir çevrede kullanılıyorsa biraz değişik kullanman gerekir replace komutunu

7

Re: replace all komutu ile ilgili

ercan bey biraz daha konuya açıklık getirebilirmiyiz?

En büyük sermaye nakit,nakit sermaye vakittir...

8

Re: replace all komutu ile ilgili

eğeerki kaydı değiştirmek istersen ve başka bir kullanıcı o an o kaydı kullanıyorsa (dolayısıyla kaydı kilitlemiştir büyük ihtimalle) bu durumda sen değişitirmek istediğin kaydı değiştiremezsin. kayıtdaki alan
değişmediğinden amacına ulaşamazsın(değiştiğini zannedebilirsin).  bunun için yardım dosyasından
CURSORSETPROP  fonksiyonuna bakarsan konuyu daha iyi kavrayabilirsin.

9

Re: replace all komutu ile ilgili

"Understanding Rushmore Query Optimization Technology"
bölümünü incelersen hız konusunda aradığını bulabilirsin. kabaca eğer "for" koşulunda kullandığı terimlerden birine göre indeksin var ise program çok hızlı çalışır.

10

Re: replace all komutu ile ilgili

arkadaşlar o kayıdın o anda kullanılıp,kullanılmadığını nasıl anlarız?

En büyük sermaye nakit,nakit sermaye vakittir...

11

Re: replace all komutu ile ilgili

ISRLOCKED()

/o---------------------o\
     www.haser.com
\o---------------------o/

12

Re: replace all komutu ile ilgili

teşekkürler arkadaşla

En büyük sermaye nakit,nakit sermaye vakittir...

13

Re: replace all komutu ile ilgili

Replace all daha hizli cunku SQL Update gibi record locking kullanmiyor. Tablo exclusive kullanimda ise SQL update'de hizli.

Ancak kilitleme farklari nedeniyle hizdan once dusunmen gereken o anda kilitlenmis kayitlar. Kisaca soylemek gerekirse:

eger replace'i for,while, all, next N gibi ekleriyle kullanirsan tablo header kilitlemesi gerekiyor ve baska kullanicilardan birisi tek bir kaydi bile o sirada kilitlemisse (senin degistireceklerinle ilgisi olmasa bile) replace hata ile kesilir.

Update (SQL) ise isini yapar. Onda da ozel durum, eger baskasinin kilitledigi kayit senin yapacagin degisikliklere uyan kayitlardan birisi ise,  oraya kadar olan kayitlarda degisiklikler yapilir, orada kesilir. Ancak where nedeniyle o kilitli kayitlara dokumuyorsa isini tamamlar (replace tamamlayamaz o kayit degistirmesi gerekenlerden olmasa bile).

Buffering kullaniyorsan o zaman hem replace hem SQL update'de isi tamamlama sansin cok yukselir. Cunku isin basarilamama sansini, sadece tableupdate() anina sinirlamis olursun. Ayni anda birden fazla kullanicinin kayit ya da tablo kilitleme sansi cok daha dusuk ve hata almak yerine tableupdate() sonucuna bakarak ilerleme sansin var (aerror ile neden basarilamadi vs).

Simdi Tarkan'dan ozur dileyerek, biraz verilen kodlar uzerinde konusmak istiyorum:

Visual Fox Pro
Replace cAciklama With "Kullanıcılar" For nTip = 1

Replace cAciklama With "Site" For nTip = 2
Replace cAciklama With "Program" For nTip = 3

Yerine:

Visual Fox Pro
Replace cAciklama With ;

Icase(nTip=1,"Kullanıcılar",nTip = 2,"Site",nTip = 3,"Program") ;
for inlist(nTip,1,2,3)

Tercih et. Cunku tablo header kilitleme zamanini dusurmus olursun. Bu SQL update olsa idi nTip'in 1,2,3 disinda olan kayitlarin baska yerde kilitlenmis olmasindan etkilenmeyecekti.
Update SQL'in davranisi kabaca:

Visual Fox Pro
scan for ...

  if rlock()
    replace ...
  else
    exit
  endif
endscan


gibi.

IsRLocked() sadece senin kaydi kilitleyip kilitlemedigini soyler. Baskasinin degil. O nedenle baskasinin kilitleyip kilitlemdigini ogrenmek biraz zor. Rlock() ile kilitlemeye kalkarsin ve .F. donerse baskasi kilitlemistir.

Foxpro'da bayagi sihir var galiba bu isin bu kadar karmasik olabilecegini yillardir farketmemisim:)

14 Son düzenleyen, ercan (16.07.2007 06:37:56)

Re: replace all komutu ile ilgili

işin hassasiyetini açıklamak bakımından bir örnek vermek istiyorum.

bir pazarlama şirketisiniz ve devlet bazı ürünlerde kdv değişikliğine gitti. genel kdv oranı %17 den %18 e çıkarıldı. bu işlemi bir bir satırda yapabilirsiniz(replace all kdv with 18 for kdv=17 gibi). ancak o anda
5 kullanıcı 5 farklı ürün kaydı üzerinde değişiklik yapmak üzere kayıtları kilitledi. siz de tam bu sırada
genel kdv oranlarını değiştirdiniz. (mi acaba?) kullanıcılar değişiklikleri kaydettiği anda 18 olan kdv oranı
5 kullanıcının kullandığı kayıt  için tekrar %17 olacaktır.  O yüzden form kullanılıyorsa database environment te buffering-5 ve tableupdate() , kodlamayla  CURSORSETPROP fonksiyonu ve tableupdate()  kullanmak kaçınılmaz olacaktır.