Avatar billede michael-schou Novice
23. juni 2009 - 11:06 Der er 24 kommentarer og
1 løsning

Problemer med søgning i ADOQuery

Jeg har en ADOQuery tilsluttet en ADOTabel (Selvfølgelig) og Datasource.

Den er igen tilknyttet et DBGrid.

Mit Edit1 felt bruger jeg til at søge efter poster i mit DBGrid
Koden ser sådan her ud :

procedure TForm2.Edit1Change(Sender: TObject);
Var
SearchString : String;
begin
  SearchString := AnsiUpperCase(Form2.Edit1.Text);
 
  Form2.ADOQuery1.SQL.Text := 'SELECT * from Navn WHERE (Navn)
  LIKE "%' + SearchString + '%"';
 
Form2.ADOQuery1.Open;
end;

Når jeg så skriver T f.eks så kommer alle de poster frem der starter med T o.s.v hvis jeg så laver en søgning på en post der ikke er der så opstår der en fejl jeg ikke lige helt kan finde en løsning på : " is not a valid integer value.

Den fejl opstår lige meget om jeg skriver tal eller bogstaver - Det skal jo være sådan at hvis der ikke er nogen poster på det jeg søger efter skal den bare ikke vise nogen poster i mit DBGrid.

Håber at jeg har gjort mig forståelig :-)

Tak på forhånd

Mvh.
//Michael.
Avatar billede hrc Mester
23. juni 2009 - 11:34 #1
Det kan godt bliver pænere kode:
1. Du giver ikke komponenterne fornuftige navne.
2. Din query er formateret via text. Det er meget pænere at bruger SQL.Add's, for dumper du til en fil kommer linjeskiftene med.
3. Parametrene formaters direkte. Brug ADOQuery1.Parameters.ParamByName('').Value hvor du kan.
4. Tabellen hedder det samme som felt-navnet. Det er en uskik der også kan give dig problemer.
5. Værst af alt er, at du refererer Form2 via dens globale variabel "Form2" inde i objektet. Det er en dødssynd (burde ikke oprettes automatisk af Delphi). Du har ingen garanti for at den peger på dit objekt. Den kan for den sags skyld sagtens være nil. Skal det være, bør du bruge "self".

Måske ligger det i at du skal erstatte " med ''.

procedure TForm2.Edit1Change(Sender: TObject);
var
  SearchString : String;
begin
  SearchString := AnsiUpperCase(Edit1.Text); // D2007
  // SearchString := UpperCase(Edit1.Text); // D2009

  ADOQuery1.Close;
  try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT *');
    ADOQuery1.SQL.Add('from Navn');
    if SearchString <> '' then
    begin
      ADOQuery1.SQL.Add('WHERE (Navn LIKE :navn)');
      ADOQuery1.Parameters.ParamByName('navn').Value := SearchString + '%';
    end;
  finally
    ADOQuery1.Open;
  end;
end;
Avatar billede hrc Mester
23. juni 2009 - 11:35 #2
Nåe ja, så henter du * fra tabellen. Det er altid en god idé at angive de felter man søger så båndbredden ikke optages af ting man ikke bruger til noget.
Avatar billede michael-schou Novice
23. juni 2009 - 12:48 #3
Hey hrc.

Jeg har testet din kode men den virker ikke efter hensigten søger man på T viser den kun 1 post og den skal jo vise alle poster der starter med T (f.eks).

Jeg har omdøbt min Tabel til : Opsk i stedet for Navn for du har ret det er noget sjusk :-)

Men jeg kan nu skrive alle tegen uden at få den fejl jeg oprindeligt fik.
Avatar billede hrc Mester
23. juni 2009 - 14:39 #4
Det værste punkt (som desværre er ret almindeligt) er dog 5'eren. Mage til problemer det kan give at debugge.

Et lille fif (tip): Hvis du bruger D2007+ kan du stille dig på navnet, eks. ADOQuery1 og trykke <shift-ctrl-e>. Så omdøber du alle steder hvor navnet bruges.

Er du sikker på der er flere records end det ene 'T%' du finder? Løsningen virker hos mig (i firmaets program). Prøv at slette din UpperCase. Den er vist ikke nødvendig. Hvad står der i SearchString når scriptet genereres?
Avatar billede michael-schou Novice
23. juni 2009 - 15:04 #5
SearchString er tom.

Jeg er begyndt at fjerne "Form2" foran alt i de alm. auto oprettede procedure. :-)

