[Delphi] zoekfunctie *

Pagina: 1
Acties:

  • Rrrr
  • Registratie: Oktober 2002
  • Laatst online: 27-05 16:15
Deze code werkt wel, alleen vindt hij maar de eerste naam uit onze tabel. Maar we willen graag dat hij alle namen uit de tabel pakt.

Dit is de code die we hebben gebruikt:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var 
  gevonden : boolean; 

procedure TZoeken.BitBtn1Click(Sender: TObject); 
begin 
gevonden := false; 
table1.first; 

while not table1.eof do begin 
   if pos(edit1.text,table1.fieldbyname('LAST_NAME').asstring) <> 0 then begin 
     gevonden := true; 
        hide; 
        Form6.ShowModal; 
        show; 
        table1.next; 
  end   ; 
  if not gevonden then 
    showmessage('Er zijn geen bestanden gevonden.'); 
    break; 
end; 


Heeft iemand misschien een idee (oplossing) om alle namen te zoeken uit de tabel.

Bij voorbaat dank

[ Voor 5% gewijzigd door curry684 op 09-01-2004 15:07 . Reden: rechte haken aub voor ubb ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-05 23:27

Creepy

Tactical Espionage Splatterer

Wat dacht je ervan om een query te gaan gebruiken?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 12:17
Leuk, zo'n stuk code hier planten, maar wat wil je eigenlijk? Welke tabel, wat staat er in edit1? Waarom wil je dat?

Om alvast vooruit te lopen op je doel, waarschijnlijk probeer je het op een zeer gare manier op te lossen. Een database is nou juist bedoeld om makkelijk te kunnen zoeken. Dan ga jij lekker even elk record vergelijken met de invoer?

Ik denk dat je eens goed moet gaan kijken of je geen query component nodig hebt. Andere mogelijkheden zijn filter, locate, findnearest.

[ Voor 70% gewijzigd door Pino op 09-01-2004 15:11 ]

"If you don't know where you are going, any road will take you there"


  • Pino
  • Registratie: Oktober 2001
  • Laatst online: 12:17
Gezien je vorige topic lijkt het me slim om een boek als "Mastering Delphi x" te kopen trouwens. Daar staan veel van dit soort zaken duidelijk in uitgelegd.

"If you don't know where you are going, any road will take you there"


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
Lees eerst bovengenoemde adviezen!

Maar intussen kan je gewoon met deze brakke code doorwerken.
Tip: Teken een PSD en kijk daarna naar de locatie van je end's, break en de next; Leer je daarnaast een coding-style aan die duidelijk leesbaar is.

Kijk nu nog eens naar je code (beter ingesprongen) en vergelijk dat met je PSD.
Rrrr schreef op 09 januari 2004 @ 15:00:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var 
  gevonden : boolean; 

procedure TZoeken.BitBtn1Click(Sender: TObject); 
begin 
  gevonden := false; 
  table1.first; 

  while not table1.eof do
  begin 
    if pos(edit1.text,table1.fieldbyname('LAST_NAME').asstring) <> 0 then
    begin 
      gevonden := true; 
      hide; 
      Form6.ShowModal; 
      show; 
      table1.next; 
    end; 
    if not gevonden then 
      showmessage('Er zijn geen bestanden gevonden.'); 
    break; 
  end; 

end;


Heeft iemand misschien een idee (oplossing) om alle namen te zoeken uit de tabel.

Bij voorbaat dank

Verwijderd

Ik zou die break is weghalen, die hele lus van je ittereert maar maximaal 1x, in alle gevallen.

of je maakt van regel 19 t/m 21 het volgende:
Delphi:
1
2
3
4
5
if not gevonden then 
begin
   showmessage('blablah');
   break;
end;


netjes is het niet, maar zou wel moeten werken

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
Verwijderd schreef op 09 januari 2004 @ 15:57:
netjes is het niet, maar zou wel moeten werken
't Is niet netjes, en 't werkt niet. De controle bevindt zich binnen de lus, en na het eerste record zal er dus al gemeld worden, dat het niet gevonden is en wordt de lus verlaten.

[ Voor 61% gewijzigd door jvdmeer op 10-01-2004 00:38 ]


Verwijderd

jvdmeer schreef op 10 januari 2004 @ 00:37:
[...]


't Is niet netjes, en 't werkt niet. De controle bevindt zich binnen de lus, en na het eerste record zal er dus al gemeld worden, dat het niet gevonden is en wordt de lus verlaten.
oeps :) Klopt idd, maarja dit soort constructies kom je normaal gesproken ook niet meer tegen.

