Domino 9 und frühere Versionen > ND6: Entwicklung

SaveOptions = 0 funktioniert nicht

<< < (2/6) > >>

koehlerbv:

--- Zitat von: WildVirus am 08.01.08 - 22:22:57 ---Das kommt davon, wenn UI-Klassen und Backendklassen genutzt werden.
--- Ende Zitat ---
Richtig! Wenn man den Stunt wagt, muss man wissen, was man tut. Wirklich wissen.


--- Zitat von: WildVirus am 08.01.08 - 22:22:57 ---Du setzt per doc.saveoptions etwas ins Backenddocument und erwartest dann, dass das angezeigte UIdoc das mitbekommt. Tut es aber nicht.
--- Ende Zitat ---
Das ist eindeutig falsch - das funktioniert nun wirklich, und dieses Funktionieren entspricht auch der Logik.

Ich bin heute aber zu müde, um mir über den Code von oben noch Gedanken zu machen. Und mit "Orks" habe ich es sowieso nicht so (warum können die Leute nur keine Namen unter ihre Postings schreiben? Alles Feiglinge?)

Bernhard

Ork:
Hallo Bernhard,

mein richtiger Name ist Okko, da ist Ork gar nicht so weit weg.

Ich habe den Code ein wenig abgekürzt, um mein Problem genauer zu schildern, aber wenn ein wenig gemäkelt ;-) wird, was ich natürlich als positive Kritik verstehe und versuche auch umzusetzen, füge ich mal den gesamten Quelltext ein. Ich hoffe (oder aber der Spezis schlagen die Hände über dem Kopf zusammen :-) ), da wird dann klarer, warum ich wie Bernhard so schön formuliert hat"den Stunt gewagt habe".

Hier der gesamte code:

