Toon posts:

[Delphi]Sorteren op letter in ADOTable

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer alle gegevens te sorteren waarvan de achternaam begint met een A. Alleen nu lukt dat alleen als ik de gehele naam opgeef. Bijvoorbeeld 'anders'. Als ik 'a*' pak dan neemt delphi hem niet. Hij laat dan niks zien. Ook geen fouten.
Weet iemand hoe ik dit op kan lossen.

procedure THoofdscherm.A(Sender: TObject);
begin
ADOTable1.Filtered := true;
ADOTable1.Filter:= 'achternaam =''' + TImage(Sender).Name+ '*''';
ADOTable1.First;
end;
end.

Als ik in plaats van TImage(Sender).Name gewoon een naam neerzet doet hij het wel, dus snap er niks van. Een sterretje (*) betekend toch dat alle karakters die er achter komen worden meegenomen? Zo is dit in SQL zelf ook.

Alvast bedankt.

[ Voor 6% gewijzigd door Verwijderd op 08-02-2004 16:11 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Vervang * eens voor een %; en in SQL moet je Like gebruiken. Geen idee of dit ook in delphi zo hoort.

[ Voor 67% gewijzigd door gorgi_19 op 08-02-2004 16:12 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 08 februari 2004 @ 16:12:
Vervang * eens voor een %; en in SQL moet je Like gebruiken. Geen idee of dit ook in delphi zo hoort.
Lukt niet, geeft errors, ik krijg een vermoeden dat SQL helemaal niet kan...hoe kan ik het anders oplossen? iemand een idee..

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja, het is *, maar soms wil % ook nog wel eens werken. En hoe ben je er zo zeker van dat het niet gewoon klopt? Ga eens debuggen en verzeker jezelf er van wat er in ADOTable1.Filter staat ook klopt met wat jij verwacht. En zet de Filtered eens op True nadat je het Filter zelf gezet hebt ipv ervoor.

We adore chaos because we like to restore order - M.C. Escher


  • Paul
  • Registratie: September 2000
  • Laatst online: 26-05 18:02
Je kunt ook een OnFilterRecord gebruiken :) Deze wordt echter wel voor iedere record in de db 1x aangeroepen, dus een beetje voorzichtig met de hoeveelheid werk die je erin zet :)
Delphi:
1
2
3
4
5
6
procedure ADOTable1OnFilterRecord(dataSet: TDataSet; var filtered: boolean);
var eersteLetter: char;
begin
  eersteLetter := dataSet.FieldByName('achternaam').AsString[1];
  filtered := (eersteLetter = 'a') or (eersteLetter = 'A');
end;

Ik ben niet helemaal zeker van de parameterlijst van die procedure, en of je er nu juist een true of false in moet zetten, maar dat weet de help wel :)

Je kunt ook mijn var er uit laten, maar ik weet niet hoe duur FieldByName.AsString is, en assignments kosten bijna niets :)

Als een variant conversion goedkoop genoeg is kun je ook dataSet['voornaam'] gebruiken, maar dan moet je controleren of de waarde geen NULL is, anders krijg je een 'variant type conversion' exception :) AsString heeft daar geen last van, die stuurt dan gewoon een lege string terug

[ Voor 12% gewijzigd door Paul op 08-02-2004 17:43 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Topicstarter
Het is me nog steeds niet gelukt, laatste oplossing werkt wel als ik alleen sorteer op de A (of een andere letter), maar ik wil met behulp van een button op alle letters kunnen sorteren.
Ik heb dus knoppen van A t/m Z, en wanneer ik hier op klik, moeten de records worden getoond waarvan de achternaam alleen met deze letter begint.

  • evol
  • Registratie: November 2000
  • Laatst online: 22:42

evol

hello world

Waarom zou een ADODataSet met als CommandText
SELECT * FROM TabelNaam WHERE Achternaam Like :Param1 OR Like :Param2
niet kunnen werken?
Param1 en 2 vul je met de gedrukte knop, bijv. a en A (en % erachter plakken denk ik)
Lijkt mij de makkelijkste oplossing :)

/final edit
ADOQuery mag ook ;)

[ Voor 32% gewijzigd door evol op 19-02-2004 18:43 ]

Move along people. Nothing to see here.


  • Boss
  • Registratie: September 1999
  • Laatst online: 06:28

Boss

+1 Overgewaardeerd

Als je op wildcards (*) wilt filteren moet je IS LIKE gebruiken ipv =.
Dus:
code:
1
ADOTable1.Filter:= 'achternaam is like''' + TImage(Sender).Name+ '*''';

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Verwijderd

Topicstarter
Hoi,

bedankt voor de snelle reacties.
IS LIKE en LIKE werken allebei niet, hij runt het programma wel goed maar als ik op de knop druk geeft een error aan dat de argumenten van het verkeerde type zijn of in conclict met elkaar.

De oplossing met de ADODataSet en CommandText werkt ook niet echt. Ik heb geen idee hoe ik Param1 en Param2 moet vullen.

De manier die ik dacht dat het moest.
Param1 : String;
en dan Param1 := 'a'; //onder de onclick achter de knop.
werkt niet...

  • Paul
  • Registratie: September 2000
  • Laatst online: 26-05 18:02
Wat voor zin heeft het toekennen aan een of andere var die je net zelf gedeclareerd hebt? een "var Param1: string" heeft TOTAAAAAL niets met die ADOTable1 van doen.

Een TADOTable heeft misschien wel een property params, al verwacht ik van niet (wel bij een T(ADO)Query), daar zou je hem in kunnen doen.

Als het met een filter werkt, okee, maar schijnbaar wil het niet, dus waarom het OnFilterRecord niet proberen? :Y) Daar heb ik je nog niet over gehoord namelijk.

ipv '' in je string kun je trouwens ook QuotedStr(s: string) gebruiken :) Is wat overzichtelijker denk ik.
Delphi:
1
2
3
4
5
6
procedure THoofdscherm.A(Sender: TObject);
begin
ADOTable1.Filtered := true;
ADOTable1.Filter:= 'achternaam =' + QuotedStr(TImage(Sender).Name+ '*');
ADOTable1.First;
end;


Euh... Zie ik het goed? Cast je hier de sender naar een TImage, en vraag je daar de nameproperty van op?
1) Waarom casten? Afaik heeft een TObject ook een Name property :)
2) Waarom de componentname van een TImage, als ik vragen mag? Probeer het eerst eens met een Edit1.Text, het probleem opdelen in deelstukken :) Wie weet (aan je doelstelling te horen weet ik dat vrij zeker :X ) is die componentname niet je bedoeling. Als dat wel zo is kun je er bijvoorbeeld nog een "Label1.Caption := ADOTable1.Filter;" tussenzetten :Y) (of loggen naar een bestand, of zelfs steppen met de IDE)...

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • evol
  • Registratie: November 2000
  • Laatst online: 22:42

evol

hello world

ADO en Filters is naar mijn ervaring niet bepaald snel te noemen.
De oplossing met een ADODataSet of ADOQuery met Parameters lijkt mij nog het makkelijkst.

Als SQL of CommandText property
SELECT * FROM TabelNaam WHERE Achternaam Like :Param1 OR Like :Param2

En dan als je je parameters wilt gaan vullen, bijv. iemand klikt op "a", dan doe je:
ADOQuery->Close();
ADOQuery->Parameters->ParamByName("Param1")->Value = "a";
ADOQuery->Parameters->ParamByName("Param2")->Value = "A";
ADOQuery->Open();

Lijkt mij dat je hiermee wel tot een oplossing kan komen.

Move along people. Nothing to see here.

Pagina: 1