Jeg har løst problemet ved at have 2 Query's end som jeg bruger til selve programmet og 1 KUN til at søge med og det virker som det skal med den kode jeg først skrev :-)

hrc - takker mange gange for dine input :-)

Mvh
//Michael.
Avatar billede hrc Mester
23. juni 2009 - 15:25 #6
Det her burde altså også virke - og det en del pænere (selvom det stadig ikke er overkønt).

procedure TForm2.Edit1Change(Sender: TObject);
var
  SearchString : String;
begin
  SearchString := trim(Edit1.Text);

  ADOQuery1.Close;
  try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT *');
    ADOQuery1.SQL.Add('from Navn');
    if SearchString <> '' then
    begin
      ADOQuery1.SQL.Add('WHERE (Navn LIKE :navn)');
      ADOQuery1.Parameters.ParamByName('navn').Value := SearchString + '%';
    end;
  finally
    ADOQuery1.Open;
  end;
end;
Avatar billede hugopedersen Nybegynder
24. juni 2009 - 07:11 #7
hrc> hvis ikke man har
Var
  frmMain                  : TfrmMain;
hvordan undgår man så en fejl under compilering når der i dpr filen står:
Application.CreateForm(TfrmMain, frmMain);

Jeg har før set du 'brokker' dig over måden, men jeg har aldrig kunnet greje lige den her.
Avatar billede hrc Mester
24. juni 2009 - 09:03 #8
Hej Hugo. Man kan ikke undvære main-formens globale variabel. Man kan ikke undvære variablene hvis de autooprettes; sådan er Delphi skruet sammen. Men man skal bruge autooprettelse med varsomhed. Hvorfor oprette dialoger (= bruge RAM) som man måske ikke kommer til at bruge?

Men hvis du har en manuelt oprettet form:

var
  frmMyShitty: TfrmMyShitty;

...

  with TfrmMyShitty.Create(self) do
    try
      ShowModal;
    finally
      Release;
    end;

Her bliver den globale variabel slet ikke sat (og er nil). Du kan sikkert også skrive frmMyShitty := pointer(12312321); og så peger den et eller andet sted hen. Med "self" er du altid sikker på at have fat i objektet som du står i - så det er altid den man skal bruge.

Med manuelt oprettede forme kan/skal man fjerne de globale form-variable så man ikke kommer til at bruge til dem:

var // slettes
  frmMyShitty: TfrmMyShitty; // slettes

Har du brug for en variabel til formen, så hold den lokal.

procedure TfrmMain.ShowForm(Sender: TObject);
var
  frmMyShitty: TfrmMyShitty;
begin
  frmMyShitty := TfrmMyShitty.Create(self); // self = frmMain
  try
    frmMyShitty.Caption := 'Hello World';
    frmMyShitty.ShowModal;
  finally
    frmMyShitty.Release;
  end;
end;
Avatar billede michael-schou Novice
24. juni 2009 - 09:07 #9
hrc - det virker stadigvæk ikke den viser stadig kun 1 post med T har 2 poster Test1 og Test2 og den skulle jo meget gerne vise begge poster :-)
Avatar billede hugopedersen Nybegynder
24. juni 2009 - 09:08 #10
OK - så er der gået ild i et lys mere.

Jeg har normalt også kun min mainform som autooprettet - det er ikke så tit man har en app uden en mainform :-)
Avatar billede hrc Mester
24. juni 2009 - 11:07 #11
ms: Det må skyldes en anden fejl for jeg har lige testet det (skal gerne sende dig programmet om du lægger en email)

procedure TfrmMain.eSoegChange(Sender: TObject);
var
  SoegeSt: string;
begin
  qBorger.Close;
  try // overkill at skrive scriptet hver gang - men det er jo et eksempel
    qBorger.SQL.Clear;
    qBorger.SQL.Add('select cpr, fornavn, efternavn');
    qBorger.SQL.Add('from borger');

    SoegeSt := trim(eSoeg.Text);
    if SoegeSt <> '' then
    begin
      qBorger.SQL.Add('where (efternavn like :efternavn)');
      with qBorger.Parameters.ParamByName('efternavn') do
      begin
        DataType := ftString;
        Value := SoegeSt + '%';
      end;
    end;

    qBorger.SQL.Add('order by efternavn, fornavn');
  finally
    qBorger.Open; // Forsøg at åbne igen
  end;
