Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: TazDevil20 am 05.10.05 - 15:48:23

Titel: Schulungskalender
Beitrag von: TazDevil20 am 05.10.05 - 15:48:23
Hallo,

ich suche einen Kalender in den ich eine Schulung eintragen kann. Auf diesen Kalender können alle Mitarbeiter zugreifen und sich für die Schulung anmelden. Ab einer von mir vorher definierten Mitgliederanzahl wird die Schulung geschlossen.

Kennt jemand ein solches Produkt? Ist es schwer so etwas mit "wenig" (nur LS) Kenntnissen selbst zu bauen?

mfg

Michael
Titel: Re: Schulungskalender
Beitrag von: Gandhi am 05.10.05 - 15:53:46
Schwer ist so relativ...
Also Standardmässig gibt es das nicht.
Du könntest einen Standardkalender, Groupkalender, ....kalender anpassen - Dazu müsstest Du dann noch Felder für Teilnehmer in der entsprechenden Maske einbauen.
Definitiv kein Hexenwerk - aber auch nicht trivial.
Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 05.10.05 - 16:00:13
Richtig: Schwer ist relativ ...
Ich würde allerdings kein mitgeliefertes Template (vor allem nicht das Mail-Template) verwenden, da hier einfach zuviele Dinge ablaufen, die für den Zweck gar nicht gebraucht werden und sogar kontraproduktiv sind. Das alles sauber (!) zu entfernen, ist deutlich mehr Arbeit, als from the scratch zu starten.

Was braucht es ? Ein Dokumenttyp für die angesetzte Schulung mit Angaben von / bis und weiteren Infos zur Schulung, Ansichten (Kalender und Standard) zur Visualisierung, Knöpfchen zur Anmeldung (incl. Kontrolle der erlaubten Teilnehmerzahl) und Stornierung.
Die Tücken kommen dann eher im Detail (was passiert, wenn ein Kurs abgesagt wird, Routinen, um Mails an die Kursteilnehmer senden zu könenn usw. usf.)

Bernhard
Titel: Re: Schulungskalender
Beitrag von: theBastian am 05.10.05 - 22:47:22
Hi,

Vielleicht kann man doch ein mitgeliefertes Template nutzen.
Meine Idee zur Umsetzung wäre folgende:

- Erstellung einer Ressourcen-DB und Schaffung einer neuen Ressource (z.B. Schulung)
- automatische Annahme von Planungen für diese Ressource
- wenn Teilnehmerzahl erreicht ist dann manuelles Löschen dieser Ressource oder automatische Annahme ausstellen

Damit könnte das Absagen auch über das Canceln des Termins gehen.

Alternativ könnte man auch prüfen, wie der Annahmeprozess abläuft und eine Bedingung einbauen. Sowas wie

If Anzahl der Buchungen = Anzahl der Teilnehmer Then Buchung ablehnen Else Buchung annehmen
...
Ist aber nur reine Theorie von mir, da ich gerade kein Template da habe um mal zu schauen.  ???

cu
der B@sti
 
Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 05.10.05 - 23:42:33
Das ist eine schlechte Idee. Auch die Ressourcen-Reservierung steckt voll von Routinen und Automatismen, die man für den gewünschten Zweck nicht benötigt und die daher entfernt oder stillgelegt werden müssen. Mit allen Risiken und Nebenwirkungen ... Allein der Mechanismus der Verweigerung weiterer Teilnehmer wird da schon viel zu aufwändig gegenüber einem Ansatz "from the scratch".
Ausserdem: Wenn die Ressource bei Erreichen der Teilnehmerzahl gelöscht wird und danach ein Teilnehmer doch absagt, könnte ja ein neuer Teilnehmer wieder aufgenommen werden. Und dann ?
Weiterhin: Die Ressourcen-Reservierung setzt auf das Zusammenspiel mit dem DD und dem AdminP. Möchtest Du da wirklich eingreifen ?

