18. november 2006 - 17:11Der er
7 kommentarer og 1 løsning
søg i database
Hej eksperter...
jeg er i gang med at lave et udvidet film kartotek hvor jeg gerne vil have en søge function...
den skal fungere sådan her.
jeg har en editbox og en button og et DBGrid...
det jeg skriver i min edit skal komme frem i min DBGrid. men skal først komme når jeg trykker på min knap. men hvis der ikke er nogle forekomster i min database med det gældende navn skal jeg have en messagebox frem hvor der står at det du har søgt på ikke findes i databasen...
ved ikke om jeg har beskrevet det godt nok ellers må i lige komme med nogle flere spørgsmål...
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Hvis du vil have lidt mere kode så noget i denne stil:
procedure OnButtonClick(Sender : TObject); begin Kør SQL if sqltable.IsEmpty then Application.MessageBox('Noget tekst',kan ikke huske flere parms) else noget andet.. end;
Men jeg plejer nu at dele det der søges på op, dvs. søges der på Huset på øen så søger jeg på de 3 ord for sig og ikke på hele sætningen. Jeg laver så en procedure der opbygger en sql sætning. Her er en som søger i et bog kartotek.
function GetBogerSearch(tekst : string) : string; var StringList : TStringList; i : integer; begin stringList:=TStringList.Create; result:=''; ExtractStrings([#32, ',', ';', '.', '-'],[],pchar(tekst),StringList); for i:=0 to StringList.Count-1 do begin StringList[i]:='%'+StringList[i]+'%'; if i=0 then result:='WHERE ' else result:=result+' AND '; result:=result+'( (boger.titel LIKE '+QuotedStr(StringList[i])+')'; result:=result+' OR (forfatter.NavnForfatter LIKE '+QuotedStr(StringList[i])+')'; result:=result+' OR (forlag.NavnForlag LIKE '+QuotedStr(StringList[i])+')'; result:=result+' OR (boger.UdgivetAar LIKE '+QuotedStr(StringList[i])+')'; result:=result+' OR (boger.Diverse LIKE '+QuotedStr(StringList[i])+') )'; end; StringList.Free; end;
--------
den kaldes så på denne måde:
Data.SQL.Clear; Data.SQL.Add('SELECT * from (boger'); Data.SQL.Add('LEFT JOIN forfatter ON boger.forfatter = forfatter.idnrForfatter)'); Data.SQL.Add('LEFT JOIN forlag ON boger.forlag = forlag.idnrForlag');
Data.SQL.Add(GetBogerSearch(tekst));
Data.SQL.Add('ORDER BY forfatter.NavnForfatter LIMIT 200');
Dvs. når jeg søger på "Huset på øen" så opbygges der en SQL som denne:
SELECT * from (boger LEFT JOIN forfatter ON boger.forfatter = forfatter.idnrForfatter) LEFT JOIN forlag ON boger.forlag = forlag.idnrForlag WHERE ( (boger.titel LIKE '%huset%') OR (forfatter.NavnForfatter LIKE '%huset%') OR (forlag.NavnForlag LIKE '%huset%') OR (boger.UdgivetAar LIKE '%huset%') OR (boger.Diverse LIKE '%huset%') ) AND ( (boger.titel LIKE '%på%') OR (forfatter.NavnForfatter LIKE '%på%') OR (forlag.NavnForlag LIKE '%på%') OR (boger.UdgivetAar LIKE '%på%') OR (boger.Diverse LIKE '%på%') ) AND ( (boger.titel LIKE '%øen%') OR (forfatter.NavnForfatter LIKE '%øen%') OR (forlag.NavnForlag LIKE '%øen%') OR (boger.UdgivetAar LIKE '%øen%') OR (boger.Diverse LIKE '%øen%') ) ORDER BY forfatter.NavnForfatter LIMIT 200
På den måde er det ligemeget om man søger på "Huset på øen" eller på "øen på huset" eller kun på "Huset øen" så vil den i alle tilfælde finde posterne.
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.