Autor Thema: Probleme beim Befehl "Name" (Umbenennen und Verschieben von Dateien)  (Gelesen 7294 mal)

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
Follow up: https://atnotes.de/index.php/topic,63290.msg403541.html#msg403541

Guten Morgen,

es tritt doch noch ein Zugriffsproblem auf, aber erst, nachdem einige Dateien verschoben wurden. Kann ich diesen Thread für eine weitere Frage nutzen oder ist er abgeschlossen?

Viele Gruße

Guten Morgen,
ich hoffe, das Zitieren ist so gemeint.
Alles lief prima. Aber dann traten plötzlich Zugriffsprobleme auf.
Vielen Dank für Deine/Eure Hilfe!!!

  • Es wird, nachdem einige Dateien erfolgreich verschoben wurden, plötzlich ein Verzeichnis mit dem Namen aus "neuesFile" angelegt. Dann bricht die Aktion mit Fehler ab.
  • Außerdem hatte ich mitunter auch die Fehlermeldung, dass "filename = Dir$()" nicht ausgeführt werden konnte.
  • Muss ich zum Abschluss die verwendeten Dateien altesFile und neuesFile freigeben? "Reset" ist sicher nicht richtig, oder?

Das "Überspringen" von Dokumenten, die eventuell einen Replizierkonflikt haben, ist im Code-Ausriss nicht enthalten.

Anmerkung: Ich muss jede Datei sofort aus dem Quellverzeichnis löschen, weil ich sonst das wichtige Merkmal "SchluesselNr" verliere. Diese benötige ich für den neuen Namen.

Sub Click(Source As Button)

' Im Original stehen hier Deklarationen
   Set vc = view.AllEntries
   Set entry = vc.GetFirstEntry
   Set doc = entry.Document
   
   pageSeparator = 2 'Neue Seite
   
   Dim altesFile, neuesFile As String
   
   Dim pathname As String
   Dim filename As String
   'Es folgt das Muster des Dokumentnamen der Form: "Datum_Uhrzeit-Dokumentname.pdf"
   'fuer den Befehl: filename = Dir$(pathname,0)

   pathname = "C:\Users\xxxxxx\Desktop\*Dokumentname.pdf*"
   
   Do Until doc Is Nothing   
      Call uiview.SelectDocument(doc)
      SchluesselNr = doc.SchluesselNr(0)   
      Call uiview.Print(1, , , ,pageSeparator ,"Form_des_Dokuments", , , ,"PDF24")

      filename = Dir$(pathname,0)

      altesFile = "C:\Users\xxxxxx\Desktop\" & filename
      
      filename = Dir$()
      neuesFile = "E:\ZIELVERZEICHNIS\" & SchluesselNr & "_Export_Dokument.pdf"
      
      Name altesFile As neuesFile
      
      Call uiview.DeselectAll
      Set entry = vc.GetNextEntry(entry)
      Set doc = entry.Document()
      
   Loop   
   
End Sub
« Letzte Änderung: 09.07.21 - 09:13:37 von eknori »
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
Eine Ergänzung:

Im DEBUG-Modus, also mit fleißigem Tippen der F8-Taste läuft alles super. Die Dokumente werden umbenannt und verschoben. Konfliktdokumente lasse ich aus.

Sobald ich aber den DEBUG-Modus ausschalte, wird im Ziellaufwerk/Verzeichnis wieder ein Unterverzeichnis mit dem Namen "Dokumentname.pdf" angelegt. Und zwar gleich beim ersten Dokument. Das führt im nächsten Schritt zum Fehler.

 :-: Ich glaube, das ist das passende "emoji".

Viele Grüße.


