![]() |
Repeat schleife mit Datenbankabfrage
HAllo
Warum bekomme ich hier die Felermeldung Inkompatible Typen? In der Table2 ist die Spalte ID für Integer werte daher solte das doch gehen oder wo ist der Haken?
Code:
Ich hoffe ihr es kann mir jemand helfen.
....
var a,ID:Integer; begin a:=(table1.recordCount); repeat ID:=Random(a); until ID=table2.FindKey([ID]); ...... Gruess Schmodi |
Re: Repeat schleife mit Datenbankabfrage
Zitat:
Code:
...
until ID=table2.FindKey([ID]).asinteger; |
Re: Repeat schleife mit Datenbankabfrage
FindKey gibt 'True' zurück, wenn ein Datensatz gefunden wurde und positioniert die TAbelle auf den entsprechenden Datensatz.
Es werden keine Daten zurückgegeben. Ein Datensatz wird dann gefunden, wenn der als Parameter übergebene Wert mit dem Feld (den Feldern) übereinstimmt, das über den Index Table2.IndexName festgelegt ist. Du musst also einerseits gewährleisten, dass Table2 auch im Feld ID sucht (um den richtigen Datensatz zu finden), andererseits schreiben:
Delphi-Quellcode:
'= true' kann auch weggelassen werden.
until table2.FindKey([ID]) = true;
Im Übrigen: Was willst Du mit der Schleife eigentlich bezwecken? Es erschließt sich nicht wirklich und sieht eher eigenartig aus... Ist gewährleistet, dass es in table2 einen Datensatz gibt, dessen ID innerhalb des Bereichs der Anzahl der Datensätze in table1 liegt; bzw. was soll das für eine Verbindung zwischen den Tabellen sein :wiejetzt: MfG Urs |
Re: Repeat schleife mit Datenbankabfrage
Hallo
Ich habe festgestellt das ich nach until das not vergessen habe, so kann ich überwachen ob dieser Datensatzt schon einmal eingelesen wurde oder nicht. Jetzt funktioniert eigentlich alles. Ich habe den code noch so abgeändert das wen in der Tabele 2 gleichviel Datensetzt vorhanden sind das das Program automatisch geschlossen wird, das ganze habe ich mit einem Goto befehl gemacht. Ich habe jetzt nur noch ein grosses problem festgestehlt. Die Random funktion funktioniert irgendwie nicht richtig, wenn ich das Programm ein paarmal durchlaufenlase kommen jedes Mal die gleichen Datensätze in der gleichen Reihenfolge wider, was kann das Problem sein?
Code:
Warum funktioniert hier die Randome funktion nicht richtig?
....
var a,b,ID:integer; label sprungpunkt; begin a:=(table1.Recordcount); b:=(table2.Recordcount); if a=b then goto sprungpunkt; repeat ID:=random(a); until not table2 Findkey([ID]); ...//wie gehabt Sprungpunkt: if a=b then close; Gruess Schmodi |
Re: Repeat schleife mit Datenbankabfrage
Hallo
Ich habe etwas gefunden das die random funktion funktionirt ich habe einfach randomize funktion davor eingefügt. Das kan man ja oder? Gruess Schmodi |
Re: Repeat schleife mit Datenbankabfrage
Zitat:
|
Re: Repeat schleife mit Datenbankabfrage
Random funktioniert schon richtig, wenn immer die gleichen Datensätze durchlaufen werden.
Random ist eine Funktion, die nach einem bestimmten Algorithmus Pseudo-Zufallszahlen produziert. Durch die Funktion Randomize (ich weiß nicht genau, in welchem Kontext die aufgerufen werden muss, bitte in der Hilfe nachschauen) wird der Zufallsgenerator neu initialisiert (ich glaube mit der Systemzeit). Du solltest also zu Beginn der Funktion (nicht innerhalb der Schleife) Randomize aufrufen. Trotzdem verstehe ich nicht, weshalb Du die Tabelle zufällig durchläufst. Worum geht es denn überhaupt? Normalerweise wäre es näherliegend, table1 mit etwas wie
Delphi-Quellcode:
zu durchlaufen.
table1.First;
while not table1.eof do begin if table2.FindKey([table.FieldByName('ID').AsInteger]) // Es gibt einen Datensatz in table2, dessen Indexfeld // den selben Wert wie "ID" in table1 hat then close; // was wird bei Dir den geschlossen?? evtl. exit verwenden table1.next; end; Kannst Du denn garantieren, dass es keine Endlosschleife gibt? Die Konstruktion mit label und goto ist nicht nötig. Statt "goto sprungpunkt" kannst Du einfach "close" (oder "exit") schreiben und statt dem Sprungpunkt einfach "close"(exit). Mir ist letztlich immer noch gar nicht klar, was das Ganze eigentlich bewirken soll. MfG Urs |
Re: Repeat schleife mit Datenbankabfrage
Mit der zufälligen abfrage kann ich jetzt zufällige Datensätze aus einer Datenbank abrufen.
Zum beispiel kann ich so zufällig sagen wo ich hin in die Ferien fahre oder welches gericht ich heute koche einfach irgendwas. Ja ich kann garantieren das es keine Endlosschleife gibt Da ich mit der goto anweisung die schleife überspringe wenn alle datensätze der Table11 identisch sind mit der Tabel2. Wen ich aber close anstatt goto schreibe gibt es eine endlosschleife da doch der programcode nach dem close noch abgearbeitet wird oder ist das Falsch? Ich habe anstelle von der Goto if a=b then goto sprungpunkt das geschrieben: if a=b then close; Und dan ist mir das Program abgestürzt wen ich alle datensätze durgearbeitet hatte. Vieleicht habe ich ja einen Feler gemacht. Ich weiss das man keine Goto anweisungen gebrauchen solte da es die lesbarkeit des codes verschlächtert. Habt Ihr den eine andere Idee? Gruess Schmodi |
Re: Repeat schleife mit Datenbankabfrage
Zitat:
- Was sind das für zwei Tabellen (Felder, Datenbanktyp)? - In welchem Verhältnis stehen die Tabellen (Fremdschlüssel?) - In was für einer Funktion steht der Code, den Du gepostet hast? (wegen des Close, was soll denn geschlossen werden?) - Wann wird das denn durchlaufen Im Moment kann ich mir noch gar nicht vorstellen, was da eigentlich passieren soll. Z.B. verstehe ich das mit dem "until not" nicht, weil ich das Verhältnis der Tabellen nciht kenne. MfG Urs |
Re: Repeat schleife mit Datenbankabfrage
sali
Es sind zwei Paradox7 Datenbanken. Und das feld ID ist Integer, und hat einen Fremdschlüsel. Bei close könnte z.b in einem Späteren zeitpunkt in meinem Program Form2.show stehen das es ein neuies Formular öffnet und das alte schliesst. Die close anweisung steht bei mir jetzt am schluss nach dem Sprungpunkt aber wen ich die Goto anweisung nicht mache steht sie vor der schlaufe. Und wen ich dan das Program laufen lasse wird doch die schleife nochmals abgearbeitet und dan gibt es eine endlosschleife da schon einmal alle datensätzt aufgerufen wurden. Oder est das falsch. Als ich das probierte mit dem close vor der schleife stürzet mein program ab. Das until not sagt wen der Datensatzt nicht in der 2 tabele steht ist die anweisung true und die Repetschleife hört auf. Alles klar urs.liska? Gruess Schmodi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz