SQLTabelle -> Abbruchoption
-
hallo @ all.
Ich habe eine schleife, welche jeden eintrag einer Tabelle mit eine datei auf der festplatte vergleicht.
diese tabelleneinträge sind nummeriert.
ich möchte ab dem 2.000.000 eintrag die schleife abbrechen.wie mache ich das?
mein code sieht (beispielhaft) so aus:
Query1->SQL->Clear(); Query1->SQL->Add("select * from vapbitmap order by bmp_name"); Query1->Open(); Form1->Query1->First(); // SCHLEIFENANFANG while (!Query1->EoF) { if (FileExits(BLABLA) // dann blablabla Form1->Query1->Next(); }
Jetzt soll irgendwo aber noch halt die Abbruchbedingung rein.
Ich habe es so versucht:Form1->Query1->First(); // in die schleife eingebaut: // bmp_nummer ist halt die nummer Query1->SQL->Clear(); Query1->SQL->Add("select * from vapbitmap order by bmp_nummer"); int nummer = Query1 -> FieldByName("bmp_nummer") -> AsInteger; if (nummer>2000000) return; Query1->SQL->Clear(); Query1->SQL->Add("select * from vapbitmap order by bmp_name"); Query1->Open() // und wieder die FileExistabfrage.... Form1->Query1->Next();
aber so funzt es leider nicht, komischerweise, denn die FileExistabfrage klappt irgendwie nicht, denn er geht die schleife nicht mehr durch. er probiert immerwieder den selben eintrag zu vergleichen, und das geht endlos so weiter.
warum?
kann mir jemand helfen?
denke mal das ist ein problem, das in der schleife zweimal der SQLbefehl geändert wird.
aber das müsste doch funzen?
und wenn nicht, wie geht es denn richtig?Mein Problem nochmal im Klartext:
Es wird nicht akzeptiert, das man in der schleife den SQLbefehl umschreibt, und in darauf wieder umschreibt.
Er geht dann einfach keinen eintrag mehr weiter.
aber wie soll man sonst die abbruchbedingung schreiben?
mit einem neuen Query?THX
Bj
-
Was ist Query1 und Form1->Query1. ist das die gleiche Query?
wenn ja, du kannst doch nicht die Query in der "eigenen" schleife schliessen, mit neuen abfrage öffnen und dann moch irgendwelche sinnvolle ergebnisse erwarten.
zu der abbruchbedingung:
Query1->SQL->Clear(); Query1->SQL->Add("select * from vapbitmap order by bmp_name"); Query1->Open(); Form1->Query1->First(); //???????? int i = 0; // SCHLEIFENANFANG while (!Query1->EoF) { if (++i > 2000000) break; if (FileExits(BLABLA) // dann blablabla Form1->Query1->Next(); // ??????????? }
-
warum geht das nicht?
ja, sorry Form1->Query1 und Query1 sind die selben.Warum kann ich denn nicht in der schleife die eine SQL anweisung benutzen, diese dann löschen, eine neue reinschreiben, diese benutzen, und wieder die reinschreiben, welche am anfang drinstand?
das muss doch gehen?
thx
Bj
-
na weil z.B. mit Open wird der Cursor im RecordSet auf Anfang gesetzt. Deshalb auch die Endlossschleife.
nimm doch einfach noch ne Query.
-
ok, mit noch einer gehts.
aber was ist wenn ich open nur einmal außerhalb der schleife setze, und innerhalb trotzdem den SQL Befehl ändere.
ist das möglich?
es muss doch auch eine andre möglichkeit geben, als noch eine query zu nehmen, oder?thx
Bj
-
Irgendwie hast du das Prinzip von Datenbanken, Abfragen und Ergebnismengen noch nicht richtig verstanden, scheint es.
Du holst dir einmal alle Einträge einer Tabelle. Diese Einträge stehen jetzt alle im Query. Jetzt gehst du die Einträge im Query in einer Schleife durch, liest den Dateinamen aus und prüfst, ob die Datei existiert. Die Bildnummer kannst du doch im gleichen Schritt auslesen, wozu willst du dafür nochmal die Datenbank befragen? Die Information hast du doch schon im Query.
Randbemerkung:
while (!Query1->Eof && ++i <= 2000000) ... // oder for (int i = 0; i < 2000000, !Query1->Eof; ++i) ...
-
also ich lese die tabelle ein, mit zwei spalten, in ein query.
die spatlen sind.
name & nummer.jetzt kann ich auf beide zugreifen mit: ?
Query1->FieldByName (name)
Query1->FielnByName (nummer)??
-
Mit 'SELECT * ...' liest du alle Spalten ein, nicht nur zwei.
Die Auswertung bestimmter Spalten erfolgt dann genau wie von dir vermutet, zzgl. des jeweiligen AsInteger etc.
-
asooo, na wiedermal etwas gelernt
danke, Bj