Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dijakritički znakovi u IBO comoponents ne funkcioniraju

[es] :: Pascal / Delphi / Kylix :: Dijakritički znakovi u IBO comoponents ne funkcioniraju

[ Pregleda: 1816 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

escape::
Developer Delphi
Rijeka, Croatia

Član broj: 26382
Poruke: 65
*.adsl.net.t-com.hr.



+1 Profil

icon Dijakritički znakovi u IBO comoponents ne funkcioniraju04.03.2010. u 13:44 - pre 171 meseci
Koristim IBO komponente 4.6B.
Ovaj dio koda u EXE ne daje rezultate ako prezime ima više od početnog dijakritičnog znaka:


qrMembers.Close;
qrMembers.SQL.Clear;

qrMembers.SQL.Add(FMemberSQL + ' and UPPER("Person"."LastName")
starting with UPPER(:SEARCH_CRITERIA);');

qrMembers.ParamByName('SEARCH_CRITERIA').AsString :=
TrimRight(AnsiUpperCase(edSEARCH.Text));

qrMembers.Open;


Ali ovo radi u IBExpert da je ispravne rezultate za bilo koju kombinaciju dijakritičnih u prezimenu:


select * from "Person"
where
UPPER("Person"."LastName") starting with UPPER( :SEARCH_CRITERIA )


Čitao sam da bi bilo najbolje rješenje napravit funkciju koja uspoređuje po bitovima dva stringa...ali čemu onda SQL...
Ima li tko ideju kako to elegantno riješiti da radi u SQL/Firebird + IBO?

escape::
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Dijakritički znakovi u IBO comoponents ne funkcioniraju05.03.2010. u 20:23 - pre 171 meseci
> Ovaj dio koda u EXE ne daje rezultate ako prezime ima više od početnog dijakritičnog znaka:

Ako prezime sadrži dva ili više naših slova onda se slog ne vraća?

> starting with UPPER(:SEARCH_CRITERIA);');
> qrMembers.ParamByName('SEARCH_CRITERIA').AsString :=
> TrimRight(AnsiUpperCase(edSEARCH.Text));

Već forsiraš upper tekst u SQL, moguće je da rezultat koji daje AnsiUpperCase nije kompatibilan sa rezultatom koji FB daje, izbaci AnsiUpperCase.

> select * from "Person"
> UPPER("Person"."LastName") starting with UPPER( :SEARCH_CRITERIA )

Zašto uopšte koristiš navodnike za nazive tabela i polja, lakše je bez njih?

> Čitao sam da bi bilo najbolje rješenje napravit funkciju koja uspoređuje po bitovima dva stringa...ali čemu onda SQL...

Najbolje je da koristiš case insensitive collation ili da koristiš expression indekse, pogledaj:
http://www.destructor.de/firebird/caseinsensitivesearch.htm.
 
Odgovor na temu

escape::
Developer Delphi
Rijeka, Croatia

Član broj: 26382
Poruke: 65
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Dijakritički znakovi u IBO comoponents ne funkcioniraju09.03.2010. u 13:49 - pre 171 meseci
Mislim da ću upotrijebiti ovu funkciju i napraviti dva polja u bazi NameBIN i LastNameBIN...samo ne kužim šta ne bi ova funkcija trebala vratiti 2 bajta za dijakritični znak!?



function TForm1.StrToBin(const S: string): string;
const
BitArray: array[0..15] of string =
('0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011',
'1100', '1101', '1110', '1111');
var
Index: Integer;
LoBits: Byte;
HiBits: Byte;
begin
Result := '';
for Index := 1 to Length(S) do
begin
HiBits := (Byte( S[Index]) and $F0) shr 4;
LoBits := Byte( S[Index]) and $0F;
Result := Result + BitArray[HiBits];
Result := Result + BitArray[LoBits];
end;
end;
escape::
 
Odgovor na temu

escape::
Developer Delphi
Rijeka, Croatia

Član broj: 26382
Poruke: 65
*.adsl.net.t-com.hr.



+1 Profil

icon Re: Dijakritički znakovi u IBO comoponents ne funkcioniraju09.03.2010. u 20:44 - pre 171 meseci
Ovo radi perfektno...znači uz Ime i prezime dodaju se u tabeli dva polja imeBIN i prezimeBIN pa se kroz petlju (i funkciju StrToBin) napravi konverzija imena i prezimena u ta nova polja kao binarni string.
Kasnije search (SQL usporedba) radi savršeno!


function StrToBin(const S: string): string;
const
BitArray: array[0..15] of string =
('0000', '0001', '0010', '0011',
'0100', '0101', '0110', '0111',
'1000', '1001', '1010', '1011',
'1100', '1101', '1110', '1111');
var
Index: Integer;
LoBits: Byte;
HiBits: Byte;
begin
Result := '';
for Index := 1 to Length(S) do
begin
HiBits := (Byte( S[Index]) and $F0) shr 4;
LoBits := Byte( S[Index]) and $0F;
Result := Result + BitArray[HiBits];
Result := Result + BitArray[LoBits];
end;
end;

escape::
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Dijakritički znakovi u IBO comoponents ne funkcioniraju

[ Pregleda: 1816 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.