Probleme mit DbLocate [Erledigt]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Probleme mit DbLocate [Erledigt]

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit DbLocate

Beitrag 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 ...
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Probleme mit DbLocate

Beitrag 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".
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Probleme mit DbLocate

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit DbLocate [Erledigt]

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Probleme mit DbLocate [Erledigt]

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit DbLocate [Erledigt]

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Probleme mit DbLocate [Erledigt]

Beitrag von Manfred »

Hubert,

wieso? Ich sehe in Deinem Beispiel FIELD-> und habe Dich danach gefragt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Probleme mit DbLocate [Erledigt]

Beitrag von Jan »

brandelh hat geschrieben:@ JAN,

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

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Probleme mit DbLocate [Erledigt]

Beitrag von Tom »

Die IF-Schleife korrekt zu legen...
IF-Schleifen. Was es nicht alles gibt. :wink:
Herzlich,
Tom
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Probleme mit DbLocate [Erledigt]

Beitrag 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
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten