Seite 1 von 1

Probleme mit DbLocate [Erledigt]

Verfasst: Mi, 06. Nov 2013 12:28
von Jan
hallo,

was ist an dieser Zeile falsch?

Code: Alles auswählen

IF garden->(DbLocate({|| garden->adressnr == aEintraege[i][1]})) = .F.
Das Problem ist: Die wird ersteinmal sauber durchlaufen. Aber plötzlich springt der doch in die Schleife rein, obwohl eindeutig kein korrekter Wert gefunden wurde. RecNo() ist auf auf dem Phantomsatz, sprich LastRec() + 1.

Es gibt keinen Index, keinen Filter.

Wenn ich das so mache

Code: Alles auswählen

             LOCATE FOR adressnr == aEintraege[i][1]
             IF .NOT. found() .AND. garden->(RecNo()) < 163
dann funktioniert das. Wobei ich da ja auch abfange ob der auf dem Phantomsatz steht.

Jan

Re: Probleme mit DbLocate

Verfasst: Mi, 06. Nov 2013 12:42
von brandelh
zunächst prüft man EOF nicht mit recno() < 163 ab, sondern mit if ! EOF() ...

ansonsten kann ich mir nur Vorstellen, dass ein leerer Inhalt von dem Array auf den leeren Feldinhalt vom Phantomsatz trifft ...

Re: Probleme mit DbLocate

Verfasst: Mi, 06. Nov 2013 12:59
von georg
Hallo, Jan -


wenn ich Dein Codebeispiel

Code: Alles auswählen

LOCATE FOR adressnr == aEintraege[i][1]
übersetze, erhalte ich in der PPO-Datei folgenden Code:

Code: Alles auswählen

                    dbLocate( _EarlyBoundCodeblock({|| adressnr == aEintraege[i][1]}), , , , .F. )
Das weicht ein wenig von Deinem Code ab, weil hier eine interne Funktion verwendet wird, wahrscheinlich, um das Verhalten des Codeblocks so zu ändern, dass es "passt".

Re: Probleme mit DbLocate

Verfasst: Mi, 06. Nov 2013 13:18
von Jan
Das Problem hat sich erledigt. Die Zeile war korrekt, aber die IF-Schleife dahinter, die ich nur provisorisch reingebaut hatte (also ohne die passenden Einrückungen), endete an der falschen Stelle. Mit Einrückungen wäre das nicht passiert :banghead:

Jan

Re: Probleme mit DbLocate [Erledigt]

Verfasst: Mi, 06. Nov 2013 13:42
von brandelh

Code: Alles auswählen

IF garden->(DbLocate({|| garden->adressnr == aEintraege[i][1]})) = .F.
Ich nutze intern nach ALIAS-> auf Funktionen nur noch FIELD ...

Code: Alles auswählen

IF garden->(DbLocate({|| FIELD->adressnr == aEintraege[i][1]})) = .F.
und für die Fehlersuche ...

Code: Alles auswählen

IF garden->(DbLocate({|| qout("i:",i,"F:",FIELD->adressnr, "A:",aEintraege[i][1],"R:",recno()),;
                                             FIELD->adressnr == aEintraege[i][1]})) = .F.

Re: Probleme mit DbLocate [Erledigt]

Verfasst: Mi, 06. Nov 2013 14:09
von Manfred
Hubert,

warum? Nur so, oder hast Du einen speziellen Grund dafür? Wenn mehrere Dbf geöffnet sind, dann muß man genau aufpassen. Mit DBF Angabe, geht alles m.E. wesentlich übersichtlicher.

Re: Probleme mit DbLocate [Erledigt]

Verfasst: Mi, 06. Nov 2013 14:50
von brandelh
@ JAN,

was war jetzt die Lösung ?

@ Manfred

du solltest schon genauer lesen ... :badgrin:

Einzelne Zugriffe und der Aufruf von Funktionen statte ich (normalerweise) mit dem numerischen Selectbereich (gleichwertig mit Alias) aus:

Code: Alles auswählen

(n)->FELD
(n)->(dbFunktion())
(n)->(eof())
ALIAS->(eof())
etc.
nur wenn ich bei z.B. dbLocate() oder dbEval() intern ein Feld angeben muss z.B. im codeblock, dann nutze ich hier FIELD->, da ja der Alias / Selectbereich vorne erledigt wurde:

Code: Alles auswählen

(n)->(dbEval( {|| nSumme += FIELD->betrag ))
ALIAS->(dbLocate( {|| FIELD->feld == (cSuch) } ))
und natürlich ist es nicht falsch immer den Alias zu verwenden, aber es kam zumindest bei mir schon vor, dass ich bei einer Änderung nur den Alias vorne geändert habe und dann kam sowas raus:

Code: Alles auswählen

DB1->(dbLocate( {|| DB2->feld == (cSuch) } ))
wenn dann zufällig DB2 noch ein gültiger Alias einer anderen Datei ist, wird es lustig.

Re: Probleme mit DbLocate [Erledigt]

Verfasst: Mi, 06. Nov 2013 14:55
von Manfred
Hubert,

wieso? Ich sehe in Deinem Beispiel FIELD-> und habe Dich danach gefragt.

Re: Probleme mit DbLocate [Erledigt]

Verfasst: Mi, 06. Nov 2013 15:01
von Jan
brandelh hat geschrieben:@ JAN,

was war jetzt die Lösung ?
Die IF-Schleife korrekt zu legen...

Jan

Re: Probleme mit DbLocate [Erledigt]

Verfasst: Mi, 06. Nov 2013 15:14
von Tom
Die IF-Schleife korrekt zu legen...
IF-Schleifen. Was es nicht alles gibt. :wink:

Re: Probleme mit DbLocate [Erledigt]

Verfasst: Do, 07. Nov 2013 10:50
von UliTs
Ich finde, das ist ein grundsätzlicher Design-Fehler in der Sprache xBase++ bzw. Clipper 5.0.

Meines Erachtens sollte es möglich sein, select-Bereiche zu kapseln, so dass diese z.B. bei Codeblöcken als Parameter übergeben werden MÜSSEN, wenn sie benötigt werden.

Uli