ein doc=nothing sollte aber auch reichen, wenn man es richtig macht und keine weitere Referenz mehr existiert. So z.B.:
set doc = new NotesDocument(db)
... doc füllen
call doc.save(false,false)
id = doc.NoteID
set doc = nothing
call agent.runOnServer(id)
set doc = db.getDocumentById(id)
... doc lesen
call doc.remove()
Frohe Ostern
Roland
PS: Mein bisheriger oft geänderter Code:
Aktion:
Sub Click(Source As Button)
'*********************************************************************************************************************************
'creates the interface file KOSTT.TXT for the time managment in the same path of database
'*********************************************************************************************************************************
'Invoked from: Initialize of this agent
'used libraries: logging
'used functions: CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
' Text As String)as Boolean
'*********************************************************************************************************************************
'changed: 09.04.2010 - DDorn - verify that files allready imported from the time server side
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
Dim agent As notesagent
Dim profileView As NotesView
Dim profileDoc As NotesDocument
Dim Item As NotesItem
'diyplay to user
Dim AllreadyImported As String
Dim ImportedBy As String
'*********************************************************************************************************************************
Set s = New NotesSession
Set db = s.CurrentDatabase
Set agent = db.GetAgent("InterfaceTime")
Set profileView = db.GetView(lkpProfileView)
Set profileDoc = profileView.GetDocumentByKey(Cstr("ProfileInterfaceTime"))
'-----------------------------------------------------------------------------------------------------------------------------------------------------------------
'create profileDoc if it not exist an set status to 0 to warn other users if they start the action
If profileDoc Is Nothing Then
Set profileDoc = db.CreateDocument
profileDoc.form = "ProfileInterfaceTime"
profileDoc.ImportingUser = s.CommonUserName
profileDoc.FilesAllreadyImported = "0"
Set item = New NotesItem(profileDoc,"ProfileInterfaceTimeAuthors", "[InterfaceData]")
item.IsAuthors = True
Call profileDoc.Save(True,False)
'needed in the first run of this action, if no profileDoc exists
'AllreadyImported = "1"
Else
If profileDoc.FilesAllreadyImported(0) = "0" Then
'don't start the agent
ImportedBy = profileDoc.ImportingUser(0)
AllreadyImported = profileDoc.FilesAllreadyImported(0)
Goto Message
Elseif profileDoc.FilesAllreadyImported(0) = "1" Then
'lock the agent for other users
profileDoc.ImportingUser = s.CommonUserName
profileDoc.FilesAllreadyImported = "0"
Call profileDoc.Save(True,False)
Else
Call CreateLogEntry(db.title,s.CommonUserName,"Aktion: CreateInterfaceTime","Click",_
"Error - Import Status konnte nicht von Profildokument ausgelesen werden")
End If
End If
Set profileDoc = Nothing
'agent decide if it will run or not and write status to profileDoc
Call agent.RunOnServer()
'read the status from the profile doc
Set profileDoc = profileView.GetDocumentByKey(Cstr("ProfileInterfaceTime"))
AllreadyImported = profileDoc.FilesAllreadyImported(0)
Message:
If AllreadyImported = "0" Then
Call CreateLogEntry(db.title,s.CommonUserName,"Aktion: CreateInterfaceTime","Click",_
"Agent läuft bereits - " & " User: " & ImportedBy & " & Status: " & AllreadyImported)
Msgbox "Die Kostenträger werden zur Zeit von " & ImportedBy & " aktualisiert. Bitte probieren Sie es später erneut.",,"Muster GmbH"
Goto Leave
Else
Msgbox "Dateien wurden erstellt! Bitte starten Sie die batch-Datei auf dem Zeitserver um die Kostenträger zu importieren.",,"Muster GmbH"
End If
Leave:
Exit Sub
ErrHandle:
Call CreateLogEntry(db.title,s.CommonUserName,"Aktion: CreateInterfaceTime","Click",_
"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
Resume Leave
End Sub
Agent - Initialize:
'*********************************************************************************************************************************
'Creates the interface files for the time managment in the same path of database. They will copied sheduled by a batch
'file on the time server. If the agent will run manual the batch file on the time server must be started by user.
'*********************************************************************************************************************************
'used libraries: logging
'used functions: CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
' Text As String)as Boolean
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
Dim profileView As NotesView
'*********************************************************************************************************************************
Set s = New NotesSession
Set db = s.CurrentDatabase
Set profileView = db.GetView("lkpProfileDocs")
Set profileDoc = profileView.GetDocumentByKey("ProfileInterfaceTime")
If profileDoc Is Nothing Then
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Error - Das Profildokument konnte nicht gefunden werden")
Exit Sub
End If
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Profildokument wurde gefunden, prüfe ob Dateien noch nicht importiert wurden")
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Profildokument User: " & Cstr(profileDoc.ImportingUser(0)))
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Profildokument Status: " & Cstr(profileDoc.FilesAllreadyImported(0)))
If FilesNotImported = True Then
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Die Dateien konnten nicht erstellt werden, da ein anderer User die Kostenträger importiert")
Exit Sub
End If
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Die Listen für die Zeitwirtschaft werden aktualisiert")
Call CreateKOSTT()
Call CreateCHIPKOSTT()
Call CreateWORKPLACEKOSTT()
Call DeleteMarkedChipAssigns
Call DeleteInterfaceIndicators
Call SetImportStatus
Leave:
Exit Sub
ErrHandle:
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
Resume Leave
End Sub
Agent - FilesNotImported:
Function FilesNotImported As Boolean
'*********************************************************************************************************************************
'check if the files allready imported by the batch file on the time server an write the status to profileDoc for displaying
'status to the user
'*********************************************************************************************************************************
'used libraries: logging
'used functions: CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
' Text As String)as Boolean
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
Dim FileNum As Integer
Dim BatchReturn As Integer
'*********************************************************************************************************************************
FileNum = Freefile()
Open ConditionFile For Input As fileNum
BatchReturn = Input$ (1 , FileNum )
Call CreateLogEntry(DB.title,s.CommonUserName,"Agent: InterfaceTime","FilesNotImported",_
"BatchReturn: " & BatchReturn)
Close FileNum
'set status to profileDoc for display to user
If BatchReturn = "0" Then
profileDoc.FilesAllreadyImported = "0"
Call profileDoc.Save(True,False)
'RETURN
FilesNotImported = True
Else
profileDoc.FilesAllreadyImported = "1"
Call profileDoc.Save(True,False)
'RETURN
FilesNotImported = False
End If
Call CreateLogEntry(DB.title,s.CommonUserName,"Agent: InterfaceTime","FilesNotImported",_
"Profildokument Status:" & Cstr(profileDoc.FilesAllreadyImported(0)))
Leave:
Exit Function
ErrHandle:
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","FilesNotImported",_
"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
'RETURN
FilesNotImported = False
Resume Leave
End Function
Agent - SetImportStatus:
Sub SetImportStatus()
'*********************************************************************************************************************************
'if agent is has created the interface files set AllreadyImported to 0, to stop creating new interface file from other users
'*********************************************************************************************************************************
'used libraries: logging
'used functions: CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
' Text As String)as Boolean
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
Filecopy AllreadyImportedFalse, AllreadyImportedNotes
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","SetImportStatus",_
"ImportStatus wurde auf 0 gesetzt - .false in .notes kopiert")
Leave:
Exit Sub
ErrHandle:
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","SetImportStatus",_
"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
Resume Leave
End Sub
neuer Gedankengang... ;D
ich lasse die Aktion wie sie eigentlich war:
'*********************************************************************************************************************************
'runs the server agent which creates the interface files
'*********************************************************************************************************************************
'used libraries: logging
'used functions: CreateLogEntry(DBName As String, User As String, DesignElement As String, InvokingEvent As String, _
' Text As String)as Boolean
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
Dim s As New notessession
Dim db As NotesDatabase
Dim agent As notesagent
'*********************************************************************************************************************************
Set db = s.CurrentDatabase
Set agent = db.GetAgent("InterfaceTime")
Call agent.RunOnServer
Msgbox "Dateien wurden erstellt!",,"Muster GmbH"
Leave:
Exit Sub
ErrHandle:
Call CreateLogEntry(db.title,s.CommonUserName,"Aktion: CreateInterfaceTime","Click",_
"Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
Resume Leave
Während der Agent weiterhin prüft, ob die zu Letzt erstellten Dateien seitens Batch schon kopiert wurden:
...
If FilesNotImported = True Then
Call CreateLogEntry(db.title,s.CommonUserName,"Agent: InterfaceTime","Initialize",_
"Die Dateien konnten nicht erstellt werden, da ein anderer User die Kostenträger importiert")
Exit Sub
End If
...
Der brave Anleitung lesende User ( ::) ) weiß ja, dass er die Batch-Datei manuell ausführen muss. Tut ers nicht auch nicht weiter schlimm. Irgendein anderer User wird schon Änderungen vornehmen, den Agenten starten und die Batch Datei ausführen. Dadurch werden jedoch zunächst die zuvor vom anderen User erzeugten Dateien in die Zeitwirtschaft importiert. Man wird sich wundern, warum die eigenen vorgenommenen Änderungen nicht in die Zeitwirtschaft übertragen wurden. An diesem Punkt werde ich dann darauf hinweisen, dass halt ein anderer User den Agenten gestartet, jedoch die Batch nicht ausgeführt hat und man halt einfach das Prozedere (Agent Start und Batch Start) nochmal machen muss (AllreadyImported.notes enthält zu diesem Zeitpunkt ja wieder den Wert 1). Wenn man das permanent für andere mitmachen muss, wird man evtl. bei sich selbst mehr drauf achten. Das geht dann hoffentlich irgendwann in Fleisch und Blut über. >:D
Bleibt nur noch das Problem mit der Handhabung, wenn der Agent dann zu seinem täglichen Zeitpunkt läuft und die von einem User erzeugten Dateien noch nicht via Batch Skript importiert wurden. Hier sollte vielleicht die Usergruppe, die den Agenten manuell ausführen kann per Mail informiert werden, damit die Batch-Datei am nächsten Morgen manuell ausgeführt und die Änderungen vom Vortag auch manuell übernommen werden. Mal schauen. :-:
Für irgendwelche anderen Vorgehensweisen bin ich natürlich offen ;)
Gruß
Demian