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
Hallo msimmerl
Liest dir mal folgenden Beitrag durch:
Terminausnahmen in einer Terminserie
Gruss
David
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
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
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
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
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
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;
..
.
}
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
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
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
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
Hoi Michael
Ist die Datei rdo.dll auf deinem Rechner vorhanden?
Sorry, nicht rdo.dll sondern cdo.dll.
Gruss
David
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
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
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
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
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.
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
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.
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
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();
}
}
}
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