Toon posts:

[Delphi] Zoekfunctie voor database

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil maken dat er een DBGrid op Form1 staat, die laat alle artikelen zien die in de database staan.
Eronder zit een Edit veldje waar ik mijn zoek/trefwoord invul, en daarnaast zit een zoek knop.

Ik heb de volgende code:

procedure TForm1.Button1Click(Sender: TObject);
begin
if ADOTable1.Locate('ZOEKNAAM',Edit1.Text,[loPartialKey]) then
begin
edit2.Text := ADOTable1.FieldByName('CDARTIKEL').Text;
edit3.Text := ADOTable1.FieldByName('ZOEKNAAM').Text;
edit4.Text := ADOTable1.FieldByName('OMSCHR').Text;
end;
end;


Maar ik wil het zo maken, dat als ik nog een keer op Zoeken klik, dat hij dan het volgende artikel zoekt.

Ik heb van een kennis gehoord dat ik dat eventueel met een Query kan doen.
Ik heb dus een query toegevoegd.

Als code heb ik onder de knop zoeken:

procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOQuery1 do
begin
SQL.Clear;
SQL.Text := 'SELECT *' +
'FROM ARTIKELEN ' +
'WHERE ZOEKNAAM = ZOEKNAAM ';

Parameters.ParamByName('zoeknaam').Value := Edit1.Text;

try
Open;
except
on e:Exception do
ShowMessage('Het openen van de tabel is mislukt');
end;
end;
end;


Maar daarbij krijg ik de fout: Parameter: Zoeknaam not found.
Dus dat snap ik niet.

En mij lijkt het dat ik nog meer moet instellen enzo om het te laten werken als een zoekfunctie (of zie ik dat verkeerd?)?

Kan iemand mij helpen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Achter je * in je SELECT-clause mist een spatie. Daarnaast is WHERE zoeknaam = zoeknaam altijd true. Eén van beide zal denk ik een variabele moeten worden.

We hebben trouwens ook code-tags, dus waarom zo lastig doen met tables? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Ik ben een beginner, en ik moet nou voor een project van school een sofrware pakket schrijven.
Dus het is voormij allemaal redelijk nieuw.

Wat zijn code-tags?

Ik heb nou:

[/quote] with ADOQuery1 do
begin
SQL.Clear;
SQL.Text := 'SELECT * ' +
'FROM ARTIKELEN ' +
'WHERE ZOEKNAAM = Edit1.text ';

Parameters.ParamByName('zoeknaam').Value := Edit1.Text;
[quote]

Maar dan krijg ik nog steeds de zelfde fout.
De tabel heet trouwens ARTIKELEN, en het veld (kollom) heet ZOEKNAAM.

