Ergebnis einer SELECT-Anweisung anzeigen

Antworten
niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Ergebnis einer SELECT-Anweisung anzeigen

Beitrag von niederrheiner »

Hallo an Alle,
bei dem nachfolgendem Code erscheint bei Ausführung folgende Fehlermeldung:

field not found: "sumsys".

Woran liegt es und wie muss der Code aussehen, damit ich das Ergebnis der Abfrage in einem Feld anzeigen kann?

Code: Alles auswählen

txtSQL := 'SELECT AVG(g_sys) AS sumsys FROM gesundheit WHERE g_datum='+strdatum+';';
 
  SQLQuery1.SQL.Text:= txtSql;
  SQLQuery1.ExecSQL;
 
  lbSYS.Caption  := SQLQuery1.fieldbyname('sumsys').asString;
Danke für Eure Hilfe und Tipps.

Bis dann ...
MfG
Günter

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Das müsste stimmen, mit der Änderung, das Select mit Open anstatt ExecSQL geöffnet werden. Open vereinfacht immer dann, wenn Daten zurückgegeben werden sollen.

Aber prüfe noch zur Sicherheit über Query.RecordCount ob du überhaupt Datensätze erhältst..bevor du auf ein Feld zugreifen willst.
Johannes

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Beitrag von niederrheiner »

Hallo Johannes,
es klappt leider immer noch nicht. Query.RecordCount liefert 1. und die Select-Anweisung habe ich auf der mysql-Console getestet, dort klappt sie.

Bis dann ...
MfG
Günter

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Eventuell wird dein Alias-Name nicht korrekt übernohmen.

Lass dir doch mal nach dem Open, die Bezeichnungen der Datenfelder anzeigen:

Code: Alles auswählen

Liste: TStringlist
 
SQLQuery1.Fields.GetFieldNames(Liste);
Showmessage(Liste.Text)
Ansonsten kenn ich noch folgende SQL-Sytax ohne AS, allerdings von Firebird mit TSQLQuery, keine Ahnung, ob das mit MySQL auch funktioniert bzw. wie TSQLQuery das umsetzt:

Code: Alles auswählen

SELECT AVG(g_sys) "sumsys" FROM ...
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6849
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Du kannst es auch visuell auf einer Form probieren, vor allen am Anfang ist das oft einfacher. Und man sieht im Grid automatisch welche Feldnamen vorhanden sind.

Leere Form, Connection, Query, Transaktion und Grid drauf, kurz konfigurieren und man kann schön seine Statements testen. Das meiste geht sogar ohne kompilieren nur im Objektinspektor.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

niederrheiner
Beiträge: 87
Registriert: Sa 19. Jan 2008, 17:21
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Rheinberg

Beitrag von niederrheiner »

Hallo an Alle,
ich habe jetzt mal mit dem nachfolgendem Code gespielt, und dabei sind mir zwei Dinge augefallen.

1.) RecordCount ergibt 1, aber FieldCount nur 0.
2.) In der aktuellen Version komme ich nicht mehr aus dieser Procedure, ich muss das Programm mit kill abschiessen. Ich habe das Gefuehl ich bewege mich in einer Endlosschleife, woher kommt das?

Die SQL-Aweisung auf der MySQL-Console bringt genau das Ergebnis was ich erwarte.

Bei der Anwendung von SQLQuery1.Fields.GetFieldNames(Liste); erhalte ich die Fehlermeldung: Access violation ??????

Code: Alles auswählen

procedure TfrmMain.inDatumExit(Sender: TObject);
var
  txtSQL        :String;
  strdatum      :String;
  strZw         :String;
  sumsys        :String;
  Liste         :TStringlist;
begin
  // Durchschnittswerte fuer den einegegeben Tag ermitteln und ausgeben
  lbDatum.Caption     := inDatum.Text;
 
  strZw            := copy(inDatum.Text,7,4);
  strZw            := strZw + copy(inDatum.Text,4,2);
  strZw            := strZw + copy(inDatum.Text,0,2);
  strdatum         := quotedstr(strZw);
 
  txtSQL := 'SELECT AVG(g_sys) AS sumsys FROM gesundheit WHERE g_datum='+strdatum+';';
 
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add(txtSql);
  SQLQuery1.Prepare;
  showmessage(SQLQuery1.SQL.Text);
  SQLQuery1.Open;
  showmessage('Anzahl Saetze ' + inttostr(SQLQuery1.RecordCount));
  showmessage('Anzahl Felder ' + inttostr(SQLQuery1.FieldCount));
 
    //SQLQuery1.Fields.GetFieldNames(Liste);
    //Showmessage(Liste.Text);
 
 
  if SQLQuery1.RecordCount > 0 then
    if SQLQuery1.FieldCount > 0 then
      lbSYS.Caption  := SQLQuery1.fieldbyname('g_sys').asString
    else
      begin
        showmessage('Keine Daten vorhanden');
        SQLQuery1.Close;
        exit;
      end;
 
end;
Danke fuer Eure Hilfe und Tipps.

Bis dann ...
MfG
Günter

Antworten