Moin,
früher konnte ich vor dem Öffnen per IF File() checken, ob die dbf existierte. Heute liegen die dbf im ADS, und auf den dazugehörigen Server hat der normale User keinen Zugriff. Damit fällt die alte Abfrage flach. Gibt es irgend eine Möglichkeit festzustellen, ob eine bestimmte Datei im ADS-Repository aufgeführt ist?
Jan
Existiert dbf im ADS?
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Existiert dbf im ADS?
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- UDF-Programmierer
- Beiträge: 63
- Registriert: Mi, 23. Dez 2015 22:46
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 4 Mal
Re: Existiert dbf im ADS?
Moin,
einfach mal schnell rauskopiert wie wir es machen:
einfach mal schnell rauskopiert wie wir es machen:
Code: Alles auswählen
FUNCTION ads_fexist(cDBF)
local xOldSel ,bSaveError
local lRet := .T.
local l1
bSaveError := ErrorBlock( {|oError| dummy_err_hnd(oError) } )
xOldSel := select()
*Datei testweise öffnen RO Shared
DbUseArea(.T.,,cDBF,,.T.,.T.)
*getLastError, relevante Codes
*0 : ok
*7013: File AccessError ( z.B. fehlende Rechte), Datei aber vorhanden
*7014: kein DBF-File, Datei vorhanden
*7041: Datei nicht vorhanden
*7061: beim testen einer NTX, Datei vorhanden, warum auch immer kommt
* diese Nummer statt 7014
l1 := oSession:getLastError()
//? "oSessionErrC", l1
//cErrorMsg := oSession:getLastMessage()
//? "oSessionErrM", cErrorMsg
do case
case l1 == 0
DbCloseArea()
case l1 == 7041
lRet := .F.
end case
*Errorhandler zurück
ErrorBlock(bSaveError)
select(xOldSel)
RETURN lRet
Grüße von Philipp
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Existiert dbf im ADS?
Moin Philipp,
das ist natürlich brachial mit Brechstange. Ich hatte gehofft es gibt irgendwas eleganteres, z. B. auf SQL-Basis.
Jan
das ist natürlich brachial mit Brechstange. Ich hatte gehofft es gibt irgendwas eleganteres, z. B. auf SQL-Basis.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- nightcrawler
- 1000 working lines a day
- Beiträge: 651
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 96 Mal
- Kontaktdaten:
Re: Existiert dbf im ADS?
Hallo Jan,
leider auch nichts besseres. Auch ein SELECT würde versuchen, die Tabelle zu öffnen. Damit wird das Filesystem enorm belasted und die Gesamt-Performance geht in die Knie.
Deshalb gab es ja mit Version 6 (kurz nach dem Jahrtausendwechsel) die Erweiterung der Data Dictionaries. Eine Zusammenfassung der Einzel-Dateien zu einer übergreifenden Datenbank
Was möglich wäre (und etwas ähnliches habe ich schonmal mit Delphi gemacht): Du schreibst eine Extended Stored Procedure (in eine native Windows-DLL), welche die FileExist-Abfrage direkt auf dem Server macht, ohne die Datei dabei zu öffnen. Das könnte schneller gehen, als über eine ADS-OpenTable Abfrage.
leider auch nichts besseres. Auch ein SELECT würde versuchen, die Tabelle zu öffnen. Damit wird das Filesystem enorm belasted und die Gesamt-Performance geht in die Knie.
Deshalb gab es ja mit Version 6 (kurz nach dem Jahrtausendwechsel) die Erweiterung der Data Dictionaries. Eine Zusammenfassung der Einzel-Dateien zu einer übergreifenden Datenbank
Was möglich wäre (und etwas ähnliches habe ich schonmal mit Delphi gemacht): Du schreibst eine Extended Stored Procedure (in eine native Windows-DLL), welche die FileExist-Abfrage direkt auf dem Server macht, ohne die Datei dabei zu öffnen. Das könnte schneller gehen, als über eine ADS-OpenTable Abfrage.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Existiert dbf im ADS?
Aber das ist doch keine Brechstange, das mit dem ErrorBlock von Philipp - sondern eine recht elegante Lösung. Auch hier geht es um die negative Antwort auf einen File-Request. Man darf sich nicht dadurch irritieren lassen, dass vermeintlich eine Fehlersituation behandelt wird.
Herzlich,
Tom
Tom
- Jan
- Marvin
- Beiträge: 14655
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Existiert dbf im ADS?
Hallo Tom,
ja klar geht das. Und auch sicher. Was ich damit meinte ist: Ich provoziere einen Laufzeitfehler, den ich dann aber natürlich geordnet abfange und auswerte. Gegenüber irgendwas in SQL wie isTable (jetzt unwissend und naiv dahin geschrieben) wäre da halt wesentlich eleganter. Daher der Vergleich mit der brachialen Brechstange.
Ich seh aber gerade: In einem anderen, älteren Modul benutze ich ein Abfrage "Select name from system.tables order by name". Das gibt mir irgend sowas wie ein Array zurück, das ich dann auslesen kann. Oder ich könnte schauen ob man das so umbauen kann das ich nicht komplett alle dbf aus dem ADS zurückbekomme, sondern nur Datei eine spezielle. Dann wäre die Rückgabe natürlich leer. Ich werd da mal etwas mit spielen und dann das Ergebnis hier posten.
Jan
ja klar geht das. Und auch sicher. Was ich damit meinte ist: Ich provoziere einen Laufzeitfehler, den ich dann aber natürlich geordnet abfange und auswerte. Gegenüber irgendwas in SQL wie isTable (jetzt unwissend und naiv dahin geschrieben) wäre da halt wesentlich eleganter. Daher der Vergleich mit der brachialen Brechstange.
Ich seh aber gerade: In einem anderen, älteren Modul benutze ich ein Abfrage "Select name from system.tables order by name". Das gibt mir irgend sowas wie ein Array zurück, das ich dann auslesen kann. Oder ich könnte schauen ob man das so umbauen kann das ich nicht komplett alle dbf aus dem ADS zurückbekomme, sondern nur Datei eine spezielle. Dann wäre die Rückgabe natürlich leer. Ich werd da mal etwas mit spielen und dann das Ergebnis hier posten.
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Existiert dbf im ADS?
Häng Dich nicht am Begriff "Fehler" auf, Jan. Letztlich geht es darum, dass ein Request - ob nun auf Betriebssystem- oder auf Serverebene, scheißegal - eine negative Antwort liefert. Diese negative Antwort ruft das Fehlersystem - ordentlich funktionierende Module der Software! - auf, und Du bringst das Fehlersystem dazu, in Deinem Sinne zu reagieren. Du provozierst nichts Falsches; so wird unter der Haube andauernd gearbeitet. Schau Dir mal die Logs an, die ein Tool wie ProcMon liefert, während Deine Anwendung irgendwas lokal mit Daten macht. Da werden pausenlos "Fehlerzustände" erzeugt und behandelt. Es ist kein Fehler, proaktiv darauf zu reagieren, wenn eine Tabelle sich aufgrund ihres Fehlens nicht öffnen lässt. Ein Fehler wäre, derlei zu tun, obwohl es bei korrekt installierter und betriebener Software nicht so sein sollte, dass Tabellen nicht vorhanden sind, die man braucht.
Problematisch ist das nur, wenn jetzt ein Fehler innerhalb dieser kurzen Codestrecke auftritt.
Problematisch ist das nur, wenn jetzt ein Fehler innerhalb dieser kurzen Codestrecke auftritt.
Herzlich,
Tom
Tom