Nächst Mögliche ID herausfinden

Zerolith

Mitglied
Folgendes:

ich habe eine Tabelle mit folgenden IDs und Namen(dbid):
1 TEST1
2 TEST2
3 TEST3
4 TEST4
5 TEST5
6 TEST6
7 TEST7
8 TEST8
11 TEST11
12 TEST12

und möchte jetzt in ne combo box die ganzen TEST% haben

keine ahnung wie ich das machen soll - hab mal so provisorisch das hier gemacht:

PHP:
rocedure TForm4.FlatButton4Click(Sender: TObject);
var count,i: integer; name : string;
begin
form1.ADOQuery1.SQL.Clear;
form1.ADOQuery1.SQL.Add('SELECT COUNT(Name) _COUNT From sysdatabases');
form1.ADOQuery1.Active := TRUE;
count := form1.ADOQuery1.fieldbyname('_COUNT').AsInteger;
form1.ADOQuery1.Active := FALSE;
for i := 1 to count do
 begin
  form1.ADOQuery1.SQL.Clear;
  form1.ADOQuery1.SQL.Add('SELECT Name FROM sysdatabases WHERE dbid ='+inttostr(i)+' AND dbid <'+inttostr(i+4));
  form1.ADOQuery1.Active := TRUE;
  name := form1.ADOQuery1.fieldbyname('name').asstring;
  form1.ADOQuery1.Active := FALSE;
  flatcombobox2.items.Add(name);

 end;

end;
 

Dario Linsky

Erfahrenes Mitglied
Viel zu umständlich... ;)
Code:
ADOQuery1.Sql.Add('SELECT * FROM sysdatabases;');
ADOQuery1.Open
if ADOQuery1.RecordCount > 0 then ADOQuery1.First;
while not ADOQuery1.Eof then
begin
  ComboBox1.Items.Add(String(ADOQuery1.FieldValues['name']));
  ADOQuery1.Next;
  Application.ProcessMessages;
end;
Erklärung:
Über die RecordCount-Eigenschaft des Query-Objektes bekommst Du die Anzahl der Datensätze, die die Abfrage zurückliefert. Wenn diese Eigenschaft 0 ist, dann gibt es gar keine Datensätze, ansonsten wird mit ADOQuery1.First auf den ersten Datensatz gesprungen.
Danach wird jeder einzelne Datensatz durchgegangen (ADOQuery1.Next), solange bis das Ende der Tabelle (ADOQuery1.Eof) erreicht ist.
 

Arne Buchwald

Erfahrenes Mitglied
Hi asphyxia,

Original geschrieben von asphyxia
Viel zu umständlich... ;)
Code:
ADOQuery1.Sql.Add('SELECT * FROM sysdatabases;');
ADOQuery1.Open
if ADOQuery1.RecordCount > 0 then ADOQuery1.First;
while not ADOQuery1.Eof then
begin
  ComboBox1.Items.Add(String(ADOQuery1.FieldValues['name']));
  ADOQuery1.Next;
  Application.ProcessMessages;
end;
Wofür das First? Wenn passende Datensätze vorhanden sind, wird doch automatisch der erste markiert.

Das
Code:
ComboBox1.Items.Add(String(ADOQuery1.FieldValues['name']));
finde ich auch irgendwie ungewöhnlich.
Ich persönliche finde folgendes
Code:
ComboBox1.Items.Add( ADOQuery1.FieldByName('name').AsString );
verständlicher ... aber vermutlich auch nur ein anderer Weg nach Rom. :)
 

Dario Linsky

Erfahrenes Mitglied
Wofür das First? Wenn passende Datensätze vorhanden sind, wird doch automatisch der erste markiert.
Normalerweise schon, aber ich muss leider viel mit Access arbeiten, und da hab ich mir angewöhnt, lieber eine Zeile zu viel als eine zu wenig zu schreiben. :rolleyes:

Das mit der FieldValues-Eigenschaft hab ich mir auch irgendwann mal angewöhnt. Liegt vermutlich ebenfalls daran, dass die Recordset-Objekte aus Visual Basic auch eher als eine Art Array gehandhabt werden. Ist aber eigentlich wirklich nur Geschmackssache.
Wobei die Variante mit dem Array meiner Meinung nach sogar noch den Vorteil hat, dass man auch über eine Zahl ein bestimmtes Feld ansprechen kann:
Code:
for i := 0 to 10 do
begin
  ShowMessage(String(ADOQuery1.FieldValues[i]));
end;
Das kann unter anderem sinnvoll sein, wenn man ein TListView mit Tabelleninhalten füllen will oder wenn man nicht weiss, wie der Feldname genau ist (bei manchen Abfragen ist das leider der Fall). :)

Die Version mit FieldByName() hab ich ehrlich gesagt noch nie gebraucht. Muss man da eigentlich auch auf Null-Werte achten oder werden die automatisch in Leerstrings umgewandelt?
 

Arne Buchwald

Erfahrenes Mitglied
Hallo,

Original geschrieben von asphyxia
Normalerweise schon, aber ich muss leider viel mit Access arbeiten, und da hab ich mir angewöhnt, lieber eine Zeile zu viel als eine zu wenig zu schreiben. :rolleyes:
Im Bezug auf Access (das Thema hatten wir doch schon mal ;)) kann man gar nicht genug Fehler-Abfang-Routinen einbauen :) :) :)


Das kann unter anderem sinnvoll sein, wenn man ein TListView mit Tabelleninhalten füllen will oder wenn man nicht weiss, wie der Feldname genau ist (bei manchen Abfragen ist das leider der Fall). :)
Mag sein - brauchte ich noch nicht / habe ich wieder vergessen. ;-)


Die Version mit FieldByName() hab ich ehrlich gesagt noch nie gebraucht. Muss man da eigentlich auch auf Null-Werte achten oder werden die automatisch in Leerstrings umgewandelt?
Wie "auf Nullwerte achten"? Wenn das Feld keinen Wert hat, wird es natürlich in einen Leer-String umgewandelt ... :)
 

Dario Linsky

Erfahrenes Mitglied
Wenn in einem Feld in einer Tabelle nichts drinsteht, dann ist das ja erstmal kein normaler Leerstring, sondern eben NULL. Bei dem FieldValues[] muss man das erst abfangen, sonst gibt es einen Fehler. Auch wenn man das mit String() umwandelt. Die normale Typkonvertierung kommt anscheinend nämlich nicht mit Echt-Null-Einträgen aus Datenbanken klar. :rolleyes:
Also müsste das der Vollständigkeit halber so aussehen:
Code:
if not VarIsNull(ADOQuery1.FieldValues['name']) then
  MeinString := String(ADOQuery1.FieldValues['name'])
else
  MeinString := '';
Das muss man bei der FieldByName()-Methode doch auch so machen, oder lieg ich da jetzt völlig falsch? :rolleyes:
 

Dario Linsky

Erfahrenes Mitglied
Gut zu wissen. Wenn ich demnächst mal weiss, wie meine Felder heissen, werd ich dann wohl doch besser mit der FieldByName-Methode arbeiten. ;)
 

Arne Buchwald

Erfahrenes Mitglied
Ganz praktisch ist auch: Eine Tabelle hat ein Feld "alter" vom Typ integer.

Code:
var
xyz: string;
begin
...
xyz:= Query1.FieldByName('alter').AsString
Du musst noch nicht mal die Typen (Int --> String) umwandeln ...