Im Menü <Aktionen> gibt es einen neuen Eintrag. In meinem Beispiel ist es "Gruppen aus Kategorie berechnen".
Gruß
Dirk
Im Menü <Aktionen> gibt es einen neuen Eintrag. In meinem Beispiel ist es "Gruppen aus Kategorie berechnen".
Gruß
Dirk
1. DB im Notes-Client öffnen
2. Menü <Ansicht> Eintrag "Agenten" wählen, dann solte sich der Designer öffnen und Du alle Agenten sehen.
3. Schaltfläche "Neuer Agent" verwenden
bei Notes 5.x
4. Name eintragen, so erscheint das Teil dann unter Aktionen (z.B. "Gruppen aus Kategorie berechnen")
5. "Gemeinsam genutzter Agent" anhaken
6. Eintrag bei "Wann soll der Agent gestartet werden?" - "Manuell aus dem Menü 'Aktionen'"
7. Eintrag bei: "Für welche Dokumente soll er gelten?" - "Alle Dokumente in der Datenbank"
8. im Feld Starten den Eintrag "Einfache Aktion(en)" durch "LotusScript" ersetzen
9. bei den Objekten "Initialize" auswählen
10. jetzt sollte
auf der rechten Seite stehen. Dazwischen den Code
Dim session As New NotesSession Dim db As NotesDatabase Dim view_Personen As NotesView Dim view_Gruppen As NotesView Dim doc_Personen As NotesDocument Dim doc_Gruppen As NotesDocument Set db = session.CurrentDatabase Set view_Personen = db.GetView("People") Set view_Gruppen = db.GetView("Groups") Set doc_Personen = view_Personen.GetFirstDocument Dim Array() As String Dim Kategorie As String While Not doc_Personen Is Nothing If Trim(doc_Personen.FullName(0)) <> "" Then For i = 0 To Ubound(doc_Personen.Categories) If Trim(doc_Personen.Categories(i)) <> "" Then Kategorie = Sonderzeichen_ersetzen(doc_Personen.Categories(i)) Set doc_Gruppen = view_Gruppen.GetDocumentByKey(Kategorie, True) If doc_Gruppen Is Nothing Then Set doc_Gruppen = New NotesDocument(db) doc_Gruppen.Form = "Group" doc_Gruppen.Type= "Group" Set item_Members = New NotesItem(doc_Gruppen, "Members", Trim(doc_Personen.FullName(i)), NAMES) Set item_DocumentAccess = New NotesItem(doc_Gruppen, "DocumentAccess", "[GroupModifier]", AUTHORS) doc_Gruppen.GroupType = "0" doc_Gruppen.AvailableForDirSync = "1" doc_Gruppen.ListName = Kategorie flag = doc_Gruppen.ComputeWithForm(True, True) doc_Gruppen.Save True, True, True Call view_Gruppen.Refresh Else Redim Array(0) vorhanden = False For i_Array = 0 To Ubound(doc_Gruppen.Members) If Trim(doc_Gruppen.Members(i_Array)) = Trim(doc_Personen.FullName(0)) Then i_Array = Ubound(doc_Gruppen.Members) vorhanden = True Else If Array(0) <> "" Then Redim Preserve Array(Ubound(Array) +1) End If Array(Ubound(Array)) = Trim(doc_Gruppen.Members(i_Array)) End If Next If Not vorhanden Then Redim Preserve Array(Ubound(Array) +1) Array(Ubound(Array)) = Trim(doc_Personen.FullName(0)) doc_Gruppen.Members = Array doc_Gruppen.Save True, True, True End If End If End If Next End If Set doc_Personen = view_Personen.GetNextDocument(doc_Personen) Wend
einfügen.
11. Nach "End Sub" im Script den Code
Function Sonderzeichen_ersetzen(txt As String) As String
' ersetzt alle Steuerzeichen und \ durch ein Leerzeichen
Sonderzeichen_ersetzen = ""
For i = 0 To Len(txt) - 1
zeichen_nr = Asc(Right(txt, Len(txt)- i))
If Zeichen_nr > 31 And zeichen_nr <> Asc("\") Then
Sonderzeichen_ersetzen = Sonderzeichen_ersetzen + Chr(zeichen_nr)
Else
Sonderzeichen_ersetzen = Sonderzeichen_ersetzen + " "
End If
Next
End Function
Alles anzeigen
einfügen.
12. Speichern und das Teil testen
Gestern ist mir noch der Gedanke gekommen, dass beim Speichern einer Person dies auch in die Kategorie-Gruppen einsortiert werden kann - bedeutet ein Script beim Speichern.
Gruß
Dirk
Anbei das versprochene Script - ging etwas schnelle. Mit meinem lokalem Adressbuch ist es getestet.
- Es werden keine Gruppen und auch keine schon eingetragenen Member gelöscht, d.h. alle manuell hinzugefügten Member bleiben in der Liste.
- Fliegt eine Kategorie aus der DB, dann bleibt die Liste erhalten.
- Wird der Fullname eine Person geändert, erscheint die Person mit dem alten und dem neuen FullName in der Liste.
- Personen ohne Fullname erscheinen nicht in der Gruppe.
Falls es noch Probleme gibt, einfach hier posten.
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view_Personen As NotesView
Dim view_Gruppen As NotesView
Dim doc_Personen As NotesDocument
Dim doc_Gruppen As NotesDocument
Set db = session.CurrentDatabase
Set view_Personen = db.GetView("People")
Set view_Gruppen = db.GetView("Groups")
Set doc_Personen = view_Personen.GetFirstDocument
Dim Array() As String
Dim Kategorie As String
' über alle Personen-Dokumente gehen
While Not doc_Personen Is Nothing
If Trim(doc_Personen.FullName(0)) <> "" Then
' über alle Kategorieen gehen, falls mehrere eingetragen sind
For i = 0 To Ubound(doc_Personen.Categories)
' nur wenn etwas im Kategorieeintrag steht
If Trim(doc_Personen.Categories(i)) <> "" Then
Kategorie = Sonderzeichen_ersetzen(doc_Personen.Categories(i))
' Gruppe für die Kategorie suchen
Set doc_Gruppen = view_Gruppen.GetDocumentByKey(Kategorie, True)
' ist die Gruppe schon vorhanden
If doc_Gruppen Is Nothing Then
' Gruppe nicht vorhanden ... neu anlegen
Set doc_Gruppen = New NotesDocument(db)
' Felder zuweisen und Eigenschaften setzen
doc_Gruppen.Form = "Group"
doc_Gruppen.Type= "Group"
Set item_Members = New NotesItem(doc_Gruppen, "Members", Trim(doc_Personen.FullName(i)), NAMES)
Set item_DocumentAccess = New NotesItem(doc_Gruppen, "DocumentAccess", "[GroupModifier]", AUTHORS)
doc_Gruppen.GroupType = "0"
doc_Gruppen.AvailableForDirSync = "1"
doc_Gruppen.ListName = Kategorie
flag = doc_Gruppen.ComputeWithForm(True, True)
doc_Gruppen.Save True, True, True
' Refresh der Ansicht, damit neue Gruppen gefunden werden
Call view_Gruppen.Refresh
Else
Redim Array(0)
vorhanden = False
For i_Array = 0 To Ubound(doc_Gruppen.Members)
' Gruppe ist vorhanden ... ist Person schon in der Gruppe eingetragen
If Trim(doc_Gruppen.Members(i_Array)) = Trim(doc_Personen.FullName(0)) Then
' Abbruch Person ist schon in der Gruppe
i_Array = Ubound(doc_Gruppen.Members)
vorhanden = True
Else
' Array mit allen Gruppenmitgliedern erstellen
If Array(0) <> "" Then
Redim Preserve Array(Ubound(Array) +1)
End If
Array(Ubound(Array)) = Trim(doc_Gruppen.Members(i_Array))
End If
Next
If Not vorhanden Then
' Person war nicht in Gruppe, dann Person hinzufügen
Redim Preserve Array(Ubound(Array) +1)
Array(Ubound(Array)) = Trim(doc_Personen.FullName(0))
doc_Gruppen.Members = Array
flag = doc_Gruppen.ComputeWithForm(True, True)
doc_Gruppen.Save True, True, True
End If
End If
End If
Next
End If
Set doc_Personen = view_Personen.GetNextDocument(doc_Personen)
Wend
End Sub
Function Sonderzeichen_ersetzen(txt As String) As String
' ersetzt alle Steuerzeichen und \ durch ein Leerzeichen
Sonderzeichen_ersetzen = ""
For i = 0 To Len(txt) - 1
zeichen_nr = Asc(Right(txt, Len(txt)- i))
If Zeichen_nr > 31 And zeichen_nr <> Asc("\") Then
Sonderzeichen_ersetzen = Sonderzeichen_ersetzen + Chr(zeichen_nr)
Else
Sonderzeichen_ersetzen = Sonderzeichen_ersetzen + " "
End If
Next
End Function
Alles anzeigen
Danke für die Hilfe,
aber jetzt habe ich gleich 2 hausgemachte Probleme.
Die Datei dasetup.exe existiert auf dem SystemDrive nicht.
Und dann kann ich keine Software installieren und deinstallieren - keine Rechte auf dem Client :(.
Jetzt muss ich erst mal zu den Client-Admins und betteln.
Melde mich wieder, wenn unsere Verwaltungsmühlen ausgemahlen haben.
Gruß
Dirk
Ich habe zwar keine Lösung, aber vielleicht grenzen meine Beobachtung die Sache etwas ein.
- Win NT und Notes 4.5.x, 4.6.x und 5.0.x keine Probleme
- Win XP und Notes 5.0.x auf einigen wenigen Rechneren Probleme
- Win XP und Notes 6.x kein Kennwortsyncronisation mehr, selbst wenn die Kennwörter von Hand identisch eingetragen werden, muss man sich anmelden.
Alle Rechner haben eine einheitliche Win NT / XP-Installation.
Wir haben nach langem Suchen die Funktion dann abgeschaltet.
Gruß
Dirk
Es kommen Mengen von den Zeilen
"HTTP Server: SSL handshake failure, ..., SSL Error: Network IO error, code 4165"
Die Meldungen kommen aber nur mit "&ui=iNotes" bei "&ui=webmail" ist alles i.O..
Mal sehen vielleicht reicht mir die Zeit nächste Woche. Ich poste es dann hier.
Gruß
Dirk
soweit komme ich nicht, beim öffnen von iNotes komme irgend eine Meldung einen Augenblick warten oder so ähnlich und dann reagiert der Browser nicht mehr.
Wie dringend is es denn?
Gruß
Dirk
Ok die MDAC Version auf dem Client ist "MDAC 2.7 SP1 On Windows XP SP1". Es gibt bei Microsoft eine Version 2.8, vielleicht bringt die uns weiter.
Gruß
Dirk
Mit einem Script-Agent sollte es funktionieren.
- Schleife über alle Personen
- prüfen ob Gruppe schon existiert (nein... neu anlegen)
- prüfen ob Person schon Member (nein... Person hinzufügen)
Habe ich noch nicht benötigt, deshalb habe ich auch keinen fertigen Code zur Hand. Die Idee finde ich gut - ist eine Überlegung wert, es den Usern anzubieten.
Gruß
Dirk
als BS nutzen wir Microsoft Windows 2000 Server in englisch mit SP3.
Wie komme ich an die MDAC-Info ran? Keine Ahnung was unsere Server-Betriebssystem-Admins installiert haben.
Gruß
Dirk
Ein kleiner Zappler bringt villeicht die Lösung:
Das Dokument im Ui öffnen und drucken.
Mit Notes 4.6.x muss das Back-End-Dokument vorher gespeichert werden. Unter Notes 5.x geht es ohne das Speichern des Back-End-Dokumentes.
Gruß
Dirk
kommt zwar spät, bin aber eben erst über die Anfrage gestolpert.
Wenn wenigstens das Dokument in einer NotesAnsicht markiert ist, kann es mit dem Print vom NotesUIView gedruckt werden.
ZitatCall notesUIView.Print( numCopies% [, fromPage% ] [, toPage% ] [, draft ] [, pageSeparator% ] [, formOverride$ ] [, printview ] [, dateRangeBegin ] [, dateRangeEnd ] )
Gruß
Dirk
bei meinem Template fehlt die "0", es nennt sich also "iNotes6.ntf". Ich könnte es per Mail zuschicken.
Gruß
Dirk
Dies geht nur über die API.
Den Code verwende ich mit Notes 5.x unter Win32.
(Declarations)
Const APIModule = "NNOTES" ' Windows/32 only
Const REPLFLG_DO_NOT_BROWSE = &H0400
Type ReplicaInfo
ID(1) As Long
Flags As Integer
CutoffDays As Integer
CutoffDate(1) As Long
End Type
Declare Function NSFDbOpen Lib APIModule Alias "NSFDbOpen" ( Byval P As String, H As Long) As Integer
Declare Function NSFDbClose Lib APIModule Alias "NSFDbClose" ( Byval H As Long) As Integer
Declare Function OSPathNetConstruct Lib APIModule Alias "OSPathNetConstruct" ( Byval Z As Long, Byval S As String, Byval F As String, Byval P As String) As Integer
Declare Function NSFDbReplicaInfoGet Lib APIModule Alias "NSFDbReplicaInfoGet" ( Byval H As Long, R As ReplicaInfo) As Integer
Declare Function NSFDbReplicaInfoSet Lib APIModule Alias "NSFDbReplicaInfoSet" ( Byval H As Long, R As ReplicaInfo) As Integer
' Beispiel Script
Dim hDB As Long
Dim session As New NotesSession
Dim db As NotesDatabase
Set db = session.CurrentDatabase
p$ = String(1024, " ")
OSPathNetConstruct 0, db.Server, db.FilePath, p$
NSFDbOpen p$, hDB
Dim R As ReplicaInfo
NSFDbReplicaInfoGet hDB, R
R.Flags = R.Flags And Not REPLFLG_DO_NOT_BROWSE ' Haken setzen
' R.Flags = R.Flags Or REPLFLG_DO_NOT_BROWSE ' Haken löschen
NSFDbReplicaInfoSet hDB, R
NSFDbClose hDB
Alles anzeigen
ein kleines Script soll die Select-Formel einer Ansicht ändern. Tut es auch, aber die Select-Formel wirkt erst, wenn ich die View einmal im Designer abgespeichert habe. Gibt es einen Trick, wie es ohne dieses Speichern klappt?
' view ... Ansicht, die geändert werden soll
' db ... Datenbank in der sich die Ansicht befindet
dim doc as NotesDocument
set doc = db.GetDocumentByUnID(view.UniversalID)
Call doc.ReplaceItemValue("$Formula","Form='Test'")
Call doc.save(True,True)
So sollte man zwar nicht vorgehen, aber ich würde mir das Editieren von ca 400 Ansichten ersparen.
Gruß
Dirk
Wenn Du wirklich ne echte Kopie und keine Replik willst, dann habe ich sowas schon mal gemacht.
Prinzip:
1. leere Kopie mit db.CreateCopy erstellen
2. Dokument für Dokument kopieren und im Kopie-Dokument in ein Feld (ich nenne es mal "OriginalUID") die UniversalID des Original-Dokumentes schreiben
3. alle Ansichten durchgehen und prüfen ob es sich um Ordner handelt (view.IsFolder)
4. ist es ein Ordner, dann alle Documente im Ordner durchgehen, die Dokumente anhand des Feldes "OriginalUID" und der UniversalID des Original-Dokumentes suchen und finden und dem Ordner hinzufügen.
Achtung Code-Schnipsel ist aus einem vorhanden Script und so nicht getestet.
' db_kop ... DB-Kopie
' db_org ... originale DB
Dim db_kop As NotesDatabase
Set db_kop = db_org.CreateCopy(SERVER, DATEINAME)
Dim dc_org As NotesDocumentCollection
Set dc_org = db_org.AllDocuments
Dim doc_org As NotesDocument
Set doc_org = dc.GetFirstDocument
'kopieren der Dokumente
While Not doc_org Is Nothing
Set doc_kop = doc_org.CopyToDatabase( db_kop )
doc_kop.OriginalUID = doc_org.UniversalID
doc_kop.Save True, True, True
Set doc_org = dc_org.GetNextDocument(doc_org)
Wend
' Ordner-Einträge prüfen
Dim ndt As New NotesDateTime("30.12.1899")
Forall v In db_org.Views
If v.IsFolder Then
Set doc_org = v.GetFirstDocument
While Not doc_org Is Nothing
Set doc_kop = db_kop.Search("OriginalUNID=""" & _
doc_org.UniversalID & """", ndt,0)
If Not doc_kop Is Nothing Then
Call doc_kop.PutInFolder(v.Name, True)
End If
Set doc_org = v.GetNextDocument(doc_org)
Wend
End If
End Forall
Alles anzeigen