"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
So wirklich verstehe ich Deinen code nicht

   pathname = "C:\Users\xxxxxx\Desktop\*Dokumentname.pdf*"
  
   Do Until doc Is Nothing  
      Call uiview.SelectDocument(doc)  <- wozu?[/s]
      SchluesselNr = doc.SchluesselNr(0)  
      Call uiview.Print(1, , , ,pageSeparator ,"Form_des_Dokuments", , , ,"PDF24") <- wozu?[/s]

      filename = Dir$(pathname,0) <- liest immer die erste Datei anhand von Definition in pathname

      altesFile = "C:\Users\xxxxxx\Desktop\" & filename
      
      filename = Dir$() <- liest immer die NÄCHSTE Datei anhand von Definition in pathname . Bringt hier rein gar nichts
      neuesFile = "E:\ZIELVERZEICHNIS\" & SchluesselNr & "_Export_Dokument.pdf"
      
      Name altesFile As neuesFile <- Blindflug . Woher weisst Du, dass die richtige Datei umbenannt wird?
      
      Call uiview.DeselectAll <- wozu?[/s]
      Set entry = vc.GetNextEntry(entry)
      Set doc = entry.Document()
      
   Loop  

UPdate: Ah, verstehe, es ist immer nur das aktuall ausgedruckte Dokument in dem Ordner.
« Letzte Änderung: 09.07.21 - 09:20:22 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline maxritti

  • Senior Mitglied
  • ****
  • Beiträge: 490
Meine Vermutung ist die, dass

Code
Call uiview.Print

die Dokumente druckt und erst mal in die Druckerqueue schiebt.
Da dauert es dann erst mal bis das ein und andere gedruckt ist.
Dein Code macht allerdings schon weiter und findet nicht wirklich die richtigen Dokumente.

Wenn du Debugst, hat der Printer mehr Zeit, die Dokumente zu erstellen.

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Zitat
die Dokumente druckt und erst mal in die Druckerqueue schiebt.
Ja, sehe ich auch so. Das ist ein timing Problem.

Versuche s mal mit SLEEP https://help.hcltechsw.com/dom_designer/10.0.1/basic/LSAZ_SLEEP.html
Ist nicht schön, könnte aber helfen.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
Hallo eknori,

ich dachte, dass "filename=Dir$()" etwas zurücksetzt. Das hatte ich falsch interpretiert. Nehme ich raus?!

Zu Deinen Anmerkungen:

Ich exportiere immer ein einzelnes Dokument. Denn: Zu diesem Zeitpunkt habe ich noch das Atrribut "SchluesselNr", welches ich zum Umbenennen der (einen) PDF-Datei benötige.

Das mit Print entstandene PDF enthält, vom System vergeben, im Namen zunächst "Datum und Uhrzeit und DB_Name"(.pdf).

Ich "verarbeite" es sofort, weil ich sonst mit dem nächsten Notes-Document die Verbindung zur SchluesselNr des jetzigen Dokuments verliere.

Also, ein PDF-Dokument mit Print erzeugen, SchlüsselNr etc. in den Namen schreiben und verschieben. Das nächste Doc aus der UIView erzeugt dann wieder ein einzelnes PDF im Verzeichnis.

Es entsteht also pro Umlauf immer nur eine PDF-Datei.  Deshalb ist es kein Blindflug.

Die erste Zeile in der Schleife: uiview.SelectDocument deshalb, weil ich immer nur ein Document bearbeiten möchte. Das vorher selektierte Dokument bekomme ich doch nicht einzeln deselektiert. (Oder geht das doch?)

Also deshalb der kleine Umweg über "DeselectAll", "GetNextEntry" und "SelectDocument"

Es handelt sich insgesamt um sehr viele Dokumente.

Es funktioniert im DEBUG-Modus recht erfreulich ;)

Viele Grüße
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
Zitat
die Dokumente druckt und erst mal in die Druckerqueue schiebt.
Ja, sehe ich auch so. Das ist ein timing Problem.

Versuche s mal mit SLEEP https://help.hcltechsw.com/dom_designer/10.0.1/basic/LSAZ_SLEEP.html
Ist nicht schön, könnte aber helfen.

"Hallo" zu Euch,

ich hatte so etwas vermutet. Aber dass Ihr das erfahren bestätigt und gleich eine Lösungsmöglichkeit habt ... prima!!!

Ich folge gleich mal dem angegebenen Link.

Vielen Dank!!!
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline maxritti

  • Senior Mitglied
  • ****
  • Beiträge: 490
Solche Lösungen mit Sleep finde ich meist ein wenig sagen wir mal unschön.

