Ad Soyad parçalamak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Ad Soyad parçalamak

Mesaj gönderen turkcanfidan »

Selam,

arkadaşlar bir table da isimleri AdıSoyadı gibi bir alanda tutuyorum. SoyadıAdı lazım, onun için Data Modül üzerinde CalculatedField olarak SoyadıAdı gibi bir alan tanımladım. Normalde form üzerinde listbox koyarak aşağıdaki kodla yapmıştım ama Data Modül üzerine listbox koyulmuyor. TStringlist olarak değişken tanımladım onunda item gibi bir properties i yok. sizce nasıl çözülür?

Kod: Tümünü seç

function Segment(var S:string; Sp:Char):string;
var
  Ix:Integer;
begin
  S:=TrimLeft(S);
  Ix:=Pos(Sp,S);
  if IX<>0 then
  begin
    Segment:=Copy(S,1,Ix-1); Delete(S,1,Ix);
  end
  else begin
    Segment := S;  S:=''
  end;
end;
kullanımı :

Kod: Tümünü seç

S := qrKimlikADSOYAD.Value;
while S <> '' do
   begin
   Seg := Segment(S,' ');
   if Seg <> ''
      then ListBox1.Items.Add(Seg);
   end;
iyi çalışmalar...
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

neden bu işlemi veri tabanına yaptır mıyorsunuz? Veriler gelirken düzgün olarak gelsin.

Kod: Tümünü seç

select concat(copy(AdiSoyadi,pos(' ',AdiSoyadi)+1,len(AdiSoyadi-pos(' ',AdiSoyadi))),copy(AdiSoyadi,1
,pos(' ',AdiSoyadi)-1)) as SoyadiAdi from tablom
Artık birden fazla soyisim kullanma hakkı çıktı biliyorsunuz (bayanlar için). Bu durumda ayırmak çok daha zor olacaktır.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
tablonun oncalcfields olayında

Kod: Tümünü seç

dataset['soyadiadi']:=segment(dateset['adisoyadi'],' ');
şeklinde bir kullanımın işinizi görmesi lazım
bu arada iki isimli veya (özellikle bayanlarda) iki soyadlı kişilerde durum
nasıl oluyor onuda unutma.
kolaygelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

mssql de pos fonksiyonu yok galiba. Bunun yerine ne kullanabiliriz?





.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

İki ve üç isimli kayıtlarda daha da karmaşık hale gelir bu şekilde.Özellikle @mkysoft'un verdiği örnekte alakasız sonuçların dönme ihtimali çok yüksek.Sondan başa doğru tarayarak parse etmek en mantıklı çözüm fikrimce ancak iki soyadı olanlar için bir çözüm teknik olarak yok.

Kolay gele.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

mssql server da PATINDEX ve CHARINDEX var.
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

Kod: Tümünü seç

select concat(SUBSTRING(ADISOYADI,patindex(' ',ADISOYADI)+1,len(ADISOYADI-patindex(' ',ADISOYADI))),SUBSTRING(ADISOYADI,1 
,patindex(' ',ADISOYADI)-1)) as SoyadiAdi 
from hastalar
where IDNO = 1
@mkysoft un verdiği kodu patindex ve substring ile değiştirdim, bu sefer CONCAT yerine ne koyabiliriz?
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

CONCAT mysql komutu herhalde, + ile birleştiriliyor

Kod: Tümünü seç

select SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI) )   ) 
        +', '+SUBSTRING(ADISOYADI,1,charindex(' ',ADISOYADI)-1) as SoyadiAdi 
from hastalar 
where ID = 1
bu kodla tek isimlileri ayırıyor, ama iki isimlilerin göbek adını soyadı gibi algılıyor :( charindex in tersi olsa, bu iş olacak ama...
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Sırf merakımdan soruyorum, önceki yazdığımı okudun mu?
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

aLonE CoDeR yazdı:Sırf merakımdan soruyorum, önceki yazdığımı okudun mu?
Merak etme hallettim. (mysoft, aslangeri ve naile Ustalara teşekkürler)

bu sql cümlesi biraz uzun ama çok iyi iş gördü. Aynı mantıkla 4 isimlileride halledebiliriz :)

Kod: Tümünü seç

select 
SUBSTRING(SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI))),
charindex(' ',SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI))))+1,
(len(SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI))))-charindex(' ',
SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI)))))) as SOYADI
,
SUBSTRING(ADISOYADI,1,PATINDEX('%'+SUBSTRING(SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI))),
charindex(' ',SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI))))+1,
(len(SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI))))-charindex(' ',
SUBSTRING(ADISOYADI,charindex(' ',ADISOYADI)+1,(len(ADISOYADI)-charindex(' ',ADISOYADI))))))+'%',ADISOYADI)-2 ) AS ADI

from personel 

where ID = 1
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

bu arada patindex ile charindex fonksiyonlarını da öğrenmiş olduk. Daha önce hiç lazım olmamıştı.

patindex bir string içinde aranan string parçasının kaçıncı karaterden başladığını veriyor.

charindex ise bir karakterin string içindeki pozisyonunu veriyor.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Merakım halledip halledememen değil ama konuya girmeyi düşünmüyorum.Son olarak kullandığın yöntem yine alakasız sonuçlar döndürme olasılığı barındırıyor!

Kolay gele..
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

çok gereksiz muhabbetler...

önce dene istersen. Ben 250.000 kayıtta denedim.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Polemiğe girmeyi sevmem, kolay gele..
turkcanfidan
Üye
Mesajlar: 380
Kayıt: 31 Eki 2005 03:26

Mesaj gönderen turkcanfidan »

aLonE CoDeR yazdı:Polemiğe girmeyi sevmem, kolay gele..
Tövbe, tövbe... ben ihtiyacım olan raporu hatasız çıkardım, hem gereksiz polemiğe giriyorsun, hemde polemiğe girmeyi sevmem diyorsun. Burada çözümsüzlük değil, çözümleri tartışalım.
Cevapla