AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Repeat schleife mit Datenbankabfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Repeat schleife mit Datenbankabfrage

Ein Thema von schmodi · begonnen am 7. Jan 2005 · letzter Beitrag vom 10. Jan 2005
Antwort Antwort
schmodi

Registriert seit: 11. Dez 2004
24 Beiträge
 
#1

Repeat schleife mit Datenbankabfrage

  Alt 7. Jan 2005, 21:20
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:
....
var a,ID:Integer;
begin
a:=(table1.recordCount);
repeat
ID:=Random(a);
until ID=table2.FindKey([ID]);
......
Ich hoffe ihr es kann mir jemand helfen.

Gruess Schmodi
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#2

Re: Repeat schleife mit Datenbankabfrage

  Alt 7. Jan 2005, 22:15
Zitat von schmodi:
Code:
...
until ID=table2.FindKey([ID]);
vielleicht...

Code:
...
until ID=table2.FindKey([ID]).asinteger;
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#3

Re: Repeat schleife mit Datenbankabfrage

  Alt 8. Jan 2005, 10:44
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:until table2.FindKey([ID]) = true; '= true' kann auch weggelassen werden.

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

MfG
Urs
  Mit Zitat antworten Zitat
schmodi

Registriert seit: 11. Dez 2004
24 Beiträge
 
#4

Re: Repeat schleife mit Datenbankabfrage

  Alt 8. Jan 2005, 14:39
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:
....
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;
Warum funktioniert hier die Randome funktion nicht richtig?

Gruess Schmodi
  Mit Zitat antworten Zitat
schmodi

Registriert seit: 11. Dez 2004
24 Beiträge
 
#5

Re: Repeat schleife mit Datenbankabfrage

  Alt 8. Jan 2005, 15:00
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
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#6

Re: Repeat schleife mit Datenbankabfrage

  Alt 8. Jan 2005, 15:03
Zitat von schmodi:
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
Ich habe gelernt, ein "Randomize" sollte im ganzen Programm nur ein einziges mal aufgerufen werden (sprich im onCreate)
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#7

Re: Repeat schleife mit Datenbankabfrage

  Alt 8. Jan 2005, 15:05
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:
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;
zu durchlaufen.

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
  Mit Zitat antworten Zitat
schmodi

Registriert seit: 11. Dez 2004
24 Beiträge
 
#8

Re: Repeat schleife mit Datenbankabfrage

  Alt 8. Jan 2005, 18:55
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
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#9

Re: Repeat schleife mit Datenbankabfrage

  Alt 8. Jan 2005, 20:25
Zitat von schmodi:
Habt Ihr den eine andere Idee?

Gruess Schmodi
Nochmal die Bitte, etwas genauere Infos zu geben (dann kann man besser helfen):
- 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
  Mit Zitat antworten Zitat
schmodi

Registriert seit: 11. Dez 2004
24 Beiträge
 
#10

Re: Repeat schleife mit Datenbankabfrage

  Alt 10. Jan 2005, 19:12
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 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