none
Suchen eines Outlook Kalendereintrags anhand von 2 Kriterien via C# RRS feed

  • Frage

  • Hallo liebe Gemeinde,

    ich suche anhand von 2 Kriterien einen Kalendereintrag in Outlook 2007 und komme leider nicht weiter, hier mein Versuch:

    Outlook.AppointmentItem KADD = (Outlook.AppointmentItem)olApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar).Items.Find("@SQL="+"\""+"urn:schemas:httpmail:subject="+ "\""+" 'Anfahrt " + Variablen.DNach + "' AND urn:schemas:calendar:dtend '"+"\""+Variablen.DDatum+"");


    Könnte mir jemand bei der Syntax helfen?

    Vielen lieben Dank schonmal! :)


    Freitag, 14. Dezember 2012 16:57

Antworten

  • Hallo,

    Alles eine Frage der DASL-Syntax bei der Erstellung der Filter-Zeichenfolge.
    So funktioniert's bei mir (getestet unter Outlook 2003 und 2010):

    using System;
    using System.Windows.Forms;
    using Outlook = Microsoft.Office.Interop.Outlook;
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Outlook.Application olApp = new Outlook.Application();
                Outlook.NameSpace olAppSession = null;
                Outlook.AppointmentItem olAppointment = null;
                Outlook.MAPIFolder olCalendarFolder = null;
                try
                {
                    var dNach = "Stuttgart";
                    var dDatum = "15.12.2012";
                    var daslQuery = "@SQL=(urn:schemas:httpmail:subject='Anfahrt {0}' AND urn:schemas:calendar:dtend >= '{1}')";
                    var filterString = String.Format(daslQuery, dNach, dDatum);
                    olAppSession = olApp.Session;
                    olCalendarFolder = olAppSession.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
                    olAppointment = (Outlook.AppointmentItem)olCalendarFolder.Items.Find(filterString);
                    if (olAppointment != null)
                    {
                        MessageBox.Show(String.Format("Betreff: {0}, Beginn: {1}, Ende: {2}", olAppointment.Subject, olAppointment.Start, olAppointment.End));
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                finally
                {
                    if(olApp != null)
                    {
                        if (olAppointment != null)
                        {
                            olAppointment.Close(Outlook.OlInspectorClose.olDiscard);
                            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olAppointment);
                            olAppointment = null;
                        }
                        if (olCalendarFolder != null)
                        {
                            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olCalendarFolder);
                            olCalendarFolder = null;
                        }
                        if (olAppSession != null)
                        {
                            olAppSession.Logoff();
                            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olAppSession);
                            olAppSession = null;
                        }
                        olApp.Quit();
                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olApp);
                        olApp = null;
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }
                }
            }
        }
    }

    Ein gutest Buch zum Thema ist das von Ken Slovak - Professional Outlook® 2007 Programming.

    Der MSDN Code-Editor hat seine Macken. Du solltest dein CodeSchnippsel neu formatieren, so dass dein Code sichtbar wird. Sonst muss jeder, der was lesen möchte im HTML-Quelltext fünding werden. Und es ist leider so: Je länger man braucht, um das zu lesen/verstehen, was gepostet wurde, desto geringer sind die Chancen, dass sich jemand die Mühe macht zu antworten.

    Gruß
    Marcel

    • Als Antwort markiert NorthSouth Dienstag, 18. Dezember 2012 05:43
    Samstag, 15. Dezember 2012 12:00
    Moderator
  • Hallo,

    Kannst Du mir noch sagen wie ich die EntryID eines grade erzeugten Kalendereintrages auslesen kann?

    Gerne. Indem Du zuerst das AppointmentItem speicherst, und dann die Eigenschaft EntryID auswertest:

    var oAppointment = (Outlook.AppointmentItem)olApp.CreateItem(Outlook.OlItemType.olAppointmentItem);
    oAppointment.Save();
    var entryID = oAppointment.EntryID;
    
    Gruß
    Marcel
    • Als Antwort markiert NorthSouth Dienstag, 18. Dezember 2012 05:44
    Samstag, 15. Dezember 2012 18:02
    Moderator

