Laden...
Z
zino myCSharp.de - Member
Datenmanager/Softwareentwickler Schweiz - Winterthur Dabei seit 17.11.2009
Benutzerbeschreibung

Forenbeiträge von zino Ingesamt 24 Beiträge

14.11.2013 - 09:16 Uhr

Hallo zusammen

Ich bin schon seit einigen Tagen an folgendem Problem. Ich habe einen Windowsdienst erstellt, der 24 Stunden am Tag läuft. Die Aufgabe des Dienstes ist es, je nach Tageszeiten Anrufe einer Telefonanlage automatisch anzunehmen und weiter zu leiten. Der Dienst ist schon seit längerer Zeit in Betrieb und bewältigt diese Aufgabe zu vollsten Zufriedenheit.

Bei einer geplanten Erweiterung ist mir aber im Process-Explorer etwas unschönes Aufgefallen. Via Timer werden alle x Sekunden Überprüfungen vorgenommen. Dabei erhöht sich bei jedem Aufruf der Prüfmethode die Anzahl der Handles. Der Speicher und die Anzahl der Threads bleibt dabei Stabil. Ich habe es mit dem Timer von System.Timers und System.Threading.Timer probiert mit jeweils gleichem Effekt.

Untenstehend ein Ausschnitt meines Codes:


 class MyClass
 {
     private pbx _pbx;
     private List<PBX_User> _userInfo_list;
     private System.Threading.Timer _echo_timer;
     private ReaderWriterLock _lockUserList;
     ..
     .
     public volatile bool m_stopService;

     public MyClass()
     {
         //.
         //..
         //Timer initialisieren
         TimerCallback cb = new TimerCallback(echo_aufruf);
         _echo_timer = new Timer(cb);
         _echo_timer.Change(10000, 10000);
     }

     //Prüfen ob PBX-Session noch gültig ist
     private void echo_aufruf(object timerState)
     {
         if (!m_stopService)
         {
             //Schreibschutz setzen    
             _lockUserList.AcquireReaderLock(Timeout.Infinite);
             try
             {
                 if (_userInfo_list.TrueForAll(
                         delegate(PBX_User usr)
                         {
                             return (usr.User_State == 0);
                         }
                     ))
                 {   //Wenn alle Anschlüsse inaktiv sind wird die PBX-Session geprüft
                     _pbx.EchoAsync(m_session_handle, m_key);
                 }
                 else
                     Log.writeLog(Texte.TXT_INFORMATION, "PBX-Status = true", m_debug);
             }
             finally
             {
                 _lockUserList.ReleaseReaderLock();
             }
          }
     }
 }

Ich wäre für jeden Tipp danbar 🙂

Gruss
David

15.10.2013 - 17:14 Uhr

Hallo msimmerl

Liest dir mal folgenden Beitrag durch:
Terminausnahmen in einer Terminserie

Gruss
David

09.03.2011 - 11:40 Uhr

Du muss nur folgendes angeben:


oSession.LogonExchangeMailboxEx(this.exUser, this.exServer, false, false, false, false);

this.exServer enthält den Namen des Exchange-Servers und
this.exUser den Namen des freigegebenen Kalenders.

Natürlich braucht der User unter dem der Service läuft die entsprechenden Berechtigungen (auf Exchange/Outlook) um den Kalender zu lesen.

Die Beschreibung aller Objekte, Methoden; Properties und Events findest du unter Redemption Data Objects

Gruss
David

09.03.2011 - 10:39 Uhr

Hoi hur


//Session initialisieren
RDOSession oSession = RDOSession();

//Mit Exchange connecten
oSession.LogonExchangeMailboxEx(this.exUser, this.exServer, false, false, false, false);

if (oSession.ExchangeConnectionMode == rdoExchangeConnectionMode.olOnline)
{
   //Enddatum setzen
   DateTime eDate = new DateTime();
   eDate = DateTime.Today.AddDays(1).AddSeconds(-1);

   //Kalender
   RDOFolder oCalendar = oSession.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);
   oCalendar.Items.Sort("Start", "false");

   //Normale Termine
   string filter = "[Start] < '" + eDate.ToString("s") + 
                   "' And [End] > '" + DateTime.Now.ToString("s") + 
                   "' And [IsRecurring] = 'False'";

   foreach (RDOAppointmentItem oAppt in oCalendar.Items.Restrict(filter))
   {  //Alle Termine von jetzt bis Mitternacht lesen
      string subject = oAppt.Subject;
      ...
      ..
      .
   }
}

//Session schliessen
 if (this.oSession.LoggedOn) { this.oSession.Logoff(); }

Marshal.ReleaseComObject(oSession);

Gruss
David

08.03.2011 - 10:43 Uhr

Hoi hur

Würde dir auch Redemption ans Herz legen. Habe damit einen Absenzenservice erstellt der anhand Terminen/Serientermine aus Exchange die Umleitungen einer VOIP-Anlage steuert.

Der Zugriff über Redemption auf Exchange ist recht einfach gehalten. Stolpersteine können Serientermine sein, die man anhand eines "Pattern" und dem (Start-)Termin selber berechnen muss. Kann mir aber vorstellen, dass Serientermine in deinem Fall keine Rolle spielen.

Gruss
David

22.11.2010 - 08:42 Uhr

Hoi infinity

Welche Version hat der Verweis auf Microsoft.Office.Interop.Excel? Der Verweis sollte mind. auf die Version 12.0 erfolgen.

Siehe auch Office Primary Interop Assemblies

Gruss
David

09.11.2010 - 14:27 Uhr

Hoi mdcc

Wie gesagt, du musst alle einzelnen Termine ausgehend vom Erstellungsdatum des Serientermins selber berechnen. Das heisst also, wenn der Serientermin vor einem Jahr erstellt wurde, muss dieser gelesen und anhand der Klasse

RDORecurrencePattern 

die einzelnen Termine der Serie aufbereitet werden.

Was genau ist dein Problem? Wird der "Ursprungstermin" eingelesen? Poste doch mal ein wenig Code. Mich würde z.B. interessieren wie du auf die Serientermine zugreifst. Wird ein Filter gesetzt oder werden einfach alle Termine ever eingelesen? Interessant wäre auch, wie du die einzelnen Termine einer Serie berechnest.

Wie sieht den die Serie aus, die dir Mühe macht:
Termin?
Serienmuster?
Seriendauer?

Gruss
David

29.10.2010 - 11:39 Uhr

Hoi Xenolith

Filtern kannst du die Items des Ordners wie folgt:


Folder inbox = olNS.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

//Emailadresse ...
string filter = "[SenderEmailAddress] = 'hans.muster@muster.com'";

// ... oder Name
string filter = "[SenderName] = 'Hans Muster'";

foreach (Mail mail in inbox.Items.Restrict(filter))
{
    string sub = mail.Subject;
    string adr = mail.SenderEmailAddress;
    string nam = mail.SenderName;
     ..
     .
    }

25.10.2010 - 11:24 Uhr

Hoi Mdcc

Mit viel Fleiss, Geduld und Frust konnte ich alle Probleme lösen und das Teil läuft mittlerweile sein einigen Monate produktiv 8) .

Zu deiner Frage. Im

RecurrenceType

vom

RDOAppointmentItem

findest du heraus um welchen Serientyp es sich handelt.

olRecursDaily, olRecursMonthly ,olRecursMonthNth, olRecursWeekly, olRecursYearly oder olRecursYearNth

Mit

Interval

findest du die Häufigkeit heraus. Die Wochentage sind im Pattern

RDORecurrencePattern oRecPat = oAppt.GetRecurrencePattern()

der Klasse

RDOAppointmentItem

hinterlegt. Dabei gilt folgende Regel:


            switch (flag)
            {
                case 1:
                    this.sunday = true;
                    break;
                case 2:
                    this.monday = true;
                    break;
                case 4:
                    this.tuesday = true;
                    break;
                case 8:
                    this.wednesday = true;
                    break;
                case 16:
                    this.thursday = true;
                    break;
                case 32:
                    this.friday = true;
                    break;
                case 64:
                    this.saturday = true;
                    break;
            }

Enthät das Pattern also den Wert 20, der Interval ist 2 und der RecurrenceType ist olRecursWeekly ist der Serientermin alle 2 Wochen am Dienstag und Donnerstag gültig. Das Problem ist, dass du anhand dem Startdatum

PatternStartDate

selber ausrechnen musst, wann du dich in einer gültigen Woche befindest. Wurde der Serientermin z.B. am 1. Feb. 2008 angelegt musst du dieses Datum als Ausgangspunkt nehmen.

Dazu muss auch geprüft werden ob einzelner Termin in der Serie gelöscht oder verschoben wurde. Dies findest du mit der

Exceptions

Methode aus der Klasse

RDORecurrencePattern

heraus. Mit den Methoden der Klasse

RDOExceptions

kannst du danach prüfen ob der Termin gelöscht oder verschoben wurde.

Gruss
David

20.10.2010 - 17:03 Uhr

Hoi Fil

Soweit ich den Beitrag von Microsoft interpretiere, müsstest du es mit der GetItem Operation statt der FindItem Operation versuchen. Leider habe ich damit aber auch keine Erfahrung.

Alternativ könntest du das ganze auch mit Redemption realisieren (ist kostenpflichtig). Damit funktioniert es bei mir.

Gruss
David

19.10.2010 - 17:06 Uhr

Hoi FiL

Hast du diesen Beitrag von Microsoft bereits gelesen?

Gruss David

17.09.2010 - 15:22 Uhr

Hoi zäme

Also bei uns in der Schweiz werden Fachinformatiker in Vergleich zu anderen Berufen recht gut bezahlt. Das Problem mit den Überstunden gibt es vor allen bei Softwarebuden wo auf Kundenbasis gearbeitet wird und alle Stunden auf Projekte gebucht werden müssen (z.B. ERP). Bei Banken und Versicherungen ist dies eigentlich recht gut geregelt. Bei Weiterbildungen (z.B. höhere Berufsprüfung oder Eidg. Diplom) beteiligt sich im Regelfall die Firma zu 50% (Kosten und Zeit). Man muss sich aber vielfach für eine gewisse Zeit verpflichten (in meinem Fall für 3 Jahre).

Da grössere Problem ist, dass es mit einer Fachausbildung (Lehre) sehr schwierig ist überhaupt eine Stelle zu finden. Ohne höhere Berufsbildung wie höhere Berufsprüfung, Eidg. Diplom oder Studium geht fast nichts.

Gruss
David

20.08.2010 - 09:16 Uhr

Hoi Michael

Sorry, habs gerade überprüft. Diese dll wird nur benötigt, wenn ohne Outlook direkt auf Exchange zugegriffen wird.

Hast du dich schon direkt an Redemption gewendet?

Hier wurde das Problem auch schon diskutiert.

Gruss
David

18.08.2010 - 17:20 Uhr

Hoi Michael

Ist die Datei rdo.dll auf deinem Rechner vorhanden?

Sorry, nicht rdo.dll sondern cdo.dll.

Gruss
David

16.08.2010 - 11:57 Uhr

Hoi Micheal

Das folgende Beispiel wurde mit Zugriff auf Exchange programmiert. Mit der Methode

oSession.Logon()

statt

oSession.LogonExchangeMailboxEx()

sollte es auch mit Outlook direkt funktionieren (glaube ich)


private void getDefaultFolder()
{
    RDOSession oSession = new RDOSession();

    //Mit Exchange o. Outlook verbinden
    oSession.LogonExchangeMailboxEx(this.exUser, this.exServer, false, false, false, false);

    foreach (rdoDefaultFolders defFolder in Enum.GetValues(typeof(rdoDefaultFolders)))
    {   //Alle Standardordner durchlaufen (Inbox, Drafts, Sent Items, Deleted Items, Outbox, ...)
       if (defFolder != rdoDefaultFolders.olFolderCalendar && 
           defFolder != rdoDefaultFolders.olFolderNotes)
       {   //ohne Kalender + Notizen
            RDOFolder oFolder = oSession.GetDefaultFolder(defFolder);
            foreach (RDOMail oMail in oFolder.Items)
            {   //Alle Emails im Standardordner
                string test = oMail.Subject;
            }
             //Unterordner
             getSubfolder(oFolder);
        }
    }
}

private void getSubfolder(RDOFolder oFolder)
{            
    foreach (RDOFolder oSubFolder in oFolder.Folders)
    {   //Alle Unterordner durchlaufen
        foreach (RDOMail oMail in oSubFolder.Items)
        {   //Alle Emails im Unterordner
            string test = oMail.Subject;
        }
        //Unterordner des Unterordners ...
        if (oSubFolder.Folders.Count > 0) 
            getSubfolder(oSubFolder);
    }
}

Gruss
David

20.07.2010 - 16:58 Uhr

Wie bereits vorher erwähnt funktioniert dies nur, wenn du einen Zwischenordner einfügst (manuell oder im Code).

D:\Ziptest\Ziptest\Datei.xls
D:\Ziptest\Ziptest\Datei2.doc

Der Ziper nimmt meines Wissens immer nur den Inhalt des angegebenen Ordners und komprimiert diese.

Gruss
David

14.05.2010 - 15:01 Uhr

Hoi Doltsche

So sollte es eigentlich funktionieren. Falls du im Hauptordner des Posteinganges auch noch Emails und nicht nur in den Unterordnern hast, musst du diese zuerst lesen. Hier könnte man es auch mit Rekursion versuchen (falls sich in den Unterordnern weitere Ordner befinden).


//Posteingang
inbox = this.oSession.GetDefaultFolder(rdoDefaultFolders.olFolderInbox);

//Alle Ordner durchlaufen
foreach (Folder mailFolder in inbox.Folders)
{   //Alle Emails durchlaufen
    foreach (MailItem mail in mailFolder.Items)
        listBox1.Items.Add(mail.Subject);
}

Die Ordner kannst du z.B. durch einen Index oder mit Namen direkt ansprechen


//Zugriff auf den 2ten Ordner im Posteingang
Folder mailFolder = inbox.Folders.Item(2);
//oder Ordner Diverses im Posteingang
Folder mailFolder = inbox.Folders.Item("Diverses");

Gruss
David

14.04.2010 - 16:09 Uhr

Hoi Stefan

Du kannst den Inhalt des Kalenders sortieren und filtern. Mein Beispiel ist zwar mit Redemption (RDO) gemacht, die Outlook Objekte stellen aber die gleichen Methoden zur Verfügung.


//Kalender einlesen und nach Startdatum sortieren
oCalendar = this.oSession.GetDefaultFolder(rdoDefaultFolders.olFolderCalendar);
oCalendar.Items.Sort("Start", "false");
                
//Normale Termine
string filter = "[Start] < '" + this.eDate.ToString("s") + "' And "
                + "[End] > '" + DateTime.Now.ToString("s") + "' And "
                + "[IsRecurring] = 'False'";
foreach (RDOAppointmentItem oAppt in oCalendar.Items.Restrict(filter))
    getSingleAbsence(oAppt); 
                  
//Serientermine
filter = "[Start] < '" + this.eDate.ToString("s") + "' And "
       + "[IsRecurring] = 'True'";
foreach (RDOAppointmentItem oAppt in oCalendar.Items.Restrict(filter))
    getRecurrenceAbsence(oAppt); 

Gruss
David

08.04.2010 - 10:27 Uhr

Hoi BeZi

Habe vor einigen Monaten einen Service der alle Termine (inkl. Serientermine) aus Gruppenkalendern direkt über Exchange ausliest programmiert. Dabei habe ich nach einem Tipp aus diesem Forum die Redemption.dll verwendet.

Kann dir diese Komponente sehr ans Herz legen!

Gruss
David

PS: Der Service wurde auf Windows 2003 Server und Windows XP Clients getestet und der Zugriff geschieht auf Exchange 2003, Redemption sollte aber auch Exchange 2007 unterstützen.

29.03.2010 - 15:58 Uhr

Hallo zusammen

Kann man nicht auch durch setzen von True/False von System.Timers.Timer.enabled (der Timer des Elapsed-Ereignis wird durch False gestoppt und erst bei True wieder gestartet) das gleiche erreichen?


private void timer_aufruf(object sender, EventArgs e)
{
    this.calr_timer.Enabled = false;

    //Termin einlesen
    foreach (MonitorUser mUser in Parameters.monitorList)
        mUser.loadAndValidateAbsence();

    this.calr_timer.Enabled = true;
}

Gruss
David

25.02.2010 - 09:19 Uhr

Hallo herbivore