end;
Avatar billede michael-schou Novice
24. juni 2009 - 11:21 #12
hrc : ja for syntes da også det er lidt underligt hvis det virker for dig og ikke for mig.

Smidder lige min mail til dig :

Mail : michael_schou@hotmail.com

Takker :-)

//Michael
Avatar billede hrc Mester
24. juni 2009 - 11:54 #13
Hej Michael. DFM-filen indeholder et par linjer du nok må slette

I øvrigt blev connectionstringen vist ikke slettet sådan som jeg ellers skrev...

program IncOpslag;

uses
  madExcept, // Slet denne linje
  madLinkDisAsm, // og denne.
  Forms,
  FMain in 'FMain.pas' {frmMain};


.. kan ellers kun anbefale Madshi-pakken. Den giver mange oplysninger fra sig når der sker fejl. Desuden er den gratis for privatpersoner.
Avatar billede hugopedersen Nybegynder
24. juni 2009 - 11:56 #14
hrc> mener du madExcept er bedre end Eurekalog?
Avatar billede michael-schou Novice
24. juni 2009 - 12:15 #15
hrc - takker :) Jeg ser lige på det når jeg kommer hjem.
Avatar billede hrc Mester
24. juni 2009 - 13:41 #16
Kender ikke rigtig EurikaLog. Borrisholdt anbefaler den anden og det må være et spørgsmål om hvad man prøver først.
Avatar billede hugopedersen Nybegynder
24. juni 2009 - 14:03 #17
Mange gange er det jo sådan at en kan lide datteren og en anden moderen :-)
Avatar billede hrc Mester
24. juni 2009 - 14:48 #18
... det kommer måske også an på hvad man prøver først?
Avatar billede hugopedersen Nybegynder
24. juni 2009 - 14:50 #19
:-)
Avatar billede borrisholt Novice
25. juni 2009 - 11:43 #20
hrc>> Nej det kommer ikke an på hvad man prøver først ;o) Eurekalog er ca. 800 milliarder gange bedre (overdrivelse kan være anvendt).

Jeg har professionel erfaring med begge programmer, og lidte mere seriøst så er eurekalog markant bedre. Den logger fejlen mere præcist.

Var der ikke noget med noget under visning jeg skulle gøre ? Det hørte jeg da aldrig mere fra.
Avatar billede hrc Mester
25. juni 2009 - 12:13 #21
Hej Jens. Beklager jeg ikke er vendt tilbage. Det bliver efter uge 32 der kommer en chance. Jeg ligger vandret i forsøget på at nå en forbasket deadline (skriver samtidig lidt her på fora, men det er en ren overspringshandling). Hvis du stadig er frisk er vi det også - men altså først efter ferien.

Hvad EurikaLog vil jeg nok give dig ret. Synes dog 800 mia. er lidt langt at gå. Ved ikke om madshi kom først men det ligner en "nu-tager-vi-madshi-og-giver-den-en-tand-mere"-operation. Opbygningen er pænt ens, men logning af konsolpropgrammer er lavet pænt. En lille detalje om at have exceptionloggen i udviklingsmiljøet er også smart. En ting jeg godt kunne bruge var den bedre angivelse af mail-opsætning.

Tror de to pakker returnerer en stak der ligner hinanden ganske pænt - madshi værende den uden ikoner og andet bling.

.. men jeg synes stadig Madshi har været et godt køb. Et skift for €300 er dog ikke afskrækkende. Jeg vil teste den på min Weaver derhjemme.
Avatar billede hrc Mester
25. juni 2009 - 12:16 #22
... men det er måske den anden vej rundt: "nu-prøver-jeg-at-lave-det-ligesom-EurikaLog". Kan se de har eksisteret siden 2000.

Et godt argument for Madshi er, at det er gratis for private.
Avatar billede michael-schou Novice
26. juni 2009 - 16:37 #23
hrc: Jeg har nu testet dit eksempel og kan se at det virker .. men når jeg prøver koden i mit program virker det ikke .. helt vildt mærkeligt.

Så jeg beholder bare det jeg har der virker.

Jeg syntes at du skal smide et svar så for du point :)
Avatar billede hrc Mester
26. juni 2009 - 20:07 #24
Du kunne prøve at sende mig din kode - så skulle jeg gerne tjekke hvad der gør forskellen.
Avatar billede michael-schou Novice
27. juni 2009 - 14:18 #25
hrc : Takker for tilbudet, men jeg lader det være som det er nu :-)

Takker mange gange for hjælpen hrc :D
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