Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Selin am 08.03.05 - 10:54:21
-
Hallo Zusammen,
ich habe eine Datenbank, die auf der Adressbuchschablone basiert.
Habe ein zusätzliches Feld Gruppe eingefügt.
Das Feld ist ein Listfeld mit der Formel
@Right(@DbColumn("":"NoCache"; ""; "Gruppe"; 1);"_")
Die Gruppennamen fangen alle mit ABC_ an.Deshalb @Right...
Mir werden in der Liste nun alle Gruppen angezeigt.
Was ich versuche ist folgendes:
Wenn ich eine oder mehrere Einträge in dem Listfeld markiere(Mehrfachauswahl möglich), soll dieser Kontakt, z.B. nach Klick auf einen Knopf, in die markieren Gruppen hinzugefügt werden.
Wie kann ich das am besten machen?
Bitte um Hilfe.
Danke + Gruß
Selin
-
Hi,
ohne mir tiefergehende Gedanken gemacht zu haben, könnte das ganz grob gesehen so aussehen:
Du brauchst eine nach Gruppennamen sortierte Ansicht im globalen Adressbuch. Die ist aber glaube ich schon vorhanden.
Mit GetDocumentbyKey("GruppennameausderListe incl ABC_",True) aus der NotesView-Klasse holst du dir das Zugriff auf das entsprechende Gruppendokument. Dann kannst du den Namen in das Members-Feld anhängen.
Ganz nebenbei gefragt: hat derjenige der das machen soll auch Autorenrechte auf das Adressbuch?
Axel
-
Mit GetDocumentbyKey("GruppennameausderListe incl ABC_",True) aus der NotesView-Klasse holst du dir das Zugriff auf das entsprechende Gruppendokument. Dann kannst du den Namen in das Members-Feld anhängen.
GetDocumentbyKey("GruppennameausderListe incl ABC_",True) => meinst du hier den Feldnamen aus der View Gruppe?
Und wie hänge ich den Namen des Members an?
Die User haben Autorenrechte.
-
Hi,
bei GetDocumentByKey kommt der Feldname, der die Gruppenliste enthält rein. Zusätzlich musst du aber noch, da du das in der Liste abgeschnitten hast, "ABC_" davorsetzen.
Das kann so aussehen:
Set docGroup = view.GetDocumentByKey("ABC_" & doc.ListenFeld(0), True)
Das Anhängen der Namen an das Members-Feld kann so aussehen:
Dim item As NotesItem
Set item = docGroup.GetFirstItem( "Members" )
Call item.AppendToTextList( "Hugo Test" )
Axel
-
Danke Dir
>>Set docGroup = view.GetDocumentByKey("ABC_" & doc.ListenFeld(0), True)
Hier hat er noch ein Problem
Habe alles angepasst aber kann aufgrund von Fehlern nicht abspeichern
-
Hi,
was für Fehler? ein paar mehr Infos musst du schon geben.
Axel
-
Zeile Set docGroup: Not a mamber: MAILING
Sub Click(Source As Button)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim docGroup As NotesDocumentCollection
Dim item As NotesItem
Set db = session.CurrentDatabase
Set view = db.GetView("(Gruppe)")
Set docGroup = view.GetDocumentByKey("ABC_" & docGroup.Mailing(0), True)
Set item = docGroup.GetFirstItem( "Members" )
Call item.AppendToTextList( "Hugo Test" )
End Sub
-
sorry
mein Fehler
Hatte documentCollection statt Document
-
hmm
geht aber immer noch nicht
Der Debugger sagt "Object variable not send" an der Stelle :
Set docGroup = view.GetDocumentByKey("ABC_" & docGroup.Mailing(0), True)
-
Lies Dir doch die Zeile bitte mal aufmerksam durch und denke. Was erwartest Du, was in docGroup.Mailing stehen sollte ...
Bernhard
-
Hallo,
ja, da hab ich doc.Mailing draus gemacht
aber das geht auch nicht
-
"Denken" hatte ich gesagt: Was soll denn dort für ein Wert gespeichert sein ?
Bernhard
-
na der Wert aus dem Listfeld bzw. die Werte. (ist ja ein Mehrfachauswahlfeld)
-
Und warum sollte das in dem Feld des Dokumentes stehen, das Du gerade erst suchst ?
Es lohnt auch ein Blick in die DesignerHelp, denn GetDocumentByKey erwartet einen String als Kriterium und liefert dann auch nur ein Dokument zurück.
Bernhard
-
Hi,
ich versuch dir mal ein bisschen auf die Sprünge zu helfen.
Wie bernhard schon gesagt hat, kannst du nicht ein Feld eines Dokumentes, dass du erst suchen willst, als Parameter für die Suche hernemen.
Ich gehen mal davon aus (ein bisschen Kaffeesatzleserei), dass du den Code in eine Aktion des Adressdokumentes einbauen willst und die entsprechenden Gruppendokumente innerhalb des Domino Verzeichnisses bearbeiten willst.
Dann muss das Ganze so aussehen:
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim docGroup As NotesDocument
Dim item As NotesItem
Dim books As Variant
Dim done As Integer
Dim idx As Integer
'Zugriff auf das aktuell geöffnete Dokument
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
'Suchen des öffentlichen Adressbuches und Zugriff auf die entspr. Ansicht
done = False
books = session.AddressBooks
Forall b In books
If (b.IsPublicAddressBook) And (Not done)Then
Call b.Open( "", "" )
Set view = b.GetView("(Gruppe)")
done = True
End If
End Forall
'Bearbeiten aller markierten Einträge im Listenfeld
For idx = 0 to UBound(doc.Mailing)
Set docGroup = view.GetDocumentByKey("ABC_" & doc.Mailing(idx), True)
Set item = docGroup.GetFirstItem( "Members" )
Call item.AppendToTextList( doc.Mailing(idx))
Call docGroup.Save(True, False)
Next
End Sub
Ich hab den Code nicht getestet und auf Fehlerabfragen hab ich auch verzichtet.
Axel
-
Vielen Dank
So hat es funktioniert.
Jetzt muss ich noch ne Abfrage einbauen, die prüft, ob es den Namen schon in der Gruppe gibt.....
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim docGroup As NotesDocument
Dim item As NotesItem
Dim books As Variant
Dim done As Integer
Dim idx As Integer
'Zugriff auf das aktuell geöffnete Dokument
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
Set db = session.CurrentDatabase
Set view = db.GetView("(Gruppe)")
For idx = 0 To Ubound(doc.Mailing)
Set docGroup = view.GetDocumentByKey("ABC_" & doc.Mailing(idx), True)
Set item = docGroup.GetFirstItem( "Members" )
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Next
End Sub
-
Hallo,
wie mache ich denn den umgekehrten Weg?
Was, wenn ich in dem Kontaktdokument aus der Liste eine Gruppe wieder rausmarkiere?
Dann muss der Name ja auch aus der Gruppe rausgenommen werden??
Könnt ihr mir ein Tipp geben?
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim docGroup As NotesDocument
Dim item As NotesItem
Dim books As Variant
Dim done As Integer
Dim idx As Integer
Dim subj As Variant
'Zugriff auf das aktuell geöffnete Dokument
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
Set db = session.CurrentDatabase
Set view = db.GetView("(Gruppe)")
'Bearbeiten aller markierten Einträge im Listenfeld
For idx = 0 To Ubound(doc.Mailing)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Mailing(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If (subj(0) <> doc.Name_Gruppe(0)) Then
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
Next
End Sub
-
'Bearbeiten aller markierten Einträge im Listenfeld
For idx = 0 To Ubound(doc.Mailing)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Mailing(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If (subj(0) <> doc.Name_Gruppe(0)) Then
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
Next
Du stellst eine neue Frage, hast aber offensichtlich die Funktionalität Deines bisherigen Codes noch gar nicht getestet.
Du holst Dir die Members aus dem Gruppendokument - und vergleichst dann den ersten Eintrag mit dem ersten Eintrag des Feldes "Name_Gruppe" (by the way: Ein extrem unglücklicher Name für dieses Item). Da dort die Gruppenmitglieder immer angehängt werden, funktioniert das schon bei der zweiten Gruppe nicht mehr.
Dann kommt der Witz an sich: Du speicherst das Gruppen-Dokument, das Du bis jetzt nur ausgelesen hast. Wann speicherst Du das Dokument, in Deine auf fragliche Art und Weise gesammelten Informationen landen ?
Wie soll man hier helfen ?
Bernhard
-
Ich weiß jetzt nicht genau, was Du meinst.
Es funktioniert.
Ich kann mehrere Gruppen in der Liste markieren. Nach dem Klick auf die Schaltfläche wird der Name in die Gruppe, Feld Members reinegschrieben
-
Sorry, Du hast Recht. Aber bei der vorhandene Beschreibung und der mangelnden Kommentierung des Codes incl. irreführender Objektnamen kommt man sehr schnell durcheinander.
Warum liest Du bei jeder Änderung von doc.Mailing nicht die Liste komplett neu ein und verwirfst dabei die alte ? Einen eleganten Listenvergleich und ggf. erforderliche Removes traue ich Dir einfach nicht zu. Sorry. Das oben vorgeschlagene wäre doch viel einfacher und löst auch Dein ungeklärtes Problem, doppelte Einträge zu vermeiden.
Bernhard
-
Hi,
die Sache ist nicht ganz so trivial.
Ich denke mal der Vorschlag von Bernhard ist gar nicht schlecht. Was andere fällt mir auf die Schnelle auch nicht ein. Und so bekommst du es auch auf relative einfache Weise in den Griff, wenn einer in einem "Arbeitsgang" ein Markierung in der Liste entfernt und bei einem anderen Gruppeneintrag die Markierung setzt. Du musst dir nur vorher die Liste "merken".
Axel
-
so, ich versuche nun das Ganze Schritt für Schritt zu machen.
Habe zwei Listfelder.
Liste1 = @Right(@DbColumn("":"NoCache"; ""; "Gruppe"; 1);"_")
Liste2 brechnet; Inhalt Liste1 und Auswahlformel auch @Right(@DbColumn("":"NoCache"; ""; "Gruppe"; 1);"_")
Habe zwei Buttons.
Import= fügt den aktuellen Namen in die Gruppen ein, die ich in Liste1 markiert habe
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim docGroup As NotesDocument
Dim item As NotesItem
Dim books As Variant
Dim done As Integer
Dim idx As Integer
Dim subj As Variant
'Zugriff auf das aktuell geöffnete Dokument
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
Set db = session.CurrentDatabase
Set view = db.GetView("(Gruppe)")
'Bearbeiten aller markierten Einträge im Listenfeld
For idx = 0 To Ubound(doc.Liste1)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Liste1(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If (subj(0) <> doc.Name_Gruppe(0)) Then
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
Next
Msgbox("Die Gruppenliste wurde aktualisert")
End Sub
Remove
Habe einafch das Imporieren Script genommen und statt das Einfügen, löschen reingeschrieben.
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim docGroup As NotesDocument
Dim item As NotesItem
Dim books As Variant
Dim done As Integer
Dim idx As Integer
Dim subj As Variant
'Zugriff auf das aktuell geöffnete Dokument
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
Set db = session.CurrentDatabase
Set view = db.GetView("(Gruppe)")
'Bearbeiten aller markierten Einträge im Listenfeld
For idx = 0 To Ubound(doc.Liste2)
Set docGroup = view.GetDocumentByKey("#ABC" & doc.Liste2(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If (subj(0) = doc.Name_Gruppe(0)) Then
Call item.Remove
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
Next
Msgbox("Die Gruppenliste wurde aktualisert")
End Sub
Remove löscht die Liste2 bzw den aktuellen Namen aus den Gruppen, die markiert sind.
Aber die Häckchen sind in der Liste immer noch da.
Die muss ich dann manuell rausnehmen und das Dokument Speichern.
Will ich dann wieder einen Namen in die Gruppe einfügen, bekomme ich die Meldung
"Objekt Variable not set"
Habt ihr Tipps?
Danke + Gruß
Selin
-
"Objekt Variable not set"
An welcher Stelle ? Was sagt der Debugger ?
-
hier:
...
For idx = 0 To Ubound(doc.Liste1)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Liste1(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If (subj(0) <> doc.Name_Gruppe(0)) Then
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
Next
Msgbox("Die Gruppenliste wurde aktualisert")
End Sub
Danke
-
Das ist doch auch ganz logisch - Du schmeisst ja in Deinem Remove-Code auch das Item aus dem Dokument 'raus. Beim Hinzufügen versuchst Du, das Item zu instantiieren, was gar nicht mehr da ist (und prüftst das nicht mal ab).
Da ich hier mittlerweile überhaupt nicht mehr durchsehe: In welches Dokument willst Du die Gruppenmitglieder hinzufügen - In doc oder in docGroup ?
Bernhard
-
Hallo Bernhard,
hast Recht.
Da ich hier mittlerweile überhaupt nicht mehr durchsehe: In welches Dokument willst Du die Gruppenmitglieder hinzufügen - In doc oder in docGroup ?
Die Gruppenmitglieder sollen in docGroup.Members rein
Gruß
Selin
-
Ändere mal das Hinzufügen wie folgt:
For idx = 0 To Ubound(doc.Liste1)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Liste1(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If docGroup.Members (0) = "" then
docGroup.Members = doc.Name_Gruppe
Else
If (subj(0) <> doc.Name_Gruppe(0)) Then
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
End If
Next
Da Du in Entfernen nicht einfach das Item rausklatschen kannst, machst Du statt item.Remove ein docGroup.Members = ""
Das wäre eine Möglichkeit, aus dem Gewurschtel noch was Lauffähiges hinzubiegen.
Bernhard
-
Hallo Bernhard,
das hat nicht funktioniert. Der schreibt den Namen nicht in die Gruppe rein.
For idx = 0 To Ubound(doc.Liste1)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Liste1(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If docGroup.Members (0) = "" then
docGroup.Members = doc.Name_Gruppe
Else
If (subj(0) <> doc.Name_Gruppe(0)) Then
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
End If
Next
Wenn ich das hier anwende fürs Hinzufügen:
For idx = 0 To Ubound(doc.Liste1)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Liste1(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If (subj(0) <> doc.Name_Gruppe(0)) Then
Call item.AppendToTextList( doc.Name_Gruppe)
Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
Next
und das hier fürs Löschen:
For idx = 0 To Ubound(doc.Liste2)
Set docGroup = view.GetDocumentByKey("#ABC_" & doc.Liste2(idx), True)
subj = docGroup.GetItemValue( "Members" )
Set item = docGroup.GetFirstItem( "Members" )
If (subj(0) = doc.Name_Gruppe(0)) Then
docGroup.Members = "" Call docGroup.Save(True, False)
Else
Msgbox("Name vorhanden")
End If
Next
klappt es erst einmal.
Wie kann ich denn die Häckchen nach dem Löschen auch wegnehmen aus der Liste1?
Danke+Viele Grüße
Selin
-
Der schreibt das schon rein, nur speichern tut er nicht. Das muss für den ersten If-Zweig auch noch mit rein.
-
Stimmt!
Vielen Danke noch mal Bernhard.
Habe jetzt mal beide Scripte jeweils in einen Agenten kopiert und versuche beim Speichern zuerst den Löschen Agent und dann das Hinzufügen Agent zu starten.
Hier wird der Name nicht in die Gruppe geschrieben.
Was mache ich falsch?
-
Selin, woher sollen wir wissen, was nun wieder falsch läuft ? Dein Code ist sowieso schon fragil und fehleranfällig (ich hatte da bereits geschrieben), nun hast Du das "in jeweils einen Agenten kopiert und versuchst beim Speichern zuerst den Löschen und dann das Hinzufügen Agent zu starten". Wozu Du das machst, können wir nicht wissen, weder wissen wir, wie diese Agents denn nun aussehen.
Irgendwie bastelst und friemelst Du nur. Wer bezahlt Dir das nur ?
Wenn das noch was werden soll: Schmeiss das Zeugs weg, was Du bisher hast. Das hat sowieso viel zu viele Risiken und Nebenwirkungen und wird niemals stabil laufen. Dann schreibst Du mal mal für uns ganz genau auf, was Du wie von DB1 in Dokumente in DB2 übernehmen (und ggf. wieder löschen) möchtest. Diese Denkphase ist für jeden Programmierer ein Muss - nur ein klar ausformuliertes Problem kann gelöst werden.
Wenn Du diese Aufgabenbeschreibung sauber machst und die Diskussion allein über die Aufgabenstellung akzeptierst und mitgehst, BEVOR gecoded wird, ergibt sich eine Chance, Dir hier nicht nur bei Deinem "aktuellen" Problem (das geht jetzt ja schon Monate ...) zu helfen, sondern Dich vielleicht auch prinzipiell weiterzubringen.
Unter oben genannten Umständen wäre ich bereit, Dir weiter zu helfen. Ich bin mir sicher, andere folgen da. Aber nur so - alles andere scheint mir verschwendete Zeit.
Bernhard
PS: Wenn Du den beschriebenen Weg gehen willst - nicht wundern, wenn von mir eine Woche vielleicht nix kommt, ich bin bis zum 30.03.2005 im Urlaub.
-
Irgendwie bastelst und friemelst Du nur. Wer bezahlt Dir das nur ?
Meine Haupttätigkeit ist nicht das Entwickeln. Und dafür werde ich auch nicht bezahlt.
Ich mache das quasi "nebenher"
Ich weiß nicht, wie oft ich das noch sagen soll.
Klar kann es sein, dass einige Sachen für einen erfahrenen Notes Entwickler "blöd" vorkommen.
Aber für mich als Anfänger ist das nun mal so. Und ich habe auch nicht soviel Zeit mich 8 Stunden am Tag mit dem Lernen zu beschäftigen.
Habe eine Schulung besucht, wie schon mal erwähnt, und die war einfach schlecht.
Versuche das, so gut es geht, eben Schritt für Schritt mir beizubringen.
Ich bin Dir für Deine Hilfen auch wirklich sehr dankbar und weiß es auch sehr zu schätzen aber ohne näheres zu wissen, wie denn mein Arbeitsaltag abläuft und was ich denn genau mache, solltest Du nicht solche Schriften publizieren.
Danke + Viele Grüße
Selin
-
Das Thema ist - vorerst - geschlossen und wird an anderer Stelle weiterdiskutiert.