Danke für deine Antwort.
Ich habe meine Frage vielleicht etwas falsch formuliert. Meine Ausgangslage ist folgende:

Ich habe einen Windowsservice erstellt, der beim starten das Objekt PBX (Webservice der Nachrichten mit einer Innovaphone VOIP-Telefonanlage austauscht) instanziert und initialisiert. Danach wird ein Delegate gesetzt um einkommende Anrufe zu überwachen.


//Delegate um die Telefone zu überwachen
private AsyncCallback asyncPoll;

this.asyncPoll = new AsyncCallback(pollCallback);
..
.
if (setupSession())
{  //SOAP zu PBX läuft
    try 
    { 
        this.pbx.BeginPoll(this.session_handle, this.asyncPoll, null); 
    }
    catch (SoapException ex)
    {   //Fehler
         Log.writeLog(PubTxt.ERR_PBX_TIT, PubTxt.ERR_PBX_TXT_03, ex);
         success = false;
    }
    ..
    .
}

Der Service läuft Tag und Nacht und vermittelt Anrufe, wenn gewisse Parameter erfüllt sind.
Bei Problemen wird die Telefonanlage automatisch heruntergefahren und neu gestartet. Danach hat mein Service keine Verbindung mehr zum PBX.

Meine Frage ist nun:
Welche Möglichkeiten habe ich um z.B. alle 60 Sekunden ein Hello_PBX via Webservice an den PBX zu senden um bei fehlender Verbindung darauf zu reagieren, sprich das Objekt PBX neu zu initialisieren und dadurch die Verbindung wieder herzustellen und zwar so, dass alles im selben Thread abläuft?

Gruss
David

PS: Ich bin zwar kein .Net Anfänger aber auch kein Profi. Habe mich erst mit diesem Projekt begonnen intensiver mit C# und .Net zu beschäftigen.

24.02.2010 - 16:35 Uhr

Hallo zusammen

Ich habe folgendes Problem.
Im meiner Hauptklasse habe ich einen Webservice mit der Instanzvariable PBX referenziert.


//Instanz zur Innovaphone SOAP-Schnittstelle (Webservice)
private Business_Layer.com.innovaphone.pbx pbx;

Beim starten der Anwendung (Windowsservice) wird das Objekt PBX instanziert.


private bool initNewPBXSession(bool restart)
{
    this.pbx = new Business_Layer.com.innovaphone.pbx();
    this.pbx.Url = Parameters.pbxUrl;
    this.pbx.Credentials = new System.Net.NetworkCredential(Parameters.pbxAccount, Parameters.pbxPass, "");

    //Handle für Session anfordern
    this.session_handle = this.pbx.Initialize(Parameters.pbxUser, PubTxt.ALG_CLIENT, true, true, out this.key);

    //Lizenz an PBX übergeben
    this.pbx.License(this.session_handle, Parameters.pbxLicense);
    ..
    .
}

Das funktioniert eigentlich alles ganz toll. Nun möchte ich aber alle X Sekunden prüfen ob die Telefonanlage (PBX) noch Antwort gibt oder neu gestartet wurde. Ich wollte dies über einen Timer lösen und aus diesem bei Bedarf die PBX-Session neu instanzieren.


//Timer um den PBX zu überwachen initialisiern
this.SOAP_Timer = new System.Timers.Timer(Parameters.soapInterval);
this.SOAP_Timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_AufrufInitSOAP);
this.SOAP_Timer.Start();
..
.

//Die Methoden wird alle Parameters.soapInterval Sekunden aufgerufen
private void timer_AufrufInitSOAP(object sender, EventArgs e)
{
    bool pbxInit = false;

    try 
    {   //Prüft ob Session noch aktiv ist
        int echo = this.pbx.Echo(this.session_handle, this.key);
        if (echo != this.session_handle || echo == 0) { pbxInit = true; }
    } 
    catch (System.Net.WebException) { pbxInit = true; }

    //Muss SOAP-Session zu PBX neu initialisiert werden?
    if (pbxInit) { initNewPBXSession(true); }

}

Die Telefonanlage wird danach auch tatsächlich neu gestartet, danach funktioniert der Service aber nicht mehr sauber und am Schluss wird der Service abgebrochen.

Ich gehe davon aus, dass das Problem daran liegen könnte, dass der Timer in einem anderen Thread läuft. Hat jemand einen Vorschlag wie ich das Problem lösen könnte?

Gruss
David

18.11.2009 - 11:05 Uhr

Hoi JensonButton

Hoffe, dieser Code bringt dich etwas weiter. Ist ein etwas einfacher Ansatz, könnte mit etwas Anpassen aber funktionieren.

In "fileTemp" gibst du deine xls Vorlage mit den Formatierungen an und in "fileNew" den Namen und Speicherort der Zieldatei.

Gruss
David


using System;
using System.IO;
using System.Diagnostics;	
using Microsoft.Office.Interop.Excel;

namespace DataAccessLayer.Excel
{
	public class MakeExcel
	{
		private System.Data.DataTable dTable;

		//Konstruktor
		public MakeExcel(System.Data.DataTable dTable) 
		{
			this.dTable = dTable;
		}

		//Startet ein Excel-Sheet und kopiert die übergebenen Daten in das Sheet.	
		public void createExcelWithDataTable(string fileTemp, string fileNew)
		{
			if (File.Exists(fileNew)) { File.Delete(fileNew); }
			File.Copy(fileTemp, fileNew);

			Application excel = new Application();
			object mis = System.Reflection.Missing.Value;
			Workbook wBook = excel.Workbooks.Open(fileNew, mis, mis, mis, mis, mis, mis, mis,
												  mis, mis, mis, mis, mis, mis, mis);
			Worksheet wSheet = (Worksheet) wBook.Worksheets[1];

			//Bezeichnungen lesen
			int row = 1;
			for (int col = 0; col < dTable.Columns.Count; col++)
			{
				wSheet.Cells[row, col + 1] = this.dTable.Columns[col].ToString();
			}

			//Rows lesen
			foreach (System.Data.DataRow dRow in this.dTable.Rows)
			{	//Elemente lesen
				row++;
				for (int col = 0; col < dRow.ItemArray.Length; col++)
				{
					wSheet.Cells[row, col + 1] = dRow.ItemArray[col].ToString();
				}
			}
			
			excel.Visible = true;
			wBook.Save();
		}

		//Inhalt von DataTable aufbereiten und in Zwischenablage kopieren + Excel starten
		public void createExcelWithDataTable()
		{
			string daten = string.Empty;

			for (int col = 0; col < this.dTable.Columns.Count; col++)
			{	//Bezeichnungen lesen
				daten += this.dTable.Columns[col].ToString() + "\t";
			}

			foreach (System.Data.DataRow dRow in this.dTable.Rows)
			{	//Rows lesen
				daten += "\n";
				for (int col = 0; col < dRow.ItemArray.Length; col++)
				{	//Elemente lesen + Enter entfernen
					string temp = dRow.ItemArray[col].ToString().Replace("\r", "");
					daten += temp.Replace("\n", " ") + "\t";
				}
			}

			System.Windows.Forms.Clipboard.SetText(daten);
			Process proc = new Process();
			proc.StartInfo.FileName = "Excel.exe";
			proc.Start();
		}
	}
}

17.11.2009 - 10:15 Uhr

Guten Tag

Da ich neu im Forum bin, möchte ich mich kurz vorstellen:
Ich bin Informatiker Richtung Business Solutions, ende 30 und arbeite seit ca. 10 Jahren als Softwarentwickler und Datenmanager im Bereich ERP und Versicherungssoftware.

Nun zu meinem Problem:
Seit einiger Zeit arbeite ich an einem Programm zur Verwaltung und Abspielung von Telefonansagetexten mit innovaphone VOIP Anlagen und dem Outlook-Kalender als Verwaltungstool für die Ansagetexte. Die Telefonanlage wird mit SOAP angesteuert und die Termine mit den Ansagetexten werden über Redemption direkt auf den Exchange-Server gelesen. Das heisst, Outlook ist auf dem Applikationsserver nicht installiert. Es funktioniert eigentlich alles super bis auf ein Problem:
Die Serientermine. Diese werden mit der Methode RDORecurrencePattern.GetRecurrencePattern() erstellt und eingelesen.
Was mache ich jetzt, wenn ein einzelner Termin aus der Serie geändert wird wie z.B. gelöscht oder um eine Stunde verschoben. Über GetRecurrencePattern()Exceptions.Count bekomme ich die Anzahl Änderungen der Serie aber leider nicht welcher Termin bzw. Datum der Serie und was es betrifft.

