Jeu 09/05/2013 - Actualités

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

Jeu 09/05/2013 - Actualités

Message non lu par Xavier »

Import


L'import de données se fait en deux temps :
  • L'utilisateur sélectionne un fichier à importer. S'il s'agit d'un fichier XT3, il est chargé en mémoire et ses données sont converties au format XT4. S'il s'agit d'un fichier XT4, les données sont déjà hiérarchisées. Dans les deux cas, les données sont placées dans un arbre temporaire. Celui-ci est affiché à l'utilisateur qui peut alors choisir quel(s) dossier(s) importer.
  • Après sélection des dossiers à importer, ceux-ci sont recopiés de l'arbre temporaire vers l'arbre principal qui contient les données de l'utilisateur.
Avec l'Agenda sont apparus les dossiers techniques, qui sont des containers de données ne devant pas être affichés : ils servent à ranger séparément les évènements, les alarmes, les périodes etc...

La conversion d'un fichier Calendrier XT3 donne donc ce résultat :
ImportTechFolders.png
Pour le moment, il avait été décidé que la granularité des imports et exports serait le dossier (utilisateur). Selon cette logique, les dossiers techniques ne doivent pas être affichés. Il a été envisagé de ne les constituer que dans la seconde phase d'import, mais le problème se poserait de la même façon pour un fichier de données XT4.

L'autre option est donc de les dissimuler dans cette fenêtre comme ils le sont dans l'Agenda. C'est pour le moment la solution ciblée, mais elle sera revue plus tard. Dans un premier temps l'Import va être passé en TreeView comme envisagé ici. Selon la complexité d'implémentation, il est possible que la granularité soit affinée au niveaux des données elles-mêmes, ce qui annulerait alors le problème des dossiers techniques.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

Re: Jeu 09/05/2013 - Actualités

Message non lu par Denis »

Happy B... !!
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

Re: Jeu 09/05/2013 - Actualités

Message non lu par Denis »

Tiens, tu pourrais faire un statut de ce qu'il reste à finaliser avant la V4.0.0 ?
Car j'ai l'impression que la plupart des briques sont prêtes maintenant, non?
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Jeu 09/05/2013 - Actualités

Message non lu par Xavier »

Arbres


Le service récursif qui peuple un TreeView à partir de l'ancêtre d'un arbre de données à été modifié pour :
  • Afficher les dossiers techniques (icônes grises). Pas de libellé pour le moment, le code est affiché entre crochets.
  • Afficher ou non les données finales (icône de document) via un nouveau paramètre d'appel.
Ce service est utilisé par toutes les unités XT4 qui utilisent des TreeViews.
Afin d'éviter d'avoir à y ajouter le nouveau paramètre, un mini-service avec l'arité initiale à été ajouté, il appelle le service véritable avec le paramètre d'ajout des données en False :

Code : Tout sélectionner

//------------------------------------------------------------------------------
// XT400 / AddToTree
//------------------------------------------------------------------------------
function TData.AddToTree(Tree_View: TTreeView; Parent_Node: TTreeNode): TTreeNode;
begin
	Result := Self.AddToTree(Tree_View, Parent_Node, False);
end;

//------------------------------------------------------------------------------
function TData.AddToTree(Tree_View: TTreeView; Parent_Node: TTreeNode; Add_Data: Boolean): TTreeNode;
begin
...
Ce duo fonctionne bien. Il n'y a pas de régression dans les autres outils. L'ajout des données finale dans l'arbre est rapide.
Il reste à gérer les impacts des cases à cocher. Si cela se passe bien, la nouvelle granularité au niveau des données et non plus des dossiers sera validée pour au moins les Imports et les Exports.
MixedTree.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Re: Jeu 09/05/2013 - Actualités

Message non lu par Xavier »

DMo a écrit :Tiens, tu pourrais faire un statut de ce qu'il reste à finaliser avant la V4.0.0 ?
Car j'ai l'impression que la plupart des briques sont prêtes maintenant, non?
L'avancement est estimé à 75%, plus de détails ici.

Les 25% restants ne se feront pas plus vite malgré la réutilisation du code existant, car je passe pas mal de temps à factoriser et optimiser l'existant ou à réécrire des portions pour unifier le fonctionnement de tous les outils.

Je ne sais pas combien de temps il faudra pour les tests et la doc. J'espère livrer XT400 avant la fin de l'année.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Jeu 09/05/2013 - Actualités

Message non lu par Xavier »

Propagation


La propagation d'un état (coché / décoché) aux enfants fonctionne. Dans la version initiale, il n'y avait pas de hiérarchie dans la ListView, il fallait donc "passer" de celle-ci à l'arbre temporaire des données, et à partir de celui-ci, obtenir la récursivité et retourner cocher les éléments de la liste. Avec le TreeView, il suffit de traiter ses enfants, c'est simple et rapide.

Pour le moment il y a 3 types d'actions possibles:
  • Dé/sélection de l'objet sélectionné, action par défaut via la touche [Espace].
  • Dé/sélection de l'objet sélectionné et de ses enfants, action via menu ou bouton.
  • Dé/sélection de tous les objets de l'arbre, action via menu ou bouton.
Propagation.png
Le système va être simplifié pour proposer cela :
  • Dé/sélection de l'objet sélectionné et de ses enfants, action par défaut via la touche [Espace].
  • Dé/sélection de l'objet sélectionné sans ses enfants, action via menu ou bouton.
La seconde commande sera à priori moins utilisée. La dé/sélection de tous les objets de l'arbre restera possible car le passage en TreeView a imposé l'affichage d'une racine unique Données, il suffit de la cocher pour avoir une propagation sur la totalité des données.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Jeu 09/05/2013 - Actualités

Message non lu par Xavier »

Imports


Le code qui importe les données sélectionnées par l'utilisateur doit être réécrit.
Pour le moment il bouclait sur l'arbre des données temporaires, vérifiait dans la ListView si le dossier ou un de ses descendants était coché, et si oui, copiait le dossier dans l'arbre des données principales.
Le passage de la ListView au TreeView oblige d'utiliser l'approche inverse : boucler sur les objets du TreeView qui sont cochés ou ont une descendance cochée, récupérer la donnée de l'arbre temporaire et la copier dans l'arbre principal.


La logique d'import va également être revue. Le principe actuel est le suivant :
  • Recherche de la donnée à importer dans l'arbre cible. Pour le moment la recherche se fait sur le libellé de la donnée.
  • Si une donnée avec le même libellé est trouvée dans l'arbre cible dans le même dossier, les deux données sont comparées plus finement, via chaque ligne de texte.
  • Si les deux données sont identiques, la donnée à importer est ignorée.
  • Si les deux données sont différentes, la gestion des conflits démarre, et selon le choix de l'utilisateur, la donnée à importer est soit ignorée, soit ajoutée en plus de la donnée existante, soit la remplace.
Ce mode de recherche par le libellé devra être conservé, car les données XT3 n'ont pas d'ID.

Mais la comparaison ne sera pas fiable avec les données XT4 car les propriétés ne sont pas comparées. Ce test pourrait être rajouté, mais la procédure serait au final trop complexe.

Il est donc envisagé de faire une recherche par ID lors des imports de données XT4. Cela imposera de générer un ID pour chaque objet créé. Pour le moment seuls les objets liés en ont un, par exemple les évènements et leurs alarme.

La recherche par ID aura au moins la conséquence suivante : une même donnée créée dans deux environnements différents (par exemple un Contact) sera importée comme nouvel objet car les deux auront un ID différent.
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

Re: Jeu 09/05/2013 - Actualités

Message non lu par Denis »

XMo a écrit : Afin d'éviter d'avoir à y ajouter le nouveau paramètre, un mini-service avec l'arité initiale à été ajouté, il appelle le service véritable avec le paramètre d'ajout des données en False :
Sinon essaie les valeur par défaut sur tes paramètres. J'ai découvert ca en Php, et c'est super rpatique ! Je viens de vérifier, ca existe aussi en Pascal / Delphi:
http://delphi.about.com/od/objectpascal ... oading.htm (deuxième partie de l'article, mais les "overload" peuvent aussi te servir)

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

Re: Jeu 09/05/2013 - Actualités

Message non lu par Xavier »

DMo a écrit :Sinon essaie les valeur par défaut sur tes paramètres. J'ai découvert ca en Php, et c'est super rpatique ! Je viens de vérifier, ca existe aussi en Pascal / Delphi:
http://delphi.about.com/od/objectpascal ... oading.htm (deuxième partie de l'article, mais les "overload" peuvent aussi te servir)

@+
Pas mal du tout, merci.
Et mon vieux D5 a accepté sans broncher. :)

Il va falloir que je retravaille l'ordre des paramètres de mon "obj.find" qui est en overload multiple...

Code : Tout sélectionner

//------------------------------------------------------------------------------
// XT400 / Find
// Field_Name = 'Ident' / 'Model / 'Caption' / <PropertyName>
//------------------------------------------------------------------------------
function TData.Find(Ident_Value: String): TData;
begin
	Result := Self.Find('Ident', Ident_Value, False);
end;

//------------------------------------------------------------------------------
function TData.Find(Ident_Value: String; Sub: Boolean): TData;
begin
	Result := Self.Find('Ident', Ident_Value, Sub);
end;

//------------------------------------------------------------------------------
function TData.Find(Field_Name, Field_Value: String): TData;
begin
	Result := Self.Find(Field_Name, Field_Value, False);
end;

//------------------------------------------------------------------------------
function TData.Find(Field_Name, Field_Value: String; Sub: Boolean): TData;
begin
...
Denis
Messages : 180
Enregistré le : jeu. 23 juin 2011 09:21

Re: Jeu 09/05/2013 - Actualités

Message non lu par Denis »

Content d'avoir pu aider ( surtout en Delphi, que j'ai tant aimé...)
Répondre