|
| Søgning med SQL Fra : Ukendt |
Dato : 21-02-06 19:57 |
|
Hej NG.
Jeg har en database med data og en form, hvorpå jeg har en DBGrid til
visning af data samt 4 Editbokse til indtastning af søgekriterier.
I eksemplet har jeg følgede editbokse: Fornavn, Efternavn, Adresse, Telefon.
Jeg har prøvet med følgende procedure
procedure TformMain.btnSoegClick(Sender: TObject);
begin
with dmDatabaseadgang.qryData do
begin
close;
sql.Clear;
sql.Add('select * from data where fornavn like :fornavn and efternavn
like :efternavn and adresse like :adresse and telefon like :telefon;
Params[0].AsString:= edtFornavn.Text + '%';
Params[1].AsString:= edtEfternavn.Text + '%';
Params[2].AsString:= edtAdresse.Text + '%';
Params[3].AsString:= edtAdresse.Text + '%';
open;
end
end;
Den virker - stort set. Det er kun småting, som gør, at den ikke fungerer
helt.
1. Hvis der er et felt, der er tomt, fx der ikke er noteret et
telefonnummer, så vises denne post ikke, når man søger. Fx hvis der søges på
ovennævnte søgestreng uden at indtaste noget i edotboksene, så kommer alle
poster frem - pånær poster, hvor en eller flere felter er tomme. (Fx Jens,
Jensen, , 22446688 eller Ole, Olesen, Storegade 10, ,)
2. Hvis jeg fx skriver "Fred" i edtFornavn og klikker på søg, så finder den
samtlige felter, der starter med "Fred", Fx "Frede", "Frederik" osv. Det er
ok. Men hvis jeg skriver "fred" så finder den ingen, idet der ikke er nogle
navne, der matcher lille "f" som begyndelsesbogstav. Hvordan får man
søgestrengen til ikke at tage højde for forskel på store og små bogstaver?
3. Lidt ligesom ovenstående. Her er problemet dog, at der ikke søges på
"fred" midt i et navn. Fx hvis personen nu hed "Alfred". Her indgår "fred"
men søgestrengen ovenfor søger kun efter data, der starter med "fred.
Hvordan kan det integreres?
| |
Brian Andersen \(www~ (22-02-2006)
| Kommentar Fra : Brian Andersen \(www~ |
Dato : 22-02-06 09:31 |
|
Du kunne prøve at tilføje UPPER rundt om Felt navnet og rundt om kriteriet.
Jeg ved dog ikke om Delphi er i stand til at fortolke SQL'et, da der også
står UPPER rundt om parameterne?
Jeg bemærker lige,at du søger på adresse informationer i telefonnumret *s*.
procedure TformMain.btnSoegClick(Sender: TObject);
begin
with dmDatabaseadgang.qryData do
begin
close;
sql.Clear;
sql.Add('select * from data where UPPER(fornavn) like UPPER(:fornavn)
and UPPER(efternavn) like UPPER(:efternavn) and UPPER(adresse) like
UPPER(:adresse) and UPPER(telefon) like UPPER(:telefon)');
Params[0].AsString:= edtFornavn.Text + '%';
Params[1].AsString:= edtEfternavn.Text + '%';
Params[2].AsString:= edtAdresse.Text + '%';
Params[3].AsString:= edtAdresse.Text + '%';
open;
end
end;
Hvis ikke dette dur, så skriv det som følgende:
Sql.Add(
Format(
'select * ' +
'from data ' +
'where UPPER(fornavn) like UPPER(%%%s%%) and UPPER(efternavn) like
UPPER(%%%s%%) and UPPER(adresse) like UPPER(%%%s%%) and UPPER(telefon) like
UPPER(%%%s%%)', [edtFornavn.Text, edtEfternavn.Text, edtAdresse.Text,
edtTelefon.Text]));
Ad 1.
Det er fordi du skal have nogle checks på. Du kan ikke generere dit SQL så
nemt. Du bliver nød til at tjekke om der er indtastet noget i dine felter.
Er der ikke indtastet noget i dine Edit bokse, så behøver du heller ikke
have dem med i SQL'et.
F.eks.:
if edtFornavn.Text <> '' then
FornavnStr := '%' + Fornavn.Text + '%' else
FornavnStr := '';
if edtEfternavn.Text <> '' then
EfternavnStr := '%' + Efternavn.Text + '%' else
EfternavnStr := '';
Sæt så det hele samme til sidst:
SQLStr := 'Select * From Data Where ';
if FornavnStr <> then
SQLStr := SQLStr + Format('UPPER(Fornavn) like (%%%s%%) ',
[edtFornavn.Text]));
if EfternavnStr <> then
SQLStr := SQLStr + Format('UPPER(Efternavn) like (%%%s%%) ',
[edtEfternavn.Text]));
Ad 2.
Jeg har tilføjet Upper.
Ad 3.
Som du nok har bemærket, så har jeg tilføjet et % foran dit kriterie.
/Brian
| |
Brian Andersen \(www~ (22-02-2006)
| Kommentar Fra : Brian Andersen \(www~ |
Dato : 22-02-06 09:51 |
|
> Sæt så det hele samme til sidst:
>
> SQLStr := 'Select * From Data Where ';
> if FornavnStr <> then
> SQLStr := SQLStr + Format('UPPER(Fornavn) like (%%%s%%) ',
> [edtFornavn.Text]));
> if EfternavnStr <> then
> SQLStr := SQLStr + Format('UPPER(Efternavn) like (%%%s%%) ',
> [edtEfternavn.Text]));
Jeg bemærker lige, at du kun skal skrive %s efter like. De øvrige %'er står
jo i den genererede tekst.
/Brian
| |
|
|