23. juni 2009 - 11:06Der 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.
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;
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.
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.
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?
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> 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.
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.
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;
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.
hrc : Takker for tilbudet, men jeg lader det være som det er nu :-)
Takker mange gange for hjælpen hrc :D
Synes godt om
Ny brugerNybegynder
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.