1

Konu: SQL

Ardaşlar liste alırken örnegin cari firmalar listesi örnegin 'A' ile baslayan firmal asagıda ki kodla listesini alıyorum
*CariKod = 'AS%'
*SQLExec(m.lnHandle,;
* 'SELECT Cari_kod,Cari_unvan1,cari_unvan2 FROM CARI_HESAPLAR  where Cari_KOD like ?m.CariKod','liste')
AS ile baslayan firmalar listesi geldikten sonra listeden aramayı devam ettırmek için unvan1 alanın fox komutu ile index yapıp normal seek komutu ile arattırıyorum
yani
sele liste
index on CARi_unvan1 tag unvan1
seek "ASLAN'
yani sql sorgusunu cursore aktarıp cursor ıcınde fox komutları ıle arama yapıyorum.
Soru ise şu : Bu yöntemim dogrumu. 
İndex olusturması cok hızlı oluyor .işlem ram'da calıstıgı için

2

Re: SQL

Buna dogru ya da yanlis demek zor:) ASLAN'i onceden biliyorsan dogrudan onunla ara, daha az data aktarimi olur dolayisi ile de daha hizli. Kendin karar verebilirsin. Mesela cari_kodu AS ile baslayanlar en fazla 50 tane olacaksa boyle yapsan da yapmasan da farketmez. AS ile baslayanlar 5-6 bin tane ise o zaman cok sey farkeder (rakamlar atmasyon, demek istedigim data miktari senin tasarimini da belirler - isin icine fetchsize, fetchondemand vs de giriyor ya basitce boyle).

Bu arada SQL server'da eger collate CI iceriyorsa (case insensitive) o zaman buyuk kucuk harf farketmiyor VFP'dekinin aksine.

Yen yaz 1907'ye yolla FB gelsin evinde yensin.
(sonra salaklar ciksin alin terine şike desin)

3

Re: SQL

bu yöntem hem yavaş olabilir hem de pek verimli değil. Birincisi AS ile başlayanlar çok olabilir. İkincisi kullanıcı page down ile giderek b,c,d,e... harflerini de görmek isteyebilir.
en güzeli vfp tarafından sanal bir fetch yapmak. Yani kayıtları SQL Server'dan 100'er 100'er okumak. Ben bunu yaptım. Ancak yeni başlayan birisi için gerçekten zor. Yaparken UT'de bulunan bir örnek programdan yararlandım. ancak bu örnek tek başına yeterli değil. Üzerinde uğraşmak gerekiyor.

Not: Sakın VFP'nin fetch özelliğiyle fetch yapmaya kalkma. birincisi fetch bitmeden o fetch'i kullanan handle meşgul durumundan çıkmıyor. İkinci yöntem olarak ben idle fetch denedim. O da malesef private data environment olunca çalışmıyor. Zaten o da sistemi yoran birşey aslında.

Visual Fox Pro
1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
PROCEDURE GetPage(cTablename,cCursorname,nPageSize, lFirst, lLast, nOffset, cOffSet, cWhere, cOrderBy)

LOCAL cOrderBy2, cOrderBy3, cPageSize, cTop
 
* nPageSize = Size of the pages, in your example 50
* lFirst, Show first page
* lLast, Show last page
* nOffSet, Show from record nOffset onwards
* cOffset, drilldown to an alphabetic character selected (could be one or more, so A,B,C or AA, AB, AC etc)
 
* cWhere: It is assumed that the selection criteria: cWhere  is constructed by an upper layer. So for example
    * WHERE State = 'State of California' AND status IN(2,3)
    * WHERE Address LIKE  '%Lane%' AND State is 'NY' AND status = 1
 
* cOrderBy Indicates the fields on which the resultsets need to be ordered. This could be a comma delimited list
    * in this case the selection of offset would only operate on the first column in the list
 
* It assumed that the current page location is handled by the application layer (stateless) and the page number display is assumed
* to be handled by the upper layer. This routine is only retrieving the requested pages from the backend.
 
 
* Getting the 50 located records.
 
cOrderBy2 = cOrderBy
cOrderBy3 = cOrderBy
cPageSize = STR(nPageSize)
cTop = cPageSize
 
** Handling the naviation to a particular starting char
 
cWhere = cWhere + IIF(EMPTY(cOffSet),'',' AND '+GETWORDNUM(cOrderBY,1) + " LIKE '"+ALLTRIM(cOffSet)+"%'")
 
DO CASE
    CASE lLast
        cOrderBy2 = cOrderBy+' DESC'
 
    CASE nOffSet > 0
        cTop = STR(nOffset+nPageSize)
        cOrderBy3 = cOrderBy3+' DESC'
ENDCASE
 
** SQL Statement will return at most (nPageSize records) with the total rowcount of the selection in the Totalrows column
 
TEXT TO cSQL TEXTMERGE NOSHOW
    SELECT TOP <<cPageSize>> * FROM (
        SELECT TOP <<cPageSize>> * FROM (
            SELECT TOP <<cTop>> *
                FROM <<cTablename>>
                WHERE <<cWhere>>
                ORDER BY <<cOrderBy2>> ) as A
            ORDER BY <<cOrderBy3>>) as B
        INNER JOIN (SELECT COUNT(*)  as totalrows FROM <<cTablename>> WHERE <<cWhere>>) as C ON 1 = 1
        ORDER BY <<cOrderby>>    
ENDTEXT
RETURN

Son düzenleyen, metin (14.04.2010 14:07:44)

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