Mag klappen, nur ein anderes mal, wenn Windoofws ein Problem mit dem Drucker o.ä. hat, dann stehst du wieder auf dem berühmten Schlauch.
Ggf. druckst du erst mal alles und gibst dem Anwender einen netten Hinweis, dass nun jemand anderes die Dinger verarbeiten muss.
Da soll er schauen, wenn das fertig ist. Dann kann er mittels einem 2. Button den "Rest" erledigen lassen.


Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
So   ;)

ich habe die Anzahl der Dokumente einmal auf 50 eingeschränkt. Es läuft durch. ( Sleep(2) genügt )

Nur -> die erste PDF-Datei wird beim Umbenennen und Verschieben wieder als Verzeichnis angelegt.
Alle anderen sind sauber.

Kann das mit der Definition von "pathname" am Anfang zu tun haben und ich sehe den "Wald vor Bäumen" nicht?

Viele Grüße
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Zitat
Da soll er schauen, wenn das fertig ist. Dann kann er mittels einem 2. Button den "Rest" erledigen lassen.
So wie ich es verstanden habe, funktioniert das nicht, weil das erzeugte Dokument keinen Bezug zum NotesDoc hat.
Man kann ja gerade keinen Namen für das PDF vergeben.
Du kannst Alles drucken. Dann hast Du einen Haufen PDF, weißt aber nicht, zu welchen Doc die gehören.

Um das wirklich "rund" zu bekommen, müsste man die Windows Prozesse abfragen. Das ist zwar grundsätzlich möglich, aber eine ganz andere Hausnummer.

Das ist ja das dumme, dass der Print keinen Rückgabewert hat, den man abfragen könnte, um dann entsprechend zu reagieren.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline maxritti

  • Senior Mitglied
  • ****
  • Beiträge: 490
Zitat
Da soll er schauen, wenn das fertig ist. Dann kann er mittels einem 2. Button den "Rest" erledigen lassen.
So wie ich es verstanden habe, funktioniert das nicht, weil das erzeugte Dokument keinen Bezug zum NotesDoc hat.
Man kann ja gerade keinen Namen für das PDF vergeben.
Du kannst Alles drucken. Dann hast Du einen Haufen PDF, weißt aber nicht, zu welchen Doc die gehören.

Um das wirklich "rund" zu bekommen, müsste man die Windows Prozesse abfragen. Das ist zwar grundsätzlich möglich, aber eine ganz andere Hausnummer.

Das ist ja das dumme, dass der Print keinen Rückgabewert hat, den man abfragen könnte, um dann entsprechend zu reagieren.

Ach so, stimmt.
Die gedruckten PDFs mit Datum und Zeit im Namen sollen ja die Schlüsselnummer aus dem zugehörigen Dokument habe.
Musste den Code 5 x anschauen, um das gewünschte zu verstehen - glaube ich.  :D

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Zitat
Kann das mit der Definition von "pathname" am Anfang zu tun haben und ich sehe den "Wald vor Bäumen" nicht?

Wo hast Du das sleep denn eingebaut?
Code
sleep(2)
filename = Dir$(pathname,0)
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
Zitat
Kann das mit der Definition von "pathname" am Anfang zu tun haben und ich sehe den "Wald vor Bäumen" nicht?

Wo hast Du das sleep denn eingebaut?
Code
sleep(2)
filename = Dir$(pathname,0)

Ja, genau dort. Mit einer "2" klappte es manchmal noch nicht. Die "4" scheint (aber erstmal ganz vorsichtig) Notes zu gefallen ;)
Es stehen jetzt alles Dateien und keine verunglückten Verzeichnis mehr im Zielverzeichnis. Und die Inhalte der Dateien passen auch.

Ich muss mich wohl daran erinnern, dass ein Programm bei manchen Befehlen doch schon weiter"laufen" kann und somit zu einem vermeintlich späteren Zeitpunkt erwartete Werte noch nicht zur Verfügung stehen.
So langsam dämmert es. ;)

So, mit 100 Dokumenten ist es durchgelaufen. Ich taste mich vorsichtig weiter. Falls doch noch etwas schief läuft, melde ich mich.

Ohne Eure Unterstützung hätte ich es ganz sicher nicht gefunden.

Vielen Dank eknori (!!) und maxritti für Eure Zeit  :)
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline maxritti

  • Senior Mitglied
  • ****
  • Beiträge: 490
Sehr gerne, ich freue mich immer, wenn ich helfen kann.  :D

