/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste