Sam 11/08/2012 - Actualités

Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Sam 11/08/2012 - Actualités

Message non lu par Xavier »

WeekNumber


Les évènements seront donc stockés dans des sous-dossiers invisibles apellés "Index" car ils serviront à réduire le périmètre des recherches. Le nom de ces dossiers sera le numéro de la semaine. Il faut donc un nouveau service qui renvoit l'année et le numéro de semaine.

Le calcul de ce numéro est délicat car il est différemment selon les pays ou les organisations.
XT2 considérait que la semaine n°1 était celle qui contenait le 01/01.
XT3 appliquait la norme ISO 8601 qui définit la semaine n°1 comme celle qui contient au moins 4 jours (donc elle contient toujours le premier jeudi de l'année).

L'algorithme utilisé dans XT3 était en fait celui d'XT2 avec des corrections :

Code : Tout sélectionner

	// Détermination du lundi de la semaine de la date
	Input_Monday := Input_Date - XSD_GetWeekdayNumber(Input_Date) + 1;

	// Détermination du lundi de la semaine contenant le 01/01
	Jan01_Date := XSD_GetLimit(Input_Date, 'First', 'Year');
	Jan01_Monday := Jan01_Date - XSD_GetWeekdayNumber(Jan01_Date) + 1;

	// Calcul du nombre de jours puis de semaines entre les deux lundis
	Number := Trunc(Input_Monday) - Trunc(Jan01_Monday);
	Number := Number div 7;

	// Correction si le 01/01 est avant un jeudi
	if	XSD_GetWeekdayNumber(Jan01_Date) < 4
	then	Inc(Number);

	// Correction si le nombre est nul : appel récursif une semaine avant
	if	Number = 0
	then	Number := XSD_GetWeekNumber(Input_Date - 7) + 1;
Il n'empêche qu'il donnait des résultats faux sur la semaine pivot, renvoyant 52 ou 53 au lieu de 1, et devait donc toujours être appelé sur le dimanche suivant la date. :?


Un nouveau service basé sur cet algorithme va donc être implémenté. Il travaille directement avec les jeudis donc n'a pas besoin de corrections.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Sam 11/08/2012 - Actualités

Message non lu par Xavier »

WeekNumber


Version Wikipédia légérement améliorée car utilisant le premier jeudi au lieu du premier lundi + 3 jours :

Code : Tout sélectionner

	// Détermination du jeudi de la semaine de la date
	Input_Thursday := Input_Date - XSD_GetWeekdayNumber(Input_Date) + 4;

	// Détermination du premier jeudi de l'année (jeudi de la semaine du 04/01)
	DecodeDate(Input_Thursday, Year, Month, Day);
	Jan04_Date := EncodeDate(Year, 01, 04);
	First_Thursday := Jan04_Date - XSD_GetWeekDayNumber(Jan04_Date) + 4;

	// Calcul du nombre de jours entre les deux jeudis
	Days_Count := Trunc(Input_Thursday) - Trunc(First_Thursday);

	// Calcul du numéro de semaine (Base 1)
	Result := 1 + (Days_Count div 7);
Il ne reste plus qu'à en faire une version retournant l'année en plus.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Sam 11/08/2012 - Actualités

Message non lu par Xavier »

Modèles de donnée


L'implémentation des sous-dossiers techniques de l'Agenda repose sur un ensemble de services qui :
  • Analysent la donnée (tâche, période, évènement unique ou récurrent).
  • Cherchent le sous-dossier technique correspondant.
  • Le créent s'il n'existe pas.
La phase d'analyse de la donnée se fait actuellement sur l'existence ou non de certaines propriétés, ce qui n'est vraiment pas satisfaisant, car ce sera une source de rework lors de futures évolutions. Une meilleure distinction se fera sur le modèle de la donnée, et la limitation d'un seul type de donnée par outil va donc devoir être enlevée.


Par ailleurs, l'idée d'ajouter une propriété <Hidden=True> aux sous-dossiers techniques a été abandonnée. Quand il sera implémenté, le cryptage englobera les propriétés, donc il a paru risqué de choisir cette solution. Les sous-dossiers techniques sont donc de type Filter (et non Group), puis de type Index pour les évènements uniques. Le service qui construit les arbres de TreeView a été adapté en conséquence :
  • Modèle Folder : icône jaune, dossier modifiable.
  • Modèles Group, Root et Tool : icônes oranges, dossiers non modifiables.
Les sous-dossiers techniques ont maintenant un modèle Filter et Index et sont donc ignorés par la routine d'affichage.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Sam 11/08/2012 - Actualités

Message non lu par Xavier »

Dossiers techniques


Le stockage dans les sous-dossiers techniques est opérationel.

Afin d'éviter les conversions inutiles, l'identifiant des indexes est un nombre du style "201232" plutôt qu'une chaine au format ISO "2012-W32". Ce "code semaine" étant stocké sur les cellules des semaines sous ce même format numérique, l'accès aux dossiers d'index sera plus rapide.

L'ensemble des services préparés depuis ce matin a été tellement factorisé qu'il a été réduit à un seul service. Il est situé au niveau de l'unité afin qu'il puisse être utilisé par le moteur sans que l'Agenda soit ouvert. Ce service unique analyse la donnée, son emplacement et la déplace dans le sous-dossier technique (Filtre ou Index) approprié. Des sous-routines permettent de créér ces sous-dossiers s'ils n'existent pas encore.

Ce service est pour le moment appelé à la sortie du paneau d'édition, il se comporte de la même manière lors d'une création ou modification de donnée.

Lors de transformation d'objet, il suffira alors de modifier le type de la donnée (par exemple "Task" -> "Event") et d'apeller le service qui s'ocuppera de toute la gestion de bas niveau. :)

Le modèle est donc comme cela, les (i) représentant les sous-dossiers techniques invisibles :

Code : Tout sélectionner

[+] Agenda
    [+] Perso
    [+] Pro
        [+] Projet A
            (i) Tasks
                o Task
                o Task
            (i) Periods
                o Period
                o Period
            (i) Events
                o Recurrent Event
                o Recurrent Event
               (i) 201223
                   o Unique Event 
                   o Unique Event 
               (i) 201224
                   o Unique Event 
Répondre