11. marts 2000 - 22:59Der er
9 kommentarer og 1 løsning
ComboBox-søgning på to tabelfelter samtidig
Jeg har rodet mig ud i et projekt, jeg måske ikke helt er kvik nok til som nybegynder...! :o) I et program skal der være mulighed for at anføre to forskellige ansvarlige. Derfor har jeg oprettet to felter i tabellen, Ansvarlig1 og Ansvarlig2. I ComboBox skal man kunne vælge "Ansvarlig", og bagefter søge på et navn, og her kommer problemet... Kan man sætte den til at søge i begge felter, eller kan man lave det om til et enkelt felt (med komma-separering måske)?
Du kan beholde din nuværende tabel, hvis du søger med en SQL-query:
"Select * from tabelnavn where Ansvarlig1='Soegenavn%' or Ansvarlig2='Soegnavn%'"
Ved at tilføje '%' efter søgenavnet, bliver SvendHenrik også fundet, hvis du blot søger efter Svend! SQL er generelt altid en god ting at bruge, da du kan flere ting med dette, fremfor at bruge standard Ttable komponenter, og de dertil hørende kommandoer!
Tusind tak for hjælpen! Som nybegynder er jeg lige nødt til at være helt sikker på, at jeg forstår... Skal jeg gøre noget for at fortælle, at jeg bruger SQL? Min tabel er lavet i Paradox (hvis det gør en forskel...?).
Kan jeg kombinere et søgefelt med flere tabeller? Evt. ved at skrive din select-linie flere gange med forskelligt tabelnavn? (Det er samme felter, men i fire forskellige tabeller...)
Beklager at du ikke bare får pointene... Men det er meget rart lige at være helt sikker på at jeg forstår. Du skal nok få dem.
Jeg er ret ny i Delphi, og SQL ligger vist et par måneder væk endnu... :o)
Gipa>hvis både ans.1 og ans.2 er felter i samme tabel er det ikke sandsynlig at du har angivet dem begge som nøglefelter, og dermed har index på dem.
En mulighed er derfor at løbe hele registret igennem og kigge på de 2 felter i hver af de records du finder:
tabel1.first; while not tabel1.eof do begin if tabel1.fieldbyname('ansvarlig1').value = combobox1.text or tabel1.fieldbyname('ansvarlig2').value = combobox1.text then begin showmessage('Hurra ! Jeg fandt den'); break; end; table1.next; end;
eller hvis feltet "ansvarlig" er nøglefeltet i flere tabeller så brug f.eks.:
if tabel1.findkey([combobox1.text]) then begin showmessage('Hurra ! Jeg fandt den i table1'); end else begin if tabel2.findkey([combobox1.text]) then begin showmessage('Hurra ! Jeg fandt den i tabel2'); end; end;
Men som volstrup siger er det bedre med SQL da du kan finde records hurtigere selvom det du søger efter ikke er indexeret.
Jeg beklager at jeg ikke var præcis nok! Du placerer et sql-komponent på din form (på samme måde som med dit table-komponent), kaldet query_test. Dette bruger du på samme måde, som med dit table komponent, dvs. sammekæder det med en Herefter laver fx en knap med følgende kode:
with Query_test do begin close; sql.Clear; sql.add('Select * from tabelnavn'); sql.add('where Ansvarlig1="'+combobox1.text+'%"'); sql.add('or Ansvarlig2="'+combobox1.text+'%"'); open; end;
procedure TfmMainform.cboxProjektChange(Sender: TObject); begin with dmMM.taProjekter do begin IndexFieldNames := cboxProjekt.items[cboxProjekt.ItemIndex]; end;
Derefter inkrementalsøgning i søgefeltet:
procedure TfmMainform.edSogEfterChange(Sender: TObject); begin with dmMM.taProjekter do begin FindNearest([edSogEfter.text]); end;
Så nu skal jeg vel "bare" have den til at forstå, at hvis man vælger Ansvarlig i ComboBoxen, skal den søge i begge felter, og i alle fire tabeller?
Kunne jeg evt. lave noget if, then, else, med tabelnavnet, ovre på comboboxen? Eller...?
Undskyld, at jeg bliver ved med at afvise dine svar, men jeg er nødt til at forstå det helt... Jeg har lige skrevet ned, hvad jeg har kodet med de to felter. Når nu jeg ikke vil have en knap (pga inkrementalsøgningen), kan jeg måske fortælle min edSogEfterChange-procedure at den skal kigge i flere tabeller? Og/eller fortælle ComboBox-proceduren at feltet Ansvarlig skal findes i flere tabeller og flere felter...? Kan jeg det? (Er du gal, jeg er ude hvor jeg ikke kan bunde! Men det skal nok komme...) :o)
Komanndoen "tabel1.first" placere dig på første record i din tabel. Dernæst laver sjensen et loop hvor den bliver ved med at undersøge hvorvidt den har fundet posten. Hvis den finder posten så forlades loopet (med kommandoen "break") og findes den ikke hopper den videre til den næste record "table1.next". Dette loop blive den ved med at gennemløbe indtil der ikke er flere poster "while not tabel1.eof" (EOF = END OF FILE).
EOF bliver sat når du har læst den sidste record og så laver en "table1.next". Ligeledes har du også en "table1.bof" (BEGIN OF FILE) som bliver sat hvis du befinder dig i den første recods, og så laver en "table1.previous" (skift til foregående post).
En helt anden ting er at jeg personligt (til en hver tid) ville bruge en TQuery, da denne automatiske optimere ved at finde det index den skal bruge.
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.