1

Konu: Türkçe Sıralama Sorunu

Benim Aslında FoxPro DOS ile ilgili 2 sorum var:

1.  FoxPro 2.0 kullanırken Türkçe harflerin sıralama sorununu nasıl halledebiliriz. 'Ö' harfinin 'Z' den sonra gelmesi gibi...

2.  Elimdeki 2.0 versiyonda Türkçe harflerden 'ı' harfini kullanamıyorum.

Bu konularda çözüm önerisi olan eski DOS Foxprocularının önerilerini alabilir miyim.

2

Re: Türkçe Sıralama Sorunu

FoxPro DOS kullanmadım ama şöyle bir komut var belki Foxpro DOS'ta da vardır
Set Collate To "TURKISH"
Bu indexlerini türkçe sıralamasını sağlar.
Tablolarının indexlerini oluşturduğun yerde "Collate" kısmı var mı bilemiyorum bir de oraa bak.

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

3

Re: Türkçe Sıralama Sorunu

Maalesef bu komut 2.0 versiyonda bulunmuyor.

4

Re: Türkçe Sıralama Sorunu

sys(15) ile değil foxpro foxbase'de bile türkçe indeks yapabilirsin. ben yapıyordum.

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

5

Re: Türkçe Sıralama Sorunu

Çok teşekkürler.
sys(15) fonksiyonunu inceledim. En azından Ş harfini Z'den sonraya atmıyor ama örneğin S ile Ş harfini aynı görüyor. S'nin Ş'den sıralamada daha önce olduğunu nasıl belirtebiliyoruz.

6

Re: Türkçe Sıralama Sorunu

Sanırım bu işine yarar:

Visual Fox Pro
* Sys15 TR DOS yaratma

SET TALK off
lcWhole = ''
lcBaseSet='ABCEFGHJKMNOPQRTUVXY'
For ix=0 To 255
  lcWhole = m.lcWhole + Chr(m.ix)
Endfor
lcUpperMap = m.lcBaseSet
lcLowerMap = Lower(m.lcBaseSet)
For ix=Asc('Z')+1 To Asc('Z')+6
  lcUpperMap = m.lcUpperMap + Chr(m.ix)
Endfor
For ix=Asc('z')+1 To Asc('z')+6
  lcLowerMap = m.lcLowerMap + Chr(m.ix)
Endfor
lcWhole = Stuff(m.lcWhole,Asc('A'),Len(m.lcUpperMap),m.lcUpperMap)
lcWhole = Stuff(m.lcWhole,Asc('a'),Len(m.lcLowerMap),m.lcLowerMap)
 
m.lcWhole = Stuff(m.lcWhole,128,1,'D') && C
m.lcWhole = Stuff(m.lcWhole,166,1,'I') && G
m.lcWhole = Stuff(m.lcWhole,152,1,'L') && I
m.lcWhole = Stuff(m.lcWhole,153,1,'S') && O
m.lcWhole = Stuff(m.lcWhole,158,1,'W') && S
m.lcWhole = Stuff(m.lcWhole,154,1,'Z') && U
 
m.lcWhole = Stuff(m.lcWhole,135,1,'d') && c
m.lcWhole = Stuff(m.lcWhole,167,1,'i') && g
m.lcWhole = Stuff(m.lcWhole,141,1,'l') && i
m.lcWhole = Stuff(m.lcWhole,148,1,'s') && o
m.lcWhole = Stuff(m.lcWhole,159,1,'w') && s
m.lcWhole = Stuff(m.lcWhole,129,1,'z') && u
 
lcWholeCI = Stuff(m.lcWhole,Asc('a'),Len(m.lcLowerMap),m.lcUpperMap)
 
m.lcWholeCI = Stuff(m.lcWholeCI,135,1,'D') && c
m.lcWholeCI = Stuff(m.lcWholeCI,167,1,'I') && g
m.lcWholeCI = Stuff(m.lcWholeCI,141,1,'L') && i
m.lcWholeCI = Stuff(m.lcWholeCI,148,1,'S') && o
m.lcWholeCI = Stuff(m.lcWholeCI,159,1,'W') && s
m.lcWholeCI = Stuff(m.lcWholeCI,129,1,'Z') && u
 
Turkish = m.lcWhole
TurkishCI = m.lcWholeCI
 
Save To Turkish.mem All Like Turkish*

İçinde iki tane degisken var:
Turkish - Buyuk kucuk ayrimi yapan
TurkishCI - Ayrim yapmayan ( Ahmet ve AHMET index'te ayni degerde)

restore from Turkish.mem
index on sys(15,TurkishCI, isim) tag isim

gibi.

7

Re: Türkçe Sıralama Sorunu

Hocam, elbetteki siz daha iyi bilirsiniz ve sizin yaptığınız örnek çok daha genel ve her yerden kullanılabilir ama aşağıdaki yöntemle sorunumu çözdüm.

Ana programın içine aşağıdaki Fonksiyonu yazdım. Sıralama içi ise
INDEX ON TURKCELE(SOYAD) TAG SOYAD
vb. şeklinde yaptığımda Türkçe (büyük harf) sıralama sorununu çözdüm.


FUNCTION TURKCELE
PARAM ZAY
ZAY=STRTR(ZAY,"Ğ","G[")
ZAY=STRTR(ZAY,"Ü","U[")
ZAY=STRTR(ZAY,"Ş","S[")
ZAY=STRTR(ZAY,"İ","I[")
ZAY=STRTR(ZAY,"Ö","O[")
ZAY=STRTR(ZAY,"Ç","C[")
RETURN(ZAY)

8

Re: Türkçe Sıralama Sorunu

senin yöntem sys(15) ten çok daha yavaş çalışır. ayrıca s ile ş yi ayıramayacak diye birşey de yok. bu senin oluşturduğun karakter tablosuna bağlı. birinci tabloyu a-z türkçe harflerle yapacaksın. ikinci tabloyu da belli bir sırada olan karakterlerle. karakterlerin ne olduğu önemli değil. sırayla olması önemli sadece.
yani mesela:
ABCÇDEFGĞI.....

diğeri de

chr(10)+chr(11)+chr(12)+...

gibi

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

9

Re: Türkçe Sıralama Sorunu

Hız fakı olacak ise o zaman bu yöntemi entegre etmekte yarar var.
Teşekkür ederim.

10

Re: Türkçe Sıralama Sorunu

olmaz olur mu. bir kere tam 6 fonksiyon çağırıyorsun. UDF ile indeks yapmak başlıbaşına zaten bir performans kaybı sebebi.

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

11

Re: Türkçe Sıralama Sorunu

Aratırken de normal mi aratıyorsun ?
Sıralamayı yaptığımda kütükteki alanlar sıralı geliyor ama SEEK komutuyla bulmuyor. Aratırken
seek "İSİM"
gibi mi, yoksa aratacağın değişkeni de işlemden geçiriyor musun.

12 Son düzenleyen, cetinbasoz (13.12.2007 19:51:29)

Re: Türkçe Sıralama Sorunu

Ozcan,
Sys(15, ...) o isi yaparken pointer kullaniyor ve o yuzden cok hizli. Soyle bir mantik var (foxpro kodu degil - sadece algoritmik):

for ( i = 0; i < len(string) ; i++ )
  returnString[ i ] = TurkishMap[ string[ i ] ]

Yani her bir karakterin ASCII degerini aliyor, sonra verilen degiskende ayni pozisyindaki karakteri alip yerine koyuyor. Ornegin Ç gordugu yerde 129 ASCII degeri, Turkish degiskeninde 129 yerinde D buluyor. D icin baktiginda ise E buluyor. CA,ÇA, DA indexlerken CA,DA,EA, yazılmış gibi indexleniyor. Eger o hiz meselesi olmasa ben de o zaman Sys15Tr'nin daha kisa ve hizli versiyonunu yapmayi dusunurdum. O bir kere yapilacagi icin hic optimize edilmemis bir kod.

Fark sadece hiz degil. Senin yaptigin sekilde her Turkce karakter 2 karakterlik yer kaplar indexde. Index olusturuldugunda 'key length' sabit. Kazara icinde bol Turkce harfli ve alani hemen hemen dolduran bir seye denk gelirsen, index anahtar boyunu asan bir degere denk gelmis olur (index hatasi alacaksin diye tahmin ediyorum ya da sessizce indexte olmasi gereken bir kisim kesilip atilir).
sys(15) yontemi ise sonucta olusan string boyunu degistirmiyor, sadece karakterleri degistiriyor.

Sys15 dosyasini yaratirken bir hata yapmisim (hata biraz da Foxpronun aciklamasindan kaynaklaniyor). Yenisi test ile birlikte:

Buraya koyarken Turkce karakterler goctu. Yerlerine koy.

Visual Fox Pro
clear all

Turkish = sys15Map(;
'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ',;
'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]',;
'abcçdefgğhıijklmnoöprsştuvyz',;
'abcdefghijklmnopqrstuvwxyz{|}')
TurkishCI = sys15Map(;
'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ',;
'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]',;
'abcçdefgğhıijklmnoöprsştuvyz',;
'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]')
save to Turkish.mem all like Turkish*
=Sys15Test()
 
Function Sys15Test
clear all
clear
restore from Turkish
? 'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ'
? sys(15,m.Turkish,'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ')
? 'abcçdefgğhıijklmnoöprsştuvyz'
? sys(15,m.Turkish,'abcçdefgğhıijklmnoöprsştuüvyz')
? 'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ'
? sys(15,m.TurkishCI,'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ')
? 'abcçdefgğhıijklmnoöprsştuvyz'
? sys(15,m.TurkishCI,'abcçdefgğhıijklmnoöprsştuvyz')
 
Function sys15Map
parameters tcMapB,tcMapToB,tcMapK,tcMapToK
handle = fcreate('work.tmp')
for ix = 1 to 255
  =fwrite(m.handle,chr(m.ix),1)
endfor
for ix=1 to len(m.tcMapB)
=fseek(m.handle,asc(substr(m.tcMapB,m.ix))-1,0)
=fwrite(m.handle,substr(m.tcMapToB,m.ix,1),1)
endfor
for ix=1 to len(m.tcMapK)
=fseek(m.handle,asc(substr(m.tcMapK,m.ix))-1,0)
=fwrite(m.handle,substr(m.tcMapToK,m.ix,1),1)
endfor
=fseek(m.handle,0,0)
lcMapped = fread(m.handle,255)
=fclose(m.handle)
erase ('work.tmp')
return m.lcMapped

13

Re: Türkçe Sıralama Sorunu

eğer  foxpro da chrtraan fonksiyonu varsa
*****
function trindex
PARAMETERS alan
Return alltrim(upper(Chrtran(m.alan,'ıi','Iİ')))
*****
indekslerken;

index on trindex(alan) tag tralan of alancdx

ararken;

seek trindex(alan)

şeklinde kullanabilirsin.

eğer  foxpro da chrtran fonksiyonu yoksa
foxpro altında bu fonksiyon yaratılıp amaca uygun hale getirilebilir.

14

Re: Türkçe Sıralama Sorunu

Visual Foxpro çıkmadan önce, DOS versiyonu olarak en son FOXPRO 2.6a kullanmıştım.
2.6a dan önce bende european.mem in içeriğini değiştirip sys(15) kullanıyordum.
Fakat 2.6a da FOXPRO.INT var içinde bütün code page'ler var. SET COLLATE TO "TURKISH"
komutu ile herşey halloluyor sys(15) veya başka komutlara gerek kalmadan direk index yapabiliyorsun.

CONFIG.FP içine,

codepage=857
collate=turkish

satırlarını ilave etmen gerekiyor.

Özcan,
Meseleyi kökünden çöz Foxpro 2.6a ya geç.
Internette foxpro 2.6a yı bulursun sanırım, veya mail adresi ver göndereyim.

15

Re: Türkçe Sıralama Sorunu

ercan yazdı:

eğer  foxpro da chrtraan fonksiyonu varsa
*****
function trindex
PARAMETERS alan
Return alltrim(upper(Chrtran(m.alan,'ıi','Iİ')))
*****
indekslerken;

index on trindex(alan) tag tralan of alancdx

ararken;

seek trindex(alan)

şeklinde kullanabilirsin.

eğer  foxpro da chrtran fonksiyonu yoksa
foxpro altında bu fonksiyon yaratılıp amaca uygun hale getirilebilir.


bu söylediğin hiçbir işe yaramaz. Çünkü "İ" harfi asci tablosunda "Z" harfinden sonra gelir. bu yüzden de İ ile başlayan anahtarlar en sona atılır. ayrıca daha önce söylediğim gibi UDF yavaş çalışır. foxpro 2.0 ve foxbase de en iyi çözüm sys(15)'tir.

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

16 Son düzenleyen, foxman (14.12.2007 13:53:17)

Re: Türkçe Sıralama Sorunu

Foxpro 2.6a dan önce böyle yapıyormuşum.

Visual Fox Pro
trsort="                                               0123456789       ¨©ª¬­®¯±²´µ¶·¸¹»¼½¾ÀÁÃÄÅÆÇ      ÈÉÊÌÍÎÏÑÓÔÕÖ×ØÙÛÜİŞàáãäåæç     «â     Ë     Ò      Ú   ³ºÂ   ¿ß      °Ğ?©ª«¬!®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüı"

 
*** veya
 
trsort=""
trsort=trsort+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(48)
trsort=trsort+chr(49)+chr(50)+chr(51)+chr(52)+chr(53)+chr(54)+chr(55)+chr(56)+chr(57)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(32)+chr(32)+chr(32)+chr(168)+chr(169)+chr(170)+chr(172)+chr(173)+chr(174)+chr(175)
trsort=trsort+chr(177)+chr(178)+chr(180)+chr(181)+chr(182)+chr(183)+chr(184)+chr(185)+chr(187)+chr(188)+chr(189)
trsort=trsort+chr(190)+chr(192)+chr(193)+chr(195)+chr(196)+chr(197)+chr(198)+chr(199)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(32)+chr(32)+chr(200)+chr(201)+chr(202)+chr(204)+chr(205)+chr(206)+chr(207)+chr(209)
trsort=trsort+chr(211)+chr(212)+chr(213)+chr(214)+chr(215)+chr(216)+chr(217)+chr(219)+chr(220)+chr(221)+chr(222)
trsort=trsort+chr(224)+chr(225)+chr(227)+chr(228)+chr(229)+chr(230)+chr(231)+chr(32)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(171)+chr(226)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(203)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(32)+chr(210)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(32)+chr(218)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(179)+chr(186)+chr(194)+chr(32)+chr(32)+chr(32)+chr(191)+chr(223)+chr(32)+chr(32)+chr(32)
trsort=trsort+chr(32)+chr(32)+chr(32)+chr(176)+chr(208)+chr(63)+chr(169)+chr(170)+chr(171)+chr(172)+chr(33)+chr(174)
trsort=trsort+chr(175)+chr(176)+chr(177)+chr(178)+chr(179)+chr(180)+chr(181)+chr(182)+chr(183)+chr(184)+chr(185)
trsort=trsort+chr(186)+chr(187)+chr(188)+chr(189)+chr(190)+chr(191)+chr(192)+chr(193)+chr(194)+chr(195)+chr(196)
trsort=trsort+chr(197)+chr(198)+chr(199)+chr(200)+chr(201)+chr(202)+chr(203)+chr(204)+chr(205)+chr(206)+chr(207)
trsort=trsort+chr(208)+chr(209)+chr(210)+chr(211)+chr(212)+chr(213)+chr(214)+chr(215)+chr(216)+chr(217)+chr(218)
trsort=trsort+chr(219)+chr(220)+chr(221)+chr(222)+chr(223)+chr(224)+chr(225)+chr(226)+chr(227)+chr(228)+chr(229)
trsort=trsort+chr(230)+chr(231)+chr(232)+chr(233)+chr(234)+chr(235)+chr(236)+chr(237)+chr(238)+chr(239)+chr(240)
trsort=trsort+chr(241)+chr(242)+chr(243)+chr(244)+chr(245)+chr(246)+chr(247)+chr(248)+chr(249)+chr(250)+chr(251)
trsort=trsort+chr(252)+chr(253)
 
INDEX ON SYS(15,trsort,<field_name>) TO turksort

17 Son düzenleyen, cetinbasoz (14.12.2007 20:36:36)

Re: Türkçe Sıralama Sorunu

Foxpro'da Collate'in dertleri var, kullanma derim (VFP'de de var - en azindan vardi, belki duzeltmislerdir).

chrtran() ile olmaz (o sekilde olmaz en azindan). Soyle olablirdi:

Visual Fox Pro
#define _TRSET 'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZabcçdefgğhıijklmnoöprsştuüvyz'

#define _TRMAP 'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]abcdefghijklmnopqrstuvwxyz{|}'
chrtran(alan, _TRSET, _TRMAP )

ama kullanimi cok dert ve sanirim daha yavas olur. Sys15. Nokta (benim kisisel fikrim bu, istersen baska sekilde yap. Sonucta N turlu yapilir).

Indexli aramada bunu kullanma. Bu sadece senin sirali bir sekilde gosterimin icin. Arama icin normal index kullan. Hatta sys(15) icin index bile yapma.

Index yapacaksan ve onunla da arayacasaksan:

Visual Fox Pro
restore from Turkish

lcAranan = "Özcan"
? seek( sys(15,Turkish,m.lcAranan)  )

Indexte kullanmanin ve onunla aramanin tehlikesini goruyorsun umarim.

18

Re: Türkçe Sıralama Sorunu

SET COLLATE TO "TURKISH" komutunu ilk çıktığından beri, Foxpro DOS ve VFP nin bütün versiyonlarında sürekli kullanıyorum hiçbir problem yaşamadım.

Belki bana denk gelmedi.!!!

Veya hata işletim sistemi ayarları ile ilgili birşeymi.???

Ben COLLATE'in kullanılmasını tavsiye ederim, eğer problem olursa son çare olarak sys(15)
kullanılsın.

19

Re: Türkçe Sıralama Sorunu

FoxPro 2.0'da bu komut maalesef yok.

ı (Küçük I harfi CHR(141)) ile de Fox 2.0 barışık değil. Bu konuda önerisi olan veya patch var mı ?

20

Re: Türkçe Sıralama Sorunu

foxman yazdı:

SET COLLATE TO "TURKISH" komutunu ilk çıktığından beri, Foxpro DOS ve VFP nin bütün versiyonlarında sürekli kullanıyorum hiçbir problem yaşamadım.

Belki bana denk gelmedi.!!!

Veya hata işletim sistemi ayarları ile ilgili birşeymi.???

Ben COLLATE'in kullanılmasını tavsiye ederim, eğer problem olursa son çare olarak sys(15)
kullanılsın.


bir zamanlar vfp8 de bir rapor 3 dk 20 sn de geliyordu.
SET COLLATE TO " TURKISH"
kaldırdığımda aynı rapor 11 sn. indi
o gündür bu gündür
SET COLLATE TO " TURKISH" düşmanıyım

21

Re: Türkçe Sıralama Sorunu

Ben de COLLATE'in kullanilmamasini tavsiye ederim:)

Collate ve eski versiyonlarda _Tally sacmaliyor.
Collate aramalari o anki codepage'e bagimli ve VFP yardim dosyasinda da anlatiyor.
Su an aklima gelmeyen bazi seyler sadece collate kullanilmadiginda mumkun.

22

Re: Türkçe Sıralama Sorunu

Ben hep Set Collate To "TURKISH" kullandım. Bununla ilgili tek bir sıkıntım oldu Index On komutlarında oluşturduğum index stringin boyu 100 - 110 karaktere düşüyor. Bunun dışında hiç bir problem yaşamadım.
Erdal beyin dediği yavaşlama gibi hiç bir sorunum olmadı keza 2 yıldan beridir de foxpronun veritabanını bıraktım, SQL kullanıyorum sadece oluşturduğum cursorlerın indexlenmesi ile ilgileniyorum o da sadece lokalde oluyor zaten.

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

23 Son düzenleyen, cetinbasoz (16.12.2007 01:19:06)

Re: Türkçe Sıralama Sorunu

Tarkan,
Senin durumun farklı. Benim bildiğim de senin SQL server kullanıp lokalde sadece oradan gelenlerle ilgilendiğin. Sana hızı zaten SQL server sağlıyor, lokale az data geliyor.

VFP9 yardımında CpCurrent() ve CPDBF() farklı ise rushmore optimizasyonunun devreden çıkabildiği açıkca yazılı.

"Rushmore Optimization and Code Pages
Visual FoxPro does not use existing character indexes for tables created with a non-current code page. Instead, Visual FoxPro builds temporary indexes to ensure correct results. This can result in non-optimization of SQL or other commands. To prevent this, ensure that the current Visual FoxPro code page returned by CPCURRENT( ) Function matches the table's code page returned by CPDBF( ) Function. This requires either changing the current Visual FoxPro code page, or changing the table's code page. "

Collate degğil buradaki ama dolaylı olarak o da etkilenecektir herhalde (foxpro 2.x'teki problemlerini gordüğümden beri kullanmıyorum, bilemem).

Bu problem Turkce windows yuklu makinelerde gorulmeyebilir.