[ escape:: @ 04.03.2010. 13:44 ] @
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?
[ savkic @ 05.03.2010. 20:23 ] @
> 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.
[ escape:: @ 09.03.2010. 13:49 ] @
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:: @ 09.03.2010. 20:44 ] @
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;