Aber mal so als Idee, wenn ich es richtig verstanden habe:

- Benutzer wählt die Dokumente aus.
- Pro Dokument gibt es einen Schlüssel, der nachher in den Dateinamen erscheinen soll.

Was ist denn, wenn Du bevor du druckst, aber nachdem der Benutzer die Dokumente gewählt hat, Unterverzeichnisse in deinem Druckordner erstellst, die genau die Schlüsselnummer beinhalten.
Dann kannst du doch pro Druckjob in genau das zugehörige Verzeichnis drucken.
Ergo, könnest du den Benutzer doch bitten einen Kaffee zu trinken und nachher einen 2. Butten zu drücken.

Denn dann gibt es doch die Datum_Zeit_oder_wie_auch_immer.pdf Dokumente in den zugehörigen Schluessel_Nr_Verzeichnissen.
Da kannst du doch im 2. Schritt alles erdenkliche machen.

Denn als Tip, mit Dir$(...) kann man auch Verzeichnisse ermitteln.

Oder habe ich doch noch ein Brett vor dem Kopf?  :-:

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Nee. Der code rödelt über alle docs in einer view. Der user wählt da gar nichts aus.
Der code selber selectiert das doc, damit die UIView.print methode das doc drucken kann.

Und, man kann ja eben nicht den Pfad oder Dateinamen mitgeben. Deshalb ja der Stunt hier.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline maxritti

  • Senior Mitglied
  • ****
  • Beiträge: 490
Okay, ich lege mich wieder hin.
Jetzt habe ich es aber hoffentlich verstanden.

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
Zum guten Abschluss:

Für zum Testen 500 Dokumente ist die Aktion durchgelaufen. Mann, bin ich froh.  :)

Ich sichere erstmal alles.

Schönes Wochenende!!!

Viele Grüße,

Nils

 
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline CarstenH

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 668
  • Geschlecht: Männlich
Auch wenn das Thema quasi "abgeschlossen" ist noch eine Ergänzung, weil das vielleicht öfter gebraucht wird und eine etwas mehr generische Lösung aus meiner Sicht noch offen ist.

Und, man kann ja eben nicht den Pfad oder Dateinamen mitgeben. Deshalb ja der Stunt hier.

Kann man in diesem Fall (und auch bei den meisten anderen PDF bzw. Print-2-File-Druckern) doch. Da er erst sehr spät mit der Info kam, dass er über PDF24 druckt war die Herkunft der merkwürdigen Dateinamen zu Beginn seiner Frage für mich nicht erkennbar.

Diese Dateinamen werden über selbst konfigurierbare Variablen nach Regeln gesteuert, wenn man da den Default-Wert lässt kommen halt kryptische Dateinamen mit Datum/Uhrzeit bei 'raus (siehe Screenshot). Im Fall von PDF24 kann man aber problemlos einen Wunschdateinamen per eigener Environment Variable übergeben. Siehe gleicher Screenshot, rote Umrandung.

Wenn man jetzt einfach vor jedem Aufruf des Druckertreibers die Variable neu setzt (ggf. die künstliche Pause (Sleep) noch etwas anpassen) ist die ganze Umbenennerei unnötig und Geschichte.

Das Setzen einer Umgebungsvariable ist allerdings nicht ganz so trivial, da das aber kein Problem von "Notes" ist habe ich mal geschaut, wie das bei Office/VBA & Co. läuft, die meisten API-Sachen sind ja nahezu identisch. Gefunden habe ich jemanden mit genau dem gleichen Problem, nämlich Druckausgabe als PDF und vergeben von Dateinamen.

Die "fertige" Lösung steht ziemlich weit am Ende, kann man aber m.E. mit kleinem Aufwand für LotusScript umschreiben (mir fehlt leider gerade die Zeit dafür).

Quelle: https://www.herber.de/forum/archiv/1680to1684/1681193_umgebungsvariable_setzen_per_VBA_in_64bit.html

HTH
Carsten

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
Hallo CarstenH, guten Morgen,

