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,