Do While .NOT. EoF()) [Erledigt]

Advantage Database Server

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:

Do While .NOT. EoF()) [Erledigt]

Beitrag von Jan »

Moin,

ich bin gerade dabei, bei einem Kunden alles auf ADS umzustellen. Die Datenbanken sind FOXCDX OEM und in das Data Dictionary eingetragen. Die Verbindung klappt, die Datenbanken lassen sich auch inkl. dem Index öffnen.

Jetzt stoße ich aber auf folgendes Problem: Ich habe eine Schleife, die alle Datensätze einer dbf durchgehen soll. Mit DBFNTX und FOXCDX klappt das schon seit Jahren immer sauber. Unter ADSDBE bekommt der aber kein EOF-Signal, und startet damit nach dem letzten Datensatz wieder mit dem ersten. Endlosschleife.

Ich habe schon über den ARC reindiziert, das hat nichts gebracht.

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: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Nutzt du den SQL Zugriff mit der ADSDBE ?

Wenn ja schau mal in der Doku ob diese überhaupt EOF() unterstützt ?

Ein SQL Server kennt sowas normalerweise nicht und liefert immer ein Resultset zurück, bei dem aber die Anzahl der Treffer bekannt ist.
Im Prinzip also so, als ob die Datengrundlage ein Array wäre bei dem du von 1 bis len(aArray) durchgehst.
Gruß
Hubert
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: Do While .NOT. EoF())

Beitrag von Jan »

Moin Hubert,

öhm, wovon redest Du jetzt?

ich red bestimmt am Thema vorbei, aber SQL mache ich nicht. Der Code ist rein DBxxx(). Und ich wüßte jetzt auch nicht, wo in der ADS-Konfiguration ich irgendeinen SQL-Zugriff eingebaut haben könnte.

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: Do While .NOT. EoF())

Beitrag von Tom »

Ich kenne ein ähnliches Phänomen bei ADS/DBF im Kontext von aktiven Filtern und DbGoto(). Aber auch nur da. Ansonsten macht die ADSDBE so ziemlich genau dasselbe wie die anderen DBEs.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Ich meinte, dass es möglich ist, dass einige Funktionen in einer DBE nicht unterstützt werden, aber EOF() sollte eigentlich nicht dazu zählen.
In der ADS Doku steht nichts über eif(), aber in der ODBCDBE wird erwähnt, dass EOF() unterstützt wird,
also müsste es eigentlich auch bei der ADS von Alaska eingebaut worden sein.

Die Beispiele nutzen auch kein do while sondern dbEdit() ...

Nein, es kann nicht sein dass EOF() nicht unterstützt wird.
Und selbst wenn nicht, dürfte deshalb keinesfalls nach dem letzten wieder der erste Satz angezeigt werden.
Ich habe aber schon erlebt, dass defekte Indexdateien die seltsamsten Sachen provoziert haben, also würde ich mal die Indexe neu aufbauen ...
Gruß
Hubert
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: Do While .NOT. EoF())

Beitrag von Jan »

Hallo Tom,

ein Filter ist da drauf. Den hatte ich aber schon raus genommen, weil ich den im Verdacht hatte. Hat aber auch nichts gebracht.

Im Moment teste ich gerade mit den Index-Dateien rum. Da war aus DBFNTX-zeiten noch ein Indexschlüssel mit Upper() drin, was unter FOXCDX ja unnötig ist. Und die ADSDBE scheint den auch nicht zu mögen.

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: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Über die Indexdateien steht was in der Doku, da gibt es Beschränkungen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Nochmal zu SQL ... wenn du schon dabei bist auf ADS umzustellen UND lahme Filter nutzt, warum nicht gleich richtig machen und nur die nötigen Daten per SQL anfordern ?

Das Ergebnis dann als Array (mit DataObjects) und hast gute Chancen die Performance ordentlich zu steigern.
Gruß
Hubert
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: Do While .NOT. EoF())

Beitrag von Tom »

Es gibt Beschränkungen im Hinblick auf die Funktionen, die im Index verwendet werden dürfen. Gäbe es damit jedoch ein Problem, ließe sich der Index überhaupt nicht mit der ADSDBE öffnen. Das betrifft vor allem UDFs in Indexen und ein paar andere Funktionalitäten. Die meisten, die man so verwendet - von Str() bis Upper() - werden jedoch unterstützt.

Tatsächlich ist eine Reindexierung erforderlich, wenn man die ADS in Betrieb nimmt. Die Indexe sind nicht (ganz) kompatibel. Empfehlenswert ist übrigens auch, auf das implizite Locking der ADS umzuschalten, weil das sehr viel schneller und sicherer ist. Allerdings ist dann kein konkurrierender Betrieb (ohne ADS) möglich. Was sowieso niemand tun sollte.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Tom hat geschrieben:Ich kenne ein ähnliches Phänomen bei ADS/DBF im Kontext von aktiven Filtern und DbGoto().
In einer normalen DBE müsste ein DBGoto() auf einem gefilterten Datensatz bleiben, egal was der Filter sagt.
The function works with the physical records in a file and does not necessarily equate to logical records.
Therefore, any record can be accessed with DbGoto() even if it does not meet the current filter condition or is marked as "deleted" and SET DELETED ON is active.
Eventuell liegen die "Nebenwirkungen" aber auch in anderen Programmteilen.

Ich würde eine kleine EXE machen, die eine neue DBF ohne Index etc. öffnet und mit dbskip() durchgeht.
Wenn das kleine Testprogramm EOF() liefert, muss das Problem im restlichen Code bzw. dieser speziellen DBF / Indexdatei liegen, wenn nicht gibt es keine EOF() oder man muss was einstellen.
Gruß
Hubert
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: Do While .NOT. EoF())

Beitrag von Jan »

Hallo Hubert,

im Prinzip würde ich Dir Recht geben. Aber im Moment geht es erstmal darum, das überhaupt mit der ADSDBE ans laufen zu bekommen. Und die Filter habe ich schon fast überall aus den Programmen des Kunden rausgeworfen in den vergangenen Jahren, und durch Scopes ersetzt. Der hier war einer der ganz wenigen übrig gebliebenen.

Und DataObjects geht leider erst mit 2.0. Wo der Kunde sich weigert die anzuschaffen ...

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: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Jan hat geschrieben: Und DataObjects geht leider erst mit 2.0. Wo der Kunde sich weigert die anzuschaffen ...
Jan
das kann man so nicht sagen ;-)

Ich bin dabei die Klasse für die 1.90 nachzubauen, weil ich sie für EIN Programm brauche und nicht dauernd die Compiler switchen will.
Die Geschwindigkeit ist bei meinen paar Hundert Treffern nicht so entscheident.

PS: natürlich nicht die ganzen TO OBJECT Sachen, sondern nur das Verhalten der DataObjects nach außen.
Gruß
Hubert
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: Do While .NOT. EoF())

Beitrag von Tom »

In einer normalen DBE müsste ein DBGoto() auf einem gefilterten Datensatz bleiben, egal was der Filter sagt.
Mit der ADSDBE auch. Leider ist es zuweilen so, dass ein DbGoto() (im gültigen Filterbereich) bei aktiver ADS und gesetztem Filter nicht zu funktionieren scheint, wenn man nicht vorher ein DbGotop() ausgelöst hat. Das ist mit allen ADS- und mit allen ADSDBE-Versionen so, jedenfalls nach meinem Eindruck. Es ist aber das einzige mir bekannte Problem in diesem Kontext, und wir nutzen die ADSDBE schon seit zwölf Jahren. Ach so, und Tabellen, die mehrere Memofelder haben, muss man via ADSDBE umkopieren, bevor man sie verwendet (also mit der Standard-DBE öffnen und via ADSDBE umkopieren). Jedenfalls bei DBFNTX.

Ich denke, Jan muss einfach reindexieren. Ach, noch etwas. Die ADS ist fehlerkritischer. Während man mit den Standard-DBEs z.B. einen numerischen Wert suchen kann, obwohl der führende Index alphanumerisch ist, gibt es mit der ADS in dieser Situation einen Laufzeitfehler - was uns schon ein paar Programmierfehler hat finden lassen. :wink:
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Nach TOMs Aussage muss EOF() grundsätzlich funktionieren, ich denke auch an die Indexdateien.
Jan hat geschrieben:im Prinzip würde ich Dir Recht geben. Aber im Moment geht es erstmal darum, das überhaupt mit der ADSDBE ans laufen zu bekommen.
Bei meinen Arbeiten mit SQLite (unter Android) habe ich festgestellt, dass man mit einer einfach zu lernenden SQL Abfrage
und einem Ergebnis im ResultSet (das ich in XBase++ und SQL Express in ein Array umkopiere) mit einer Zeile erledigt, was bei uns 20 oder mehr Zeilen benötigt.
Ich weiß nicht wie man SQL Abfragen mit der ADS erledigt, aber es könnte sich lohnen das vor der Umstellung anzusehen ...
Gruß
Hubert
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: Do While .NOT. EoF())

Beitrag von Tom »

Hallo, Hubert.

Deine Anmerkungen zu SQL in allen Ehren, aber Jan will eine Standard-DBF-Applikation auf ADS umstellen, da ist das nicht wirklich hilfreich. Natürlich kann und sollte man, wenn dieser Schritt getan ist, über Optimierungen nachdenken, was man sogar in einer Applikation tun kann, die beide Modelle (Standard-DBE und ADSDBE) unterstützt, aber das ist erst der zweite Schritt.

Wie gesagt, im einfachsten Fall ist es ein Indexproblem - die Indexe sind zwar abwärtskompatibel, aber man muss Re-Indexieren, bevor/wenn man auf ADS umschaltet. Umgekehrt ist es nicht nötig. Im schwierigeren Fall verweist die ADS auf ein Problem, das man auch vorher schon hatte, aber nicht bemerkt hat.

Ansonsten würde ich einfach mal einen Zehnzeiler schreiben: DBE aktivieren, Tabelle öffnen, durchwandern. Wenn das funktioniert, liegt das Problem ganz woanders, etwa in Funktionen, die in der DO-WHILE-!Eof()-Schleife aufgerufen werden.
Herzlich,
Tom
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: Do While .NOT. EoF())

Beitrag von Jan »

So, ich bin einen Schritt weiter. Aber nicht schlauer.

Die dbf hat drei Indizee: 2 Stück auf Felder N8, einen auf ein Feld C20. Ist einer der beiden numerischen Indizee aktiv, gibt es kein Problem. Nur beim Character-Feld.

Ich habe mr die Properties dann mal im Architekten angesehen., Und bin erstaunt: Da steht als Feldbeschreibung für den Index ein C40 drin! Keine Ahnung warum. Ich hatte nach dem Index-Neu-Erstellen ohne Upper() extra die dbf und die cdx neu eingespielt in das Data Dictionary, der hat auch den Index selbständig eingelesen.
Index.jpg
Index.jpg (46.81 KiB) 8270 mal betrachtet
dbf.jpg
dbf.jpg (35.77 KiB) 8269 mal betrachtet
Ich wollte dann im Architekten ein Reindex machen. Geht nicht, Fehlermeldung "Error 7008: The specified table, memo file, or index was unable to be opened". Ich kann auch den Eintrag für den Index nicht auf 20 zurücksetzen, das Feld ist schreibgeschützt.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Do While .NOT. EoF())

Beitrag von Manfred »

Ich dränge mich mal dazwischen, da ich um Jans Problem ein wenig Bescheid weiß.

Das Problem wird sicherlich ähnlich zu erklären sein, wie damals von Clipper auf Xbase++. Es ist eine große Sache und es soll erstmal nur auf ADS umgestellt werden, das es ohne Probleme genutzt werden kann. Dann im Lauf der Zeit werden die entsprechenden Anpassungen gemacht, die der Sache mehr dienen. Da aber zu viel Rattenschwanz dahintersteckt, ist eine komplette Änderung auf keinen Fall direkt möglich. Das ganze System ist/dürfte einfach zu komplex sein, als dass man es schnell mal eben umbaut.
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: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Do While .NOT. EoF())

Beitrag von brandelh »

Da gibt es eine Schaltfläche DELETE INDEX - drücken ...

Eventuell war deine alte CDX nicht korrekt, einfach den Index löschen und neu definieren ... wenn du Glück hast steht dann passend 20 drinn ;-)
Gruß
Hubert
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: Do While .NOT. EoF())

Beitrag von Jan »

So, erstmal scheint das Problem gelöst zu sein.

Ich bin mal in die Connection Properties des Data Dictionaries gegangen. Da stand als TableType drin: adt. Muß natürlich cdx sein. In der Collation stand irgendein lokaler Eintrag drin, der muß OEM sein in diesem Fall.

Geändert, gespeichert, über den Architekten reindiziert (klappt auf Anhieb!), Kundenprogramm gestartet - klappt einwandfrei.

In der Indexbeschreibung steht immer noch ein C40 drin, aber das scheint nicht mehr relevant zu sein.

Wo man alles an der Konfigurationsschraube drehen muß ... Besonders irritierend finde ich, das es grundsätzlich ersteinmal auch mit den falschen Einstellungen klappt. Nur in Details nicht. Hätte es sofort geknallt wäre ich ja schon früher auf die Idee gekommen, das da was in den Grundeinstellungen nicht stimmen könnte.

Danke für Eure Hilfe auf dem Weg dahin.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige 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: Do While .NOT. EoF()) [Erledigt]

Beitrag von Jan »

Ein Zusatz: Der ADS scheint teilweise Probleme damit zu haben, wenn die Feldnamen im Indexschlüssel klein geschrieben sind. Ich habe gerade eine Schleife gebaut, die eine dbf mit diversen Indizee erst vorwärts und dann sofort wieder rückwärts durchläuft. Vorwärts lief alles, rückwärts hing der in einer Endlosschleife zwischen 3 Datensätzen. Erst als ich die Indexproperties auf Großschreibung des Feldnamens geändert habe, lief der sauber durch.

Etwas empfindlich, der Junge ...

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: Do While .NOT. EoF()) [Erledigt]

Beitrag von Tom »

Das kann höchstens mit dem Data Dictionary zu tun haben, aber ich wüsste nicht, weshalb. Mir ist dieses Phänomen nicht bekannt. Ob ich nun auf "name" oder "NAME" indexiere, das Ergebnis ist dasselbe.

Edit: Vermutlich hast Du die ADS bzw. das DD durch die Änderung zum Reindexieren gezwungen, und der Index war vorher nicht aktuell oder inkompatibel. Ändere doch einfach mal Spaßenshalber zurück auf Kleinschreibung.
Herzlich,
Tom
Antworten