anlage von Serienterminen

  • Hallo,


    ich hoffe ihr könnt mir Helfen. Ich muss eine synchronisation von Terminen / Aufgaben zwischen Lotus Notes und einer Oracle Datenbank programmieren. Normale Termine und Aufgaben kann ich synchronisieren.


    Dabei gehe ich wie Folgt vor. Ich erstelle ein Notes-Dokument und speicher es.



    Bei Serienterminen ist dies ja etwas anders. Dort erstelle ich zwei Dokumente. Ein Parent und ein Child Dokument. Eins besitzt das Feld CalendarDateTime und das andere nicht.


    Angenommen ich möchte einen Termin von 5 Tagen erstellen, füge ich in Start, End und CalendardateTime diese 5 Daten ein. Die Beiden Dokumente werden mit der ApptUNID verbunden.



    Nach dem Speichern des Dokuments werden die Termine auch im Kalender angezeigt. Bearbeite ich ein Termin (z.b. das Datum ändern) werden alle anderen Daten gelöscht und aus einem wiederholenden wird ein einzelner Termin. (Es wird nicht gefragt ob die änderung für den Tag oder die gesamte Serie übernommen werden soll)



    Hat jemand von euch damit schon Erfahrungen???


    Ich weis einfach nicht mehr weiter ...

  • tausend dank, könntest du mir den link von der ibm - docu posten? hab leider nichts gefunden. sitz schon seit langer zeit dran :(


    leider habe ich im forum nur maximal das anlegen von normalen terminen gefunden.d as habe ich implementiert. das problem ist wie gesagt das anlegen von serienterminen. dazu finde ich zumindestens nichts im netz bzw im forum.


    ich verstehe einfach nicht, wieso er meinen neu angelegten termin als serie anzeigt, aber nicht als serie erkennt und dadurch bei einer änderung eines einzelenen serienelements, die gesamte serie überschrieben wird, und nur ein termin mit dem geänderten datum übrig bleibt.

  • jetzt bin ich total verwirrt, kann ich einen serientermin in einem notesdokument erstellen? mir wurde immer gesagt es ginge nur mit zweien. :-? übrigens passiert dort genau das gleiche ... wenn ich den termin so erstelle, wird er nach verschieben zu einem zusammengefasst.



    aber villeicht könnte man ja einen termin auch sperren, quasi so, das man ihn nur ansehen aber nicht editieren kann. gibts da villeicht ein attribut was du mir nennen könntest. das würde mir für den anfang schon reichen um das system produktiv zu setzen.



    aber echt tausend dank das du mir ein paar infos gibst.

  • Weil dein Termin eben falsch angelegt ist.


    Wie wäre es wenn du dir das Redbook dazu erst mal durchliest.
    Da steht alles drin, wie so ein termin angelegt werden muß, welche Felder wie gesetzt sein müssen und was es alles für Dokumente braucht

  • schön, aber der link führt leider nicht zu dem redbook was du mir empfohlen hast. naja ich schließe dann mal den thread und werd mich erst ma schlafen legen. sitz seit 20 stunden an dem projekt und muss es so schnell wie möglich aktivieren. bis vor 4 tagen hatte ich keine ahung von lotus notes. geschweige denn wie man auf die schnittstelle zu greift.



    sperren von dokumenten geht wahrscheinlich nicht ganz einfach oder?

  • Also Google wirst du doch wohl bedienen können ?


    Ja der Link geht nicht mehr, hab ich auch grade festgestellt, aber wenn ich den Titel bei Google eingebe bekomme ich als ersten Treffer gleich den Link wo es jetzt liegt.


    Also das kann man ja wohl von dir erwarten

  • ja habs gefunden :) sorry, ich schlaf jetzt mal und dann hoffe ich das ich mich halbwegs konzentrieren kann und dann das dokument erstellen kann.



    ist sonst nicht meine art als nachzubohren.

  • so, ich bin ein gutes stück weitergekommen. hab mich durch das pdf gearbeitet und den serientermin anlegen können.


    jetzt bekomme ich leider beim öffnen eine fehlermeldung. "wrong datatype"


    das liegt daran, das ich das Feld $Ref falsch fülle.


    Was muss genau da hinein, die uniqueID des parent - Datensatzes ist ja falsch.
    Wie erstelle ich den Datentyp Response Reference List mit dem richtigen Inhalt.

  • wie gesagt, ich bin echt neu in notes.


    ich habe zwei notes-dokumente. Einmal den Parent und den Child. diese müssen aber miteinander in verbindung stehen, dies geht anscheind über $Ref.


    oder muss ich das Child - Dokument besonders erstellen?


    hab einfach


    notesDocumentParent = notesDatabase.CreateDocument();
    notesDocument = notesDatabase.CreateDocument();


    notesDocument.ReplaceItemValue("ApptUNID",notesDocumentParent.UniversalID);


    gemacht. und in beiden nach der Anleitung die Felder gefüllt.



    nur das Feld $Ref muss gefüllt sein. aber wie? bzw wie kann ich es füllen lassen

  • designer hilfe? :) klär mich ma auf. ich hab einfach die dll in mein .net projhekt eingebunden und angefangen :( leider


    nur um mich ma nich als total dumm zu outen.


    vor ner woche kam mein chef und meinte schreib einfach mal ne schnittstelle von userer software nach lotus notes. unser kunde möchte das termine / aufgaben und e -mails in beiden kalendern gleich sind. das ganze für ca. hundert user.


    naja also ma domino und lotus notes installiert und angefangen :( termine / aufgaben und e-mails sind kein problem, auch serientermine von notes in unsere software geht. nur die serientermine nach notes machen mich halt fertig.

  • okay :) jetzt hab ich die §ref. leider immernoch das alt bekannte problem, eine änderung und der gesamte termin wird überschrieben. gibts da villeicht etwas, was man ganz besonders beachten muss. außer die felder setzen, die im pdf stehen?

  • keiner eine Idee, was ich genau beachten muss?


    parent anlegen, child anlegen .. beides speichern ... aber nach der änderung im kalender wird die serie gelöscht :(


    hat jemand ein script in dem er srientermine anlegt, das er mir villeicht posten könnte

  • So jetzt bin ich schon wesentlich weiter, leider gehen nur Reminder keine Termeine. Setze ich den AppointmentTyp auf 0, bekomme ich einen NoItemNotFound error. Bei dem Typ Reminder, erkennt er das Dokument als Serie und ich kann es demtentsprechend auch bearbeiten.





    Domino.NotesSession notesSession = null;
    Domino.NotesDatabase notesDatabase = null;
    Domino.NotesRichTextItem richTextItem = null;


    Domino.NotesDocument notesParentDocument = null;
    Domino.NotesDocument notesChildDocument = null;


    /* PARENT - Dokument erstellen
    * - hat kein CalendarDateTime
    * - im Feld RepeatInstanceDates Liste von ursprünglichen Datumswerten
    * - im Feld RepeatDates Liste der aktuellen Datumswerte
    * - uniqueID des Mater-Dokuments = ApptUNID der Kind-Dokumente und des Master - Dokuments
    *
    * Wichtige Felder
    * - RepeatInstanceDates
    * - RepeatDates
    * - $SCFlags = c
    * - _ViewIcon = 160
    * - Appointmenttype = 0
    * - Repeats = 1
    * - SequenceNum = 1
    * - ApptUNID auf uniqueID setzen
    * - Start und EndDateTime haben nur min(Time)
    */




    // ein Notes-Dokument darf nur erstellt werden, wenn folgende Variablen gefuellt sind
    if (_syncUser != null && _syncUser != null)
    {
    // Session initalisieren
    notesSession = new Domino.NotesSession();
    notesSession.Initialize(Setting.NotesSyncUserPassword);


    // Verbindung zur Mail-Datenbank aufbauen
    notesDatabase = _syncUser.GetNotesDatabase(notesSession);


    // Notes-Dokument erstellen
    notesParentDocument = notesDatabase.CreateDocument();
    // Sicherheitsabfrage ob Domino-Verbindung und Session steht
    if (notesParentDocument != null && notesSession != null && notesDatabase != null)
    {
    // uniqueID aus neuem Notes-Dokument auslesen
    uniqueID = notesParentDocument.UniversalID;


    // Notes-Dokument mit Sync-Feldern fuellen
    foreach (FieldMapping field in _fieldList)
    {
    if (field.NotesFieldName.Equals("Body"))
    {
    richTextItem = notesParentDocument.CreateRichTextItem("Body");
    richTextItem.AppendText(field.Value);


    // wenn Appo / Task Attachment enthaelt muessen diese angefuegt werden
    if (HasAttachments(oraConn))
    {
    richTextItem = AddAttachments(oraConn, richTextItem);
    }
    }
    else
    {
    notesParentDocument.ReplaceItemValue(field.NotesFieldName, field.Value);
    }
    }


    // Form-Namen je nach Sync-Typ zuweisen
    switch (_syncType)
    {
    case eSyncType.APPO:
    notesParentDocument.ReplaceItemValue("Form", "Appointment");
    break;
    case eSyncType.TASK:
    notesParentDocument.ReplaceItemValue("Form", "Task");
    break;
    default:
    break;
    }


    // ReplicaID setzen
    notesParentDocument.ReplaceItemValue("ApptUNID", uniqueID);


    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.ENDDATE));
    if (!notesDateString.Equals(""))
    {
    notesParentDocument.ReplaceItemValue("EndDateTime", notesSession.Evaluate(notesDateString, notesParentDocument));
    }


    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.STARTDATE));
    if (!notesDateString.Equals(""))
    {
    notesParentDocument.ReplaceItemValue("StartDateTime", notesSession.Evaluate(notesDateString, notesParentDocument));
    }


    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.ORIGINALDATE));
    if (!notesDateString.Equals(""))
    {
    notesParentDocument.ReplaceItemValue("RepeatInstanceDates", notesSession.Evaluate(notesDateString, notesParentDocument));
    }


    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.CURRENTDATE));
    if (!notesDateString.Equals(""))
    {
    notesParentDocument.ReplaceItemValue("RepeatDates", notesSession.Evaluate(notesDateString, notesParentDocument));
    }


    notesParentDocument.ReplaceItemValue("$CSFlags", "c");
    notesParentDocument.ReplaceItemValue("_ViewIcon", notesSession.Evaluate("@TextToNumber(" + ((char)(34)).ToString() + "160" + ((char)(34)).ToString() + ")", notesParentDocument));
    notesParentDocument.ReplaceItemValue("AppointmentType", "4");
    notesParentDocument.ReplaceItemValue("Repeats", "4");
    notesParentDocument.ReplaceItemValue("SequenceNum", notesSession.Evaluate("@TextToNumber(" + ((char)(34)).ToString() + "1" + ((char)(34)).ToString() + ")", notesParentDocument));
    notesParentDocument.RemoveItem("CalendarDateTime");


    notesParentDocument.ReplaceItemValue("AltChair", "CN=Administrator/O=HANS");
    notesParentDocument.ReplaceItemValue("Chair", "CN=Administrator/O=HANS");
    notesParentDocument.ReplaceItemValue("RepeatInterval", "1");
    notesParentDocument.ReplaceItemValue("OrgRepeat", "1");
    notesParentDocument.ReplaceItemValue("OrgTable", "C0");
    notesParentDocument.ReplaceItemValue("MeetingType", "1");


    notesParentDocument.ReplaceItemValue("tmpAppointmentType", "Reminder");
    notesParentDocument.ReplaceItemValue("tmpAppointmentType1", "Reminder");
    notesParentDocument.ReplaceItemValue("tmpOwnerHW", "0");
    notesParentDocument.ReplaceItemValue("tmpChair", "CN=Administrator/O=HANS");



    replicaID = uniqueID;


    // CHILD
    try
    {

    while (oraReader.Read())
    {
    _refNotesID = Convert.ToInt32(oraReader.GetDecimal(0));
    FillFieldMappingList(oraConn);
    notesChildDocument = notesDatabase.CreateDocument();


    /* Kind-Dokumente erstellen
    * - Aufbau: 1) nur ein Kind (es gibt keine Abweichler)
    * 2) ein Abweichler in der Mitte
    * - Kind mit Daten bis Abweichler
    * - Kind (Abweichler)
    * - Kind Daten bis Ende
    * 3) mehre Abweichler
    * - beliebig Kinder
    *
    * nur Kinder werden in den Alarm-Ordner gesteckt
    *
    * Wichtige Felder
    * - $SCFlafs = i
    * - $Ref und ApptUNID auf uniqueID des Parents setzen
    * - Start - End - CalendarDateTime habenliste der Daten
    * - §RefOptions = 1
    * - _ViewIcon = 160
    * - Appointmenttype = 0
    * - Repeats = 1
    * - SequenceNum = 1
    */


    // Sicherheitsabfrage ob Domino-Verbindung und Session steht
    if (notesChildDocument != null && notesSession != null && notesDatabase != null)
    {
    notesChildDocument.MakeResponse(notesParentDocument);
    // uniqueID aus neuem Notes-Dokument auslesen
    uniqueID = notesChildDocument.UniversalID;


    // Notes-Dokument mit Sync-Feldern fuellen
    foreach (FieldMapping field in _fieldList)
    {
    if (field.NotesFieldName.Equals("Body"))
    {
    richTextItem = notesChildDocument.CreateRichTextItem("Body");
    richTextItem.AppendText(field.Value);


    // wenn Appo / Task Attachment enthaelt muessen diese angefuegt werden
    if (HasAttachments(oraConn))
    {
    richTextItem = AddAttachments(oraConn, richTextItem);
    }
    }
    else
    {
    notesChildDocument.ReplaceItemValue(field.NotesFieldName, field.Value);
    }
    }


    // Form-Namen je nach Sync-Typ zuweisen
    switch (_syncType)
    {
    case eSyncType.APPO:
    notesChildDocument.ReplaceItemValue("Form", "Appointment");
    break;
    case eSyncType.TASK:
    notesChildDocument.ReplaceItemValue("Form", "Task");
    break;
    default:
    break;
    }


    // ReplicaID setzen
    notesChildDocument.ReplaceItemValue("ApptUNID", replicaID);


    // Start-, End-, Calendar- und DueDateTime setzen
    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.CALENDARDATE));
    if (!notesDateString.Equals(""))
    {
    notesChildDocument.ReplaceItemValue("CalendarDateTime", notesSession.Evaluate(notesDateString, notesChildDocument));
    }


    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.DUEDATE));
    if (!notesDateString.Equals(""))
    {
    notesChildDocument.ReplaceItemValue("DueDateTime", notesSession.Evaluate(notesDateString, notesChildDocument));
    }


    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.ENDDATE));
    if (!notesDateString.Equals(""))
    {
    notesChildDocument.ReplaceItemValue("EndDateTime", notesSession.Evaluate(notesDateString, notesChildDocument));
    }


    notesDateString = CreateNotesDateTime(GetDateTime(oraConn, eDateType.STARTDATE));
    if (!notesDateString.Equals(""))
    {
    notesChildDocument.ReplaceItemValue("StartDateTime", notesSession.Evaluate(notesDateString, notesChildDocument));
    }


    notesChildDocument.ReplaceItemValue("$CSFlags", "i");
    notesChildDocument.ReplaceItemValue("$RefOptions", "1");
    notesChildDocument.ReplaceItemValue("$SCFlags", "i");
    notesChildDocument.ReplaceItemValue("_ViewIcon", notesSession.Evaluate("@TextToNumber(" + ((char)(34)).ToString() + "160" + ((char)(34)).ToString() + ")", notesParentDocument));
    notesChildDocument.ReplaceItemValue("AppointmentType", "4");
    notesChildDocument.ReplaceItemValue("Repeats", "1");
    notesChildDocument.ReplaceItemValue("SequenceNum", notesSession.Evaluate("@TextToNumber(" + ((char)(34)).ToString() + "1" + ((char)(34)).ToString() + ")", notesParentDocument));
    notesChildDocument.ReplaceItemValue("AltChair", "CN=Administrator/O=HANS");
    notesChildDocument.ReplaceItemValue("Chair", "CN=Administrator/O=HANS");
    notesChildDocument.ReplaceItemValue("RepeatInterval", "1");
    notesChildDocument.ReplaceItemValue("OrgRepeat", "1");
    notesChildDocument.ReplaceItemValue("OrgTable", "C0");
    notesChildDocument.ReplaceItemValue("MeetingType", "1");



    // Notes-Dokument speichern
    notesChildDocument.ComputeWithForm(true, false);
    notesChildDocument.Save(true, false, true);
    }

  • ja es fehlen sicherlich noch welche, die auch im buch stehen.


    kannst du mir sagen wie ich dies debuggen kann, weil es gibt ja eine mindestmenge an feldern die man braucht und einige die zusatz sind. ich muss ja auch sehen, das ich die termine mit den vorhandenen informationen aus dem gegensystem fuelle, ohne dabei zu viele statische daten im programm zu haben.



    wie sehe ich denn, was genau notes stört , wenn notesitem not found kommt. wo ist die debugfunktion?

  • Wo sie genau ist hängt einfach davon ab was für eine Notes Version du verwendest.


    Aber die einfachste Möglichkeit wäre einfach mal die bei Notes mitgelieferte Hilfe aufzumachen und dort zu suchen wie man den Debugger aktiviert