IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut Comment concerver l'état enroulées/déroulées précédent à un raffraichissement d'une table hiérarchique
    Bonjour,

    J'utilise une table hiérarchique sur fichier avec des fichiers en liaisons
    Famille --> Sous_Famille --> Produit

    Habituellement pour ce genre de chose je remplissais la table hiérarchique par programmation en ajoutant arbitrairement une ligne racine à toute l’arborescence
    Par exemple dans ce cas j'aurai pu ajouter à la racine une ligne "Catalogue"
    Ainsi quand on clique sur le bouton ajouter suivant sur quelle ligne on est on sait quelle feuille ajouter
    Sur "Catalogue" --> on ajoute uns Famille
    Sur Famille --> on ajoute une Sous_Famille
    Sur Sous_Famille --> on ajoute un Produit

    Avec les tables hiérarchique sur fichiers je n'ai pas vu la possibilité d'ajouter une ligne racine.
    Du coup quand on sélectionne une Famille je ne peux pas faire de distinction entre l'ajout d'une Famille ou d'une Sous_Famille

    Pour contourner le problème j'ai fait un bouton ajouter avec flèche qui ouvre un menu contextuel qui permet de sélectionner ce qu'on veut ajouter Famille, Sous_Famille ou produit et d'ouvrir le bon formulaire

    Pour les modifications c'est plus simple. J'ai ajouté 3 colonnes non visible liées aux index des 3 fichier.
    Quand on clique sur le bouton modifier il suffit de savoir dans quelle colonne il y a un index > 0 pour savoir quel formulaire ouvrir.

    Tout marche bien... ou presque...
    Le problème c'est qu'après validation d'un formulaire pour un ajout ou une modification, je rafraîchis la table hiérarchique pour qu'elle s'actualise, la table enroule tout et sélectionne la première ligne
    J'aimerai que la table ne change rien aux enroulés/déroulés

    Je me suis dit qu'il faudrait que j'enregistre dans un tableau les états enroulés/déroulés des lignes avant l'ajout/modification puis utilisé le tableau pour rétablir les états enroulés/déroulés précédents
    Dans l'aide j'ai trouvé la fonction TableEtatElément() qui est sensé renvoyer l'état d'un nœud d'un champ Table hiérarchique : enroulé, déroulé ou inexistant
    J'ai trouvé par ailleurs les valeurs qui peuvent être renvoyées
    -1 taErreur : Trace("Le noeud n'existe pas.")
    1 taDéroule : Trace("Le noeud est déroulé.")
    2 taEnroule : Trace("Le noeud est enroulé.")

    Pour tester j'ai ajouter un bouton avec le code en dessous pour afficher dans un libellé la valeur retournée par un TableEtatElément() sur la ligne sélectionnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nNoLigneSelect 		est un entier = TableSelect(TABLEH_P2_Fam_SousFam_Prod)
    nEtat_EnrouléDéroulé 	est un entier = TableEtatElément(TABLEH_P2_Fam_SousFam_Prod, nNoLigneSelect)
    LIB_SansNom1 = nEtat_EnrouléDéroulé
    Que les lignes sélectionnées soient enroulées ou déroulées TableEtatElément() renvoi toujours la même valeur 1 donc je ne sais pas faire la distinction

    Merci d'avance de votre aide, même de simple pistes de réflexion
    Peut-être qu'il y a plus simple mais pour le moment je n'ai pas mis le doigt dessus

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2023
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2023
    Messages : 93
    Par défaut
    Bonjour,
    Je n'ai pas essayé avec une Table Hiérarchique Fichier, donc je ne sais pas si la réponse va correspondre (je suis sur une table H par programmation).

    si je fais simplement ceci, ça me renvoie bien 1 pour déroulé, et 2 pour Enroulé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nRésultat est un entier = TableEtatElément(TABLEH_Archive)
    ToastAffiche(nRésultat)
    éventuellement, le chemin avec les TAB donnerait il le bon résultat (essayez en dur) ?
    TableEtatElément(TABLEH_Archive, "Racine" + TAB + "Noeud" + TAB + "Feuille")

    Edit: la table Fichier doit être en cause car je viens de faire l'essai avec votre code et ça fonctionne sur une Table H par programmation.

    Edit 2 : Je viens de refaire un essai après avoir ouvert un ancien projet avec Table H sur fichier (mais avec liaison Réflexive, donc tous les niveaux dans un seul fichier HFSQL), et le parcours fonctionne également sans souci (Trace me renvoie bien les 1 ou 2).

    Cdlt

  3. #3
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut
    Bonjour,

    Merci DevOcc pour la réponse.

    J'ai fait pas mal de recherches sur le net mais je n'ai pas trouvé de solution
    J'ai juste trouvé ce post où d'autres on le même problème... 4 posts de 2013 à 2019 sans solution...
    https://forum.pcsoft.fr/fr-FR/pcsoft...hique/read.awp

    Pour répondre au post de DevOcc
    Dans l'évènement "Enroulé, déroulé d'un nœud de TABLEH_P2_Fam_SousFam_Prod" j'ai mis le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIB_SansNom1 = TableEtatElément(TABLEH_P2_Cat_Fam_SousFam_Marq_Prod,2)
    et sur clic d'un bouton le même code avec son résultat affiché dans un 2e champ libellé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIB_SansNom2 = TableEtatElément(TABLEH_P2_Cat_Fam_SousFam_Marq_Prod,2)
    Quand je clique pour enrouler/dérouler la ligne n°2 dans LIB_SansNom1 la bonne réponse s'affiche 1 ou 2 suivant le cas
    Quand juste après avoir enroulé/déroulé la ligne n°2 je clique sur le bouton, dans LIB_SansNom2 il y a toujours la même réponse 1 qui ne suis pas les changements d'état
    Même code mais pas la même réponse...

    J'avais dans l'idée de faire un tableau pour enregistrer les états enroulés/déroulés des lignes avant traitement pour les rétablir après.
    Mais vu que TableEtatElément() ne retourne pas la bonne réponse quand il est utilisé en dehors de l'évènement "Enroulé, déroulé d'un nœud..." ça ne me semble compliqué...

    Je continue de chercher...
    Toujours preneur de votre aide, même de simple piste de réflexion
    Mercie d'avance

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2023
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2023
    Messages : 93
    Par défaut
    Bonjour,
    En fait, je clique sur un bouton hors table, et le Trace des valeurs 1 ou 2 fonctionne.
    Il doit y avoir une différence de description de la table, l'indice de la ligne sélectionnée est-il bien renvoyé dans votre projet ?

    Du coup, j'ai fait un test avec l'exemple Windev : WD Lien Reflexif et ça fonctionne.
    Vous pourriez comparer avec votre projet.
    Cdlt

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 364
    Par défaut
    Bonjour,

    A mon avis, pour éviter de perdre l'enroulé/déroulé, il faut d'un côté enregistrer en base ton nouvel élément et de l'autre utiliser simplement les tableAjouteLigne(..), Insère etc pour ne jouer que sur l'affichage.

  6. #6
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut
    Merci pour vos réponses

    DevOcc
    J'ai comparé le description de ma table avec celle du projet exemple "Lien Réflexif"
    Et bonne pioche
    Je ne sais pas pourquoi j'avais coché "Mémoriser la position et la sélection" et dès que je l'ai décoché ça immédiatement marché
    A noter que le code dans l'évènement "Enroulé, déroulé d'un nœud ..." donne l'état inverse
    Je pense qu'il renvoie l'état de la ligne avant l'action enroulé/déroulé du coup on a un état qui est à l'inverse de l'état après l'action

    Lo²
    Je n'avais pas pensé à utiliser TableAjouteLigne() et TableInsèreLigne() je faisait un TableAffiche() pour actualiser la table
    Dans la documentation ils disent qu'ils peuvent s'appliquer sur des table fichier donc ça devrait marcher
    La difficulté sera de déterminer l'indice de ligne pour le TableInsèreLigne() vu que je fait des ajouts en cliquant sur des options d'un menu contextuel d'un bouton flèche sans tenir compte de la position de la sélection dans la table

    D'ailleurs ça pose également problème si je rempli un tableau pour enregistrer les états enroulés/déroulés des lignes avant traitement pour les restituer après traitement
    L'utilisateur peu ajouter un enregistrement d'une branche qui n'était pas déroulée initialement et du coup la ligne de l'ajout ne sera pas visible... déconcertant pour l'utilisateur...

    Demain je n'aurai pas beaucoup de disponibilité, peut-être en fin d'après midi...
    Je testerai les 2 solutions à but d'apprentissage et je vous ferai un retour...

    Mais je pense que je vais contourner le problème et utiliser une autre solution beaucoup plus simple :
    après un rafraîchissement de la table avec un TableAffiche(), je fait un TableDérouleTout() et je position la sélection sur l'enregistrement ajouter/modifier
    C'est simple, c'est franc et je suis sûr que l'utilisateur se retrouve sur la ligne sur laquelle il vient de faire une action

    Encore merci pour vos réponses qui m'aide dans ma réflexions
    Si vous avez d'autres idées ou pistes d'idées je reste preneur

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2023
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2023
    Messages : 93
    Par défaut
    L'évènement Enroulé/déroulé donne l'effet inverse : oui, c'est effectivement l'état avant l'action.
    Il y a la possibilité d'utiliser l'évènement "Bouton gauche relaché ...", mais il faut vérifier que ceci n'engendre pas d'autres problèmes dans votre appli car cet évènement est déclenché à chaque relaché.
    Sinon, il reste une possibilité du coté de l'interception de l'évènement Enroulé/déroulé.

    Cdlt

  8. #8
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut
    Bonjour,

    J'ai testé ma solution de contournement

    Pour un ajout (bouton avec flèche et menu contextuel) ici pour une Famille, à adapter pour une sous_famille ou un Produit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    nID_ajout est un entier sur 8 octets
    nNo_Ligne est un entier sur 8 octets
     
    HRAZ(Famille)
    Ouvre(FEN_Fiche_Famille, "Ajouter", 0) // paramètres : Action (Ajouter ou Modifier) et ID de l'enregistrement si action = modifier
     
    // ID de l'enregistrement suite à l'ajout
    nID_ajout = Famille.ID_Famille
     
    // Rafraichit la table et déroule tout
    TableAffiche(TABLEH_Fam_SousFam_Prod)
    TableDérouleTout(TABLEH_Fam_SousFam_Prod)
     
    // Sélection et positionne dans la table sur la ligne du nouvel enregistrement
    nNo_Ligne = TableCherche(TABLEH_Fam_SousFam_Prod.COL_ID_Famille, nID_ajout, rechercheIdentique)
    TableSelectPlus(TABLEH_Fam_SousFam_Prod,nNo_Ligne)
    TablePosition(TABLEH_Fam_SousFam_Prod,nNo_Ligne)
    Pour une modification, pareil à adapter suivant le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // ID de l'enregistrement à modifier pour le passer à la fenêtre du formulaire
    nID_Modifier	est un entier sur 8 octets	 = TABLEH_Fam_SousFam_Prod[TABLEH_Fam_SousFam_Prod].COL_ID_Famille
    // No de ligne a modifier
    nNo_Ligne	est un entier sur 8 octets	= TableSelect(TABLEH_Fam_SousFam_Prod)
     
    Ouvre(FEN_Fiche_Famille,"Modifier",nID_Modifier) // paramètres : Action (Ajouter ou Modifier) et ID de l'enregistrement si action = modifier
     
    // Rafraichit la table sans toucher aux état enroulé/déroulé
    TableAffiche(TABLEH_Fam_SousFam_Prod)
     
    // Sélection et positionne dans la table sur la ligne modifiée
    TableSelectPlus(TABLEH_Fam_SousFam_Prod,nNo_Ligne)
    TablePosition(TABLEH_Fam_SousFam_Prod,nNo_Ligne)
    Précision dans la table hiérachique j'ai ajouté 3 colonnes non visibles pour ID_Famille, ID_SousFamille et ID_Produit

    C'est très simple, ça fonctionne très bien, on n'est pas dérouté ça semble très logique à l'usage...

    Ça fonctionne tellement bien et tellement facilement que j'ai la flemme de m’embêter et me prendre la tête à essayer de faire fonctionner les 2 autre méthodes que j'avais évoqué...

    Je considère que c'est résolu... en contournant le problème...

    Merci de vos contributions

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/01/2014, 21h29
  2. Réponses: 12
    Dernier message: 28/12/2011, 20h27
  3. [AC-2007] Comment récupérer la valeur du dernier numéro auto inséré dans une table ?
    Par marot_r dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2010, 18h17
  4. Réponses: 1
    Dernier message: 23/11/2009, 10h47
  5. Réponses: 4
    Dernier message: 02/02/2007, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo