Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Dijakritički znakovi u IBO comoponents ne funkcioniraju

  • 3 odgovora
  • 2.522 pregleda

Najnovija ↓

Dijakritički znakovi u IBO comoponents ne funkcioniraju 04.03.2010. u 14:44 · pre 202 meseca #1
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?
Potpis
escape::
Re: Dijakritički znakovi u IBO comoponents ne funkcioniraju 05.03.2010. u 21:23 · pre 202 meseca #2
> 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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Dijakritički znakovi u IBO comoponents ne funkcioniraju 09.03.2010. u 14:49 · pre 202 meseca #3
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;
Potpis
escape::
Re: Dijakritički znakovi u IBO comoponents ne funkcioniraju 09.03.2010. u 21:44 · pre 202 meseca #4
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;
Potpis
escape::
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme