19. december 2006 - 10:17Der er
10 kommentarer og 1 løsning
søgning
Hej eksperter. jeg er i gang med at lave en kartotek hvor jeg skal bruge en søgemaskine. men jeg har nu et problem med dette. for den skal kunne søge i to tabeller men hver for sig. så jeg har brugt nogle radiobuttons til at bestemme hvilken tabel den søger i. men kan ikke rigtig få den til at virke. håber i kan hjælpe mig. smider lige noget kode ind så i kan se hvad jeg har lavet. men lige inden da en beskrivelse af selve funktionen...
meningen er at når jeg skriver noget i mit søgefelt og vælger om det skal være dvd, vhs, musik. Så skal den åbne en dbgrid hvor det man har søgt på kommer frem. og findes det ikke det man søger på skal den ikke fortage sig noget. men trykker man på søg uden at skrive noget i feltet skal den komme med en besked om at du skal indtaste noget i søgefeltet.
nå men her kommer det kode jeg ville mene kunne bruges.
procedure TForm2.Button1Click(Sender: TObject); begin if radiobutton1.Checked then begin if Adotable1.Locate('titel', edit1.Text, [])=true then begin groupbox1.Visible:=true; dbgrid1.Visible:=true; dbgrid2.Visible:=false; end else showmessage('Der skal indtastes noget...'); end; begin if radiobutton2.Checked then begin if adotable2.Locate('titel', edit1.Text, [])=true then begin groupbox1.Visible:=true; dbgrid1.Visible:=false; dbgrid2.Visible:=true; end; end else showmessage('Der skal indstastes noget...'); end;
Kan man gøre sådan her så den kan søge i flere felter på en gang? og er det den rigtige måde jeg har lavet det på? Den kommer ikke fra med min dbgrid når jeg trykker på søg hvad har jeg da gjort galt?
procedure TForm2.Button1Click(Sender: TObject); begin if radiobutton1.Checked=true then begin ADOQuery1.Close; ADOQuery1.SQL.Text:= 'SELECT * FROM dvd WHERE titel, genre LIKE "%' + edit1.Text + '%"'; ADOQuery1.Open; end; if radiobutton2.Checked=true then begin ADOQuery1.Close; ADOQuery1.SQL.Text:= 'SELECT * FROM vhs WHERE titel, genre LIKE "%' + edit1.Text + '%"'; ADOQuery1.Open; end; end;
procedure TForm2.Button1Click(Sender: TObject); var DB : string; begin if radiobutton1.Checked=true then DB:='dvd' else if radiobutton2.Checked=true then DB:='vhs';
ADOQuery1.Close; ADOQuery1.SQL.Text:= 'SELECT * FROM '+DB+' WHERE titel, genre LIKE "%' + edit1.Text + '%"'; ADOQuery1.Open; end;
En Query bør ikke bestå af sammensatte strenge. Brug i stedet den indbyggede Params (i ado Parameters) og du slipper for mange problemer senere hen (såsom om du skal bruge " eller ' til strenge eller, ikke mindst, om en dato skal angives mm/dd/yyyy eller dd/mm/yyyy). Man bør heller ikke lave 'select * ... ', men explicit angive de felter der er brug for. Det er sløset og ineffektiv programmering (undskyld kroning, men det er det, ligesom at undlade at bruge parametre er det).
'SELECT * FROM Album WHERE titel like "%' + edit1.Text + '%"' and genre = ''CD''';
bør være
Query.SQL.Text := 'SELECT navn, laengde, udgivet, BARCode, antal, pris, stand FROM Album WHERE titel like %:titel% and genre = :genre';
with Query.ParamByName('titel') do begin DataType := ftString; Value := 'Orphans'; end;
with Query.ParamByName('genre') do begin DataType := ftInteger; AsInteger := 1; // 1 for CD, 2 for DVD, 3 for ... end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.