Es wäre toll wenn jemand aus dem Forum einen Ansatz hätte wie ich der Lösung des Problemes einen Schritt näher komme.

Beiliegend einen Teil meines Codes:


public ArrayList connectAndStartRead(string exUser, string exServer)
{
	//Collection für die Termine
	this.absenceList = new ArrayList();
	
	//Mit Exchange connecten + Kalender einlesen
	RDOSession session = new RDOSession();
	session.LogonExchangeMailboxEx(exUser, exServer, false, false, false, false);
	RDOFolder oCalendar = session.GetDefaultFolder(rdoDefaultFolders.olFolderCalendar);

	//Alle Termine durchlaufen
	foreach (RDOAppointmentItem oAppt in oCalendar.Items)
	{ 	//Serientermine + Einzeltermine getrennt verarbeiten
		if (oAppt.IsRecurring)
			getRecurrenceAbsence(oAppt);
		else
			getSingleAbsence(oAppt);
	}
	..
	.
	session.Logoff();
	this.absenceList.Sort(new SortAbsenceListAsc());
	
	return this.absenceList;
}

//Serientermine aufbereiten
private void getRecurrenceAbsence(RDOAppointmentItem oAppt)
{
	//Pattern lesen + Pattern-Enddatum aufbereiten
	RDORecurrencePattern oRecPat = oAppt.GetRecurrencePattern();
	DateTime ePattern = (oRecPat.NoEndDate) ? DateTime.MaxValue : oRecPat.PatternEndDate.AddDays(1).AddSeconds(-1);
	
    if ((oRecPat.NoEndDate && oRecPat.PatternStartDate <= this.eDate) ||
        (ePattern > DateTime.Now && oRecPat.PatternStartDate <= this.eDate))
    {   //Terminspanne setzen
        DateTime sTermin = oAppt.Start;
        DateTime eTermin = getEndTermin(oAppt.Start, oAppt.End, oAppt.Duration);
		
        //Gültige Tage setzen
        WeekMask week = new WeekMask();
        if (oRecPat.RecurrenceType != rdoRecurrenceType.olRecursMonthly &&
            oRecPat.RecurrenceType != rdoRecurrenceType.olRecursYearly)
			week = composeWeek(oRecPat.DayOfWeekMask, 64, week);
        if (oRecPat.Interval == 0) { oRecPat.Interval = 1; }
	
		switch (oRecPat.RecurrenceType)
		{	//Termine anhand des Pattern setzen
			case rdoRecurrenceType.olRecursDaily:
				//Jeden Xten Tag
				prepareRecursDaily(oAppt, sTermin, eTermin, ePattern, oRecPat.Interval, week);
				break;
			case rdoRecurrenceType.olRecursMonthly:
				//Monatsweise am Datum X
				prepareRecursMonthly(oAppt, sTermin, eTermin, ePattern, oRecPat.Interval);
				break;	
	       case rdoRecurrenceType.olRecursMonthNth:
	           //Monatsweise an jedem Xten Tag
	           prepareRecursMonthNth(oAppt, sTermin, eTermin, ePattern, oRecPat.Interval, oRecPat.Instance, week);
	           break;
	       case rdoRecurrenceType.olRecursWeekly:
	           //Jede Xte Woche an jedem Xten Tag/Tagen
	           prepareRecursWeekly(oAppt, sTermin, eTermin, ePattern, oRecPat.Interval, week);
	           break;
	       case rdoRecurrenceType.olRecursYearly:
	           //Jahresweise am Datum X
	           prepareRecursYearly(oAppt, sTermin, eTermin, ePattern, oRecPat.DayOfMonth, oRecPat.MonthOfYear);
	           break;
	       case rdoRecurrenceType.olRecursYearNth:
	           //Jahresweise an jedem Xten Tag
	           prepareRecursYearNth(oAppt, sTermin, eTermin, ePattern, oRecPat.Instance, oRecPat.MonthOfYear, week);
	           break;			
		}
	}
}

Gruss
David