Beiträge von Westenseer

    Hallo,
    hier mal den Code, wie z.B. bei mir sich ein Agent die DTA-Sätze zusammen baut.
    Ist zumindest mal 'ne Anleitung, wie's geht.
    Ich erstelle damit die Fahrtkostenabrechnungen in unserem Haus per DTA.


    Gruß
    Harald

    zunächst einmal Dank an alle, die versucht haben zu helfen.
    OK, Ich weiss, dass es so nicht 100%ig dicht ist, aber mir ist zumindest so weit geholfen, dass Strg+B nicht mehr in den Bearbeitungsmodus wechselt und trotz allem die Personen, die das Dokument geöffnet haben, registriert werden.
    Nachstehend mal der modifizierte Code:


    Sub Postopen(Source As Notesuidocument)

    Dim Session As New Notessession
    Dim Item As NotesItem
    Set Item = source.Document.GetFirstItem("gelesen")
    User = Session.CommonUserName
    If User = source.Document.From(0) Then Exit Sub 'den Ersteller brauchen wir nicht in der Leserliste

    Inhalt = Item.Values

    Forall Namen In Inhalt
    If Strleft(Namen," -") = User Then Goto Ende 'Exit Sub 'wenn schon vorhanden, braucht der User nicht nochmal als Leser eingetragen werden
    End Forall

    A = User+ " --- " +Cstr(Date) +" ·· "+Cstr(Time)
    Call Item.AppendToTextList( A )

    source.Document.gelesen = Item.Values
    Call source.Document.Save(True,False)


    Ende:
    If source.Document.gesperrt(0) = "1" Then
    source.EditMode = False
    continue = False
    Exit Sub
    End If

    End Sub











    Sub Querymodechange(Source As Notesuidocument, Continue As Variant)

    Dim Session As New NotesSession

    Admin = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
    Admin := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "#Admins" ; "Members" );
    @Name([CN] ; Admin )|)

    Ersteller = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
    Ersteller := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "9603 Ersteller Controlling-Info" ; "Members" );
    @Name([CN] ; Ersteller )|)

    Benutzer = Evaluate (|@name([CN];@UserName)|)

    Dim wks As New NotesUIWorkspace
    Dim doc As notesdocument
    Set doc = source.Document

    If source.Document.gesperrt(0) = "1" Then Goto Ende

    Forall Member In Admin
    If Benutzer(0) = Member Then
    Exit Sub
    End If
    End Forall

    Forall Member In Ersteller
    If Benutzer(0) = Member Then
    Exit Sub
    End If
    End Forall

    Ende:
    If Not source.EditMode Then
    continue = False
    Exit Sub
    End If

    End Sub





    nochmals Danke für Eure Hilfe


    Gruß Harald
    :( aus dem jetzt nicht mehr so sonnigen S-H

    taurec,
    wenn ich die Personen in ein Autorenfeld nehme, können Sie ja alle das Doc bearbeiten, aber gerade das soll ja nicht sein. Nur ausgewählte Personen sollen das Doc bearbeiten dürfen.
    Nur..... wenn eine Person das Doc öffnet soll protokolliert werden, wer wann das Doc gelesen hat. Daher habe ich alle auch als Editoren in der DB, die Maske geht nicht automatisch in den Bearbeitungsmodus, nur per Doppelklick und dann greift QueryModeChange und verhindert ggf. die Bearbeitung, aber Strg+B hebelt mir das aus. Und das möchte ich abfangen, weiss bloß nicht wie :-((

    @Lancelot,


    Hast Du den Code schon mal setp für step druchlaufen?


    If User = doc.From(0) Then Exit Sub


    "Hier frägst Du ab ob der Username gleich dem Maskenname ist???"



    Da wird nicht der Maskenname (Form); sondern der Ersteller des Docs abgefragt. Dieser Feldwert (From) wird beim Erstellen des Docs angelegt.





    If Strleft(Namen," -") = User Then Goto Ende


    "Beginnen Deine Commonname wirklich mit " -" ???"



    Nein, aber aus dem Code ist ersichtlich, mit welchen Werten ich das Feld "gelesen" gefüllt habe und Strleft(Namen," -") ergibt den Namen. Der Feldwert ist aufgebaut mit :
    User+ " --- " +Cstr(Date) +" ·· "+Cstr(Time)

    andreas


    hier mal der Code



    Dim Session As New Notessession
    Dim wks As New notesuiworkspace
    Dim Doc As Notesdocument
    Set doc = wks.CurrentDocument.Document
    Dim Item As NotesItem
    Set Item = doc.GetFirstItem("gelesen")

    User = Session.CommonUserName
    If User = doc.From(0) Then Exit Sub 'den Ersteller brauchen wir nicht in der Leserliste

    Inhalt = Item.Values

    Forall Namen In Inhalt
    If Strleft(Namen," -") = User Then Goto Ende 'Exit Sub 'wenn schon vorhanden, braucht der User nicht nochmal als Leser eingetragen werden
    End Forall

    A = User+ " --- " +Cstr(Date) +" ·· "+Cstr(Time)
    Call Item.AppendToTextList( A )
    Call doc.Save(True,False)



    Ende:
    If doc.gesperrt(0) = "1" Then
    continue = False
    End If




    Dieses Feld "gesperrt" wird zuvor, wenn es Berechtigte bearbeitet haben gesetzt. Es ist also bereits mit dem Wert "1" gefüllt.



    und im QueryModeChange habe ich:



    Dim Session As New NotesSession

    Admin = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
    Admin := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "#Admins" ; "Members" );
    @Name([CN] ; Admin )|)

    Ersteller = Evaluate (|_HomeServer := @Subset( @DbName; 1 ); HomeServer := @Name([CN];_HomeServer) ; HomeServer;
    Ersteller := @DbLookup( "" : "NoCache" ; HomeServer : "Names.nsf" ; "Groups" ; "9603 Ersteller Controlling-Info" ; "Members" );
    @Name([CN] ; Ersteller )|)

    Benutzer = Evaluate (|@name([CN];@UserName)|)

    Dim wks As New NotesUIWorkspace
    Dim doc As notesdocument
    Set doc = wks.CurrentDocument.Document

    If doc.gesperrt(0) = "1" Then Goto Ende

    Forall Members In Admin
    If Benutzer(0) = Member Then
    Exit Sub
    End If
    End Forall

    Forall Members In Ersteller
    If Benutzer(0) = Member Then
    Exit Sub
    End If
    End Forall

    Ende:
    Dim workspace As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Set uidoc = workspace.EditDocument( False )
    continue = False




    Aber QueryModeChange wird gar nicht durchlaufen, wenn ich Strg+B betätige.
    Bin ich denn zu dösig ? ;-)) oder wo liegt mein Problem

    aber ich prüfe im PostOpen doch, ob ein Feld einen bestimmten Wert hat und wenn es nicht den Wert hat, dann soll eben nur Lesen möglich sein.
    Oder stehe ich hier irgendwie auf dem Schlauch ??


    Gruß
    Harald

    andreas,
    verstehe ich nicht ganz. Was hilft mir ein Button ? Mit Strg+B brauche ich doch keinen Button, der mir irgendetwas an Flags setzt.
    Der User macht Strg+B und ist im Bearbeitungsmodus, da greift das QueryModeChange doch gar nicht.
    Es wird PostOpen durchlaufen und ich bin im Bearbeitungsmodus, das QueryModeChange wird gar nicht ausgeführt, oder liegt ich da falsch.


    Gruß
    Harald

    RockWilder,
    so einfach auf Leser einstufen, geht nicht. Die Dokumente sind an sich gesperrt, aber.......
    beim Öffnen eines Dokuments wird im PostOpen der Username im Dokument in ein Feld "Kenntnisnahme" mit Name und Datum eingetragen. Deshalb habe ich im QueryModeChange auch ein Continue = False drin, dass mir den Wechsel in den Bearbeitungsmodus verhindert. Die User habe ich desher auch als Editoren in der ACL. Durch Code im QueryModeChange wird der Bearbeitungsmodus aber nur bestimmten Gruppen gestattet und Strg-B würde das ja umgehen.
    Wenn Jemand eine bessere und effektivere Lösung kennt, ich bin für alles offen .-)).


    Gruß aus den z.Zt. noch sonnigen Schleswig-Holstein
    Harald

    Hallo,
    ich habe einen Agenten in der Mail-DB, der "Vor Eingang neuer Mail" laufen soll.
    Den Agenten habe ich im Template hinterlegt. Dort wird auch in der Liste der Agenten, dieser mit einem gelben Stern gekennzeichnet.
    Bringe ich nun die Mail-DB's per "load design" auf den neuen Stand verschwindet der Stern in den User-Mail-DB's und der Agent läuft nicht.
    Öffne ich den Agenten in einer User-Mail-DB und speicher ihn dann nochmal, erscheint der Stern und der Agent läuft wie er soll.
    Mache ich da was falsch oder muss ich jetzt jede Mail-DB anfassen, den Agenten öffnen und speichern ?
    Kennt Jemand eine Lösung ???


    Gruß
    Harald

    Hallo,
    ich hab' da mal wieder ein Problem mit einem Agenten, der einfach nicht laufen will.
    Der Agent ist zeitgesteuert und läuft über alle Dokumente in der DB.
    Wenn ich ihn manuell aus der Agentenliste starte, tut er fein das was er tun soll.
    Aber zeitgesteuert gibt er mir noch nicht mal einen Eintrag in der Log.


    hier mal der Code, vielleicht fällt ja Jemanden auf, was ich dort falsch gemacht habe.
    Was der Agent machen soll, muss ich wohl nicht extra schreiben, dass geht m.E. aus dem Code hervor.



    Sub Initialize

    On Error Goto Fehler

    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim archiveDb As NotesDatabase
    Dim collection As NotesDocumentCollection
    Dim Doc As NotesDocument
    Dim Doc2 As NotesDocument
    Set db = session.CurrentDatabase
    Set collection = db.AllDocuments
    Dim Agent_gelöscht As Variant
    Agent_gelöscht = False
    Dim Archiv_erstellt As Variant
    Archiv_erstellt = False


    Print "Starte Agent "+"neues Archiv erstellen > 100.000 Docs"

    ArchivDate = " bis "+Cstr(Day(Today))+"_"+Cstr(Month(Today))+"_"+Cstr(Year(Today))

    If Collection.Count => 10 Then 'Agent läuft nur, wenn mindestens 100.000 Dokumente in der Datenbank sind

    archiveServer$ = db.server
    DB_Name = Strleftback(db.FileName,".") ' ".nsf" abtrennen

    Set doc = collection.GetFirstDocument

    If Not (Doc Is Nothing) Then
    Set archiveDb = New NotesDatabase( "", "" )
    archiveFile$ = "Archive\"+DB_Name+"_"+ArchivDate+".nsf"
    End If

    archiveDb.Title = Db.Title+"_"+ArchivDate

    While Not(doc Is Nothing)
    Set doc2 = collection.GetNextDocument(doc)

    If Not archiveDb.IsOpen Then

    If (Not(archiveDb.Open(archiveServer$, archiveFile$))) Then
    Set archiveDb = db.CreateCopy( archiveServer$, archiveFile$ )
    Archiv_erstellt = True

    If Agent_gelöscht = False Then
    Forall Agenten In ArchiveDb.Agents
    If Agenten.Name = "neues Archiv erstellen > 100.000 Docs" Then
    Call Agenten.remove 'Archivierungsagenten aus dem neuen Archiv löschen
    Agent_gelöscht = True
    End If
    End Forall
    End If

    End If

    End If

    Call doc.CopyToDatabase( archiveDb ) 'Dokumente werden in das neue Archiv kopiert
    Call doc.Remove(True) 'kopierte Dokumente werden im alten Archiv gelöscht

    Set Doc = Doc2
    Wend

    If Archiv_erstellt = True Then
    Dim Memo As New NotesDocument(db)
    Memo.Form = "MainTopic"
    Memo.Subject = "neues Bank-Archiv wurde erstellt"
    Dim RTitem As NotesRichTextItem
    Set RTitem = New NotesRichTextItem(Memo,"Body")
    Call RTitem.AppendText("neues Bank-Archiv wurde erstellt.")
    Call RTitem.AddNewline(1)
    Call rtitem.AppendText("Link zur neuen Datenbank """+archiveDb.Title+""" ---> ")
    Call rtitem.AppendDocLink(archiveDb, archiveDb.Title)
    Call rtitem.AddNewline(1)
    Call Memo.Send(True,"#Admins") 'Meldung an Admins, dass ein weiteres Archiv erstellt wurde
    End If

    End If
    Exit Sub

    Fehler:
    Print Cstr(Err) + " inLine "+Cstr(Erl)
    End Sub

    Hallo,
    ich hätte da gern mal wieder ein Problem.
    Ein Agent startet in einer Bibliothek nachstehenden Code und übergibt dabei den ViewNamen und einen Offset mit Wert 4.
    Das läuft auch alles soweit gut, bis auf...


    vc.Title =Format$(Datum,"dd")



    das Datum habe ich zuvor durch


    Datum = Format$(Today()+ daycount,"Short Date")


    korrekt übergeben, da stimmt es noch (21.09.2009)


    Die Zeile


    vc.Title =Format$(Datum,"dd")


    gibt mir aber einen falschen Wert, hier "31"


    Ich habe mir mal den Wert als "d-mmmm" geben lassen,
    da erhalte ich dann den Wert "31.Dezember"





    hier der Code aus der Bibliothek:


    Sub UpdateColumnHeaders( NameOfView As String,Offset As Integer ) 'Offset wird mit 4 übergeben
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim view As NotesView
    Dim vc As NotesViewColumn
    Dim Datum As Variant
    Dim count As Integer
    Dim daycount As Integer
    Dim VarColor As String

    Set db = session.CurrentDatabase
    Set view = db.GetView(NameOfView)

    count = View.ColumnCount
    daycount = (count-offset)/2 - 1

    Do Until count = offset
    Set vc = view.Columns(count-1)
    Datum = Format$(Today()+ daycount,"Short Date")

    vc.FontFace = "Webdings"
    vc.Alignment = VC_ALIGN_CENTER
    vc.FontPointSize = 16
    vc.HeaderFontPointSize = 10
    vc.HeaderFontStyle = VC_FONT_BOLD
    vc.HeaderAlignment = VC_ALIGN_CENTER
    Select Case Weekday(Datum)
    Case 1 : vc.HeaderFontColor = COLOR_RED
    Case 7 : vc.HeaderFontColor = COLOR_DARK_YELLOW
    Case Else :vc.HeaderFontColor = COLOR_BLACK
    End Select

    vc.Title =Format$(Datum,"dd")
    vc.Width = 1
    count =count -1
    daycount = daycount -1
    Loop





    Wo zum Teufel ist dann hier der Fehler.
    Bin für jeden Tipp dankbar.


    Gruß
    Harald

    Hallo Taurec,
    so sieht es bei mir aus. In der View sind diverse leere Bereiche. Sieht ganz anders aus, wie in den normalen Views. Mich wundert nur, dass das Script bei mir einwandfrei läuft.
    Heißt das, dass ich diese View nicht mehr löschen kann ?


    Danke und Gruß
    Harald