Seite 1 von 1

ADS Error 5004 - aber NetErr() merkt es nicht?

Verfasst: Fr, 03. Mär 2017 19:19
von DelUser01
Hallo

Habe wieder einen seltsamen Fehler:

An einer bestimmten Stelle fange ich seit längerer Zeit einen "unklaren Zustand" ab, protokolliere das und starte mein Programm neu.
Bei dem "unklaren Zustand" geht es darum, dass das Programm den OrdSetFocus( nI )auf eine Index-Nr. stellen soll welcher nicht vorhanden ist. OrdCount() ist also kleiner als der gewünschte Index ( nI ).

Jetzt erst ist mir aufgefallen, das bei dem "unklaren Zustand" den ich abfange immer eine ADS Fehlermeldung mitprotokolliert wird welche ich bisher übersehen habe:

  • oADS:GetLastError() Nr: 5004
    oADS:GetMessage: Error 5004: Either ACE could not find the specified file, or you do not have sufficient rights to access the file.
Der gemeldete ADS-Fehler kann niemals an der Stelle auftreten an der ich den "unklaren Zustand" abfange. Das muss schon vorher passieren.

Zusammengefasst sieht der Ablauf wie folgt aus:
  • 1) prüfen ob der ALIAS schon existiert.
    2) existiert der ALIAS wird DbUseArea() übersprungen, sonst wird die DBF in einer leeren WorkArea geöffnet.
    3) Fehlerprüfung unter anderem mit NetErr().
    4) prüfen ob alle zur DBF gehörigen Index geöffnet sind.
    5) sind alle Index geöffnet wird OrdListAdd() übersprungen, sonst werden alle Index mit OrdListAdd() geöffnet.
    6) Fehlerprüfung unter anderem mit NetErr().
    7) prüfen ob der gewünschte Index im möglichen Bereich liegt( >0 .and. <= OrdCount() ). Hier abgefangen.
    8 ) Schlussendlich wird mit OrdSetFocus() der gewünschte führende Index gewählt.
Meine Vermutung ist, dass der bei Pkt.7 abgefangene ADS Fehler 5004 bereits bei Pkt.2) oder Pkt.5) aufgetreten ist. Sollte das so sein ergibt sich daraus, dass bestimmte Fehler des ADS nicht im NetErr() landen sondern anderweitig abgefangen werden müssen.

Somit würde sich auch der "unklare Fehler" erklären: die DB und alle Index müssten geladen worden sein - das Ist aber nicht der Fall - es ist keint Fehler aufgetreten. Der Alias existiert jedoch nicht und somit auch nicht die notwendigen Indexes.

Hat jemand so etwas auch schon beobachtet - oder fangt Ihr ADS-Fehler mit ADS-Funktionen ab und nicht nur mit Standard Xbase++-Möglichkeiten ?

Re: ADS Error 5004 - aber NetErr() merkt es nicht?

Verfasst: Sa, 04. Mär 2017 12:18
von nightcrawler
zum Verhindern des 5004 einfach RIGHTS CHECKING abschalten. In VO wäre dies AX_RightsCheck(.F.), k.a. wie es in Xbase++ umgesetzt ist.

Re: ADS Error 5004 - aber NetErr() merkt es nicht?

Verfasst: Sa, 04. Mär 2017 13:15
von DelUser01
Hallo Joachim

AX_RightsCheck(.F.) werde ich einbauen.
Der Fehler kommt ja nur bei Verwendung von ADS.

Das bringt mich noch auf eine Idee:
Ich könnte ja den ADS mal ein paar Tage abschalten um zu sehen ob die verschiedenen "unklaren Fehler" weiterhin auftreten oder nicht.
Traue mich aber nicht so richtig den ADS abzuschalten - die Gewährleistung der Datenintegrität ist gerade bei solchen Programmabstürzen unbedingt notwendig. Das ist seit langer Zeit das wichtigste Argument für den Einsatz von ADS (und dann erst die Geschwindigkeit).

Re: ADS Error 5004 - aber NetErr() merkt es nicht?

Verfasst: Sa, 04. Mär 2017 20:48
von DelUser01
Hallo

habe gerade festgestellt, dass ich dieses Problem 2013 schon einmal unter anderem Blickwinkel ins Forum geschrieben habe:
http://www.xbaseforum.de/viewtopic.php? ... tlasterror

Damals hatte ich zum Abfangen der Fehler

Code: Alles auswählen

      Begin Sequence
         DbUseArea(...)
         ...
      Recover
         ...
      End Sequence
eingebaut und damit scheinbar den Fehler behoben.
Was sich auch immer geändert hat - der Fehler ist wieder da...

Re: ADS Error 5004 - aber NetErr() merkt es nicht?

Verfasst: Mi, 08. Mär 2017 23:46
von DelUser01
Zusatzinfo

Bei der Suche nach der Fehlerquelle habe ich festgestellt, dass ich zwar je Thread eine DacSession anlege, diese aber nicht bei DbUseArea verwendete. Habe ich inzwischen gemacht. Mal sehen...