Nee, werkt wel, gevonden wordt toch omgezet zodra er een record wordt gevonden, dus dan komt ie niet bij die melding. Probleem is dat de kans zeer groot is dat de lus oneindig is, omdat gevonden nooit meer op False wordt gezet.

Zo zie je maar weer wat brakke code voor verwarring veroorzaakt.

[ Voor 32% gewijzigd door Verwijderd op 10-01-2004 00:51 ]


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 27-05 23:18

Delphi32

Heading for the gates of Eden

Gewoon een filter zetten op je table, dan hou je alleen de records over die je wilt hebben:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TZoeken.BitBtn1Click(Sender: TObject);
begin
  Table1.Filter := 'LastName like ' 
    + QuotedStr('%' + Edit1.Text + '%');
  Table1.Filtered := True;
  //nu heeft Table1 alleen nog de records beschikbaar 
  //waar LastName lijkt op de inhoud van Edit1.Text. 
  //Kan je vanalles mee doen (gridje tonen of zo)..
  //en als er geen records zijn die aan de zoekopdracht voldoen:
  if Table1.RecordCount = 0 then 
    ShowMessage('Er zijn geen bestanden gevonden.');
end;

Dit vereist natuurlijk wel dat je een TTable aan het gebruiken bent: die haalt standaard ongeveer alle benodigde data uit je tabel (en is daarmee hopeloos inefficient bij grote tabellen). Een TQuery gebruiken kan natuurlijk ook (is zeker een goeie optie) maar aangezien je die Table1 toch al hebt kan je hem net zo gemakkelijk filteren.

[ Voor 5% gewijzigd door Delphi32 op 10-01-2004 00:57 . Reden: Layout ]


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
Verwijderd schreef op 10 januari 2004 @ 00:41:
[...]


oeps :) Klopt idd, maarja dit soort constructies kom je normaal gesproken ook niet meer tegen.

Nee, werkt wel, gevonden wordt toch omgezet zodra er een record wordt gevonden, dus dan komt ie niet bij die melding. Probleem is dat de kans zeer groot is dat de lus oneindig is, omdat gevonden nooit meer op False wordt gezet.

Zo zie je maar weer wat brakke code voor verwarring veroorzaakt.
Leuk Ja/Nee-spelletje wordt dit... Want het werkt niet. er zijn 2 situatie's:
• Als het eerste record niet het juiste record is, dan wordt de instructie Table1.Next nooit aangeroepen. En dan komt het programma dus bij die 'Break' die de zoek lus onderbreekt.
• Als het eerste record wel het juiste record is, dan wordt de instructie Table1.Next aangeroepen. Vanaf nu geldt: Gevonden =True. En dan komt het programma dus nooit bij die 'Break' die de zoek lus onderbreekt. Maar daarnaast komt het programma ook nooit meer bij de 'Table1.next'.

De enige situatie waar de lus normaal wordt afgewerkt, is als alle records aan de voorwaarde voldoen. Maar in dat geval hoef je niet te zoeken ;)

Verwijderd

Kortom:
Gewenste functionaliteit van de code uitschrijven, oude code weg gooien, en even op nieuw maken. Voorkomt veel ellende in dit geval ;)

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 08:55
Of gebruik de functie Locate van een dataset.
Pagina: 1