1

Konu: SQL union

http://www.fox4um.com/downloads/rut_rp.jpg

yukarida resimde gorulen 1.tablodaki gibi olusan cursor sonuclarini 2 nci tablodaki gibi hale nasil getirebilirim
yeni olusan cursoru asıl raporda kullanacagim icin gerekli...

SQL union aklima geliyor ama tam fikir yurutemedim sizce nasil olabilir en pratik yonden ?

ornek data asagida

* Ornek Data Hazirlama kodu ici buradan Cetin hocama bir kez daha tesekkur....

Visual Fox Pro
CreateCursor_crsresult()

 
 
Procedure CreateCursor_crsresult
LOCAL lcData, lcTemp
lcTemp = SYS(2015)+'.tmp'
TEXT TO m.lcData noshow
"39L-001","ÖZKAN MARKET-MEHMET ÖZKAN",120,00,"BY","BUYUK YUMURTA",1250,00,0,1700,212,5000,30,00,0,00
"39L-001","ÖZKAN MARKET-MEHMET ÖZKAN",120,00,"KY","KUCUK YUMURTA",100,00,0,1500,15,0000,30,00,0,00
"39L-002","VAROL",0,00,"BY","BUYUK YUMURTA",500,00,0,1650,82,5000,0,00,0,00
"39L-003","ERGUVAN MARKET",10,00,"BY","BUYUK YUMURTA",250,00,0,1900,47,5000,50,00,0,00
"39L-003","ERGUVAN MARKET",10,00,"KY","KUCUK YUMURTA",150,00,0,1600,24,0000,50,00,0,00
 
ENDTEXT
 
STRTOFILE(m.lcData,m.lcTemp)
 
create CURSOR crsresult ;
( ;
  CKODU C(16,0)  NULL  ;
  ,CADI C(60,0)  NULL  ;
  ,ESKIBAKIYE N(19,2)  NULL  ;
  ,SKODU C(16,0)  NULL  ;
  ,SADI C(50,0)  NULL  ;
  ,MIKTAR N(10,2)  NULL  ;
  ,FIYAT N(10,4)  NULL  ;
  ,TUTAR N(15,4)  NULL  ;
  ,CHTAHSILAT N(16,2)  NULL  ;
  ,CEKTAHSILA N(16,2)  NULL  ;
  )
 
APPEND FROM (m.lcTemp) TYPE delimited
ERASE (m.lcTemp)
endproc

2 Son düzenleyen, ugurlu2001 (02.05.2008 17:20:29)

Re: SQL union

Soykan abi, galiba bu işini görür smile

Visual Fox Pro
CreateCursor_crsresult()

 
SELECT 0 As Sira_No, *  FROM crsresult ORDER BY CKodu, SAdi INTO CURSOR crsTemp READWRITE
 
Replace Sira_No WITH Recno() ALL
 
SELECT Min(Sira_No) Sira_No , CKodu FROM CrsTemp GROUP BY Ckodu INTO CURSOR crsMin_ID
 
UPDATE crsTemp ;
    SET ;
        CKodu         = Space(16), ;
        CAdi         = Space(60), ;
        EskiBakiye    = 0, ;
        chTahsilat     = 0 ;
    From CrsTemp ;
    Inner Join crsMin_ID ;
        ON crsMin_ID.Sira_No <> crsTemp.Sira_No AND crsMin_ID.CKodu = crsTemp.CKodu
 
 
SELECT crsTemp
BROWSE
 
Procedure CreateCursor_crsresult
LOCAL lcData, lcTemp
lcTemp = SYS(2015)+'.tmp'
TEXT TO m.lcData noshow
"39L-001","ÖZKAN MARKET-MEHMET ÖZKAN",120.00,"BY","BUYUK YUMURTA",1250.00,0.1700,212.5000,30.00
"39L-001","ÖZKAN MARKET-MEHMET ÖZKAN",120.00,"KY","KUCUK YUMURTA",100.00,0.1500,15.0000,30.00
"39L-002","VAROL",0.00,"BY","BUYUK YUMURTA",500.00,0.1650,82.5000,0.00
"39L-003","ERGUVAN MARKET",10.00,"BY","BUYUK YUMURTA",250.00,0.1900,47.5000,50.00
"39L-003","ERGUVAN MARKET",10.00,"KY","KUCUK YUMURTA",150.00,0.1600,24.0000,50.00
 
ENDTEXT
 
STRTOFILE(m.lcData,m.lcTemp)
 
create CURSOR crsresult ;
( ;
  CKODU C(16,0)  NULL  ;
  ,CADI C(60,0)  NULL  ;
  ,ESKIBAKIYE N(19,2)  NULL  ;
  ,SKODU C(16,0)  NULL  ;
  ,SADI C(50,0)  NULL  ;
  ,MIKTAR N(10,2)  NULL  ;
  ,FIYAT N(10,4)  NULL  ;
  ,TUTAR N(15,2)  NULL  ;
  ,CHTAHSILAT N(16,2)  NULL  ;
  ,CEKTAHSILAT N(16,2)  NULL  ;
  )
 
APPEND FROM (m.lcTemp) TYPE delimited
ERASE (m.lcTemp)
endproc
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ü

3

Re: SQL union

evet smile

4 Son düzenleyen, foxman (05.05.2008 15:49:31)

Re: SQL union

Bu daha kısa, datayı bir kere okuyor.

Visual Fox Pro
Select crsresult

GO TOP
DO WHILE NOT EOF()
    xckodu=crsresult.ckodu
    Skip
    Replace ;
        crsresult.ckodu      With "",;
        crsresult.cadi       With "",;
        crsresult.eskibakiye With 0,;
        crsresult.chtahsilat With 0;
        WHILE crsresult.ckodu=xckodu
ENDDO

5

Re: SQL union

DO WHILE
   ****
ENDDO

ile

REPLACE ALL // YADA SQL UPDATE  // kıyaslandığında UPDATE ve REPLACE  ALL çok daha hızlı sonuç veriyor.

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: SQL union

Bencede replace all mantıklı,bende alışkanlık olsa gerek replace all komutunu for koşulu ile çok sık kullanırım.Pekala replace all mı? SQL UPDATE mi daha hızlı diye sorsam?

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

7

Re: SQL union

Burada Foxman'in dedigi:) Ben sadece scan..endscan ile digistirirdim.

8

Re: SQL union

cetinbasoz yazdı:

Burada Foxman'in dedigi:) Ben sadece scan..endscan ile digistirirdim.


Visual Fox Pro
select mytable

scan
endscan

taktigi gercekten ise yariyor smile

9 Son düzenleyen, foxman (06.05.2008 10:49:58)

Re: SQL union

foxman yazdı:

Bu daha kısa, datayı bir kere okuyor.

Visual Fox Pro
Select crsresult

GO TOP
DO WHILE NOT EOF()
    xckodu=crsresult.ckodu
    Skip
    Replace ;
        crsresult.ckodu      With "",;
        crsresult.cadi       With "",;
        crsresult.eskibakiye With 0,;
        crsresult.chtahsilat With 0;
        WHILE crsresult.ckodu=xckodu
ENDDO


Benim verdiğim kodda "do while...enddo" yerine "scan...endscan" kullanılırsa loop içinde skip olduğu için hatalı sonuç verir.
Replace yerine "scan...endscan" olabilir ama ne kadar hız artışı sağlar test etmek lazım.

Bu kalıp data içindeki gruplar için değişik amaçlarla kullanılabilir. Replace grubu yerine loop kullanarak gruba, sıra numarası vermek, bakiye hesaplamak, kumulatif hesaplamak gibi işlemleri yapabilirsiniz.

Visual Fox Pro
Select crsresult

GO TOP
DO WHILE NOT EOF()
    xckodu=crsresult.ckodu
    ni=1
    Replace crsresult.sirano With ni
    Skip
    SCAN WHILE crsresult.ckodu=xckodu
        ni=ni+1
        Replace crsresult.sirano With ni
    endscan
ENDDO

10

Re: SQL union

Scan..endscan dumduz kullanilinca evet extra skip hatali sonuca yol acar. Endscan oncesi skip -1 ile ben bu taktigi yillardir bir veya icice  birden  fazla scan...endscan kullanarak uyguluyorum. Tek gecis oldugundan cok hizli. Do while .. enddo aarasinda hiz olarak olculebilir problemi yoktur ama dikkatli olunmazsa sonzsuz donguye takilma sansi var. Dikkatli ol ama dimi:)

11 Son düzenleyen, foxman (06.05.2008 13:04:47)

Re: SQL union

Hız optimizasyonu açısından bakarsak, bu kodda bulunan en dıştaki do while...enddo döngüsüne record pointer'in ilerletilmesi ve eof kontrolu esnasında çok az iş düşüyor. Record pointer'in ilerletilmesi işini büyük oranda döngü içindeki replace veya scan...endscan yaptığı için verdiğim örnek kodda en dışta do while...enddo kullanılması hız açısından fazla sakınca yaratmıyor.

12

Re: SQL union

cetinbasoz yazdı:

Scan..endscan dumduz kullanilinca evet extra skip hatali sonuca yol acar. Endscan oncesi skip -1 ile ben bu taktigi yillardir bir veya icice  birden  fazla scan...endscan kullanarak uyguluyorum. Tek gecis oldugundan cok hizli. Do while .. enddo aarasinda hiz olarak olculebilir problemi yoktur ama dikkatli olunmazsa sonzsuz donguye takilma sansi var. Dikkatli ol ama dimi:)


İçiçe ;
Scan / EndScan
ve
EndScan
öncesi
Skip -1
dizilimi için bir örnek alabilirmiyiz Üstad?

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ü

13

Re: SQL union

çok mu karmaşık çözmeye çalışıyoruz  ?

Visual Fox Pro
SELE * FROM ... INTO CURS crsresult READW

m.xckodu="ğĞğĞğĞ"
SCAN
  IF ! m.xckodu=crsresult.ckodu
    m.xckodu=crsresult.ckodu
    LOOP
  ENDI
  BLAN FIEL crsresult.ckodu,crsresult.cadi,crsresult.eskibakiye,crsresult.chtahsilat
ENDS
VFP9 SP2

14

Re: SQL union

ugurlu2001 yazdı:

...
İçiçe ;
Scan / EndScan
ve
EndScan
öncesi
Skip -1
dizilimi için bir örnek alabilirmiyiz Üstad?


scan
...
...
skip
...
...
skip-1
ends


scan
....
...
xkod=kod
xrec=recno()
scan for kod=xkod
ends
go xrec
...
...
ends

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

15

Re: SQL union

scan endscan / do enddo döngüleri içerisinde SKIP veya SKIP -1 komutları kullanılıyorsa;
SKIP öncesi

Visual Fox Pro
IF EOF()

  EXIT  && örneğin - yoksa End of file encountered gibi hata mesajı verebilir
ENDI

veya SKIP -1 öncesi

Visual Fox Pro
IF BOF()

  ....
ENDI

kontrolleri kullanılması daha güvenli iyi olur.

bir de özellikle döngü içerisinde indexleri ilgilendiren değişiklikler karmaşık sonuçlar veriyor.

VFP9 SP2

16

Re: SQL union

Metin Hocam, örnek için çok teşekkür ediyorum; Konuka Hocam, EOF() ve BOF() uyarısı için ayrıca teşekkürler smile

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ü

17

Re: SQL union

konuka yazdı:

scan endscan / do enddo döngüleri içerisinde SKIP veya SKIP -1 komutları kullanılıyorsa;
SKIP öncesi

Visual Fox Pro
IF EOF()

  EXIT  && örneğin - yoksa End of file encountered gibi hata mesajı verebilir
ENDI

veya SKIP -1 öncesi

Visual Fox Pro
IF BOF()

  ....
ENDI

kontrolleri kullanılması daha güvenli iyi olur.

bir de özellikle döngü içerisinde indexleri ilgilendiren değişiklikler karmaşık sonuçlar veriyor.


skip yapınca hata vermez. eğer son kayıtlsa eof() .t. olur sadece. çünkü eğer eof ise zaten scan endscan bitmiş olurdu.

indexleri ilgilendiren derken sanırım scan for demek istedin. o zaman go record_number ile döngüye devam edersin. karışıklık olmaz o zaman.

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