Avatar billede koden12 Nybegynder
14. marts 2004 - 20:36 Der er 8 kommentarer og
1 løsning

En Super søgning søges

Hvad jeg har brug for er en søgning
med delphi ADO  ..
Jeg kender nogle stykker de er gode.
Men jeg mangler en der gennem en Edit1.text
kan søge på alle der ligner og når den har
fundet det viser det i en i en DBGrip eller
finder det nummer som har den mest rigtige
løsning. (eller i noget andet)
Der har det kniber er at have en knap med
gå til næste altså en knap som efter at have
fundet den første som er lig med eller som ligner mest
kan gennemgå resten af Access databasen for dem
som ligger nær søgeordet.
Altså en "find næste " som er lig med søgeordet i
Edit1.text.
Og således forsætte indtil der ikke er flere.
Derfter når der ikke er flere en besked fx på
en Label.text  "der er ikke flere der macher".
Kan det laves ?
Har nogle sådan en liggende ?
Kan jeg låne/arve den ?

VH
koden12
Avatar billede hrc Mester
14. marts 2004 - 23:36 #1
Jeg kunne jo foreslå at du legede lidt med filtre, men det vil jeg ikke, idet:

1. De er dårlige mht. ydelse
2. Synes det er usmart at vise færre og færre records i listen, mens jeg godt kan lide at stave mig frem til det søgte. Ser dumt ud.
3. Rettede felter "pludselig" forsvinder fra listen når de ikke længere opfylder filteret.
4. De virker de ikke her hos mig!

Noget jeg har brugt tidligere er denne enkelte linie:

  ADOTable1.Locate('Name',eName.Text,[loCaseInsensitive, loPartialKey]);

Her kan man stave sig frem til det man søger. Skriver du 'b' i eName så stiller cursoren sig på første forekomst af navne der begynder med 'b' eller 'B'.

Husk, at sætte IndexFieldName til 'Name' medmindre du allerede har et passende indeks som at kan sætte.


Appropos det at stave sig frem (og det er en venlig henstilling). Det tog mig nok 5 minutter at forstå dit spørgsmål og jeg er ikke nogen dårlig læser. Næste gang du lægger et spørgsmål så læs det igennem og sæt nogle tegn. Jeg har ikke noget imod dårlige stavere, mens det er en anden sag med de sjuskede (mon jeg vækker en moderator?)!
Avatar billede hrc Mester
15. marts 2004 - 00:10 #2
Alternativt kan du lave en SQL-query som nedenfor: Jeg har en OnKeyPress til at registrere når brugeren er færdig med at skrive sin filtertekst i eName og når denne trykker VK_RETURN (enter), så kører jeg scriptet i DoQuery.


procedure TfrmMain.eNameKeyPress(Sender: TObject; var Key: Char);
begin
  if ord(Key) = VK_RETURN then
    DoQuery((Sender as TEdit).Text);
end;


procedure TfrmMain.DoQuery(aName: string);
begin
  // Dette er sat ind i ADOQuery.Sql:
  // select * from Names where name like :Name order by name

  Screen.Cursor := crHourglass;
  ADOQuery1.Close;
  try
    ADOQuery1.Parameters.ParamByName('Name').Value := aName + '%';
// debug:  Edit1.Text := ADOQuery1.SQL.Text;
  finally
    ADOQuery1.Open;
    Screen.Cursor := crDefault;
  end; // try
end;
Avatar billede hrc Mester
15. marts 2004 - 00:13 #3
Det sidste eksempel er velfungerende men så langsomt, at man ikke bør lade det køre via en TEdit.OnChange event. Man bør vente til brugeren eksempelvis trykker return.
Avatar billede koden12 Nybegynder
15. marts 2004 - 00:32 #4
Jeg håber bestemt ikke du har fået vækket noget..
debug ? hvad står det for ?
Jeg beklager teksten, men det er svært at forklare..
Den skal da helt klart prøves..

VH
koden12
Avatar billede hrc Mester
15. marts 2004 - 01:06 #5
Hej Koden12 - havde lidt problemer med at huske hvordan parametre blev angivet i en SQL-sætning. Pludselig virkede det og så kommenterede jeg den debuglinien ud igen. Skrev faktisk "Debug: " for din skyld, men var i tvivl om det forvirrede.

Jeg kan simpelthen ikke få filtre til at virke. Jvf. hjælpetekster ser løsningen således ud:

  ADOTable1.Filter := 'Name = ' + QuotedStr(eName.Text + '*');
  ADOTable1.Filtered := true;

Det virker bare ikke. Har prøvet med '%' (i stedet for '*') som man bruger i SQL-databaser men det dur ikke. Har prøvet helt uden, for den burde i det mindste skrive eet navn i min database hvis jeg skriver det fuldt ud.

Mistænker at det kun er BDE-tabeller at filtre virker.

Af ovennævnte grunde vil jeg aldrig selv bruge filtre, men det ser ud til at det er hvad du mest leder efter.
Avatar billede koden12 Nybegynder
15. marts 2004 - 10:46 #6
Hej HRC
Tak for dine mange forsøg... Jeg må med skam melde at jeg ikke har fået det testet endnu. (hvade ikke forventet at du var så hurtig : )
Jeg havde i sin tid jo en i VB jeg var glad for og som var kæmpe god..
Den vedlægger jeg her :

***********

Private Sub Command1_Click()


Data1.Recordset.FindFirst _
"varenummer LIKE '*" & Txtfravare & "*'"

If Data1.Recordset("varenummer") = Txtfravare.Text Then
List1.AddItem (Txtfravare.Text)
Data1.Recordset.MoveNext
Else
Label15.Caption = "findes ikke"

End If


End Sub

********

Måske kan den "omskrives" den virker , det er helt sikkert og med din hjerne
kan du måske udlede noget af det..

Jeg beklager jeg ikke er bedre...

VH
koden12
Avatar billede koden12 Nybegynder
15. marts 2004 - 15:05 #7
Jeg må indrømme jeg ikke fatter den... nu da jeg har testet ?

Ordet :
procedure TfrmMain.DoQuery(aName: string);

En sådan har jeg ikke på min Delphi..

Jeg ved heller ikke hvor Query skal sættes ind..

Ej hller forstår jeg hvad aName er og hvad eName er ?

Jeg har forsøgt at sætte det ind, men jeg kan ikke ..

VH
koden12
Avatar billede koden12 Nybegynder
15. marts 2004 - 15:47 #8
HRC

Kan det laves sådan at når man trukker backspace (ved ikke hvad det hedder
på Delphisk)  så går tabellen tilbage igen, evt finder noget nærmere eller
bare helt i toppen..

VH
koden12
Avatar billede hrc Mester
16. marts 2004 - 01:38 #9
DoQuery er bare en procedure jeg har stoppet ind i formen (frmMain):

TfrmMain = class(TForm)
private
  procedure DoQuery ...

Det letteste er vel at bruge følgende kode i eName's OnChange event:

procedure TfrmMain.NameOnChange(Owner : TObject);
begin
  // ADOTable1.First; // Er ikke helt klar over om linien er nødvendig - test.
  ADOTable1.Locate('Name',eName.Text,[loCaseInsensitive, loPartialKey]);
end;

Jeg synes ikke det er kønt, men tror på den anden side at det løser din opgave med en rimelig ydelse.
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