none
WM AppointmentRecurrence.GetOccurrence RRS feed

  • Question

  • Bonjour à tous.
    Avant de poser ma question, un petit état des lieux de mes connaissances:

    1) Lorsqu'on récupère la liste des évènements de l'agenda dans WM, on récupère dans cette liste les évènements récurrents, mais pas le détail de ces évènements (normal, si la recurrence n'a pas de limite, il y en a une infinité par définition)
    2) Si on modifie un des éléments de la récurrence, on ne récupère toujours pas cette modification dans la liste (ce qui est cohérent car comment récupérer une suppression ?!)
    3) Le seul moyen de savoir si un évènement (Appointment A) est actif un jour donné (DateTime D), c'est d'utiliser la fonction suivante qui renvoi un Appointment ou null s'il n'y a pas d'occurence : A.RecurrencePattern.GetOccurrence(D)

    Ma conclusion est que pour connaitre les évènements/rendez-vous un jour D, il faut tester TOUS les évènements récurrents via la fonction GetOccurence(D) pour être sûr que l'évènement donné n'a pas été déplacé.

    Exemple extrème: un évènement définit le 1er lundi de l'année 2000 et dont la récurrence annuelle est le 1er lundi de chaque année va devoir être testé via GetOccurence() lorsqu'on voudra analyser n'importe lequel des 364 autres jours de l'année ! 
    Ainsi si on veut afficher les évènements d'un mois il va falloir utiliser la fct 30 fois!

    On pourrait "optimiser" en testant d'abord le jour ou l'occurrence doit avoir lieu, et si elle y est, ne pas tester les autres jours ! Mais dans le cas où l'évènement a été déplacé (dont GetOccurrence(jour prévu) renvoi null), on ne coupe pas au 30 tests.

    Et même chose pour les évènements mensuels...

    Cela ne me poserait pas plus de problème si la fonction en question n'était pas si LENTE.
    Et lorsqu'on a 10 anniversaires et 3 évènements récurrents actifs, afficher l'état du mlois devient TRES TRES PENIBLE.

    Donc voici ma QUESTION:

    Quelle est la méthode à suivre pour accélérer la recherche? L'agenda de Microsoft renvoi les données instantannément, les logiciels dans le commerce semblent ne pas avoir de problème... j'ai surement raté quelque chose, à moins que ce soit C# qui ait un problème ?

    1) Existe-t-il une fonction qui renvoi une liste des occurences pour un intervalle donné? (qu'on appelerait donc une fois au lieu de 30)
    2) Y-a-t-il un algorithme simple qui permet de ne pas tout tester et que je suis trop bête pour trouver tout seul?
    3) Faut-il utiliser des fonctions rapides à importer de la dll PocketOutlook (et si oui laquelle/lesquelles ?)

    Si quelqu'un a une solution, merci d'avance !
    Et merci à tous ceux qui auront lu ce message jusqu'au bout !

    mardi 5 janvier 2010 22:04

Réponses

  • Bonjour,

    La règle générale pour obtenir une occurrence est :


    Item recurringItem = NameSpace.GetItemFromId(entryId,storeId);
     RecurrencePattern pattern = recurringItem.GetRecurrencePattern();
     Item occurrence = pattern.GetOccurrence(date);


    J’ai trouvé une discussion sur ce sujet. Quoique les problèmes abordés couvrent plusieurs aspects, peut-être les fragments de code vous seront utiles.

    Si vous avez encore des problèmes, tenez-moi au courant. Je n’arrive pas, pour le moment, de trouver des problemes similaires raportees, concernant la vitesse de cette fonction, mais si vous ne trouvez pas une solution à partir de ces discussions, je vais essayer d’investiguer en plus grand détail.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mardi 12 janvier 2010 07:50
    vendredi 8 janvier 2010 14:47

