Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLite Abfragen (https://www.delphipraxis.net/150503-sqlite-abfragen.html)

AnyKey 19. Apr 2010 09:20

Datenbank: SQLite • Version: 3.2.2 • Zugriff über: UniDAC

SQLite Abfragen
 
Hi,

folgendes Problem, ich will eine Abfrage auf die Datenbank machen und mir die ausgelesenen Werte in eine StringList schreiben.

Code sieht folgendermaßen aus:

Delphi-Quellcode:
UniQuery1.SQL.Clear;
UniQuery1.SQL.Add('SELECT ABPfad FROM tblArchivierbar '
                       +'GROUP BY PRNr HAVING ABArchivierbar = 1;');
UniQuery1.Execute;
for i := 0 to UniQuery1.Fields.Count-1 do
begin
  HelpList.Add(fMain.UniQuery1.Fields[0].Value[i]);
end;
In Value steht allerdings nichts drin, wie komme ich nun an die Werte der Abfrage? Bei einer Anderen Abfrage bin ich über .Filds[0].Value an den Wert gekommen. Das das mit dem Fileds.Count wohl nicht richtig funktioniert ist mir klar, aber wie komme ich nun an die Werte? Über Fields[1] komme ich auch nicht ran

Bitte helft mir!

Gruß
AnyKey

DelphiBandit 19. Apr 2010 09:24

Re: SQLite Abfragen
 
Hallo,

Du darfst die SQL-Abfrage nicht mit Execute ausführen - dann läuft es einmal und liefert danach aber keine Resultate. Query.Execute nutzt man im Allgemeinen für Delete bzw. Update-Statements. Für Result-Sets taugen sie nicht.
Nutze statt dessen

Delphi-Quellcode:
Query.Open

while Not Query.EOF
  // Hier adden
  Query.Next;
end;

Query.Close

AnyKey 19. Apr 2010 09:48

Re: SQLite Abfragen
 
Also ich habs jetzt mal so umgebaut:

Delphi-Quellcode:
UniQuery1.Open;
UniQuery1.SQL.Clear;
UniQuery1.SQL.Add('SELECT ABPfad FROM tblArchivierbar '
                 +'GROUP BY PRNr HAVING ABArchivierbar = 1;');
for i := 0 to RowsInDB do
begin
  HelpList.Add(UniQuery1.Fields[0].Value);
  UniQuery1.Next;
end;
Funktioniert aber leider immer noch nicht... An der Stelle an der ich in die Stringlist schreiben möchte bekomme ich eine Fehlermeldung: Listenindex überschreitet das Maximum.
RowsInDB ist einfach nur die Anzahl der Zeilen in der Datenbank, die ich mir vorher über ein Select auslese, dort steht dann auch die Zahl der Zeilen drin, hab ich durchs Debugen nachgeprüft.

Wo kann mein Fehler liegen?

Gruß
AnyKey

Grolle 19. Apr 2010 10:19

Re: SQLite Abfragen
 
Hi,

probier mal:
Delphi-Quellcode:
UniQuery1.SQL.Clear;
UniQuery1.SQL.Add('SELECT ABPfad FROM tblArchivierbar '
                 +'GROUP BY PRNr HAVING ABArchivierbar = 1;');
UniQuery1.Open;
while not UniQuery1.eof do
begin
  HelpList.Add(UniQuery1.FieldByName['ABPfad'].AsString);
  UniQuery1.Next;
end;
Viele Grüße ...

AnyKey 19. Apr 2010 11:59

Re: SQLite Abfragen
 
Naja richtig funktionieren tut es noch nicht. Außer einer von euch hat noch eine Idee wie man so eine Abfrage machen kann:

SQL-Code:
SELECT COUNT(ID)
FROM Tabelle
GROUP BY Fremdschlüssel
HAVING JaNein = true
Das funktioniert bei mir mal garnicht, aber so eine Abfrage bräuchte ich.

Ich habe da noch eine Andere Frage, hat zwar nicht viel hiermit zu tun, wäre aber zu simpel sie wo anders noch mal zu stellen, wie kann ich in einem dynamisch erzeugten DBGrid die Spaltenbreite auf Autosize stellen? Im Moment sehen die Spalten noch irgendwie doof aus.

Danke für eure Hilfe!

Edit: Wäre super wenn mal kurz jemand helfen könnte!

Gruß
AnyKey

mkinzler 19. Apr 2010 13:00

Re: SQLite Abfragen
 
JaNein scheint auch kein Aggegat zu sein
SQL-Code:
SELECT COUNT(ID)
FROM Tabelle
GROUP BY Fremdschlüssel
WHERE JaNein = true;
oder
SQL-Code:
SELECT SUM(IIF(JaNein = true, 1, 0))
FROM Tabelle
GROUP BY Fremdschlüssel;

AnyKey 19. Apr 2010 14:55

Re: SQLite Abfragen
 
Wie ich das DBGrid anpassen muss weiß nicht zufällig einer oder?

Gruß
AnyKey

p80286 19. Apr 2010 15:05

Re: SQLite Abfragen
 
Ich hab's bei einem anderen Grid so gelöst, daß ich die max. Länge der eingefügten Strings gesucht habe und dementsprechend die Breite der Zellen nachgerichtet habe.

Gruß
K-H

AnyKey 19. Apr 2010 15:16

Re: SQLite Abfragen
 
Und wie kommt man im Code an die Spaltengöße? Welche Eigenschaft ist das? Ich nehme mal an DBGrid.Columns oder? nur wie gehts dann danach weiter?

Besser wäre es halt sie auf Autosize zu stellen...

Gruß
AnyKey

DeddyH 19. Apr 2010 15:26

Re: SQLite Abfragen
 
AutoSize gibt es aber nicht. Du musst schon den jeweils längsten Eintrag ermitteln (LEN, LENGTH, CHAR_LEN, schau mal in die Doku zu Deinem DBMS) und die Spaltenbreite dann mittels Canvas.TextWidth errechnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz