Denkanstoß gesucht.

  • Nachtrag und Erläuterung :

    Du musst die Variable in deinem Code also umbenennen.

    Local $idclose = GUICtrlCreateButton("Abbrechen", ... wird zwar mit dem Schlüsselwort Local deklariert, aber da dies im globalen Scope Deines Skriptes (d.h. außerhalb einer Funktion) stattfindet, handelt es sich trotzdem um eine globale Variable. Dies führt dann zu dem o.a. Konflikt. Konstanten können nachträglich nicht mit neuen Werten besetzt werden, darum heißen sie ja so ;) .

    Alternativ könntest Du die GUI in eine Funktion verlagern. Dort wäre Local $idclose ... dann wirklich lokal und würde nicht mehr mit Global Const $IDCLOSE = 8 aus der MsgBoxConstants.au3 kollidieren.

    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."

  • Ersteinmal Danke Musashi. Da haben 2-3 Sätze gereicht um ein Problem zu lösen :) Das habe ich hiermit verstanden :)

    Concara

    Zitat

    Ich finde dein Projekt interessant!

    Für mich würden sich aber einige Fragen noch ergeben um dieses umsetzen zu können.

    Freut mich zu lesen. Ich freuie mich über jede Unterstützung und auf alles was ich lernen kann :)

    Zitat

    Woher kommen die PDF Dateien in den unterschiedlichen Ordnern?

    Die Dateien in den unterschiedlichen Ordnen kommen vom ERP System, dass diese Dateien immer als einzelne Dateien ausspuckt. Die Ausgabe Ordner des ERP können jeweils frei im ERP System konfiguriert werden.

    Zitat


    Sind in dem jeweiligen Ordner immer nur eine PDF Datei?

    Nein in den Ordnern können mehrere Dateien liegen, da mehrere Benutzer dieses Tool benutzen sollen, aber dafür hätte ich die Projektnummer als einheitliches Suchkriterium innerhalb der PDF Dateinamen.

    Zitat

    Für wie viele Anwender soll dieses Programm Verwendung finden? (variable Pfade eventuell auslesen aus einer ini Datei --> Setup in der GUI oder einmal Einrichtung per manueller Befüllung der ini Datei )

    Es soll von 5-6 Benutzern auf einem Terminal Server ausgeführt werden können.

    Zitat

    Sind die Projektnummern IMMER 6 stellig? (Dateien einlesen per regex = Benutzer freundlich)

    Ja die Projektnummern sind immer 6 stellig.


    Um pro Benutzer ein eigenes Setup zu vermeiden, habe ich in jedem Dateinamen immer die Projektnummer mit inkludiert. Das kommt so aus dem ERP System raus. Die Dateien liegen in 4 unterschiedlichen Ordnern. In jedem Ordner immer der gleiche Dateityp aber (wenn 2 Benutzer gleichzeitig arbeiten) möglicherweise aus 2 Projekten.

    4 unterschiedliche Ordner deshalb, weil sie immer in einer bestimmten Reihenfolge aneinander gehängt werden müssen (wenn Dateien vorhanden sind) .

    Wenn also in Ordner 1 keine Datei mit Projektnummer xxxyyy vorhanden ist prüfe ordner 2. Wenn da eine drin ist benutzen. Dann ordner 3 usw....

    Ich hoffe meine Logik ist verständlich und ergibt auch ein wenig :)

    Beste Grüße

    DGI

  • Sind dir die Dateinamen vollständig bekannt, sobald du die Projektnummer hast oder gibt es je nach Projekt weitere Variable Teile des Namens? Im ersteren fall könntest du auf eine Suche im Dateisystem komplett verzichten und müsstest lediglich auf die Existenz der 4 Dateien prüfen.

  • Sind dir die Dateinamen vollständig bekannt, sobald du die Projektnummer hast oder gibt es je nach Projekt weitere Variable Teile des Namens? Im ersteren fall könntest du auf eine Suche im Dateisystem komplett verzichten und müsstest lediglich auf die Existenz der 4 Dateien prüfen.

    Es gibt noch weitere variable Teile. Heißt also ich müsste immer die Dateien anhand der Projektnummer identifizieren.

  • Und könnte es auch vorkommen, dass mehr als die 4 Dateien über die Projektnummer gefunden werden? Z.B. bei korregierten Exports aus dem ERP oder ähnlichem?

    Nein, da die Exporte von den Benutzern pro Projekt immer nur einmal in dieser Form exportiert werden können.

  • Wenn ich dich @DG richtig verstanden habe, könnte man es so gut wie automatisieren ohne jegliche Benutzer Interaktion.

    Ordner 1 bis 4 sagen wir mal einmal in der Minute alle Dateien einlesen. Nach Projektnummer unterteilen. Und wenn in den anderen Ordnern eine Datei mit der Projektnummer vorhanden ist, verbinden lassen und in einen Ordner ausgeben.

    If not :?: then ?( else :thumbup:

  • Wenn ich dich @DG richtig verstanden habe, könnte man es so gut wie automatisieren ohne jegliche Benutzer Interaktion.

    Ordner 1 bis 4 sagen wir mal einmal in der Minute alle Dateien einlesen. Nach Projektnummer unterteilen. Und wenn in den anderen Ordnern eine Datei mit der Projektnummer vorhanden ist, verbinden lassen und in einen Ordner ausgeben.

    Ja und nein. Da die Benutzer die Dokumente manuell bearbeiten und danach erzeugen, vergeht da schon immer etwas an Zeit.

    Automatisieren könnte man Beispielsweise in foolgender Form :

    Das Tool fragt nur noch nach einer Projektnummer und einem Ausgabenamen der fertig zusammengestellten Datei. Die User starten das Tool und geben die entsprechende Projektnummer erst ein wenn sie alle Ihre Dokumente erstellt haben.

    Das Tool sucht sich jetzt immer aus den jeweiligen Ordnern die Dateien (falls vorhanden) und hängt diese nach der vorgegebenen Reihenfolge aneinander.

  • Falls die Projektnummer am Anfang der Datei steht, dann sollte dir der Code hier etwas helfen.

    Die Ausgabe müsste allerdings noch programmiert werden.

    If not :?: then ?( else :thumbup:

  • Falls die Projektnummer am Anfang der Datei steht, dann sollte dir der Code hier etwas helfen.

    Die Ausgabe müsste allerdings noch programmiert werden.

    Hi Concara,

    das sieht schon mega aus. Habe eben mal Testweise Ordner angelegt und Dateien rein geschoben. Selbst wenn der DAteiname nicht mit der Projektnummer beginnt, nimmt er trotzdem die richtigen Dateien. In der Auswahl wird allerdings dann das angezeigt was in O1 am anfang der Datei steht.

    Beste Grüße

    DGI

  • Hi!

    Du wolltest ja keine fertige Lösung!?

    Hier nochmal eine Version, die 6 stellige Nummern erkennt, egal wo sie im Dateinamen steht und Dateien in jedem Ordner erkennt.

    Wichtig! im Dateinamen dürfen nicht 2 oder mehr 6 stellige Nummern vorhanden sein.

    Falls doch, nimmt er die erste von Links.

    Spoiler anzeigen

    If not :?: then ?( else :thumbup:

  • Hallo Concara,

    habe ich gleich mal getestet. Mega! :)

    Jetzt mache ich mich daran die anderen schon vorhanden Code Schnippsel zu benutzen und die Verarbeitung anzustoßen.

    Gibt es denn "Engines" oder wie mann das nennt die PDF auch direkt zusammenfügen können ohne ein installiertes Programm auf dem jeweiligen Rechner?

    Beste GRüße

    DGI

  • OK, ich muss passen. Ich wollte keine fertige Lösung - richtig - bin mir aber gar nicht mehr so sicher.... , aber ich verstehe nicht alles was ich da im Code lese...

    Ich brauche dann doch noch etwas mehr Hilfe als ich vermutet habe.

    Beste GRüße

    DGI

  • Hi!

    Wenn ihr Windows 10 verwendet fällt mir nur der "Microsoft Print to PDF" Druckertreiber ein, der schon von "Haus" aus auf dem PC installiert ist.

    Ich denke das wird viel komplizierter, wenn es überhaupt damit funktioniert ?

    Hast du nicht was von Terminalserver geschrieben?

    Dort muss man die Software zum zusammenfügen ja nur einmal installieren.

    Das Beispiel mit PDF24 funktioniert bei mir. Habe ich getestet.

    Was für ein Programm verwendest du zum Zusammenfügen von PDFs?

    Das man nicht auf Anhieb alles versteht ist klar, wenn man gerade anfängt etwas zu lernen.

    Wenn du noch eine konkrete Frage hast, dann nur her damit.

    If not :?: then ?( else :thumbup:

  • Hi Concara,

    ich hatte wegen der "Engine" nur als Alternatrive gefragt. PDF24 ist auf dem Terminal Server unfassbar langsam wenn es an das zusammen stellen per Kommandozeile geht. Daher habe ich den Nuance Power PDF NPDFCreate.exe verwendet und das Fenster dann automatisiert.

    Das Tool soll und muss auf dem Terminal Server verwendet werden.


    Eine konkrete Frage wäre :

    $sAusgabeString --> hier scheinen ja die enthaltenen Dateien mit den Pfaden drin zu stecken?!?!

    Aber wie verwende ich das ganze nun um die 1,2,3 oder vier enthaltenen Werte an das Tool zu übergeben?

    In einem vorigen Code Schnipsel habe ich verstanden wie die Werte übergeben werden :

    Code
    Global $sCmd = StringFormat('%s "%s" "%s" "%s" "%s"', $prog, _                            $aFileSource[0], $aFileSource[1], $aFileSource[2], $aFileSource[3])
    Run($sCmd, '', @SW_HIDE) ; evtl. WorkingDir-Angabe erforderlich

    Ich bekomme das nicht ganz umgedacht.

    Und was hat es mit dem $sRun auf sich?

    Beste Grüße

    DGI


    EDIT : Ich musste mir das noch 10 Mal ansehen... Der String besteht aus den gefunden Dateinamen. Ich könnte also noch ein leerzeichen zwischen den Dateinamen einfügen und dann wie oben mir ein String wie $sCmd zusammenbauen...

    Ich glaube so gaaaaanz langsam, :)

    Korrigiere mich bitte wenn ich falsch liege.

    Beste Grüße

    DGI

    Einmal editiert, zuletzt von dgi (24. August 2021 um 13:44)

  • Hi Concara,

    also ich habe noch eine Bitte :

    Dein Ausgabestring erzeugt :

    C:\Program Files\PDF24\pdf24-DocTool.exe -join -profile default/good -outputFile "OutputOrdner\ausgabe.pdf" "eingabeOrdner1\111111.pdf" "eingabeOrdner2\111111.pdf" "eingabeOrdner3\111111.pdf" "eingabeOrdner4\111111.pdf"

    Ich habe mich umgeschaut und würde gerne PDFTK nutzen der String müsste aber folgendermaßen zusammengebaut werden :

    C:\Program Files\PDFTK\bin\pdftk.exe "eingabeOrdner1\111111.pdf" "eingabeOrdner2\111111.pdf" "eingabeOrdner3\111111.pdf" "eingabeOrdner4\111111.pdf" cat output "OutputOrdner\ausgabe.pdf"

    Das bekomme ich nciht zusammen gebaut. Vielleicht kannst Du da helfen?

    Beste Grüße

    DGI

  • Hi!

    Es waren noch ein paar kleine Fehler im Script.

    z.B: Wenn im ordner1 keine PDF Datei war, dann wurde bei den Projektnummern nichts eingelesen auch wenn in den Anderen Ordnern PDF Dateien vorhanden waren.

    Ich habe den Teil mit dem Aufruf des externen Programms in die GUI Schleife gegeben.

    Die _Ausgabe() Funktion gibt jetzt "nur" das Array zurück.

    $aRun wurde umbenannt in $aOrdnerMitProjektNR ich hoffe du kannst damit mehr anfangen als Bezeichnung. Es ist das Array mit den PDF Dateien einer Projektnummer zu den Ordnern.

    $aOrdnerMitProjektNR[0] = Ordner1

    $aOrdnerMitProjektNR[1] = Ordner2

    ...

    ...

    qpdf ist bei mir sehr schnell:

    QPDF
    Download QPDF for free. PDF transformation/manipulation program + library. QPDF is a C++ library and set of programs that inspect and manipulate the structure…
    sourceforge.net
    Spoiler anzeigen


    Edit

    Für PDFTK

    Zeile 54: Local $sAusgabeString = 'C:\Program Files\PDFTK\bin\pdftk.exe '

    Zeile 60: $sAusgabeString &= "cat output " & $sAusgabeordner & "\" & $ausgabenamen

    If not :?: then ?( else :thumbup:

    Einmal editiert, zuletzt von Concara (24. August 2021 um 17:08) aus folgendem Grund: Edit

  • Hallo Concara,

    das hatte ich auch festgestellt war sehr damit beschäftigt, dass alles nachzuvollziehen und zu verstehen.

    Ich habe das Tool jetzt mit PDFTK zum laufen gebracht. Habe die Input und Output Ordner angepasst. und habe den Ausgabestring noch verändert, sodass man in der GUI den Dateinamen nicht mehr mit der Endung .pdf angeben muss.

    Alles in allem läuft das Tool jetzt so wie es soll. Ich lasse 2 User gerade testen um das Tool dann für alle einzuführen.

    Vielen Dank für Deine großartige Unterstützung!

    Natürlich auch danke an alle anderen Schreiber, die hier beteiligt waren.

    Beste Grüße

    DGI

  • Hi!

    Freut mich, dass ich dir helfen konnte.

    Hier noch eine ältere Version wo die _einlesen Funktion noch den Fehler hatte, dass wenn im ersten Ordner keine PDF Datei lag, dass die anderen Ordner ignoriert wurden.

    (Der Fehler war, das wenn das $aOrdnerProjektnummer1 Array eben kein Array ist (keine PDFs im Ordner1 kein Array), dann verbindet die Funktion _ArrayConcatenate die Arrays nicht.

    Warum stell ich diese Version noch rein.

    Ganz einfach, weil ich diese Kommentiert habe.

    Und die sollte dir die Funktionsweise näher bringen.

    Also falls du noch Interesse hast etwas über die Funktionsweise zu erfahren dann schau sie dir an.

    Spoiler anzeigen

    Als Tip kann ich nur sagen, dass es immer sehr viel bringt, einzelne Codezeilen in der Console auszugeben, um die Fuktionsweise zu überblicken bzw. den Rückgabewert zu erhalten.

    z.b: ConsoleWrite( StringInStr(StringTrimLeft($aOrdner[$ii], StringInStr($aOrdner[$ii], "\", Default, -1)), $sProjektIDAusgabe) )

    Was mich auch immer wieder erstaunt, dass das Tool "Tidy AutoIT Source" so wenig benützt wird. Sofern man den offiziellen SciTE Editor als Programmierumgebung verwendet.

    Dieses Tool find ich einfach nur mega und schaft auf Knopfdruck schön struktuierten Code.

    If not :?: then ?( else :thumbup: