Avatar billede gipa Nybegynder
18. januar 2001 - 16:25 Der er 27 kommentarer og
2 løsninger

Søgning der skal vises i DBGrid

Jeg har lavet en paradox-tabel, blandt andet med et kategori-felt.
Nu skal jeg bruge en combobox eller lignende, hvor folk kan vælge en kategori. Så skal DBGrid\'en vise en liste over alt hvad der er i den kategori. Bagefter skal man kunne nulstille, så hele tabellen igen vises i DBGrid\'en.

Umiddelbart er det så simpelt, at det ikke er med i nogen af mine bøger, eller kan findes på nettet... (Og eksperten.dk\'s søgefunktion er forkølet, så der er ingen hjælp at hente denne gang.)

Men hvor svært kan det være?!!
Avatar billede Slettet bruger
18. januar 2001 - 22:13 #1
Jeg har en component der kan det du søger ! tror jeg nok den hedder
DBFinders

Freeware components  and source code for 32-bit Delphi by Deborah Pate
Version 1.81, May 1999

men hvor jeg har den fra ved jeg ikke, måske andre kan hjælpe udfra ovenstående.
Ellers kan jeg sende dig den. Den fylder ca 38 Kb

Mail mig bermann@email.dk

~ibtage~
Avatar billede tknudsen Nybegynder
19. januar 2001 - 09:05 #2
du kan bruge en TTable komponent til at filtrere felter fra din tabel.

DBGrideet skal så pege på den TTable (det gør det nok allerede :)

I TTable kan du sætte TTable.Filter := TCombo.Text. Derefter skal TTable.Filtered sættes til true.
Avatar billede tknudsen Nybegynder
19. januar 2001 - 09:06 #3
det er ikke helt korrekt det jeg lige har skrevet...

fileteret skal sføli være:

TTable.Filter := \'kategori = \'+TCombo.Text;
Avatar billede tknudsen Nybegynder
19. januar 2001 - 09:08 #4
I filteret kan du bruge wildcards som ? og *

så TTAble.Filter := \'kategori = \'+TCombo.Text+\'*\';

vil give alle kategorier, der starter med hvad der står i combo boxen...
Avatar billede tknudsen Nybegynder
19. januar 2001 - 09:13 #5
Du kan fjerne filteret ved at sætte TTable.Filtered til false...
Avatar billede gipa Nybegynder
19. januar 2001 - 10:21 #6
ibtage - Tak, det kan være jeg vender tilbage vedr. komponenten. Men jeg må lige prøve om jeg kan klare det uden...

tknudsen - Også tak til dig. Umiddelbart virkede det du skrev, ligetil. Meeeen det driller lidt, så jeg håber, at du vil bruge tid på at uddybe lidt? Jeg har i forvejen en table, der peger på grid\'en, så alt indholdet i tabellen vises i grid\'en. Det er bare den jeg skal rette i, ikke? Når jeg sætter filter på, må det næsten blive ved at brugeren klikker på en knap, for der skal jo ikke være filter på hele tiden... Derfor går jeg ud fra at det du skriver, skal skrives i koden bag en onClick. Meeen det virker ikke.
Hvis man for eksempel vælger kategorien telefoner og så klikker på Søg-knappen, får man at vide at der ikke er nogen fields der hedder telefoner. Der er flere poster i tabellen der hedder telefoner (under kategori), men jeg er ikke sikker på, at den søger i det felt der hedder kategori?

Jeg kiggede lige i hjælp, og der fandt jeg blandt andet følgende sætning efter en forklaring om hvordan filter virker: \"Field comparisons are not supported against local tables (Paradox, dBASE, Access, FoxPro).\"
Er det der mit problem ligger? Eller er jeg bare ikke særlig god til at fortælle den at den skal søge i det bestemte felt?
Hjææææææælp!!

:o)

Avatar billede tknudsen Nybegynder
19. januar 2001 - 10:34 #7
Felter (fields :-) er kollone navne i en tabel.

Hvis du vil søge efter telefoner i feltet \'kategori\' skal du i filter strengen skrive:

\'kategori = telefoner\';

eks:

(t1 er en TTable, cb1 er en TComboBox og dbg1 er et TDBGrid)
// filtrerer data ud fra kategori feltet
procedure TMainForm.c1Change(Sender: TObject);
begin
  t1.Filter := \'kategori = \'+c1.Text;
  t1.Filtered := true;