Alle Antworten

  • Hallo,

    Alles eine Frage der DASL-Syntax bei der Erstellung der Filter-Zeichenfolge.
    So funktioniert's bei mir (getestet unter Outlook 2003 und 2010):

    using System;
    using System.Windows.Forms;
    using Outlook = Microsoft.Office.Interop.Outlook;
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Outlook.Application olApp = new Outlook.Application();
                Outlook.NameSpace olAppSession = null;
                Outlook.AppointmentItem olAppointment = null;
                Outlook.MAPIFolder olCalendarFolder = null;
                try
                {
                    var dNach = "Stuttgart";
                    var dDatum = "15.12.2012";
                    var daslQuery = "@SQL=(urn:schemas:httpmail:subject='Anfahrt {0}' AND urn:schemas:calendar:dtend >= '{1}')";
                    var filterString = String.Format(daslQuery, dNach, dDatum);
                    olAppSession = olApp.Session;
                    olCalendarFolder = olAppSession.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
                    olAppointment = (Outlook.AppointmentItem)olCalendarFolder.Items.Find(filterString);
                    if (olAppointment != null)
                    {
                        MessageBox.Show(String.Format("Betreff: {0}, Beginn: {1}, Ende: {2}", olAppointment.Subject, olAppointment.Start, olAppointment.End));
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                finally
                {
                    if(olApp != null)
                    {
                        if (olAppointment != null)
                        {
                            olAppointment.Close(Outlook.OlInspectorClose.olDiscard);
                            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olAppointment);
                            olAppointment = null;
                        }
                        if (olCalendarFolder != null)
                        {
                            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olCalendarFolder);
                            olCalendarFolder = null;
                        }
                        if (olAppSession != null)
                        {
                            olAppSession.Logoff();
                            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olAppSession);
                            olAppSession = null;
                        }
                        olApp.Quit();
                        System.Runtime.InteropServices.Marshal.FinalReleaseComObject(olApp);
                        olApp = null;
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }
                }
            }
        }
    }

    Ein gutest Buch zum Thema ist das von Ken Slovak - Professional Outlook® 2007 Programming.

    Der MSDN Code-Editor hat seine Macken. Du solltest dein CodeSchnippsel neu formatieren, so dass dein Code sichtbar wird. Sonst muss jeder, der was lesen möchte im HTML-Quelltext fünding werden. Und es ist leider so: Je länger man braucht, um das zu lesen/verstehen, was gepostet wurde, desto geringer sind die Chancen, dass sich jemand die Mühe macht zu antworten.

    Gruß
    Marcel

    • Als Antwort markiert NorthSouth Dienstag, 18. Dezember 2012 05:43
    Samstag, 15. Dezember 2012 12:00
    Moderator
  • Hallo Marcel,

    ich werde das Ganze mal morgen oder spätestens Montag testen, ich denke aber das es unter der 2007er Version auch funktionieren wird.

    Kannst Du mir noch sagen wie ich die EntryID eines grade erzeugten Kalendereintrages auslesen kann?


    Ach ja, vielen Dank zum 2ten :)
    • Bearbeitet NorthSouth Samstag, 15. Dezember 2012 16:32
    Samstag, 15. Dezember 2012 16:32
  • Hallo,

    Kannst Du mir noch sagen wie ich die EntryID eines grade erzeugten Kalendereintrages auslesen kann?

    Gerne. Indem Du zuerst das AppointmentItem speicherst, und dann die Eigenschaft EntryID auswertest:

    var oAppointment = (Outlook.AppointmentItem)olApp.CreateItem(Outlook.OlItemType.olAppointmentItem);
    oAppointment.Save();
    var entryID = oAppointment.EntryID;
    
    Gruß
    Marcel
    • Als Antwort markiert NorthSouth Dienstag, 18. Dezember 2012 05:44
    Samstag, 15. Dezember 2012 18:02
    Moderator
  • Als ich die Frage gestellt habe, hab ich mir das fast gedacht, aber toll das Du so schnell antwortest. :)
    Samstag, 15. Dezember 2012 20:02
  • Als ich die Frage gestellt habe, hab ich mir das fast gedacht [...]

    Gerne, gerne und gerne ;-)

    Es lag auf der Hand. Die Dokumentation zu AppointmentItem.EntryID ist in diesem Punkt ziemlich eindeutig:

    "Ein Anbieter für MAPI-Informationsspeicher weist eine Zeichenfolge mit einem eindeutigen Bezeichner zu, wenn ein Element in diesem Informationsspeicher erstellt wird. Aus diesem Grund wird die EntryID-Eigenschaft für ein Outlook-Element erst festgelegt, wenn es gespeichert oder gesendet wird."

    Sonntag, 16. Dezember 2012 09:52
    Moderator