Bernhard
Titel: Re: Schulungskalender
Beitrag von: flaite am 06.10.05 - 00:12:55
Das ist nicht so schwer zu entwickeln.
Die Schulung ist das Hauptdokument und die Anmeldung ist das Antwortdokument.
Das geht wirklich ganz gut mit Notes.
Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 06.10.05 - 00:23:24
Das wäre eine saubere Lösung, ist aber vielleicht gar nicht nötig, wenn eine Rotine die Anmeldung und Stornierung übernimmt und die Teilnehmer direkt ins das Seminar-Dokument schreibt (und die Anmeldungen und Stornierungen dokumentiert). Das erspart dann wieder den Deal mit der Ermittlung der Teilnehmer und der Teilnehmerzahl aus dem Hauptdokument auf die Repsonses.
Wie schon gesagt: Die Tücke liegt dann eher im Detail, und auch hier sollte man "nicht ohne Plan aufs Klo gehen" ("Jagd auf Roter Oktober" ?)  ;)

Bernhard
Titel: Re: Schulungskalender
Beitrag von: eknori am 06.10.05 - 05:02:47
Ich habe so etwas für unser unternehmen entwickelt. Da arbeite ich ausschließlich mit Hauptdokumenten. Die Datenbank ist allerdings auf unseren Prozeß "innerbetriebliche Fortbildung" zugeschnitten; Daher macht es wenig Sinn, die hier zu posten.

- User kann eine Veranstaltung aus Katalog wählen und sich anmelden
- Vorgesetzter genehmigt
- Personalabteilung plant die Schulung und lädt ein
- Teilnehmer bestätigt Termin
- Teilnehmerliste an Referent übermitteln
- Schulung durchführen; Rückmeldung über Teilnahme werden anhand der Liste eingetragen
- Teilnehmer erhält Aufforderung zur Abgabe einer Seminarbewertung ( incl. Reminder )
- Vorgesetzter erstellt Wirksamkeitsbeurteilung
- ENDE

Viele Routinen sind aus !!HELP!! ( Eskalationsmanagement wird hier für die Benachrichtigungen verwendet, Feldvalidierung )
Die Steuerung des "Workflow" erfolgt über simple @Formula und Leser- und Autorenfelder.
Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 06.10.05 - 13:33:51
Hallo,

ich habe gestern abend auch mit einer neuen Datenbank angefangen, da ich gerne weiß was sich so alles in den Programmen/Datenbanken abspielt.

@eknori
könntest du mir evtl. trotzdem die Datenbank mal zukommen lassen? Dann kann ich mir verschiedene Sachen mal anschauen. !!HELP!! hab ich mal versucht durchzublicken, habe es aber nie so richtig geschafft. Denke mal, dass diese nicht so groß ist.
Besonders interessiert es mich wie du folgende Punkte bearbeitet hast:

- Personalabteilung plant die Schulung und lädt ein
- Teilnehmerliste in Haupdokument
- Teilnehmer erhält Aufforderung zur Abgabe einer Seminarbewertung ( incl. Reminder )

Wär echt super. Werde dann meine fertige Arbeit hier mal bereit stellen. (kann aber noch ein wenig dauern)

mfg

Michael

Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 06.10.05 - 22:16:48
- Personalabteilung plant die Schulung und lädt ein
- Teilnehmerliste in Haupdokument
- Teilnehmer erhält Aufforderung zur Abgabe einer Seminarbewertung ( incl. Reminder )

Ha, und hier haben wir schon die "besonderen Feinheiten", die dann nach den "grundlegenden Dingen" so kommen - wie es hier schon angesagt wurde.

Mein Fazit:
Du brauchst einen sauberen Plan. Dann erst anfangen, wenn Du der Meinung bist, diesen Plan erfüllen zu können.
Dir nützt nicht nur kein Notes / Domino-immanentes Template, genauso nützt Dir auch eknori's DB nix, da diese spezifisch ist für sein Unternehmen (und Du bei !HELP! auch nicht komplett durchblickst).

Meine Meinung: Wir helfen hier gerne. Daher sollten wir als erstes Eure Anforderungen diskutieren. Dann Ansätze zur Umsetzung. Und Dir dann bei Problemen bei der Umsetzung helfen. Fertiger Code für sehr spezfische Umgebungen nützt Dir aber gar nichts.

Bernhard
Titel: Re: Schulungskalender
Beitrag von: flaite am 06.10.05 - 23:53:37
Kann man sich hier unter Umständen mal darauf einigen, dass Arbeit das ist, wo man sich ab und zu mal ein bischen Mühe geben muß und man sich eigentlich immer in einem gewissen Zustand der Unsicherheit befindet?
Ich vermute ja, dass esder allerersten Amöbe schon genauso ging. Und dann die ganze Evolution. Die menschliche Kulturgeschichte.
Das ist ein Projekt für den fortgeschrittenen Notes-Anfänger.
Bei konkreten Fragen kriegst du auch sicher eine Antwort.
Sonst würde es ja Software-Bestand und nicht Software-Entwicklung heissen.  ;D
Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 06.10.05 - 23:59:19
Kann man sich hier unter Umständen mal darauf einigen, dass Arbeit das ist, wo man sich ab und zu mal ein bischen Mühe geben muß und man sich eigentlich immer in einem gewissen Zustand der Unsicherheit befindet?

Genau auf diesen Umstand wurde doch schon hingewiesen, Axel. Mehrfach. Du hast es aber prägnant auf den richtigen Punkt gebracht.

Das ist ein Projekt für den fortgeschrittenen Notes-Anfänger.
Bei konkreten Fragen kriegst du auch sicher eine Antwort.

Sehe ich exakt genau so. Nur den Plan muss man jetzt mal aufmalen. Und dann konkrete Fragen stellen.

Bernhard
Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 07.10.05 - 07:55:36
Hallo,

also, folgende dinge soll die Datenbank erfüllen:

- Schulung planen von einer gewissen Gruppe (die mit Rollen angegeben wird)
- Schulung mit Anmeldung / ohne Anmeldung (Ersteller gibt Personen vor)
- mit Anmeldung:
  - Person bekommt eMail und bekommt den Termin in pers. Kalender eingetragen
  - Person kann sich wieder abmelden (Termin soll aus Kalender entfernt werden)
  - Bei Änderung des Zeitraumes eMail an alle Angemeldeten mit Button um Kalender zu berichtigen
  - Bei Absage - eMail an alle Angemeldeten mit Button um Kalender zu berichtigen
- ohne Anmeldung
  - Eingetragene bekommen eMail mit Button um Termin in Kalender einzutragen
  - Terminverschiebung/Absage wie bei "mit Anmeldung"

Die Seminarbewertung würde mich nur mal Interessieren. Ist aber kein muss für diese Datenbank.

Ich glaube schon, dass ich die Datenbank hinbekommen könnte. Allerdings fehlt mir einiges an Erfahrung (habe mich im ersten Beitrag verschrieben - habe in LS noch nichts gemacht, immer nur copy & paste und ein wenig angepasst)

Wie bereits gesagt, ich habe mit der Datenbank schon angefangen und stehe jetzt vor ein paar kleinen Problemen:

- Eintrag aus pers. Kalender entfernen
- Person welche sich anmeldet in Dokument (Haupt- oder Antwortdokument) eintragen
- aktuelle Teilnehmeranzahl berechnen
- Kalendereintrag funktioniert, lässt sich aber nicht durch doppelklick aufrufen --> erledigt

Habe mal das bisherige Ergebnis angehängt.

Michael

Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 07.10.05 - 21:23:46
Ich bin jetzt gerade am eintragen der Person welche sich anmeldet. Habe jetzt im Script für die Anmeldung folgenden Code

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.
Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 07.10.05 - 22:24:26
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.


Code
	'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:

Code
Call uidoc.FieldSetText ( "Teilnehmer", tmpTeilnehmer & ";" & session.UserName )
(Trennzeichen ist das Semikolon)
oder
Code
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
Titel: Re: Schulungskalender
Beitrag von: flaite am 07.10.05 - 22:28:42
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).
Code
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
Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 08.10.05 - 14:57:03
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.

Code
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.

Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 08.10.05 - 15:14:49
Jo, Michael - it works as designed. Du hast zu dem Zeitpunkt, zu dem Du auf das Objekt doc zugreifst, dieses noch gar nicht instantiiert. Daher ist natürlich die "object variable not set".

Du brauchst vorher ein Konstrukt wie
Dim uidocCurrent as NotesUIDocument
Dim docCurrent as NotesDocument
Set uidocCurrent = workspace.CurrentDocument
Set docCurrent = uidocCurrent.Document

Beachte bitte die neuen Objekte -Du verwendest ja "doc" später in einem ganz anderen Zusammenhang (für ein anderes Objekt).

