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 :

Passer un tableau en variable dynamique dans une fonction [WD18]


Sujet :

WinDev

  1. #1
    Nouveau membre du Club Avatar de Woote
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut Passer un tableau en variable dynamique dans une fonction
    Bonjour à vous !

    Mon intitulé n'est pas forcement clair, et mon explication sera surement un peu bancale..

    Je suis actuellement en train de reprendre du vieux code dans un logiciel de gestion et je me retrouve bloqué sur le cas suivant :

    J'appelle une fonction qui a pour but de remplir un tableau que je passe en paramètre, la petite spécificité c'est que ce tableau est global dans le projet et qu'il est passé en format chaîne.
    Pour comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     RV_bRechercheMouvement_ParArticle("Interface.gtaTabArticleMouvement")
    Mon tableau global est la chaîne : "Interface.gtaTabArticleMouvement" vous l'auriez deviné

    Dans la fonction appelée la chaîne est utilisé avec {"nomVariable",indVariable}
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    POUR TOUT ELEMENT pclArticleTmp, nIdArticle DE {sNomTabArticle,indVariable}
    	libérer pclArticleTmp
    END
    Il se trouve que j'ai besoin d'utiliser cette fonction mais cette fois je dois lui passer un tableau qui est initialisé dans le constructeur d'une classe, donc qui ne serait pas global (que ça soit dans le projet ou dans la class), et je n'ai pas le droit de modifier le code de la fonction que j'appelle..

    Est ce que, si j'ai réussi à être clair, vous connaîtriez une façon de faire pour passer mon tableau en cours dans cette fonction ?

    Un truc comme RV_bRechercheMouvement_ParArticle(MaFonctionEnCours:monTableau..Nom)

    Je vous remercie d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Qu'est-ce que c'est que ce code tordu ?
    Là, la seule façon de t'en sortir est d'avoir une variable globale du type de ta classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gpclMaClasse est un MaClasse dynamique
    Tu "affectes" à cette variable l'instance de ta classe.
    Tu passes en paramètres à cette fonction le nom de la variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RV_bRechercheMouvement_ParArticle("gpclMaClasse:monTableau")
    "Normalement" ça doit fonctionner... mais c'est très moche.

    Tatayo.

  3. #3
    Nouveau membre du Club Avatar de Woote
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Qu'est-ce que c'est que ce code tordu ?
    C'est, hum, historique on va dire

    Yep, j'avais testé cela et ça fonctionne mais j'aurais préféré une autre solution en réalité..

    Actuellement je fais ça :


    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
    CStatsMouvement est une Classe		 
    	// Le tableau des articles pour le relevé des ventes
    	m_taTabArticleMouvement est un tableau associatif (*,Null,wlEntier) de CArticleRV dynamique	
    FIN
     
    PROCEDURE Constructeur(sRequete est une chaîne)
    //Le constructeur prend en paramètre une requête 
    clRequest est un CRequest()
    // On exécute la requête 
    IF clRequest:bExecute(sRequete) THEN
     
    	// De façon temporaire on rempli les valeurs dans le tableau global
    	RV_bRechercheMouvement_ParArticle(clRequest, "Interface.gtaTabArticleMouvement")	
    	// Que l'on déverse ensuite dans le tableau de la classe 
    	:m_taTabArticleMouvement =  Interface.gtaTabArticleMouvement	
    ELSE
    	Info("L'exécution de la requête dans le constructeur a échoué !! ")
    END

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Le problème ici est que la procédure récupère le nom de la variable à traiter.
    Donc cette dernière doit être accessible dans la procédure.
    Et les seules variables accessibles sont celles passées en paramètre (impossible ici) et les globales.
    Bref je ne vois pas d'autre solution, à part tout casser et recoder proprement...

    Tatayo.

  5. #5
    Nouveau membre du Club Avatar de Woote
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bref je ne vois pas d'autre solution, à part tout casser et recoder proprement...
    Yep j'en ai bien bien peur :/

    Merci beaucoup en tout cas d'avoir pris le temps de m'aider

  6. #6
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Je n'ai peut être pas tout compris, mais pourquoi la fonction RV_bRechercheMouvement_ParArticle ne renvoie t-elle pas un tableau ?

    Par contre et de mémoire, par défaut sous Windev, une variable est toujours passé par adresse et non par valeur, donc a priori en passant la variable normalement, cela devrait fonctionner.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  7. #7
    Nouveau membre du Club Avatar de Woote
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par DelphiManiac Voir le message
    Je n'ai peut être pas tout compris, mais pourquoi la fonction RV_bRechercheMouvement_ParArticle ne renvoie t-elle pas un tableau ? Par contre et de mémoire, par défaut sous Windev, une variable est toujours passé par adresse et non par valeur, donc a priori en passant la variable normalement, cela devrait fonctionner.
    Le problème est que la fonction ne prend pas un tableau en paramètre mais un chaîne et indique dans la fonction que la chaîne est un tableau, et vu que ledit tableau est normalement un tableau global on peut le récuperer comme on veut.

    Sauf que la je me retrouve avec un tableau qui n'est pas global et qui ne doit pas l’être d'ou la complication.

  8. #8
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Donc si j'ai bien compris, tu ne veux pas toucher tous les appels existant à cette fonction. Dans ce cas je te proposerais la solution suivante.

    - Tu refactorises la fonction actuelle pour qu'elle ne prenne aucun paramètre , qu'elle remplisse un tableau local à la fonction et qu'elle le renvoie par retour de fonction.
    - Tu créé un surcharge à cette fonction qui à la même signature que la fonction initiale (avec en paramètre le nom du tableau) et qui remplie par indirection le tableau passé en paramètre.

    Tu as ainsi toujours le fonctionnement historique, qui continue à fonctionner sans modification et tu peux aussi utilisé le fonctionnement sans passé le nom du tableau en paramètre.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROCEDURE RV_bRechercheMouvement_ParArticle()
    tableauTemporaire est un tableau associatif (*,Null,wlEntier) de chaîne
    InitHasard()
    POUR i = 1 A 10
        soit indice = Hasard(1, 10)
        tableauTemporaire[indice] = indice
    FIN
    RENVOYER tableauTemporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE RV_bRechercheMouvement_ParArticle(arrayName est une chaîne)
    {arrayName, indVariable} = RV_bRechercheMouvement_ParArticle()
    Je pense que cette solution devrait convenir
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  9. #9
    Nouveau membre du Club Avatar de Woote
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 38
    Points : 30
    Points
    30
    Par défaut
    L'idée est bonne mais dupliquer une fonction déjà existante ne plaint guère à mon chef de projet, ça fait un peu trop rustine pour un cas particulier dans le projet existant.

    Au final j'ai décidé d’appeler la fonction comme elle est et je transfert le tableau global dans le tableau que je souhaite utiliser tout simplement.
    C'est pas super propre, et c'est aussi une bonne rustine des familles, mais bon ça fonctionne.

    Merci à toi en tout cas

  10. #10
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Juste une petite précision, je n'ai pas parlé de dupliquer la fonction, mais de créer une fonction qui a 2 signatures. La deuxième signature faisant appel au code de la première.

    Mais si ta solution te convient, pas de soucis !
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

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

Discussions similaires

  1. Variables dynamiques dans une fonction
    Par NiGHtyWolf dans le forum Langage
    Réponses: 1
    Dernier message: 31/01/2010, 14h38
  2. Réponses: 2
    Dernier message: 22/12/2009, 15h01
  3. nombre des variables dynamique dans une fonction
    Par Abdelkaoui dans le forum C
    Réponses: 10
    Dernier message: 29/02/2008, 15h37
  4. Passer un tableau PHP en argument dans une fonction javascript ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/05/2007, 12h31
  5. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58

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