Ich bin jetzt gerade am eintragen der Person welche sich anmeldet. Habe jetzt im Script für die Anmeldung folgenden Code
'Person einfügen
If uidoc.FieldGetText("Teilnehmer") = session.UserName Then
Messagebox "Sie sind bereits angemeldet."
Else
uidoc.EditMode = True
tmpTeilnehmer = uidoc.FieldGetText("Teilnehmer")
Call uidoc.FieldSetText ( "Teilnehmer", tmpTeilnehmer + session.UserName )
End If
'Dokument speichern
Call doc.ComputeWithForm(False,False)
Call doc.Save(True,False,True)
Jetzt zu meinem Problem:
- die Überprüfung ob die Person bereits angemeldet ist funktioniert nicht
- Das Feld Teilnehmer ist ein Namesfeld. Der neue Name wird direkt und ohne Leerzeichen hinter den letzten gesetzt und nicht in eine neue Zeile
- Es kommt dann immer die Abfrage ob das Document gespeichert werden soll.
Meldet sich doch bitte mal wieder jemand :-)
Der Thread kann übrigens ruhig in den Designer-Bereich verschoben werden.
Michael, mit derart herausgelösten Code-Schnipseln ist es schwierig, Fragen zu beantworten, die die Kenntnis des Gesamtzusammenhangs erfordern.
Wir brauchen also mehr Infos. Und den bei Dir jeweils aktuellen Dev-DB-Stand können wir uns auch nicht dauernd 'reinziehen.
Ein paar Ansätze:
Du arbeitest lt. Code-Schnipsel sowohl im Front- als auch im Backend. Das ist meist kontraproduktiv, da das FrontEnd darauf verweist, was im RAM passiert, das Backend darauf, was gespeichert ist (oder würde) - vereinfacht ausgesprochen.
'Person einfügen
If uidoc.FieldGetText("Teilnehmer") = session.UserName Then
Messagebox "Sie sind bereits angemeldet."
Du holst Dir so den Inhalt des Feldes "Teilnehmer". Wie Du weiter schreibst, ist das ein skalarer Wert (ein String und kein Array). So, wie Du (von Dir später beschrieben) das Feld füllst, steht dort dann
"CN=Hein Bloed/O=Kutter/C=DECN=Kaeptn Blaubaer/O=Kutter/C=DE".
Wenn Du jetzt den aktuellen User ("CN=Hein Bloed/O=Kutter/C=DE") mit dem Feldinhalt vergleichst via "=", dann ist das natürlich nicht gleich ... Du müsstest dafür Instr verwenden - aber letztlich ist das ja auch nicht, was Du willst (und auch nicht sollst - das soll ja eine Liste werden).
Verknüpfung der Namen zu einer Liste:
Im UI kannst Du das machen, in dem Du das für das Feld vereinbarte Trennzeichen bei Eingabe in Felder mit Mehrfachwerten verwendest, also zum Beispiel:
Call uidoc.FieldSetText ( "Teilnehmer", tmpTeilnehmer & ";" & session.UserName )
(Trennzeichen ist das Semikolon)
oder
Call uidoc.FieldSetText ( "Teilnehmer", tmpTeilnehmer & Chr$ (10) & session.UserName )
Beachte bitte auch: Der Concatenator für Strings in LS ist nicht "+", sondern "&".
Besser (effektiver, da mehr Möglichkeiten) wäre aber, das ganze im Backend zu machen (schau Dir dazu mal ArrayAppend an für das hinzufügen von Werten zu Arrays, zur Abrage, ob vorhanden, ArrayGetIndex und zum Auffrischen des UI-Docs NotesUIDocument.Reload / Refresh).
Ferner ist unklar, was Deinen Code überhaupt triggert: Ein Button-Click ?
HTH,
Bernhard
Ich persönlich bin ja nach wie vor der Meinung, dass es vielleicht für Anfänger einfacher ist, für die Anmeldungen als Antwort-Dokumente zu nehmen....
Aber gut.
1. Fehler:
Du behandelst das mit Frontend Klassen.
Nehme besser die Klasse NotesDocument (Backend-Klasse).
Ich nehme mal an das Feld "Teilnehmer" ist ein Mehrfachwerte-Feld.
Dann kannst du so etwa vorgehen (zum Beispiel)
(ich tippe das jetzt mal schnell runter ohne das auszuprobieren, also vorsicht).
Dim teilnehmer() as String ' array wg. ()
Dim user as String
Dim userFound as Integer
teilnehmer = doc.getItemValue("Teilnehmer")
nameCurrentUser = session.username
userFound = false
forall userAngemeldet in Teilnehmer
if userAngemeldet = nameCurrentUser then userFound = true
end forall
if userFound = true then
msgBox "Das geht nicht. Sie sind bereits angemeldet"
else
msgbox "Ok. Sie dürfen teilnehmen. Aber gut aufpassen, ja :-)"
doc. save true, false
end if
Hallo,
hatte nur gedacht, da der Code inzwischen recht umfangreich ist ich nur diesen Teil poste. Hier aber mal der Komplette Code für den Button den der User drücken soll wenn er sich anmelden will (ist ein Agent und wird über "@Command([ToolsRunMacro];"Anmelden")" von dem Button angesteuert.
Sub Initialize
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Dim dateRange As NotesDateRange
Dim dauer As Integer
'Für Mail
Dim EventName_mail As String
Dim vonDatum_mail As String
Dim bisDatum_mail As String
Dim doc_mail As NotesDocument
'Für Kalendereintrag
Dim tmpdate As String
Dim tmpdate2 As String
Dim datum_von As String
Dim datum_bis As String
Dim startDate As NotesDateTime
Dim endDate As NotesDateTime
Dim rtitem As NotesRichTextItem
'Teilnehmer prüfen
teilnhemer = doc.GetItemValue( "Teilnehmer" )
found = False
found = Arraygetindex(teilnehmer, session.UserName)
If found = True Then
Msgbox "Sie sind bereits angemeldet"
Else
'Teilnehmer hinzufügen
doc.Teilnehmer = doc.ArrayAppend("Teilnehmer", sesseion.UserName)
uidoc.Reload
'Teilnehmer neu berechnen
Dim total As Integer
total = 0
MA = doc.GetItemValue( "Teilnehmer" )
Forall m In MA
total = total + m
End Forall
Call doc.ReplaceItemValue( "Teilnehmer", total )
'Deklarationen
Set db = session.CurrentDatabase
Set uidoc = workspace.CurrentDocument
Set doc = New NotesDocument( db )
Set eventdoc = uidoc.Document
doc.Form = "newEvent"
datum_von = uidoc.FieldGetText( "vonDatum" )
datum_bis = uidoc.FieldGetText( "bisDatum" )
dauer = uidoc.FieldGetText( "Dauer" )
Set startDate = New NotesDateTime (datum_von)
Set endDate = New NotesDateTime(datum_bis)
rc = Evaluate (|@MailDbName|)
Set db = session.GetDatabase(rc(0), rc(1))
Set doc = db.CreateDocument
Set rtitem = doc.CreateRichTextItem("Body")
'setzt die Felder für den Kalendereintrag
doc.Form = "Appointment"
doc.Chair = session.UserName
doc.subject = uidoc.FieldGetText( "EventName")
doc.location = uidoc.FieldGetText("Ort")
Call rtitem.AppendText("Sehr geehrte/r ")
Call rtitem.AppendText(session.CommonUserName)
Call rtitem.AppendText(",")
Call rtitem.AddNewline(2)
Call rtitem.AppendText("mit folgender Verknüpfung können Sie die Daten dieses Seminares öffnen: ")
Call rtitem.AddTab(1)
Call rtitem.AppendDocLink(eventdoc, "Verknüpfung zum Seminar")
doc.AppointmentType="2"
Call Doc.ReplaceItemValue("_ViewIcon",26)
Call Doc.ReplaceItemValue("$Alarm",1)
Call Doc.ReplaceItemValue("$AlarmOffset",-1440)
Call Doc.ReplaceItemValue("$AlarmDescription",uidoc.FieldGetText( "EventName") + " - " + uidoc.FieldGetText( "Ort"))
Set dateRange = session.CreateDateRange
tmpDate = datum_von + " 04:00:00"
Set ndt_datum_von = New NotesDateTime(tmpDate)
Set ndt_datum_bis = New NotesDateTime(datum_bis + " 23:59:59")
Dim ndt_CalendarDateTime As Variant
Redim ndt_CalendarDateTime(0)
ndt_CalendarDateTime(0) = ndt_datum_von.LSLocalTime
Call ndt_datum_von.AdjustDay(1)
i = 0
While ndt_datum_bis.TimeDifference(ndt_datum_von) > 0
Redim Preserve ndt_CalendarDateTime(Ubound(ndt_CalendarDateTime) + 1)
ndt_CalendarDateTime(Ubound(ndt_CalendarDateTime)) = ndt_datum_von.LSLocalTime
Call ndt_datum_von.AdjustDay(1)
Wend
doc.CalendarDateTime = ndt_CalendarDateTime
doc.CalendarDateTime = ndt_CalendarDateTime
Set dateRange.StartDateTime = startDate
Set dateRange.EndDateTime = endDate
Set doc.TimeRange = dateRange
doc.Duration = dauer
doc.SequenceNum = 1
doc.OrgTable = "P0"
'Weitere Felder für den Kalendereintrag
Set doc.StartDateTime = New NotesDateTime (tmpDate)
Set doc.StartDate = New NotesDateTime (tmpDate)
Set doc.StartDate_2 = New NotesDateTime (tmpDate)
Set doc.EndDateTime = New NotesDateTime (datum_bis + " 23:59:59")
Set doc.EndDate = New NotesDateTime (datum_bis + " 23:59:59")
Set doc.EndDate_2 = New NotesDateTime (datum_bis + " 23:59:59")
Set doc.tmpStartTime_local = New NotesDateTime (LSLocalTime)
uidoc.EditMode = True
tmpTeilnehmer = uidoc.FieldGetText("Teilnehmer")
Call uidoc.FieldSetText ( "Teilnehmer", tmpTeilnehmer & Chr$ (10) & session.UserName )
Messagebox "Danke für die Anmeldung. Sie werden in kürze eine Bestätigungsmail erhalten." ,, "Info"
'Dokument speichern
Call doc.ComputeWithForm(False,False)
Call doc.Save(True,False,True)
'Mail versenden
Set db_mail = session.CurrentDatabase
Set doc_mail = New NotesDocument( db )
Set rtitem_mail = doc_mail.CreateRichTextItem("Body")
Username=session.UserName
EventName_mail = uidoc.FieldGetText( "EventName")
vonDatum_mail = uidoc.FieldGetText( "vonDatum")
bisDatum_mail = uidoc.FieldGetText( "bisDatum")
DocID_mail = uidoc.FieldGetText( "DocID")
doc_mail.Form = "Memo"
doc_mail.From = "EventPlaner"
doc_mail.SendTo = Username
doc_mail.Subject = "Bestätigung der Anmeldung für: " + uidoc.FieldGetText( "EventName")
Call rtitem.AppendText("Sehr geehrte/r ")
Call rtitem.AppendText(session.CommonUserName)
Call rtitem.AppendText(",")
Call rtitem_mail.AddNewline(2)
Call rtitem_mail.AppendText("Sie haben sich für folgende Schulung angemeldet:")
Call rtitem_mail.AddNewline(2)
Call rtitem_mail.AppendText("Schulung: ")
Call rtitem_mail.AddTab(1)
Call rtitem_mail.AppendText(EventName_mail)
Call rtitem_mail.AddNewline(1)
Call rtitem_mail.AppendText("Datum: ")
Call rtitem_mail.AddTab(2)
Call rtitem_mail.AppendText(vonDatum_mail)
Call rtitem_mail.AppendText(" - ")
Call rtitem_mail.AppendText(bisDatum_mail)
Call rtitem_mail.AddNewline(2)
Call rtitem_mail.AppendText("Der Termin wurde automatisch in Ihren Kalender eingetragen. Für weiter Informationen über diese Schulung klicken Sie doppelt auf den Eintrag in Ihrem Kalender.")
Call doc_mail.Send( False )
Call uidoc.Close
End If
End Sub
Hoffe ich habe in etwa es so gemacht wie Ihr gemeint hattet. Allerdings bricht mir Notes immer mit der Fehlermeldung "Object variable not set" ab. Dies geschiet an der ersten Zeile bei "Teilnehmer prüfen".
@kennwort
Ich habe es mit deinem Code mal versucht, jedoch bekomme ich immer die Fehlermeldung "Illegal reference to array or list: TEILNEHMER" beim speichern in der Zeile teilnehmer = doc.getItemValue("Teilnehmer"). Die Fehlermeldung bezieht sich auf "teilnehmer" vor dem =.
Mir würde es im gleichen Dokument einfach besser gefallen, als dass ich noch ein Antwortdokument nehmen würde. Und so kann ich auch was über LS lernen.
Ich hoffe Ihr könnt mir sagen, warum ich immer diese blöde Fehlermeldung mit "Object variable not set" bekomme.
Hallo,
so langsam wird das ganze was... ;D
Bin jetzt so weit, dass ich den Termin im pers. Kalender wieder löschen möchte. Habe bisher folgenden Code:
Sub Initialize
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
uidoc.EditMode = True
'Teilnehmer suchen und entfernen
Dim teilnehmer() As String
Dim x As Integer
x=0
Forall m In doc.Teilnehmer
Redim Preserve teilnehmer(x)
If m <> session.UserName Then
teilnehmer(x) = m
x = x +1
End If
End Forall
doc.Teilnehmer = teilnehmer
'Kalendereintrag löschen
Set eventdoc = uidoc.Document
eventid = uidoc.FieldGetText( "DocID" )
rc = Evaluate (|@MailDbName|)
Set db = session.GetDatabase(rc(0), rc(1))
'Dokument speichern
Call doc.ComputeWithForm(False,False)
Call doc.Save(True,False,True)
uidoc.Save
Messagebox "Sie wurden wieder abgemeldet." ,, "Info"
uidoc.close
End Sub
Ich weiß nur nicht, wie ich den Eintrag beim User finden soll. Ich habe inzwischen herausgefunden, wie ich an die Datenbank des Users komme. Aber wie kann ich dort jetzt etwas suchen? Habe in dem Kalendereintrag die DocID hinterlegt (eventid).
Dies ist übrigens wieder ein Button.
Ansonsten habe ich jetzt schon fast alles was ich will. Sollten nurnoch kleinigkeiten sein.
@Bernhard
Das war nur ein Fehler in dem Script. ;D Hatte bestimmt noch 100 mehr. Habs aber selbst hinbekommen *schulterklopf* :P
Habe noch ein wenig gesucht und hab auch ein paar sachen gefunden. Bekomme aber leider immer noch nicht den Eintrag gelöscht. Habe jetzt folgenden Code für das löschen:
'Kalendereintrag löschen
Set eventdoc = uidoc.Document
eventid = uidoc.FieldGetText( "DocID" )
rc = Evaluate (|@MailDbName|)
Set db = session.GetDatabase(rc(0), rc(1))
Set dc = db.FTSearch( eventid, 0, FT_SCORES, FT_FUZZY)
Set doc_loeschen = dc.GetFirstDocument
Call dc.deletedocument(doc_loeschen)
dc habe ich natürlich auch deklariert: Dim dc As NotesDocumentCollection
In dem Feld eventid steht auch die entsprechende ID, jedoch findet er diese aus irgend welchen Gründen nicht. Wenn ich mir wie in der Designerhilfe das dc ausgeben lasse, zeigt er nichts an.
Welchen fehler mache ich???
Hallo,
das mit der NotesDocumentCollection.DeleteDocument method habe ich gefunden und hoffentlich auch entsprechend eingefügt. Jedoch habe ich das Problem erstmal mit dem findes des Dokuments.
Folgende Funktion soll dahinter stecken:
Deklaration:
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Dim dc As NotesDocumentCollection
Dim doc_loeschen As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
- suche den Kalendereintrag in der Datenbank des Users mit dem Feld "DocID" das gefüllt ist mit dem Wert "eventid"
Set eventdoc = uidoc.Document
eventid = uidoc.FieldGetText( "DocID" )
rc = Evaluate (|@MailDbName|)
Set db = session.GetDatabase(rc(0), rc(1), False)
i= 0
Set dc = db.FTSearch( eventid, 0, FT_SCORES, FT_FUZZY)
- wähle das erste Dokument aus
Set doc_loeschen = dc.GetFirstDocument
- gebe mir das gefunde aus (nur zum testen)
While Not(doc_loeschen Is Nothing)
i= i +1
message = message & i & doc_loeschen.EventName(0) & Chr(10)
Set doc_loeschen = dc.GetNextDocument(doc_loeschen)
Wend
Messagebox message,, "Search results " & 1 & " - " & dc.Count
- Lösche dieses Dokument
'Call dc.deletedocument(doc_loeschen)
Ich kann irgendwie nicht das Dokument mit der DocID finden, aber es existiert im Kalender und es besitzt auch das Feld.
Kann mir vielleicht nochmal jemand sagen, was ich da jetzt so falsch mache?
Ich denke, das ist auch das letzte mal dass ich euch mit der DB nerve :P
mfg
Michael
Hallo,
mir macht es einfach Spaß euch zu quälen ;D
Ich habe es hinbekommen, dass wenn eine Person in dem Dokument steht dieser auch den Kalendereintrag gelöscht bekommt.
Jetzt habe ich versucht das ganze auszudehen und hänge gerade an dem Problem, dass ich mehere UNIDs nicht in ein Mehrfach-Listenfeld bekomme.
Habe es mit folgendem Code versucht.
tmpunid = docCurrent.GetItemValue("calunid")
newunid = Arrayappend(tmpunid, doc.UniversalID)
Call docCurrent.AppendItemValue("calunid", newunid)
Notes läuft einfach drüber und es passiert nichts.
tmpunid habe ich nicht deklariert, damit Notes damit machen kann was es will. Wenn ich es mit deklariere passiert auch nichts anderes. Auf jeden Fall mag Notes es nicht wenn mal () hinter die Variable setzt.
Ich hoffe ich habe nur einen kleinen Fehler in meinem Script. Will euch doch nicht auf die Nerven gehen ::)
Kann ich wenn ich die UNIDs richtig geschlieben habe mit Call doc.Current.ArrayReplace(doc.UniversalID, tmpunid, newunid)
in meinem Abmeldescript die nicht mehr benötigte UNID entfernen?
mfg
Michael