Toutes les réponses

  • Bonjour,

    La règle générale pour obtenir une occurrence est :


    Item recurringItem = NameSpace.GetItemFromId(entryId,storeId);
     RecurrencePattern pattern = recurringItem.GetRecurrencePattern();
     Item occurrence = pattern.GetOccurrence(date);


    J’ai trouvé une discussion sur ce sujet. Quoique les problèmes abordés couvrent plusieurs aspects, peut-être les fragments de code vous seront utiles.

    Si vous avez encore des problèmes, tenez-moi au courant. Je n’arrive pas, pour le moment, de trouver des problemes similaires raportees, concernant la vitesse de cette fonction, mais si vous ne trouvez pas une solution à partir de ces discussions, je vais essayer d’investiguer en plus grand détail.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mardi 12 janvier 2010 07:50
    vendredi 8 janvier 2010 14:47
  • Merci d'avoir pris la peine de me lire et de répondre

    Votre réponse ne fait malheureusement que confirmer ce que je sais déjà, à savoir qu'il faut vérifier jour par jour la présence d'une occurrence via "GetOccurrence()"

    Quand à la lenteur de la fonction,sous Windows Mobile, elle est ahurrissante (tout simplement parceque les machines ne sont pas des ordinateurs)... mais ce n'est pas vraiment la lenteur de la fonction en elle même, mais plutot la méthode proposée par C# pour vérifier les occurrences

    Je mm'explique:

    Imaginez que je veuille afficher l'etat d'occupation d'un mois de 30 jours, de manière très simple: le chiffre en rouge s'il y a un rendez-vous, en bleu s'il n'y en a pas.
    Supposons qu'il y a dans la memoire du pocket PC 10 rdv, donc 5 dans le mois.
    Au total on va faire 10 tests, et on va avoir 5 jours en rouges

    Si maintenant parmis les 10 rdv, il y en a 5 dans le mois et 5 anniversaires (qui ne tombent pas ce mois)
    il va y avoir 5 tests (non recurrent) +5*30 tests (recurrents) = 155 tests  ... à comparer aux 10 precedemment cités !!

    Et en plus on ne rajoute pas 150 comparaisons de date, mais 150 appels de fonctions !

    En gros sur ma machine, sans recurrence, j'analyse les rendez-vous d'une semaine en un clin d'oeuil, alors que s'il y a disons une dizaine de recurrences, il va falloir 2 secondes.

    Et comme les autres PIM du commerces que l'on peut en général tester gratuitement 1 mois n'ont pas cette lenteur... 

    Il doit exister une solution... je la cherche toujours, mais je commence a desesperer !
    mardi 12 janvier 2010 14:41
  • Bonjour,

    J’ai bien compris votre scenario, mais je pense qu’il s’agit plutôt d’une limitation du système. Du point de vue strictement logique, car je ne parle maintenant de l’implémentation, peut-être il sera mieux de sacrifier la mémoire pour gagner de la rapidité. Quelque-chose comme un tableau qui contient déjà les occurrences pour une certaine période. La génération du tableau ne se fait qu’une fois pour une période donnée  et puis vous aurez toutes les informations déjà trouvées.

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse jpspock mardi 12 janvier 2010 17:10
    • Non marqué comme réponse jpspock jeudi 15 avril 2010 08:55
    mardi 12 janvier 2010 15:48
  • Merci pour votre réponse,
    Pour le cache, c'est déjà ce que je fais partiellement, mais je continue à douter qu'il n'y ait pas d'autre solution.
    En tout cas c'est dommage !!
    Merci pour votre participation à ce sujet

    mardi 12 janvier 2010 17:10
  • Désolé de ne pas avoir une solution plus facile. Si vous en trouvez, je vous prie de la partager ici, peut-être il y en a d’autres qui sont intéressés.

    Merci,

    Alex


    Alex Petrescu - MSFT
    mercredi 13 janvier 2010 13:04
  • Bonjour, et désolé de revenir sur cette vieille question.

    En fait, je n'ais pas trouvé d'astuce pour résoudre mon problème, donc j'ai créé un logiciel (freeware) qui est lent dès qu'il y a des occurrences

    Je me permet de revenir sur le problème car il y a pire que ce que j'ai décrit precedemment:

    Imaginons un évènement récurrent annuel le 31 décembre 2009

    Imaginons que je modifie l'instance du 31 décembre 2010 et que j'en fasse un évènement du 1/1/2010 au 30/12/2010 (je sais, c'est tiré par les cheuveux, mais c'est pour que ce soit bien parlant)

    Si app = evènement recurrent,

    alors app.RecurrencePattern.GetOccurrence(1/1/2010) va bien renvoyer un pointeur sur l'évènement modifié

    mais app.RecurrencePattern.GetOccurrence(2/1/2010), RecurrencePattern.GetOccurrence(3/1/2010) ...RecurrencePattern.GetOccurrence(30/12/2010) vont renvoyernull

    Car sur un évènement portant sur plusieurs jours, GetOccurrence ne renvoi un évènement que si on lui passe la date du début de l'occurrence

    Donc cela signifie que si je tombes sur un évènement annuel, pour être sur que celui-ci n'est pas actif le jour j, je dois verifier entre 1 et 364 occurences ? (on s'arrête si on trouve l'occurrence)

    Je suis certain vu les temps de réponse que les agenda du commerce ne font pas ca (sans parler d'outlook mobile lui même), et j'ai testé des versions de demo qui marchent parfaitement. Les entreprises peuvent-elle acheter auprès de Microsoft des bibliothèques plus évoluées? Y a-t-il un autre langage .NET qui ait des fonctionnalités avancées ?

    Je suis un peu amer sur le coup, car ca ne sert à rien de faire semblant de fournir des outils pour attaquer Outlook Mobile si ceux-ci sont si peu performants

    En espérant que quelqu'un ait une réponse...

    jeudi 15 avril 2010 08:55