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

WinDev Discussion :

Onglet dynamique procédure


Sujet :

WinDev

  1. #1
    Membre du Club
    Onglet dynamique procédure
    Bonjour,

    Dans mon application à base d'onglets dynamique j'ai un souci dans une de mes procédure.
    J'ouvre ma FI_ListeProduits avec une table alimenté par une requête.Quand je veux saisir un nouvel enregistrement je clique sur mon bouton nouveau qui m'ouvre ma FI_NouveauProduit.Une fois tout les champs remplis j'enregistre et tout est bon car mes 2 onglets dynamiques sont ouverts et ma table FI_ListeProduits se rafraîchie bien.
    Mais si ma FI_ListeProduits n'est pas ouverte j'ai une erreur par rapport à ma procédure de rafraîchissement.
    J'ai cherché sur le forum et dans l'aide mais je n'arrive pas à voir mon erreur je loupe quelque chose mais où je bug....

    Bouton Valider :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    // Ajoute / modifie l'enregistrement
    Enregistrer()
    OngletFerme()


    Mon code d'enregistrement :
    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
    18
    19
    20
    21
    22
    23
    // On récupère les informations à l'écran
    EcranVersFichier()
    
    // Ajoute ou modifie l'enregistrement
    SI nNumProduit = 0 ALORS
    	HAjoute(FProduits)
    SINON
    	HModifie(FProduits)
    FIN
    
    nNumProduit = FProduits.IDFProduits
    BTN_Valider..Grisé = Vrai
    
    // Il faut mettre à jour le libellé de l'onglet
    oVolet est un Champ <- VoletDuChamp(MoiMême)
    oVolet..Libellé = ChaîneConstruit("Fiche produit de : %1",SAI_NomProduit)
    
    //	 On regarde si l'onglet produit n'est pas déjà ouvert
    SI gtaOnglet[nNumProduit]="" _OU_ ChampExiste(gtaOnglet[nNumProduit])=Faux ALORS
    	ExécuteTraitement(gtaOnglet[nNumProduit] + ".Rafraichir",trtProcédure,SAI_NomProduit)
    SINON
    	C'est là que je bug....
    FIN


    Ma procédure Rafraichir :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROCÉDURE Rafraichir(pNumProduit)
     
    FI_NouveauProduit..Libellé = "Fiche du produit : [%pNumProduit%]"
    TableAffiche(FI_ListeProduits.TABLE_REQ_SelectionProduit,taCourantEnreg)


    Merci pour votre aide en espérant avoir été assez clair.

  2. #2
    Membre chevronné
    Bonjour,
    Normalement ton champ onglet est lié à ta FI, soit "en dur" dans la définition du champ, soit via OngletOuvre.
    Le changement de libellé se fait alors de la manière suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    ONG_OngletDyn[ONG_OngletDyn]..Libellé=FI_ListeProduit.SAI_NomProduit

    Ou alors dans la mesure où l'onglet se réfère à un enregistrement
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    ONG_OngletDyn[ONG_OngletDyn]..Libellé=Produit.NomProduit

    En règle général, on n'accède pas directement à une FI en tant que fenètre, elle est toujours liée à un conteneur (CFI, Onglet dynamique, Champ table ...)
    Il y a peut être plus simple, mais ça tourne

  3. #3
    Membre du Club
    Bonjour,

    Merci correction faite pour le changement de nom de mon libellé d'onglet,

    mais comment ne pas exécuter ma procédure "rafraichir" si ma fenêtre interne FI_ListeProduits n'est pas ouverte quand je valide mon nouvel enregistrement.

    Merci de votre aide.

  4. #4
    Membre chevronné
    Le fait d'ouvrir l'onglet ouvre la fenêtre dans l'onglet.
    En fait, je crois deviner que tu as créé une FI de type fiche pour le nouveau produit qui s'affiche dans un onglet dynamique, et une FI de type table pour une liste de produit qui s'affiche quelque part.
    2 solutions sont possibles :
    Soit mettre le champ table dans ta FI nouveau produit, soit le mettre dans le premier onglet qui est obligatoirement statique.
    Il suffira, à l'initialisation du champ de lui affecter un alias (e.g. "Récap") pour pouvoir y accéder plus facilement par programmation. Dans les premier cas, le rafraîchissement se fait via
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    TableAffiche(TABLE_REQ....)

    Dans le 2° via
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    TableAffiche(ONG_Dyn["Récap"].TABLE_REQ....)

    Sans oublier avant le TableAffiche :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    REQ_.... .pParam=MonParam
    HExecuteRequête(REQ_....)
    Il y a peut être plus simple, mais ça tourne

  5. #5
    Membre du Club
    Bonjour,

    J'ai bien compris que mon traitement comme il est actuellement ne fonctionne que si ma fenêtre contenant ma table est en dur.

    Mais je n'arrive pas à transcrire en programmation le fait de dire ma fenêtre contenant ma table n'est pas ouverte, ne pas exécuter ma procédure ".Rafraichir", ma fenêtre contenant
    ma table est ouverte donc exécuter ma procédure ".Rafraichir".

    J'ai essayé avec "SI", "SELON" soit cela ne fonctionnera jamais, soit je me trompe totalement et je dois tout repenser je sais plus.

    Merci de votre aide.

  6. #6
    Membre chevronné
    Dans quel conteneur se trouve ta FI table ? (FI_ListeProduit).
    Pourrait-on avoir une copie écran de la fenêtre qui contient les FI, ce sera plus simple. Pour la FI_Produit, j'ai compris, pour la FI table je ne comprend pas d'où mon "Quelque part"
    Il y a peut être plus simple, mais ça tourne

  7. #7
    Membre du Club
    Voila les copies d'écran. Merci de prendre le temps de te pencher sur mon problème.
    Seul mon onglet dasboard est fixe à l'ouverture de l'application les autres onglets sont mes FI qui peuvent être de façon indépendante.




    Merci de votre aide.

  8. #8
    Membre chevronné
    J'y vois un peu plus clair.
    L'utilisateur affiche la liste des produit dans un volet dynamique alimenté par FI_ListeProduit.
    A partir de cet onglet, il peut Ajouter ou modifier un produit, via le bouton adéquat dans un volet dynamique alimenté par FI_Produit. A l'issue, la table doit être à jour.

    C'est jouable, il suffit passer le nom de la table en paramètre à FI_Produit et d'utiliser une indirection

    Initialisation de FI_Produit :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    PROCÉDURE FI_Produit(gsNomTable est chaîne,gn8PKProduit est entier sur 8=0)


    Ouverture de l'onglet Produit en ajout:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    OngletOuvre(FEN_Gestion_des_produits.ONG_Produit,"Produit",FI_Produit,TABLE_Produit..NomComplet)


    Ouverture du volet Produit en modification:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    OngletOuvre(FEN_Gestion_des_produits.ONG_Produit,"Produit",FI_Produit,TABLE_Produit..NomComplet,ProduitAModifier)


    Rafraîchissement :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    TableAffiche({gsNomTable,indChamp})


    Rappel Affichage du produit :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    FEN_Gestion_des_produits.ONG_Produit[FEN_Gestion_des_produits.ONG_Produit]..Libellé=Produit.NomProduit


    Attention, affin que tout les onglets "Liste" soient à jour, il faut s'assurer que "Contexte HFSQL Indépendant" soit décoché dans FI_Liste. Sinon, seul le volet appelant risque d'être mis à jour. A l'inverse, il est préférable de cocher cette case au niveau de FI_Produit.
    Il y a peut être plus simple, mais ça tourne

  9. #9
    Membre du Club
    Bonjour,

    Je m'excuse de répondre tardivement un oubli.

    Merci pour la solution.

  10. #10
    Membre chevronné
    Etant donné les circonstances, c'est compréhensible.
    Il y a peut être plus simple, mais ça tourne

###raw>template_hook.ano_emploi###