end;

// fjerner filter
procedure TMainForm.Button1Click(Sender: TObject);
begin
  t1.Filtered := false;
end;


der er sføli mange måder at fjerne filteret på - evt kan du tilføje en tekst i din combobox og så i onChange eventen spørge på c1.text:

procedure TMainForm.c1Change(Sender: TObject);
begin
  if c1.Text <> \'Fjern filter\' then
  begin
    t1.Filter := \'kategori = \'+c1.Text;
    t1.Filtered := true;
  end
  else
    t1.Filterede := false;
end;

Avatar billede tknudsen Nybegynder
19. januar 2001 - 10:40 #8
ehh - men jeg bruger vist ikke den dbg1 i ekseplerne - hehehe - sorry

men det er jo fordi den selv opdaterer når filteret sættes eller fjernes
Avatar billede gipa Nybegynder
19. januar 2001 - 11:01 #9
tknudsen - Det hjalp på forståelsen med din 2. forklaring. Jeg forstod princippet i forvejen, men var ikke helt klar over hvad der skulle skrives i kode, og hvad der skulle rettes til i Object Inspectoren... Det hjalp, tak!
Meeeen den brokker sig stadig...! Den bliver ved med at fortælle mig at \"Field \'Telefoner\' not found\".
Jeg synes ellers at jeg har forklaret den at den skal lede efter poster i kolonnen \'Kategori\', men den er måske lidt langsom i opfattelsen...?  ;o)

Kan du regne ud, hvad problemet er?
Avatar billede gipa Nybegynder
19. januar 2001 - 11:04 #10
Så du selv kan se, at jeg ikke er fuld...
Jeg har skrevet nedenstående:

procedure TMVarelager.SoegCBoxChange(Sender: TObject);
begin
        VarelagerTable.Filter := \'Kategori = \'+SoegCBox.Text;
        VarelagerTable.Filtered := True;
end;


Kan du se fejlen...?

Avatar billede delphi Nybegynder
19. januar 2001 - 12:32 #11
Fejlen er nok følgende:

Linien:

  t1.Filter := \'kategori = \'+c1.Text;

Kan oversættes til:
  Sæt et filer således at der kun vises records hvor indholdet af kolonnen med navnet kategori skal være lig med en kolonne, hvis navn kan findes i c1.text.

Hvis der så står \'telefoner\' i c1.text, så giver det problemer, idet der ikke er en kolonne med navnet telefoner.
Det du vil ha\' er egentligt et filter der siger:

  Sæt et filer således at der kun vises records hvor indholdet af kolonnen med navnet kategori skal være lig med DEN TEKST STRENG, hvis INDHOLD kan findes i c1.text.

Dette gøres med:
  t1.Filter := \'kategori = \"\'+c1.Text+\'\"\';

(Du skal muligvis bruge \'-tegn i stedet for \"-tegn...prøv selv.)

Hvis det virker, så giv mig 1 point og resten til tknudsen - det er hans ide.

Delphi


Avatar billede delphi Nybegynder
19. januar 2001 - 12:35 #12
filer er se\'følig filTer.  Jeg har vist et dårligt tastatur, der er fuld af fjel ;)

Delphi
Avatar billede gipa Nybegynder
19. januar 2001 - 13:11 #13
delphi -
VarelagerTable.Filter := \'Kategori = \'\'+SoegCBox.Text+\';
giver fejlen: \"Unterminated string constant\" når jeg afprøver søgedelen af programmet.

VarelagerTable.Filter := \'Kategori = \'\"+SoegCBox.Text+\";
giver fejlen: \"Illegal character in input file\" når jeg kompilerer.

Et ekstra \' til sidst, ligesom du har skrevet,
altså:
VarelagerTable.Filter := \'Kategori = \'\'+SoegCBox.Text+\'\';
giver fejlen: \"Unterminated string\" når jeg kompilerer.

En anden ting jeg ikke forstår: Hvordan fortæller det ekstra + tilsidst, at det handler om tekststrengens indhold?

... Øøhh... hjælp?

Avatar billede delphi Nybegynder
19. januar 2001 - 13:21 #14
Se lige en gang til hvad jeg skrev:

> t1.Filter := \'kategori = \"\'+c1.Text+\'\"\';

(Cut\'n\'paste det over i Delphi, så er det nemmere at se...)

Det jeg gør er at samle tre strenge til en:
Første streng: \'kategori = \"\'
Anden streng : c1.Text
Tredie streng: \'\"\'

Første streng består først af navnet på en kolonne.  Ordet kategori står ikke i \"-tegn (populært kaldet dylpher (ph læses som f) her på egnen).  Dette betyder at database enginen læser ordet som et kolonne navn.  Anden del af strengen er et lighedtegn.  Tredie del er et \"-tegn, altså en dylph.
Anden streng er indholdet af en textbox, combobox eller hvad ved jeg.  Antag at der står ordet telefoner i denne component.
Tredie streng er blot en afsluttende dylph.

Resultatet af denne sammenlægning er altså: (Forudsat altså der står telefoner i c1)

t1.Filter := \'kategori = \"telefoner\"\'

Prøv evt. at cutte den linie ind i din kode istedet for.

Kan du nu se forskellen på dette, altså:

t1.Filter := \'kategori = \"telefoner\"\'

istedet for linien

t1.Filter := \'kategori = telefoner\'

som vil være resultatet af tknudsens øvelser??

Delphi

Avatar billede delphi Nybegynder
19. januar 2001 - 13:25 #15
Eksperten har altså et gevaltigt hadikap, når det drejer sig om at skrive \'-tegn og \"-tegn!!  Fx. kan man ikke skrive to efterfølgende \'-tegn, idet Eksperten sletter det ene af dem.  Se selv: nu skriver jeg to \'-tegn (apostroffer): \'\'

Ser du teksten \", så kan du altså gå ud fra at der ikke er tale om to apostroffer, men om en dylph (også kaldet gåseøjne af åndeligt mindrebemidlede og andre alternativt begavede personligheder).

Delphi

PS: God weekend, jeg smutter om 20 min.
Avatar billede delphi Nybegynder
19. januar 2001 - 13:26 #16
Nå, det problem er vist blevet fixet....
Avatar billede gipa Nybegynder
19. januar 2001 - 14:37 #17
Der er stadig et lille problem med \' og \", for man kan heller ikke se om der er lavet 1 \" eller to \'...

Og tak for den søde bemærkning om min alternative begavelse...!!  ;o)
(Ups, der røbede jeg vist mig selv...) Hehe

Jeg forstod en del mere, da jeg copy/pastede... Men Delphi vil stadig ikke æde \"-tegnene. Den skriver: Invalid filter expression character: \"\".
Avatar billede Slettet bruger
20. januar 2001 - 21:23 #18
>delphi> Kan problemet med \'apostrof og \" anførselstegn på EXPERTEN ikke løses hvis man skriver mellemrum mellem apostrof som her \' \'
Avatar billede delphi Nybegynder
23. januar 2001 - 08:59 #19
Så er jeg tilbage fra weekenden.  Tre dags weekender er fede...

>...for man kan heller ikke se om der er lavet 1 \" eller to \'...

Jo, prøv at markere texten med musen.  Der kan du se om du kan markere et \"-tegn eller to \'-tegn.


>...ikke løses hvis man skriver mellemrum mellem apostrof som her \' \'

Nix. 

Hvis du laver følgende:

  ShowMessage(\'Det er hans hund\');

Vil du se texten: Det er hans hund

Hvis du istedet ønsker texten: Det er Hans\' hund

og derfor skriver:

  ShowMessage(\'Det er Hans\' hund\');

så vil Delphi Compileren brokke sig (noget med ikka afslørede strenge eller måske noget med en identifier expected.. prøv selv).

Problemet er at Delphi i det sidste eksempel ser: Det er Hans
som en selvstændig og afsluttet streng.  Derefter kommer ordet hund, idet mellemrummet ses som et whitespace og derfor droppes.  Ordet hund læses som navnet på en kommando (identifier eller procedurenavn) - og da denne ikke er oprettet er der tale om en fejl.

I Dlphi bliver strenge altså omsluttet af \'-chars.  Hvad nu hvis man vil skrive en \'-char som en del af sin streng? - så skriver man bare to! Delphi skriver to \'-chars i streng som et enkelt. I sidste eksempel bliver kommandoen altså:

  ShowMessage(\'Det er Hans\'\' hund\');

(Der er altså to \'-tegn efter Hans - men om Experten vil skrive det rigtigt er en anden sag!)

Outputtet bliver nu: Det er Hans\' hund.

En streng der kun indeholder et \'-tegn bliver således: \'\'\'\' (fire \'-tegn på stribe)
Fx: Label1.Caption := \'\'\'\';  // (fire \'-tegn på stribe)

En tom streng er iøvrigt to \'-tegn efter hinanden: Label1.Caption := \'\';

>Den skriver: Invalid filter expression character: \"\".

Det er fordi, som jeg skrev tidligere, at der ikke skal bruges apostrof, men et \'-tegn.  Fx. er følgende et valid filter (afprøvet):

CustNo = \'1351\'

I dit eksempel bliver koden så:

t1.Filter := \'kategori = \'\'\'+c1.Text+\'\'\'\';


Delphi

PS: Hvis Jens skal gøres glad, ændrer du alle forekomster af ordet hund til hest...
Avatar billede delphi Nybegynder
23. januar 2001 - 09:01 #20
>ikka afslørede

= ikke afsluttede

(Jeg skal altså snart ha\' et nyt tastatur...)
Avatar billede gipa Nybegynder
23. januar 2001 - 13:26 #21
Delphi - JUBLE!! Det virker!
Forskellen er, at første gang du skrev, skrev du: t1.Filter := \'kategori = \"\'+c1.Text+\'\"\';
og anden gang skrev du:
t1.Filter := \'kategori = \'\'\'+c1.Text+\'\'\'\';

(Man kan se forskellen når det bliver copy/pastet til Delphi...)

Sidste gang var lykkens gang...  ;o)

Tusind tak for hjælpen, alle sammen.
Avatar billede delphi Nybegynder
23. januar 2001 - 13:28 #22
Fint, det er derfor vi er her.  Luk spørgsmålet og stil et nyt.


Delphi
Avatar billede gipa Nybegynder
23. januar 2001 - 13:31 #23
Det var da skægt... Prøvede at give tknudsen 20 point og delphi 30 point, men det endte med at blive 25 til tknudsen og 5 til delphi...
Kan man ikke uddele flere point end man havde sat på spørgsmålet til at starte med...? Man har jo tit lyst til at belønne flere der har hjulpet. (Og hvad kan de bruge det til hvis de hver får 10 skaldede point...)

Nå, hvis du vil have flere point, Delphi, så må du endelig sige til. Jeg deler gerne ud som tak for den gode hjælp! (Men gider ikke oprette spørgsmål for at give dig point hvis du er ligeglad...)
Avatar billede delphi Nybegynder
23. januar 2001 - 13:33 #24
Jeg er ærligt talt ligeglad.
Ellers tak.

Peter
Avatar billede gipa Nybegynder
23. januar 2001 - 13:58 #25
Ok. Du må få lidt ekstra en anden gang...  :o)

Men tusind tak for hjælpen!

Rie
Avatar billede delphi Nybegynder
23. januar 2001 - 14:00 #26
Rie.... hmm... Jeg kendte engang en pige der hed Rie i Sønderborg.  Hun var nu mere til programmøre end programering.....  Det er forresten noget i retning af 10 år siden!

Peter
Avatar billede gipa Nybegynder
23. januar 2001 - 14:07 #27
Hmmm... Mere til programmører end til programmering... Kan man ikke få begge dele, tænker jeg?

;o)

Rie.
Avatar billede delphi Nybegynder
23. januar 2001 - 14:11 #28
Jo da... Desværre er det nok nemmere at finde programøre der kan programere (!) end det er at finde piger der er til det hele.

;(

Delphi

(Det her skal vist fortsætte pr. email hvis det ikke skal blive for plat for alle andre brugere af Eksperten...)
Avatar billede gipa Nybegynder
23. januar 2001 - 16:17 #29
På den anden side får jeg intet lavet, hvis jeg først giver mig i kast med hygge-emails... Jeg skal sådan set forestille at være på arbejde!  :o)

Men vi kan fortsætte en anden gang. Mit næste spørgsmål er alligevel lige på trapperne...
(som altid... ;o)

Så vi snakkes.

Rie.
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