Jeg tror, at det grundlæggende problem er, at du har en helt del fejl i din opfattelse af hvorledes SQL's virker. Overhovedet ikke ondt sagt, for det jeg læser af din spørgsmål/kommentar er, at du har den samme totalt fejlagtige opfattelse, som jeg selv havde engang. (Der skulle et kursus til for at rette op det...)
For det første: En SQL query vil ALDRIG returnere en string! En Query vil ALTID returnere en tabel. Denne tabel kan så være tom eller bestå mange rækker/kolonner eller sågar bare af et enkelt felt, evt. indeholdende en string, men det er altså stadig en tabel. For at finde resultatet af din query er du altså nødsaget til at gå ind i tabellen, finde det rigtige række og den rigtige kolonne (=det rigtige felt), som du så udlæser i det format du ønsker.
I din kommentar skriver du: dbeby.Text := sql.Add ('select ....
Problemet er med dette er dels, at:
- du bruger en TDBEdit. Du burde måske anvende en TEdit eller TLabel. DBEdit er dataaware og bruger du den, så skal du ikke selv skrive i dens Text property, du kan blot nøjes med at sætte dens Datasource/-field parametre, hvorefter den 'automatisk' viser det korrekte indhold når du eksekverer din query.
- Jeg kan se at du med den linie forventer at tilskrivningen af din Qurerys Lines indhold automatisk vil opdatere query'en og returnere en string, som du så placere i din editbox. Dette er ikke tilfældet!
For det første, som skrevet ovenfor, så returnerer en Query altså en tabel, ikke en string.
For det andet, så kører (executer) du ikke query en ved blot at tilføje en linie til dens 'udtryk'.
For det tredie, så er resultatet af at tilføje en linie (med Add-metoden) at du får at vide hvilken placering den nye linie fik i SQL'ens TString-list (som et integer index). Du kan ikke tilskrive en integer til string variablel. Ville du gøre ovenstående syntakisk korrekt, så kan du skrive:
dbeby.Text := IntToStr(sql.Add ('select ....); Resultat: Din editbox vil nu indeholde index nummeret, dvs. hvilket linienr. den nye linie fik - ikke særligt anvendeligt.
Der er mere.... men det er nemmer at lave skrotte det du har lavet og så istedet lave et nyt eksempel....
En Public funktion oprettet i dit datamodule:
Iøvrigt, jeg bruger her en dynamisk oprettet Query. Man kan se'følig godt bruge en statisk TQuery, men det er nu ikke rigtigt nødvendigt. Det sparer dog et par linier i funktionen, men der skal så bl.a. tilføjest en linie med MyQuery.SQL.Clear før de/den nye linier indsættes.
Function TDataModule1.GetByNavn(aPostNr: Integer): String;
Var
MyQuery : TQuery;
Begin
// Opret en Query
MyQuery := TQuery.Create(Self);
Try
Try
// Fortæl hvilken database queryen kan finde sine tabeller i.
MyQuery.DataBaseName := dbTest.DatabaseName; // dbTest = Din TDatabase.
// Nedenstående kan være i en linie - det gør ingen forskel,
// men er i mine øjne mindre læsbart.
MyQuery.SQL.Add('Select ByNavn');
MyQuery.SQL.Add('From PostNrTabel');
MyQuery.SQL.Add('Where PostNr = ' + IntToStr(aPostNr));
// 'Kør' query'en.
MyQuery.Open;
// Hent resultatet. Her skulle der helst kun være en række!
If MyQuery.RecordCount=1 Then
Result := MyQuery.Fields[0].AsString
Else
Begin
// Ups!
Result := ''; // Tom string, men
www.Eksperten.Dk viser det forkert!
Raise Exception.Create('Fejl i PostNr tabel. ByNavn ikke fundet.');
End;
Finally
MyQuery.Free;
End;
Except
On E: Exception Do ShowMessage('Error: '+E.Message);
End;
End;
Test rutinen på en form med en button:
(Bemærk jeg bruger en TEdit, ikke en TDBEdit)
procedure TForm1.Button1Click(Sender: TObject);
Var
PostNr : Integer;
begin
PostNr := DataModule1.taForretningsTabelPostNr.AsInteger;
Edit1.Text := 'Bynavn = '+DataModule1.GetByNavn(PostNr);
end;
Så vil jeg iøvrigt lige sige, at det er stadig LANGT nemmere at bruge Mastersource og MasterFields properties i din PostNrTabel. Hvis du i dit program har brug for at se alle rækker i din PostNr tabel, så kan du bare:
- Sætte/fjerne MasterSource/MasterFields værdierne afhængigt af om de skal bruges eller ej.
- Bruge en anden TTabel, der peger på samme fysiske tabel, men so ikke har MasterSource sat til taForretningsTabel. (Sådan ville jeg gøre her.)
NiP