Sub Click(Source As Button)
   
   ' DEKLARATION
   ' LN - Vorgaben
   Dim workspace As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Dim newUiDoc As NotesUIDocument
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim newDoc As NotesDocument   
   Dim view As NotesView
   Dim attachment As NotesRichTextItem ' Anhang
   
   ' Datei- und Verzeichnisverwaltung
   Dim sourceFile As Variant ' Quelldatei im Netzwerk
   Dim targetFile As String ' Zieldatei - nach dem Kopieren aus dem Netzwerk
   Dim netDirectory As String ' Netwerkpfad zur Vorlagenauswahl
   Dim nameProtocolFile As String ' Name der Protokolldatei
   Dim protocolFile As String ' Pfad zur Protokolldatei
   Dim localTargetDirectory As String ' Lokales Zielverzeichnis für die Word-Datei
   Dim formats As String ' Formate, die in der Vorlagenauswahl angezeigt werden sollen
   Dim wordObj As Variant ' Variable für die Word-Dokumenten-Verwaltung in Lotus Script
   Dim fso As Variant ' Variable für die Verzeichnisverwaltung
   
   ' Meldungen
   Dim faultMessageNetwork As String ' Fehlermeldung für nicht korrekten Netzwerkpfad
   Dim faultMessageAttachment As String ' Fehlermeldung für schon vorhandenen Anhang
   Dim faultMessageBody As String ' Fehlermeldung für schon eingetragenen Text im Body
   Dim faultMessageTime As String ' Fehlermeldung für die Überschreitung der Wartezeit unter Word
   Dim faultMessageWordFile As String ' Fehlermeldung für eine noch offene Temp-Datei - nicht zu speichern
   Dim faultMessageWordSave As String ' Fehlermeldung für noch offene Word-Dokumente, die noch zu speichern sind
   Dim infoMessage As String ' Hinweisnachricht für den Benutzer
   
   ' MS Word
   Dim dateOldFile As String ' Änderungsdatum der Word-Datei
   Dim dateNewFile As String ' Neues Änderungsdatum der Word-Datei
   Dim waitingTime As Integer  '  Wartezeit bis zur Abspeicherung des Word-Dokuments in Sekundensprüngen
   Dim saveOptionsWordTime As String ' Speicheroptionen beim erzwungenem Schliessen von Word - gilt für alle geöffneten Dokumente
   Dim wordAktiv As Boolean ' Schleifenvariable - MS Word aktiv = true, nicht aktiv = false
   Dim splittedFile As String ' Name der ausgewählten Word-Datei
   
   ' E-Mail Angaben
   Dim subject As String ' Mailbetreff
   Dim email_Kdr As String, email_StffChef As String, email_StffFw As String, email_TEFhr As String
   Dim emailA As String, email1 As String, email2 As String, email3 As String
   
   ' Protokollvariablen
   ' Die einzelnen Zeilen der Protokoll-Datei   
   Dim protocolLine1 As String, protocolLine2 As String, protocolLine3 As String, protocolLine4 As String, protocolLine5 As String, protocolLine6 As String, protocolLine7 As String   
   Dim dateTime As Variant ' Variable zum Auslesen der Antragszeit
   Dim newDate As String, newTime As String ' Zeit kann nur als String in die Protokolldatei geschrieben werden
   Dim name1 As String, name2 As String, name3 As String
   
   ' Diverse
   Dim counter As Integer ' Zähler für Warteschleifen
   Dim numOfAttachments As Variant ' Anzahl der enthaltenen Anhänge vor Benutung des Buttons
   Dim textOfBody As String ' Text aus dem Body vor Benutzung des Buttons
   
   ' Datenbankzugriff
   Dim addressbook As String
   Dim viewData As String
   Dim server As String
   Dim userName As String
   
   ' INITIALISIERUNG
   Set uidoc = workspace.CurrentDocument
   Set doc = uidoc.Document
   Set attachment = New NotesRichTextItem(doc, "attachment")
   
   ' WERTZUWEISUNGEN
   
   ' Wertzuweisungen für Datei- und Verzeichnisverwaltung
   netDirectory = "C:\tmp" ' Netzwerkpfad zum Vorlagenordner
   formats = "Microsoft Word|*.doc" ' Anzuzeigende Format in Vorlagenordner - nur MS Word
   localTargetDirectory = "C:\Lotus\tmp"   ' Ordner für temporäre Speicherung von MS Word-Datei und Potokoll-Datei
   nameProtocolFile = "Protokoll-EMail-Authentifiizierung" & ".txt" ' Name der Protokolldatei
   protocolFile = localTargetDirectory & "\" & nameProtocolFile ' Pfad zur Protokolldatei
   
   ' Meldungen   
   faultMessageNetwork = "Beim Öffnen des Netzwerkordners ist ein Fehler aufgetreten! Der Vorgang wird hiermit beendet!"
   infoMessage = "Bitte vergessen Sie nicht die Datei in Microsoft Word zu speichern!"
   faultMessageWordTime = "Die Wartezeit zum Abspeichern des Dokuments wurde überschritten! Der Vorgang wird hiermit beendet!"   
   faultMessageWordSave = "Ein offenes Microsoft Word-Dokument verhindert den korrekten Ablauf des Programms! Bitte speichern Sie Ihr(e) Dokument(e)!"
   faultMessageWordFile = "Ein offenes Microsoft Word-Dokument verhindert den korrekten Ablauf des Programms! Microsoft Word wird nun geschlossen!"
   faultMessageAttachment = "Es existiert bereits ein Datei-Anhang! Dieser Vorgang steht somit nicht mehr zur Verfügung und wird hiermit beendet!"
   faultMessageBody = "Es wurde bereits Text in die E-Mail eingetragen! Dieser darf erst nach dem Anhang der Vorlagen eingetragen werden!Der Vorgang wird hiermit beendet!"
   
   ' MS Word
   waitingTime = 20 ' Enstpricht 20 Sekunden, bevor MS Word mit Fehlermeldung geschlossen wird
   saveOptionsWordTime = "0" ' 0 - speichern wird nicht abgefragt, 1- speichern wird vor dem Schließen abgefragt
   
   ' Datenbankangaben
   userName = Environ$("username") ' Name des Antragssteller, ausgelesen aus Umgebungsvariable
   server = "ln-server/certifier"    ' Name des Mailservers
   addressbook = "names.nsf" ' Name des Adressbuchs
   dataView= "People" ' Name der Ansicht aus Adressbuch
   
   ' Diverse Angaben
   counter = 0   '  Zählvariable für mehrere Schleifen
   wordAktiv = True ' Setzt die Variable auf: MS Word ist noch aktiv -> Schleifenvariable
   
   '_________________________________________________________________________________________
   'FEHLERVORBEUGUNG
   
   ' löscht alle Einträge im E-Mail-Kopf
   uidoc.FieldClear("EnterSendTo")
   uidoc.FieldClear("EnterCopyTo")
   uidoc.FieldClear("EnterBlindCopyTo")
   uidoc.FieldClear("FaxToList")
   uidoc.FieldClear("subject")
   
   ' Liest den Text aus dem Body aus
   textOfBody = uidoc.FieldGetText("Body")
   
   If Len(textOfBody) > 0 Then
      Msgbox faultMessageBody,MB_OK & MB_ICONSTOP ,"Warnhinweis"      
      uidoc.FieldClear("Body")       
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'Memo wird geschlossen
      Exit Sub
   End If
   
   
   ' Prüft, ob sich schon ein Anhang in dem Dokument befindet.
   
   ' Nutzung der Formelsprache
   Const NotesMacro$ = "@Attachments"
   ' Gibt die Anzahl der Anhänge aus   
   numOfAttachments = Evaluate(NotesMacro$, doc)
   
   If  numOfAttachments(0) > 0 Then
      Msgbox faultMessageAttachment,MB_OK & MB_ICONSTOP ,"Warnhinweis"
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'Memo wird geschlossen
      Exit Sub
   End If
   '_________________________________
   ' Netzwerk-Prüfung über Pfad
   
   ' Falls das Netzwerkverzeichnis nicht vorhanden ist, wir der Vorgang abgebrochen
   If Dir$(netDirectory,16) = "" Then
      Msgbox faultMessageNetwork,MB_OK & MB_ICONSTOP ,"Warnhinweis"
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'Memo wird geschlossen
      Exit Sub
   End If
   '__________________________________________________________________________________________   
   ' Verzeichnisbearbeitung
   
   ' Löscht Zwischenverzeichnis alter Dokumente
   If Dir$(localTargetDirectory,16) <> "" Then    
      Set fso = createObject("Scripting.FileSystemObject")
      Do   
         On Error Resume Next      
         fso.deleteFolder localTargetDirectory, False
         If Err = 213 Then ' Falls das zu verwendende Dokument bereits in MS Word geöffnet ist, wird es geschlossen
            Err = 0
            Msgbox faultMessageWordFile,MB_OK & MB_ICONEXCLAMATION,"Information"
            Set wordObj = getObject("","Word.Application")
            wordObj.Application.quit saveOptionsWordTime
            Call wordObj.quit() ' Verbindung zu MS Word löschen
            Set wordObj  = Nothing ' Verbindung zu MS Word löschen
            Msgbox "Microsoft Word wurde beendet!",MB_OK & MB_ICONINFORMATION ,"Hinweis"
         Else
            wordAktiv = False
            ' Erzeugt neuen Ordner, weil der alte gelöscht wurde
            Mkdir localTargetDirectory
         End If
      Loop While wordAktiv = True
   Else
      ' Wenn noch kein Ordner da, erstelle einen
      Mkdir localTargetDirectory
   End If
   
   ' Setzt die Variable wieder der Anfangswert
   wordAktiv = True
   
   '_________________________________________________________________________________________
   ' PROGRAMMSTART
   
   ' Netzwerk-Vorlage wird lokal gespeichert
   
   ' Öffnet den Netzordner zur Dateiauswahl
   sourceFile = workspace.OpenFileDialog(False,"Vorlagenauswahl",formats,netDirectory)
   
   ' Prüfe ob eine Datei vorhanden ist
   If Isempty(sourceFile) Then Exit Sub   
   
   ' Datei umbenennen (mit neuem Verzeichnis)
   targetFile = localTargetDirectory  &"\Word_" & Cstr(Today) & ".doc"
   Filecopy sourceFile(0) , targetFile
   
   ' Speichert das aktuelle Datum in einer Variablen   
   dateOldFile = Filedatetime(targetFile)
   
   '__________________________________________________________________________________________   
   ' Microsoft Word
   
   ' Ein laufendes MS Word wird geschlossen
   
   ' Benutzerhinweis
   Msgbox infoMessage,MB_OK & MB_ICONEXCLAMATION,"Information"
   
   ' Damit MS Word nicht mit einem Fehler abbricht, muss MS Word vorher geschlossen sein bzw. geschlossen werden
   Do
      On Error Resume Next
      Set wordObj = getObject("","Word.Application")
      If Err = 208 Then ' Wenn MS Word nicht aktiv ist, wird der Fehler auf 0 gesetzt und die Schleife wird verlassen
         Err = 0
         wordAktiv = False
      Else ' Word ist mit  Dokument(en) aktiv
         Msgbox faultMessageWordSave,MB_OK & MB_ICONEXCLAMATION,"Information"      
         wordObj.Application.WindowState = 2 ' Wordfenster minimiert
         wordObj.Application.WindowState = 1 ' Wordfenster maximiert
         wordObj.Application.quit ' Word wird geschlossen
         Msgbox "Microsoft Word wurde beendet!",MB_OK & MB_ICONINFORMATION ,"Hinweis" ' Stop in dem Programm, um dem Nutzer die Zeit für das Speichern zu gewähren         
      End If
   Loop While wordAktiv = True
   
   ' Verbindung zwischen Variable und MS Word löschen   
   Call wordObj.quit()
   Set wordObj  = Nothing
   '_________________________________
   ' Öffnet Microsoft Word mit ausgewählter Word-Datei
   Set wordObj = getObject(targetFile,"Word.Document")
   
   ' Word wird als aktives Fenster angezeigt   
   wordObj.Application.Visible = True
   wordObj.Application.WindowState = 1
   
   '_________________________________
   'Schliessen von MS Word
   
   ' Überprüft, ob das Word-Dokument in geänderterweise gespeichert worden ist. Falls
   ' während der Überprüfung die Wartezeit überschritten wird, wird das Programm abgebrochen
   Do
      dateNewFile = Filedatetime(targetFile)
      Sleep 1 ' wegen der CPU-Auslastung eingebaut - leichte Performance-Schwächen - kann auch entfernt werden
      counter = counter +1 ' Zählvariable wird um 1 erhöht
      If counter = waitingTime  Then
         wordObj.Application.quit saveOptionsWordTime
         Msgbox faultMessageWordTime,MB_OK & MB_ICONSTOP ,"Warnhinweis"
         doc.SaveOptions = "0" 'speichern wird nicht abgefragt
         Call uidoc.Close(True) 'Memo wird geschlossen
         Exit Sub
         Exit Do   
      End If
      If dateOldFile <> dateNewFile Then
         On Error Resume Next      
         wordObj.Application.quit saveOptionsWordTime ' Schließt nach dem Speichern des Doks das Programm MS Word
         If Err = 207 Then Err = 0 ' Falls es vorher manuell geschlossen wird, wird der Fehler wieder auf 0 gesetzt
      End If
   Loop While dateOldFile = dateNewFile
   '__________________________________________________________________________________________
   ' Erstellung der Log-Datei
   
   ' Datum für die Antragserstellung
   
   ' Splittet die Zeit der Dokumenten-Fertigstellung in Datum und Zeit   
   dateTime= Split(dateNewFile," ",2)
   newDate = dateTime(0)
   newTime = dateTime(1)
   '__________________________________
   ' Verbindungsherstellung zu Personendaten
   
   ' Stellt die Verbindung zur Datenbank Adressbuch her und wählt das erste Dokument aus der Ansicht People aus -> erste Person
   Set db = New NotesDatabase(server, addressbook)
   Set view = db.GetView( dataView)
   Set newDoc = view.GetFirstDocument
   '__________________________________
   ' Suche der E-Mail-Adresse des  Antragssteller
   
   Do
      ' Falls das aktuelle Dokument mit dem NT Benutzernamen übereinstimmt, wird die E-Mail-Adresse erzeugt
      If userName = getName(newDoc) Then
         emailA = createEmail(newDoc)   
         Exit Do         
      End If      
      Set newDoc = view.GetNextDocument(newDoc) ' nächste Datensatz / Person
   Loop While Not username = getName(newDoc)
   
   '__________________________________   
   ' Erstellt die E-Mail-Adressen für die Vorgesetzten
   
   ' Erstellt E-Mail vom Kommandeur
   
   email_Kdr = createMailFromPerson("Kdr", newDoc, db)
   
   If email_Kdr = "" Then
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'Memo wird geschlossen
      Exit Sub
   End If
   
   '__________________________________
   ' Erstellt E-Mail vom Staffelchef
   
   email_StffChef = createMailFromPerson("StffChef", newDoc, db)
   
   If email_StffChef = "" Then
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'Memo wird geschlossen
      Exit Sub
   End If
   
   '__________________________________
   ' Erstellt E-Mail vom TeileinheitsFührer
   
   email_TEFhr = createMailFromPerson("TEFhr", newDoc, db)
   
   If email_TEFhr = "" Then
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'Memo wird geschlossen
      Exit Sub
   End If
   
   '__________________________________
   ' Erstellt E-Mail vom StaffelFeldwebel
   
   email_StffFw = createMailFromPerson("StffFw", newDoc, db)
   
   If email_StffFw = "" Then
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'Memo wird geschlossen
      Exit Sub
   End If
   
   '__________________________________________________________________________________________
   ' Namensermittlung des ausgewählten Word-Dokuments
   
   ' Zählvariable für die Do-Schleife
   counter = 0
   
   ' Name der ausgewählten Word-Vorlage wird ermittelt
   
   ' Der Pfad samt Word-Datei werden am Backslash aufgeteilt und als einzelne Elemente gespeichert
   sourceFile = Split(sourceFile(0),"\")
   ' In der Schleife werden alle Elemente durchsucht, bis die Vorlage gefunden worden ist.
   ' Dann wird die Word-Vorlage vom Format getrennt und gespeichert.
   Do
      If sourceFile(counter) Like "*.doc" Then
         sourceFile = Split(sourceFile(counter),".")
         splittedFile = sourceFile(0)
      End If
      counter = counter + 1
   Loop While sourceFile(1) <> "doc"
   
   ' Zählvariable wird wieder auf den Anfangswert gesetzt
   counter = 0
   '__________________________________
   ' Festlegung der Empänger anhand des ausgewählten Dokuments
   
   Select Case splittedFile
   Case "Urlaubsantrag":
      subject = "Urlaubsantrag - " & userName
      email1 = email_TEFhr
      email2 = email_StffFw
      email3 = email_StffChef
   Case "Kfz-Anforderung":
      subject = "Kfz-Anforderung - " & userName
      email1 = email_TEFhr
      email2 = email_StffChef
      email3 = email_Kdr
   End Select
   ' Zuteilung der Name durch die Angabe der E-Mail Adressen
   name1 = getNameFromMail(email1)
   name2 = getNameFromMail(email2)
   name3 = getNameFromMail(email3)
   '__________________________________
   ' Inhalt der Protokolldatei
   
   protocolLine1 = "         Protokoll-Datei"
   protocolLine2 = " "
   protocolLine3 = "Antragssteller:   E-Mail: " & emailA & "  Antrag erstellt am: " & newDate & " um " & newTime & "  Name: " & userName
   protocolLine4 = "________________________________________________________________________________________________________________________"
   protocolLine5 = "Genehmigungsinhaber1:    E-Mail: " & email1 & "  Beurteilung:  Zeit(Datum, Uhrzeit):  Name: " & name1
   protocolLine6 = "Genehmigungsinhaber1:    E-Mail: " & email2 & "  Beurteilung:  Zeit(Datum, Uhrzeit):  Name: " & name2
   protocolLine7 = "Genehmigungsinhaber1:    E-Mail: " & email3 & "  Beurteilung:  Zeit(Datum, Uhrzeit):  Name: " & name3   
   
   fileNum = Freefile() ' Erzeugt eine ID für eine zu öffende Datei
   Open protocolFile For Output As fileNum ' Öffnet die Datei aus protocolFile zur ID zum beschreiben
   Print #fileNum,protocolLine1
   Print #fileNum,protocolLine2
   Print #fileNum,protocolLine3
   Print #fileNum,protocolLine4
   Print #fileNum,protocolLine5
   Print #fileNum,protocolLine6
   Print #fileNum,protocolLine7
   Close #fileNum
   '__________________________________________________________________________________________
   ' E-Mail - Einstellungen
   
   doc.EnterSendTo = email1
   doc.subject = subject   
   '__________________________________________________________________________________________
   ' Fügt die Dateien an
   
   ' Gehe zu Feld attachment   
   Call uidoc.GotoField("attachment")
   ' Hängt die Datei an, wenn attachment vom Typ Richtext ist und lässt sie anzeigen
   If attachment.type = 1 Then
      Call attachment.EmbedObject( EMBED_attachment, "",targetFile)
      Call attachment.EmbedObject( EMBED_attachment, "",protocolFile)
      Call attachment.Update
      doc.SaveOptions = "0" 'speichern wird nicht abgefragt
      Call uidoc.Close(True) 'wird geschlossen
      Set newUiDoc = workspace.EditDocument(True, doc) 
      Delete uidoc 'Referenz auf das alte Frontend-Dokument löschen       
      Set Doc = newUiDoc.Document
      Call doc.RemoveItem("SaveOptions")
      newUiDoc.Refresh
   End If
   
End Sub

Es gibt auch noch 5 Funktionen, bei denen ich aber nicht davon ausgehe, dass diese den Fehler verursachen können.

Hoffe weiterhin auf tolle Statements!!

LG Ork

@ Bernhard: LG Okko ;-)

ata:
... was meinen Teil angeht - morgen ist auch noch ein Tag - dafür reicht meine Aufnahmefähigkeit heute nicht mehr...

Toni

Ork:
Noch mal hallo Toni,

ist kein Problem, muss morgen sowie so noch andere Dinge weiter schreiben.

Vielen Dank und dann bis morgen!!

ata:
... ich hab' mir deinen Code angeschaut. Schön kommentiert, da sieht man wenigstens was  ;D

Mir ist nichts aufgefallen, warum du den Spagat mit Frontend und Backend machst. An allen Stellen, an denen du einen Close ausführst würde ich ...

--- Code: ---doc.SaveOptions = "0" 'speichern wird nicht abgefragt
--- Ende Code ---
... gegen ...

--- Code: ---uidoc.FieldSetText( "SaveOptions" , "0" ) 'speichern wird nicht abgefragt
--- Ende Code ---
... ersetzen

Zu Beginn deines Codes löschst du die Inhalte der Empfänger-Felder und des Betreffs - ich würde zunächst die beiden Abbruch-Bedingungen mit Attachments und Text im Body durchführen - und dann die Felder leeren - was aber in deinem Fall keine Rolle spielt...

An welcher Stelle erscheint denn die Speicheraufforderung - eventuell würde ich Print-Statements einbauen, dann hast du mehr Kontrolle über den aktuellen Verlauf. Ansonsten mal im Debugger nachschauen, an welcher Stelle genau die Aufforderung kommt, denn da liegt ja der Hund begraben...

Toni

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln