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

WinDev Discussion :

Problème avec l'indirection [WD17]


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Problème avec l'indirection
    Bonjour,

    Je bloque sur ce qui pour moi est une bizarrerie... voici (je schématise) le problème. J'ai une fenêtre comportant un bouton d'enregistrement. Un champ de cette fenêtre appelle une procédure globale qui doit exécuter le code clic du bouton de la fenêtre (mais non ce n'est pas tordu, je schématise).

    Appel de la procédure proced1 avec, en passage de paramètre, le nom du bouton avec sa provenance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proced1(MaFenêtre..Nom+".BTN_enregistrer")
    Code de la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE proced1(sBtnEnregistrer)
    ...
    ExécuteTraitement({sBtnEnregistrer,indChamp},trtClic)
    À l'exécution, la variable sBtnEnregistrer est correctement renseignée, par exemple FEN_fenetre1.BTN_enregistrer mais je récupère le message d'erreur :
    Vous avez appelé la fonction ExécuteTraitement.
    Le champ Enregistrer est inconnu

    Si quelqu'un a une idée...

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    C'est effectivement très bizarre...

    J'ai tout de même une question : ne peux tu pas t'en passer ?

    Dans le code que tu mets, tu fais un traitement et tu exécute le code du bouton enregistrer de ta fenêtre. Dans le code de ton bouton (et des autres codes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proced1() // les ... du codes que tu as posté
    ... // traitements actuels qui correspondent à ceux que tu fais lors de l'appel du exécuteTraitement
    proced2() // si besoin d'un autre traitement post-traitement enregistrement
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Citation Envoyé par golmon75 Voir le message
    A l'exécution, la variable sBtnEnregistrer est correctement renseignée, par exemple FEN_fenetre1.BTN_enregistrer mais je récupère le message d'erreur :
    Vous avez appelé la fonction ExécuteTraitement.
    Le champ Enregistrer est inconnu
    Bonjour,

    Avant d'aller plus loin, la remarque de frenchting semble tout à fait indiquée : pourquoi ne pas appeler directement la procédure dans le code du bouton ?

    Mais pour essayer de comprendre :
    - Le champ "Enregistrer" est inconnu < == > le nom du champ est "BTN_enregistrer". Erreur due à votre rapport simplifié, ou erreur réelle ?
    - vous pouvez essayer sans préciser la constante indChamp, qui n'est pas indispensable et n'est là que pour accélérer le traitement.

    Hemgé

  4. #4
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Février 2007
    Messages : 615
    Points : 841
    Points
    841
    Par défaut
    Bonjour
    La fenêtre "FEN_fenetre1" est elle toujours active ?

    Bon dev
    Gancau

  5. #5
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 202
    Points : 9 190
    Points
    9 190
    Par défaut
    Je viens d'expérimenter (à mes dépends) ce problème sous WD18. J'ai réussi à le contourner facilement dans mon cas (récupération du nom du champ)...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Sur internet, tout est vrai ! Honoré de Balzac
    Make it real not fantasy... Herman Rarebell

  6. #6
    Membre à l'essai
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par frenchsting Voir le message
    C'est effectivement très bizarre...

    J'ai tout de même une question : ne peux tu pas t'en passer ?

    Dans le code que tu mets, tu fais un traitement et tu exécute le code du bouton enregistrer de ta fenêtre. Dans le code de ton bouton (et des autres codes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proced1() // les ... du codes que tu as posté
    ... // traitements actuels qui correspondent à ceux que tu fais lors de l'appel du exécuteTraitement
    proced2() // si besoin d'un autre traitement post-traitement enregistrement

    Merci FrenchSting,

    J'ai prévenu qu'il s'agissait d'un extrait de code, je ne suis pas tordu à ce point... enfin je ne crois pas. Voici l'analyse : un formulaire FEN_fenetre1 avec un bouton d'enregistrement et un bouton de fermeture. Ce dernier vérifie si un champ n'a pas été modifié avant de fermer. Si c'est le cas, une fenêtre de dialogue propose d'enregistrer, de reprendre ou d'abandonner. Evidemment il y a une trentaine de fenêtres, d'où l'intérêt de la procédure globale.

    Bien sûr je peux m'en passer, ou alors supprimer l'enregistrement au niveau de la boîte de dialogue, mais c'est dommage...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Hemgé Voir le message
    Bonjour,

    Avant d'aller plus loin, la remarque de frenchting semble tout à fait indiquée : pourquoi ne pas appeler directement la procédure dans le code du bouton ?

    Mais pour essayer de comprendre :
    - Le champ "Enregistrer" est inconnu < == > le nom du champ est "BTN_enregistrer". Erreur due à votre rapport simplifié, ou erreur réelle ?
    - vous pouvez essayer sans préciser la constante indChamp, qui n'est pas indispensable et n'est là que pour accélérer le traitement.

    Hemgé

    Merci Hemgé,
    Pour la 1ère remarque j'ai expliqué (je me doutais qu'on me prendrait pour un fou
    Je rapporte l'erreur réelle, il n'y a pas de simplification.
    La suppression indChamp ne change rien.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par gancau Voir le message
    Bonjour
    La fenêtre "FEN_fenetre1" est elle toujours active ?

    Bon dev
    Gancau
    Merci Gancau,

    Oui cette fenêtre est toujours active...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour à tous,

    La solution est simple: ne pas utiliser d'indirection !

    Le nom du champ est suffisant pour la fonction ExécuteTraitement.
    http://doc.pcsoft.fr/fr-FR/?3013031

    Citation Envoyé par golmon75 Voir le message
    Je bloque sur ce qui pour moi est une bizarrerie... voici (je schématise) le problème. J'ai une fenêtre comportant un bouton d'enregistrement. Un champ de cette fenêtre appelle une procédure globale qui doit exécuter le code clic du bouton de la fenêtre (mais non ce n'est pas tordu, je schématise).

    Appel de la procédure proced1 avec, en passage de paramètre, le nom du bouton avec sa provenance :
    proced1(MaFenêtre..Nom+".BTN_enregistrer")

    Code de la procédure :
    PROCEDURE proced1(sBtnEnregistrer)
    ...
    ExécuteTraitement({sBtnEnregistrer,indChamp},trtClic)
    Appel de la procédure (conseil: utiliser la propriété NomComplet) :
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    proced1(BTN_enregistrer..NomComplet)

    Code de la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROCEDURE proced1(sBtnEnregistrer est une chaîne)
    ...
    ExécuteTraitement(sBtnEnregistrer,trtClic)

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Citation Envoyé par golmon75 Voir le message
    Je rapporte l'erreur réelle, il n'y a pas de simplification.
    A l'exécution, la variable sBtnEnregistrer est correctement renseignée, par exemple FEN_fenetre1.BTN_enregistrer mais je récupère le message d'erreur :
    Vous avez appelé la fonction ExécuteTraitement.
    Le champ Enregistrer est inconnu
    Alors, le problème dans votre code n'est pas imputable à l'indirection, puisque sa résolution vous donne la bonne fenêtre et le bon bouton.
    Selon l'erreur que vous ra^^ortez, votre code pointe vers un champ Enregistrer qui est inconnu et non pas vers FEN_fenetre1.BTN_enregistrer.
    Enregistrer n'est-il pas en dur dans votre code ou n'y a-t-il pas une variable intermédiaire dans la routine ?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Merci OnePoint

    J'ai n fenêtres avec n boutons je ne veux pas faire n procédures...
    J'ai essayé NomComplet par acquis de conscience, ça ne change rien puisque ma variable d'indirection est correctement renseignée.
    (j'essaie en répondant...)
    P... j'y crois pas ! contre toute attente et j'ai testé sans y croire, ExécuteTraitement(sBtnEnregistrer,trtClic) fonctionne !
    Un exemple du manque de rigueur de Windev ? mais on ne va pas se plaindre...

    Merci encore OnePoint, reconnaissance éternelle... je ne comprends pas pourquoi ça marche, mais on verra plus tard...


    Non Hemgé, tous mes champs sont préfixé et il n'y a pas de parasite.
    Je pense que OnePoint a apporté la solution. J'ai fait un test qui fonctionne correctement (voir ci-dessus, parce que cela peut intéresser tout le monde)

    Encore merci à tous d'avoir répondu si rapidement et de vous être mis en 4 pour m'aider.

    C'est beau la solidarité informatique.

  12. #12
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Bonjour
    Citation Envoyé par golmon75 Voir le message
    Un exemple du manque de rigueur de Windev ? mais on ne va pas se plaindre...
    Absolument pas, c'est un comportement normal
    En faisant une indirection on récupère le contenu (ou la valeur) de la variable représentée par la chaîne (pas très clair ça...)

    En faisant une indirection sur le nom d'un bouton, on récupère son contenu, pour un bouton c'est le libellé qui est retourné

    Le libellé de ton bouton est "Enregistrer" donc il cherche un bouton qui s'appelle "Enregistrer" et qui n'existe pas bien sur

    ExécuteTraitement attend le nom d'un champ, pas son contenu :-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Info({"BTN_enregistrer"}) // va afficher "Enregistrer"

  13. #13
    Membre à l'essai
    Homme Profil pro
    Analyste-développeur
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-développeur

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Merci hPascal, j'ai souvent utilisé l'indirection mais mon habitude de FoxPro m'a fait passer à côté de cette "particularité"

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

Discussions similaires

  1. [XL-2010] Problème avec INDIRECT
    Par Mrfreeze117 dans le forum Excel
    Réponses: 10
    Dernier message: 13/02/2015, 07h57
  2. Réponses: 2
    Dernier message: 23/02/2014, 16h30
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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