[ Voor 54% gewijzigd door Verwijderd op 03-08-2006 10:16 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Allereerst zet je nu letterlijk "Edit1.text" in je string, dat moet je niet hebben. Je wil de waarde van die variabele erin hebben, dus je zal het zaakje aan elkaar moeten plakken met een +. Daarnaast is het een tekstwaarde, dus moet je er quotes omheen zetten.
Delphi:
1
'WHERE zoeknaam = "' + Edit1.Text + '"';

Zoiets vermoed ik, al weet ik niet of je database engine blij is met dubbele quotes in plaats van enkele.

Verder: Hoe post je code? / Hoe gebruik je de code tag? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Rum
  • Registratie: Augustus 2002
  • Laatst online: 10-02 19:40

Rum

Als je parameters wilt gebruiken moet je de parameters "markeren" met een : .

Hier ff een voorbeeldje:

code:
1
2
3
  GetStateQuery.SQL.Clear;
  GetStateQuery.SQL.Add('SELECT * FROM ' + Language + ' WHERE StateName = :StateName');
  GetStateQuery.Parameters.ParamByName('StateName').Value := StateName;


Dus voor jou zou dit goed kunnen:

code:
1
2
3
4
5
6
7
8
with ADOQuery1 do
begin
SQL.Clear;
SQL.Text := 'SELECT * ' +
'FROM ARTIKELEN ' +
'WHERE ZOEKNAAM = :zoeknaam ';

Parameters.ParamByName('zoeknaam').Value := Edit1.Text;

[ Voor 27% gewijzigd door Rum op 03-08-2006 10:31 ]


Verwijderd

Topicstarter
Oke, ik krijg ondertussen geen foutmeldingen meer daardoor, bedankt Rum.

Maar hij zoekt nog niet. Maar daarvoor zul je ook nog wel een andere code nodig hebben....
Kunnen jullie mij helpen?

  • Rum
  • Registratie: Augustus 2002
  • Laatst online: 10-02 19:40

Rum

Je wilt dus de resultaten van de Query een voor een tonen, waarbij je elke keer dat je op de knop drukt het volgende record weergeeft.

Even uit het hoofd:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOQuery1 do
    begin
      if (isempty = true) or (eof = true) then
        begin
          active := false;
          SQL.Clear;
          SQL.Text := 'SELECT *' +
          'FROM ARTIKELEN ' +
          'WHERE ZOEKNAAM = :zoeknaam ';

          Parameters.ParamByName('zoeknaam').Value := Edit1.Text;

          try
            active := true;
            if isempty = false then First;
          except
            on e:Exception do
              ShowMessage('Het openen van de tabel is mislukt');
          end;
        end
      else
        begin
          if isempty = false then next;
        end;
      if isempty = false then
        begin
          edit2.Text := ADOQuery1.FieldByName('CDARTIKEL').Text;
          edit3.Text := ADOQuery1.FieldByName('ZOEKNAAM').Text;
          edit4.Text := ADOQuery1.FieldByName('OMSCHR').Text;
        end;
    end;
end;


Ik denk dat dit een heel eind moet komen...

  • Rum
  • Registratie: Augustus 2002
  • Laatst online: 10-02 19:40

Rum

Ik heb hem toch maar ff nagemaakt en het blijkt nog niet helemaal te werken. Het laatste record laat hij 2 maal zien... Je moet zelf maar ff uitzoeken waardoor dat komt.

edit:
De EOF wordt pas gezet na het laatste record. Daar had ik ff niet aangedacht. Je moet de (eof = true) in regel 5 vervangen door (recno = recordcount). Dan gaat het wel goed!

De code komt er dan dus zo uit te zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOQuery1 do
    begin
      if (isempty = true) or (recno = recordcount) then
        begin
          active := false;
          SQL.Clear;
          SQL.Text := 'SELECT *' +
          'FROM ARTIKELEN ' +
          'WHERE ZOEKNAAM = :zoeknaam ';

          Parameters.ParamByName('zoeknaam').Value := Edit1.Text;

          try
            active := true;
            if isempty = false then First;
          except
            on e:Exception do
              ShowMessage('Het openen van de tabel is mislukt');
          end;
        end
      else
        begin
          if isempty = false then next;
        end;
      if isempty = false then
        begin
          edit2.Text := ADOQuery1.FieldByName('CDARTIKEL').Text;
          edit3.Text := ADOQuery1.FieldByName('ZOEKNAAM').Text;
          edit4.Text := ADOQuery1.FieldByName('OMSCHR').Text;
        end;
    end;
end;

[ Voor 78% gewijzigd door Rum op 03-08-2006 12:26 ]


  • Depress
  • Registratie: Mei 2005
  • Laatst online: 12-02 13:20
Ik heb niet de code van Rum bekeken. Maar wat ik zou doen is alle resultaten opslaan in een lijst. Een variable op True zetten dat er resultaten zijn opgehaald. En die door lopen als de Variable true is.

Lijkt mij het makelijkste voor jouw probleem

Delphi:
1
2
3
4
while(ResultatenOver = True) do
begin
  edit1.text := resultaat;
end;

  • Rum
  • Registratie: Augustus 2002
  • Laatst online: 10-02 19:40

Rum

Ik zit er nu wel aan te denken dat mijn code nog niet in gaat op het feit dat als je de zoekterm veranderd, hij niet direct begint met opnieuw zoeken. Dat doet hij pas nadat hij alle zoekresultaten heeft getoond. Dit kun je oplossen door een extra boolean die aangeeft of de zoekterm veranderd is... Lijkt me simpel!

Verwijderd

Topicstarter
Hij geeft nu in ieder geval geen foutmeldingen meer (gelukkig).
Maar in het DBGrid laat hij niks zien (ik neem aan dat dat de bedoeling is?).

  • Ozzy
  • Registratie: April 2000
  • Laatst online: 11-02 21:32

Ozzy

omnia mutantur, nihil interit

Verwijderd schreef op donderdag 03 augustus 2006 @ 14:33:
Hij geeft nu in ieder geval geen foutmeldingen meer (gelukkig).
Maar in het DBGrid laat hij niks zien (ik neem aan dat dat de bedoeling is?).
Wat bedoel je met dat hij niets laat zien? Geen data? Of zie je niet dat hij naar de volgende gevonden record springt? Heb je de datasource die aan die tabel hangt wel aan het grid gekoppeld?

O dag schoonheid, dag schoonheid, dag schoonheid, dag, dag!


  • Rum
  • Registratie: Augustus 2002
  • Laatst online: 10-02 19:40

Rum

DBGrid heeft een property Datasource. Als je daar een datasource, met daar weer een adotable (oid), aan koppelt, zal de DBGrid de Data weergeven. Je zult dat wel allemaal zelf aan moeten geven.
Mag ik opmerken dat ik je in deze kwestie niet echt inventief vind?

Verwijderd

Topicstarter
Nou, de grid is idd verbonden aan de DataSource, maar nog laat hij niks zien.

  • Ozzy
  • Registratie: April 2000
  • Laatst online: 11-02 21:32

Ozzy

omnia mutantur, nihil interit

Verwijderd schreef op donderdag 03 augustus 2006 @ 15:39:
Nou, de grid is idd verbonden aan de DataSource, maar nog laat hij niks zien.
Is de table die gekoppeld is wel active? Door .open of Active := True;

[ Voor 5% gewijzigd door Ozzy op 03-08-2006 15:55 ]

O dag schoonheid, dag schoonheid, dag schoonheid, dag, dag!


Verwijderd

Topicstarter
Ja, die is actief.
Maar die code zou het normaal zo moeten doen?

Ik heb die hele code dus onder de knop Zoeken gezet.
Maar moet ik bij de ObjectInspector bij de Query niks bij SQL instellen ofzo?

  • Ozzy
  • Registratie: April 2000
  • Laatst online: 11-02 21:32

Ozzy

omnia mutantur, nihil interit

Verwijderd schreef op donderdag 03 augustus 2006 @ 17:07:
Ja, die is actief.
Maar die code zou het normaal zo moeten doen?

Ik heb die hele code dus onder de knop Zoeken gezet.
Maar moet ik bij de ObjectInspector bij de Query niks bij SQL instellen ofzo?
Dat wordt in Rum's voorbeeld gedaan op regel 8-11. Dat is de query die je hebt. Als je het resultaat van de query wil zien, dan moet je die query via een datasource aan de grid verbinden.

O dag schoonheid, dag schoonheid, dag schoonheid, dag, dag!


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:04

Creepy

Tactical Espionage Splatterer

Zie Creepy in "Probleem met ADOTable (Insert)". Dat geld ook voor hier uiteraard :)
Op deze manier zet GoT je software in elkaar en dat is natuurlijk niet de bedoeling ;)

"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

Pagina: 1