Auf weitere "issues" habe ich jetzt nicht geachtet - Du musst ja erstmal dieses Problem lösen.

HTH,
Bernhard
Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 08.10.05 - 19:14:38
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:

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
Titel: Re: Schulungskalender
Beitrag von: rmann am 08.10.05 - 20:22:07
kleiner hinweis in eigener Sache. Die Anwendung EasyTrain von mir dient zur Umfangreichen Schulungsverwaltung. Was derzeit nicht enthalten ist, ist das die Anmeldebestätigung bei dem Teilnehmer im pers. Kalender eingetragen wird. Die deutsche Version wird in ca. 4-6 wochen fertig, die engl. ist bei einem weltweiten Unternehmen bereits im Einsatz um damit ca. 1.000 Teilnehmer pro Jahr zu schulen.

Kleiner tipp aus der Doku. Beim ersten Start einer neuen DB erscheint eine Fehlermeldung da die System Konfiguration noch nicht erfolgte - einfach OK und zur Systemkonfiguration wechseln

Gruß
Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 08.10.05 - 20:24:00
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:

Code
	'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???
Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 09.10.05 - 13:44:22
Liest Du aufmerksam DesignerHelp:
Zitat
NotesDocumentCollection.DeleteDocument method:

Deletes a document from a collection (not from the disk).

HTH,
Bernhard
Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 09.10.05 - 18:56:56
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:
Code
	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"
Code
	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
Code
	Set doc_loeschen = dc.GetFirstDocument
- gebe mir das gefunde aus (nur zum testen)
Code
	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
Code
	'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
Titel: Re: Schulungskalender
Beitrag von: koehlerbv am 09.10.05 - 20:46:31
Zunächst nochmal zum Löschen des Kalendereintrags: Das mit NotesDocumentCollection.DeleteDocument hast Du Dir immer noch nicht richtig durchgelesen - diese Methode löscht das Dokument lediglich aus Deiner Collection, nicht aber aus dem Kalender.

Zum Finden des Eintrags: Ich finde das Verfahren mit der FTSearch nicht so besonders glücklich, da Du nicht garantieren kannst, dass jedes Mail-File auch einen FTI hat. Aussderdem müsstest Du eine Searchformel verwenden wie FIELD DocID = "inhalt-deiner-docid".

Ein sicheres Verfahren wäre, wenn Du die UniversalIDs der erzeugten Kalendereinträge auch im Schulungsdokument speichern würdest (zweites Array, welches absolut analog zum Teilnehmer-Array aufgebaut sein muss, d.h., wenn Du einen Teilnehmer löschst, muss auch genau dessen Kalender-UNID entfernt werden). Du kannst dann mit NotesDatabase.GetDocumentByUNID höchst performant das jeweilige Dokument erreichen.

Was Du aber generell beachten musst: Du brauchst ein solides error handling. Unter anderem kann es ja ohne weiteres passieren, dass jemand solch einen Kalendereintrag Kraft seiner Wassersuppe einfach aus dem Kalender selber löscht ...

HTH,
Bernhard
Titel: Re: Schulungskalender
Beitrag von: TazDevil20 am 10.10.05 - 22:10:00
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.
Code
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
Code
 Dim tmpunid As Sting 
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
Code
 Call doc.Current.ArrayReplace(doc.UniversalID, tmpunid, newunid) 
in meinem Abmeldescript die nicht mehr benötigte UNID entfernen?

mfg
Michael
Titel: Re: Schulungskalender
Beitrag von: flaite am 10.10.05 - 22:53:19
steht calunid wirklich als Mehrfachwertefeld in der Maske (kann man anhaken)?
Im übrigen ist vielleicht die Klasse NotesItem besser für diese Operationen. Bessere Kontrolle. Jedenfalls präferiere ich die meist bei Mehrfachwertefeldern.
Methoden: appendToTextList.
Und
forall itemVal in Notes.values
print itemVal
end forall

Zum entfernen eines Wertes aus den Mehrfachwerten mußt du wohl
über den gesamten Array iterieren und die Werte neu setzen.
Ausserdem hat NotesItem noch eine Contains Methdode.

Versuche v.a. das Skript in mehrere Unterroutinen zu unterteilen.
(such nach sub oder function in Hilfe).