vielen Dank für Deinen "nachträglichen" Beitrag. Ich werde mir das ansehen, sobald ich etwas Zeit habe. Im Moment "muss" ich jedoch aus Zeitgründen das geschilderte Verfahren nutzen. Da es funktioniert und ich im Augenblick nicht die Zeit aufwenden kann, einen anderen Weg zu testen.
Nochmals vielen Dank an Euch.

Viele Grüße  ;)
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

Offline aoibhneach

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
LotusScript - Setzen und Lesen "Environment Variables"
« Antwort #19 am: 27.07.21 - 11:26:20 »
Auch wenn das Thema quasi "abgeschlossen" ist noch eine Ergänzung, weil das vielleicht öfter gebraucht wird und eine etwas mehr generische Lösung aus meiner Sicht noch offen ist.

Und, man kann ja eben nicht den Pfad oder Dateinamen mitgeben. Deshalb ja der Stunt hier.

Kann man in diesem Fall (und auch bei den meisten anderen PDF bzw. Print-2-File-Druckern) doch. Da er erst sehr spät mit der Info kam, dass er über PDF24 druckt war die Herkunft der merkwürdigen Dateinamen zu Beginn seiner Frage für mich nicht erkennbar.

Diese Dateinamen werden über selbst konfigurierbare Variablen nach Regeln gesteuert, wenn man da den Default-Wert lässt kommen halt kryptische Dateinamen mit Datum/Uhrzeit bei 'raus (siehe Screenshot). Im Fall von PDF24 kann man aber problemlos einen Wunschdateinamen per eigener Environment Variable übergeben. Siehe gleicher Screenshot, rote Umrandung.

Wenn man jetzt einfach vor jedem Aufruf des Druckertreibers die Variable neu setzt (ggf. die künstliche Pause (Sleep) noch etwas anpassen) ist die ganze Umbenennerei unnötig und Geschichte.

Das Setzen einer Umgebungsvariable ist allerdings nicht ganz so trivial, da das aber kein Problem von "Notes" ist habe ich mal geschaut, wie das bei Office/VBA & Co. läuft, die meisten API-Sachen sind ja nahezu identisch. Gefunden habe ich jemanden mit genau dem gleichen Problem, nämlich Druckausgabe als PDF und vergeben von Dateinamen.

Die "fertige" Lösung steht ziemlich weit am Ende, kann man aber m.E. mit kleinem Aufwand für LotusScript umschreiben (mir fehlt leider gerade die Zeit dafür).

Quelle: https://www.herber.de/forum/archiv/1680to1684/1681193_umgebungsvariable_setzen_per_VBA_in_64bit.html

HTH
Carsten

Hallo und guten Morgen,

Das Umbenennen und Verschieben meiner Dateien mittels "Name filename1 filename2" scheitert wohl am asynchronen Verarbeiten. Selbst mit "Sleep(12)" nach der "uiview.Print"-Methode zu PDF24 scheitert. Es funktioniert bei vielen Dateien. Aber Notes verschluckt sich doch, so dass sogar einige Quell- und Zieldatei am Ende unterschiedliche Inhalte besitzen.
Dies nur als Ergebnis zum referenzierten Artikel.

Nun habe ich Carstens Idee der Umgebungsvariablen versucht. Leider bekomme ich die Meldung während des Laufs des Agenten, dass sie nicht gesetzt werden können.
Ich habe in den Einstellungen von PDF24 in "Ordner" und "Dateiname" jeweils einen, in "%" eingefassten, Namen eingegeben.

z.B.: "Ordner" --> %MeinPDF24_verzeichnis%

In LotusScript setze ich die Environment-Variablen, z.B.:

Call Session.Setenvironmentvar("MeinPDF24_verzeichnis", Win_Pfad, True)

Die Anzeige mit: MsgBox Environ("MeinPDF24_verzeichnis") ist nach dem o.a. Fehlerhinweis konsequenter Weise auch leer.
Kann es nur daran liegen, dass ich keine Admin-Berechtigung habe?

Und:

Wenn es funktionierte: Könnte ich eine Environment-Variable für einen, in der Loop wechselnden, Dateinamen immer neu setzen?

Vielleicht habe ich gedanklich auch den völlig falschen Ansatz.

Vielen Dank und Grüße,

Nils
"Der verlorenste aller Tage ist der, an dem man nicht gelacht hat."

Sébastien-Roch Nicolas de Chamfort

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz