Fehler bei Script mit DBF-UDF

  • Zitat von autobert

    Ich hatte dieselben Probleme mit dem Skript:

    Ein einfügen von:


    Code

    Code
    #AutoIt3Wrapper_UseX64=n

    im Kopf des Skriptes und Problem ist verschwunden. Mein Consolenoutput von Musashi 's Skript (mit obigem Zusatz):

    Hi autoBert !

    Laut AutoIt3Wrapper_Directives ist der Defaultwert für #AutoIt3Wrapper_UseX64 = N (No) !

    Er muss daher eigentlich nicht extra mit #AutoIt3Wrapper_UseX64 = N angegeben werden.

    #AutoIt3Wrapper_UseX64 = Y führt auch bei mir zu : "Fehler beim Öffnen der .dbf ..."

    Ein Versuch kann aber nicht schaden ;).

    EDIT oberh : Du kannst ja mal folgendes Skript ausprobieren :

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (28. April 2020 um 20:58) aus folgendem Grund: Skript erweitert

  • Mal anders gesponnen, was den Hinweis von autoBert betrifft: Wenn der TE ein 64-Bit System hat, sollte er das Flag #AutoIt3Wrapper_UseX64 auf "Y" setzen und dann noch mal testen und schauen ob das Problem damit behoben ist.

  • Mal anders gesponnen, was den Hinweis von autoBert betrifft: Wenn der TE ein 64-Bit System hat, sollte er das Flag #AutoIt3Wrapper_UseX64 auf "Y" setzen und dann noch mal testen und schauen ob das Problem damit behoben ist.

    Hi Moombas !

    Ich habe ein 64-Bit System und das Flag testweise bereits auf Y gesetzt :

    #AutoIt3Wrapper_UseX64 = Y führt bei mir zu : "Fehler beim Öffnen der .dbf ..."

    Es geht eher darum, #AutoIt3Wrapper_UseX64 = N explizit anzugeben, obwohl es eigentlich der Defaultwert ist (sein sollte).

    Letztlich ist ein Versuch mit Y bzw. N aber schnell gemacht, von daher kann oberh beide Varianten einfach ausprobieren. Wir haben ja schon ganz andere 'Besonderheiten' erlebt ^^.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Guten Morgen zusammen und vielen Dank, dass Ihr Euch so viele Gedanken macht!

    Nun habe ich mir gerade auf meinem privaten Rechner auch AutoIt installiert.

    Habe mir meine au3-Dateien ebenso dorthin kopiert und habe beide #AutoIt3Wrapper_UseX64 Varianten getestet.

    Die dbf wird weiterhin nicht geöffnet.

    Was habe ich denn gemacht, nachdem es gelaufen hatte ... (Brainstorming) ...

    ... Zunächst habe ich den Dateinamen als kompletten String mit Pfad drin stehen gehabt.

    ... Dann habe ich FileselectFolder eingebaut. Auch zu dem Zeitpunkt meine ich, lief das Script noch.

    ... Die Kommentarzeilen kamen als Nächstes hinzu.

    ... Die Beispieldatei habe ich dann über einen Export aus meinem Geograf-Projekt, welches mir als "Legende" dient, neu erstellt.

    Zwischenzeitlich hatte ich noch ein paar Punkte und Texte dort hinein gepackt, die aber für die Flächen-dbf, die hier geändert

    werden soll, unerheblich sind. Auch habe ich vorab noch ein paar Spalten neu definiert in der zugrunde liegenden Datenbank,
    aus der die dbf abgeleitet wird. Dies sollte auch nicht zum jetzigen Problem führen.
    Zudem kann ich die dbf in Excel öffnen und auch als kopletten Shape in ArcGIS.

    Die Datei kann also nicht beschädigt sein - Ihr könnt sie ja auch öffnen ...

    ... An der Konfiguration von AutoIt habe ich nichts geändert. Privat habe ich FileselectFolder sogar neu über einen Link hier im
    Forum implementiert.

    ... An unserer EDV kann es nicht liegen - privat läuft das Script ja auch nicht.

    Und dennoch muss sich ja irgend etwas geändert haben ... <Haare rauf´>

    • Offizieller Beitrag

    Bin gerade unterwegs.

    Gegen Mittag bin ich wieder am PC, dann werde ich mal testen, ob ich mit den Funktionen, die ich für meine dbf Dateien verwende, auch deine öffnen kann. Die DBF-UDF habe ich mir noch nicht angesehen. Ich verwende dazu nicht den Stream, wie ich in vielen Bsp. schon gesehen habe, sondern direkt einen DB-Treiber.

  • Testumgebung :

    • Ich verwende das in meinem Beitrag #24 gepostete Skript
    • die Dateien BLP_FLAECHEN.dbf , FileSelectFolder.au3, DBF.au3 und DBF.dll befinden sich im selben Verzeichnis wie das Testskript (DBFTestV1.au3).

    Ich habe Dir eine .Zip angehängt, die Du bitte in einem Verzeichnis Deiner Wahl entpackst, z.B.

    C:\AutoItTest

    Starte SciTE (hast Du ja jetzt installiert ;)) und öffne DBFTestV1.au3 . Anschließend lasse das Skript innerhalb von SciTE mit F5 laufen. Was passiert ?

    Gruß Musashi

    Dateien

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (29. April 2020 um 09:50)

  • Hi Musashi!

    Habe es gerade auf meinem privaten Rechner laufen lassen - es funktioniert.

    Im Laufe des Tages werde ich Dein Script Schritt für Schritt umbauen und sehen, wo es letztlich hakt.

    Super! Danke vielmals!

  • Hi!

    Es reicht schon, wenn ich aus dem Testordner die dbf.au3 und dbf.dll heraus nehme und somit auf den Include-Ordner zugreifen lasse, damit es nicht mehr funktioniert.

    LG

    Olaf

  • Hi Musashi !

    Habe es gerade auf meinem privaten Rechner laufen lassen - es funktioniert. Im Laufe des Tages werde ich Dein Script Schritt für Schritt umbauen und sehen, wo es letztlich hakt.
    Super! Danke vielmals!

    :thumbup:

    Es reicht schon, wenn ich aus dem Testordner die dbf.au3 und dbf.dll herausnehme und somit auf den Include-Ordner zugreifen lasse, damit es nicht mehr funktioniert.

    1.

    Diese Dateien im jeweiligen Skriptordner (und nicht im Standard-Include-Ordner) abzulegen, halte ich eh für die bessere Wahl.

    2.

    Obwohl es jetzt läuft würde ich Dir dennoch empfehlen, auch die von BugFix angekündigte Lösung in Betracht zu ziehen. ( funkey ist ein durchaus renommiertes Mitglied, aber die UDF+DLL haben schon einige Tage auf dem Buckel ^^)

    Ich selbst habe seit Ewigkeiten nichts mehr mit DBase gemacht, wohl aber mit PostgreSQL. Auch ich verwende dabei vorzugsweise die allgemeingültigere Treiberlösung (ADO-ODBC).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Das das Skript nicht mehr funktioniert, wenn die .dll fehlt ist (aus meiner Sicht) doch logisch.

    Ich würde dir empfehlen:

    Kompiliere dein Skript (mit F7) als *.exe

    Dann besteht dein Programm nur noch aus der *.exe und der *.dll (und erfordert kein autoit bzw. Scite zur Ausführung auf den jeweiligen Rechnern)

    Die *.dbl-Datei lässt du ja jedesmal manuell angeben und gehört ja nicht zum eigentlichen Programm.

    Ggf. solltest du dafür dann jedoch evtl. eine kleine GUI bauen (es reicht ja eine Edit in das du rein schreibst) anstatt der Konsolenausgabe (denn diese passiert dann natürlich nicht) um eine Rückmeldung für den Benutzer zu haben oder halt eine MSG-Box-Ausgabe wegen evtl. Fehler oder Gesamt-Erfolg machen.

    Einmal editiert, zuletzt von Moombas (29. April 2020 um 12:09)

  • Dass das Skript nicht mehr funktioniert, wenn die .dll fehlt ist (aus meiner Sicht) doch logisch.

    Nicht nur aus Deiner Sicht, sondern generell ;).

    Ich hatte die .Dll testweise mal umbenannt und erhielt - erwartungsgemäß- sofort "Fehler beim Öffnen der .dbf ...". Daher auch meine definierte Testumgebung, damit man sicher sein kann, dass alles vorhanden ist.

    Kompiliere dein Skript (mit F7) als *.exe [...] erfordert kein AutoIt bzw. Scite zur Ausführung auf den jeweiligen Rechnern)

    Das ist natürlich das Ziel - SciTE dient nur zum Testen und Entwickeln.

    Deine Idee mit der Eingabemöglichkeit für den Dateinamen der .dbf ist sinnvoll :thumbup:.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Deine Idee mit der Eingabemöglichkeit für den Dateinamen der .dbf ist sinnvoll :thumbup: .

    Die hatte er ja im Ursprung schon drin, hast du doch selber raus genommen zu Testzwecken^^ War also nicht meine Idee :P

    ...und den Pfad direkt gesetzt (damit man nicht immer durch den FileSelectFolder-Dialog durch muss ;) ).

  • Die hatte er ja im Ursprung schon drin, hast du doch selber raus genommen zu Testzwecken^^ War also nicht meine Idee :P

    :Face::D

    EDIT oberh (nur zur Sicherheit) :

    Wie Moombas bereits beschrieben hat, musst Du neben der .exe auch die DBF.dll beifügen. Diese Datei wird standardmäßig nicht eingebunden. Um diese Datei trotzdem mit der .exe 'auszuliefern' kannst Du sie aber mit :

    FileInstall ("DBF.dll", @ScriptDir & "\DBF.dll") ; Einbinden der DLL

    (zu Beginn des Skriptes) inkludieren.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (29. April 2020 um 13:19)

    • Offizieller Beitrag

    Also ich habe mir das mal näher angeschaut. Unter der Prämisse, dass .FO ausschließlich an der Position existiert, wo es auch entfernt werden soll, braucht man gar nicht so viel Aufwand betreiben. Das geht mit ein paar Zeilen:

    AutoIt
    Global $fH = FileOpen('BLP_FLAECHEN.dbf', 16) ; read binary
    Global $sBinary = FileRead($fH)
    FileClose($fH)
    
    $sBinary = StringReplace($sBinary, '2E464F', '202020') ; replace ".FO" mit "   "
    $fH = FileOpen("BLP_FLAECHEN_1.dbf", 1+8+16) ; write binary
    FileWrite($fH, $sBinary)
    FileClose($fH)

    ;)

  • Hi zusammen!

    Zitat

    Das das Skript nicht mehr funktioniert, wenn die .dll fehlt ist (aus meiner Sicht) doch logisch.

    Ich bin ja noch Anfänger in AutoIt.

    Für mich war es aber logisch, die dll und die au3 mit in den Include-Ordner zu packen, da sie ja auch per Include in den Code eingefügt werden.

    So habe ich mir damals in Access auch eine Funktionssammlung angelegt, die ich dann in meinen Datenbanken eingebunden habe. Die Funktionssammlung habe ich immer laufend gehalten.

    Wenn es dann irgendwo deswegen knallte, wurden die Datenbanken eben entsprechend angepasst.

    Allerdings muss ich zugeben, dass die Datenbanken natürlich nur im Hause, wenn auch in verschiedenen Abteilungen, also in einem Netzwerk, verwendet wurden.

    Zitat


    ...und den Pfad direkt gesetzt (damit man nicht immer durch den FileSelectFolder-Dialog durch muss

    Das muss leider sein, da sich dieser Pfad immer wieder ändern kann.

    Wir arbeiten mit einem Aktenplan und jeder BPlan wird mit einer eigenen Auftragsnummer abgelegt.

    Darunter kann jeder die Ordner strukturieren, wie er möchte (naja ... fast).

    Zitat


    Kompiliere dein Skript (mit F7) als *.exe

    Ja, das macht Sinn.

    Da warte ich aber ein paar Tage ... hatte heute morgen meine Anleitung verschickt, wie die Scripte in Geograf einzuninden sind.

    Wäre blöd, wenn ich das jetzt schon wieder ändern lasse.

    Die Digitalisierung der BPäne entwickelt sich ja gerade.

    So wird es noch genug an Änderungen der Digitalisierrichtlinien z.B. geben, mit denen ich die Änderung in die exe "einbetten" kann. ;)

    Edit ... Mist zu früh abgeschickt ... :)

    Zitat


    FileInstall ("DBF.dll", @ScriptDir & "\DBF.dll") ; Einbinden der DLL

    Cool ...

    Ein Dankeschön an alle, die sich hier beteiligt haben!

    LG

    Olaf

    2 Mal editiert, zuletzt von oberh (29. April 2020 um 14:46)

  • Zu deinem letzten Post oberh:

    Selbst bei anderen Programmiersprachen musst du entweder den Pfad der zu verwendenden dll(s) angeben und/oder diese direkt einbinden (was bisher NICHT der Fall war, Musashi aber ja gezeigt hat wie es geht, was ich in deinem Fall auch machen würde, da dann wirklich nur die Exe benötigt wird).

    Ich selber packe mir auch include-files (da gehören keine dll's dazu), die Sinn ergeben, weil sie auch auf andere Programme angewendet werden könnten (hier wäre es ja die DBF.au3), in den Standard-Include Ordner.

    ABER: Bedenke das die Art und Weise wie diese angesprochen wird sich dann ändert: #include "DBF.au3" --> #include <DBF.au3>

    Und das, wenn andere deine Programme mal überarbeiten müssen, sie diese "besonderen" Include-Dateien zur Verfügung haben (ich lege alle meine Includefiles in einem Verzeichnis ab, wo auch andere in der Firma drauf zugreifen können).

    Verwende für eine allgemeine "Verteilung" immer nur Programme die komplett Kompiliert sind, nicht die au3 (Sourcecode). Wenn andere in der Firma die gleichen Ambitionen hat wie du, ändert er evtl. was an deinem Tool und dann knallt es ggf.


    Das mit dem FileSelectFolder-Dialog haben wir ja als "erforderlich" bzw. "sinnvoll" gesehen also ist das ja durchaus richtig wie du es am Anfang hattest was diesen Teil angeht.^^

  • Hi Bugfix!

    Ja danke, habe ich gesehen ... ;)

    Ob ich das

    Code
    '2E464F', '202020'

    aber auch in einem Jahr noch nachvollziehen kann ... wer weiss, wer weiss ... ;)

    Jetzt habe ich ja einen funktionierenden Code und brauche so auch nicht nachfragen, wie "" (also leere Zeichenkette) anstelle Deiner 3 Leerzeichen ersetzt wird ... <räusper> :)

    Hi Moombas!

    Deinen Vorschlag werde ich im Hinterkopf behalten. Danke Dir!

  • ... damit man nicht immer durch den FileSelectFolder-Dialog durch muss ;) ).

    Das muss leider sein, da sich dieser Pfad immer wieder ändern kann.

    Ich habe den FileSelectFolder-Dialog nur für die Testphase herausgenommen, um die Analyse auf ein Minimalskript zu begrenzen. Für die Suche nach dem Problem ist dieser Teil ja nicht relevant. Das war natürlich nicht als dauerhafte Lösung gedacht, sondern kann jetzt wieder eingebaut werden ;).

    oberh : ein kleiner Tipp am Rande bezüglich des Zitierens von Texten aus Beiträgen

    Du verwendest offenbar das 'Zitat-ICON' (die Sprechblase) aus dem ICON-Header und kopierst dann den Text hinein. Das kann man machen, aber es führt dazu, dass der Name des Zitierten nicht automatisch beigefügt wird.

    In diesen Fällen ist es einfacher, den Text im jeweligen Beitrag mit der Maus zu markieren :

    Er erscheint dann die Box Zitat speichern / Zitat einfügen

    Hier kannst Du nun das Zitat speichern (auch mehrere). Im Editor gibt es danach die Anzeige :

    Aus dieser Liste kannst Du Zitate auswählen und in Deinen Beitrag einfügen.

    Da bei Dir vermutlich noch weitere Fragen aufkommen werden, mag dies nützlich sein :).

    Moombas (nur um etwaigen Missverständnissen vorzubeugen) :

    FileInstall bindet Dateien wie Grafiken oder hier eine .dll in das Skript ein, und extrahiert sie beim Programmstart in das angegebene Verzeichnis. Sie ist danach also als eigenständige Datei vorhanden, so, als ob Du sie 'normal' beigelegt hättest.

    Dies unterscheidet sich von einem #include, bei dem die inkludierte UDF ein Teil des Hauptskriptes wird !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."