Avatar billede gipa Nybegynder
11. marts 2000 - 22:59 Der 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)?

Avatar billede volstrup Nybegynder
12. marts 2000 - 00:23 #1
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!

mvh Jacob Volstrup
Avatar billede gipa Nybegynder
12. marts 2000 - 11:45 #2
Hej Jacob,

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)

Hilsen Rie (Gipa)

Avatar billede sjensen Nybegynder
12. marts 2000 - 11:56 #3
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.
Avatar billede gipa Nybegynder
12. marts 2000 - 12:10 #4
Hej sjensen,

Tak skal du have.
Ansvarlig-felterne er ikke nøglefelter, men de er indekseret (secondary index).

Vil du være sød at forklare:
tabel1.first;
while not tabel1.eof do

Den fangede jeg ikke helt...
Resten er jeg med på. Tusind tak.

Point til dig også, jeg opretter lige et ekstra"spørgsmål" med point til dig, når jeg er færdig med at blive klog på det her.

Hilsen Rie (Gipa)
Avatar billede volstrup Nybegynder
12. marts 2000 - 12:40 #5
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;

Dette skulle gerne virke!

Mvh Jacob Volstrup
Avatar billede gipa Nybegynder
12. marts 2000 - 12:48 #6
Indtil videre har jeg skrevet:

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...?
Avatar billede gipa Nybegynder
12. marts 2000 - 13:04 #7
Hej Jacob,

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)

Hilsen Rie.
Avatar billede volstrup Nybegynder
12. marts 2000 - 13:36 #8
I stedet for til en knap, sætter du det ind i combobox'ens OnChange event!

Mvh Jacob Volstrup
Avatar billede pellelil Nybegynder
12. marts 2000 - 15:18 #9
Det sjensen mener med, er ganske simpelt:

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.
Avatar billede gipa Nybegynder
12. marts 2000 - 20:09 #10
Tusind tak for hjælpen, alle sammen!

Jeg tror, problemet er løst.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester