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

IHM Discussion :

Utilisation d'une fonction dans un formulaire


Sujet :

IHM

  1. #1
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut Utilisation d'une fonction dans un formulaire
    Bonjour,

    J'ai crée une fonction en VBA que j'arrive à utiliser dans une requête mais que j'aimerai que l'utilisateur puisse saisir dans une zone de texte d'un form et puisse être appelée par cette même requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =TRANCHE(MONCHAMP;10000;10%;20000;15%;"AUDELA";20%)
    En clair si MONCHAMP = 25000 la formule calculera 10000*10% + 10000*15% + 5000*20% = 3500

    J'aimerais qu'elle puisse être saisie avec cette syntaxe dans une zone de texte de mon form et qu'elle puisse être appelée par ma requête.

    Je ne sais pas vraiment faire.
    (quelque chose avec des & des ' et/ou des ")

    Merci beaucoup pour votre aide.

    JPG

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Bonjour.

    Cela devrait être quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =TRANCHE([forms]![NomTomFormulaire]![NomTonChamp]; 10000; 10%; 20000; 15%; "AUDELA"; 20%)
    Note que Access va traduire Forms par Formulaires automatiquement.

    A+

  3. #3
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    En fait, je n'ai pas du bien formulé ma question désolé.

    Dans un champ du formulaire (ma zone de texte), j'aimerais que l'utilisateur saisisse cette formule et que je puisse exploiter ce champ dans ma requête.


    (c'est pour cette raison que ce n'était pas du code dans mon message d'origine, mais bien une saisie dans un form).


    Merci beaucoup.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Hum c'est possible mais cela ne me semble pas une bonne idée.

    Tu risques des problèmes si ton utilisateur fait une erreur de syntaxe ou pire une instruction exécutable qui n'a rien à voir comme delete * from uneTable.

    Personnellement je ferai un écran de saisie où j'entrerai les 6 ou 5 valeurs nécessaires (désolé je n'ai pas compris ce qui est variable dans ta fonction) et je les récupérerai après dans ma requête.

    Si tu tiens à procéder comme décrit la fonction Eval est là pour cela mais depuis la version 2007 elle n'est plus utilisable directement dans les requêtes. Enfin on peut en allant changer un paramètre dans les reqistres.
    Personnellement je n'aime pas jouer dans les registres donc j'ai une autre solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function MonEVal(prmExpression as variant) as variant
       MonEVal=Eval(prmExpression)
    end function
    A+

  5. #5
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    En fait ça marche, mais je ne sais pas comment appeler [MONCHAMP].

    Quand je le mets directement dans la formule tranche, il me dit que l'objet ne contient pas d'objet Automation "MONCHAMP"

    Et oui, j'ai un formulaire pour saisir cette fonction et pour effectuer les contrôles de syntaxes. Quand l'utilisateur a saisi ses arguments, la formule se présente comme ceci dans mon champ ( de ma table et donc du formulaire)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =TRANCHE([MONCHAMP];10000;10%;20000;15%;"AUDELA";20%)
    Merci encore pour ton aide.

    JPG

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Probablement

    [forms]![NomTomFormulaire]![NomTonChamp

    A+

  7. #7
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Je n'ai pas vraiment de formulaire en fait

    La saisie est effectuée dans le champ d'un form certes, mais ce champ s'appuie directement sur celui d'une table.

    En utilisant Eval, j'arrive à faire tourner la fonction si le montant [MONCHAMP] est saisi en dur : dans mon exemple 25 000.

    [MONCHAMP] est le champ d'une table dans lequel, sur un enregistrement, est stocké 25 000.

    Mais si je veux aller le trouver dans ma requête, je n'y arrive pas.

    Merci encore

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    C'est un peu normal, Eval n'a pas accès au contexte de ta requête.

    Tu pourais faire ainsi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public CalculerTranche(prmValeur as variant, prmFormule as variant) as variant
       dim result as variant:result=null
       if not isnull(prmValeur) then 
         dim formule as string:formule=replace(prmFormule, "[MonChamp]", prmValeur)
         result=Eval(formule)
       end if
     
       CalculerTranche=result
    end function
    dans ta requête, tu l'appelle ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CalculerTranche([TonChampRequete]; [TonEXpression])
    Comme cela tu vas pouvoir passer la valeur du champ à la fonction Eval comme si il était en "dur".

    A+

  9. #9
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    En fait, je pense que tu as trouvé la solution, mais je dois t'avouer que je n'y comprends pas grand chose, désolé

    Mon code TRANCHE est le suivant :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Function TRANCHE(montant As Double, ParamArray letableau())
     
    For i = 0 To UBound(letableau)
     
    If letableau(i) = "AUDELA" Then letableau(i) = montant
     
                If i Mod 2 = 0 Then ' cas du montant
     
                    If montant < letableau(i) Then
                    composant = montant - tr_moins
                    tr_moins = montant
                    Else
                    composant = letableau(i) - tr_moins
                    tr_moins = letableau(i)
                    End If
     
     
                Else ' cas du taux
                TAUX = letableau(i)
                TRANCHE = TRANCHE + composant * TAUX
     
                End If
     
    Next i
     
    If tr_moins < montant Then
    TRANCHE = TRANCHE + (montant - tr_moins) * TAUX
    End If
     
     
     
    End Function
    Et dans ce code c'est montant qui est le champ de la table.
    Dans ton code, je lance où la formule (le tableau) ?

    Un énième fois merci.

    JPG

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Bonjour.

    Peux-tu poster le SQL de la requête où tu appelles ta fonction TRANCHE via le Eval ?

    A+

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Sinon ce que j'ai fait s'appelle un "wrappeur" (en anglais "wrapper").

    Cela consiste à entourer un morceau de code existant avec un autre.
    Ce wrappeur va passer les paramètres que le code interne attend.

    A+

  12. #12
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Voici le SQL quand RangeCalculation = Tranche(10000,1000,0.10,"AUDELA",0.3)

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SEL_AumAvg.IsinId, SEL_AumAvg.CalculationBaseAvg, FeesRate.RangeCalculation, MonEval([RangeCalculation]) AS MonEval
    FROM SEL_AumAvg INNER JOIN FeesRate ON (SEL_AumAvg.EconomicPeriod = FeesRate.EconomicPeriod) AND (SEL_AumAvg.IsinId = FeesRate.IsinId)
    WHERE (((FeesRate.RangeCalculation) Is Not Null));

    C'est quand je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RangeCalculation = Tranche([CalculationBaseAvg],1000,0.10,"AUDELA",0.3)
    que j'ai le problème d'automation


    JPG

  13. #13
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SEL_AumAvg.IsinId, SEL_AumAvg.CalculationBaseAvg, FeesRate.RangeCalculation, CalculerTranche([SEL_AumAvg].[CalculationBaseAvg], [FeesRate].[RangeCalculation]) AS MonEval
    FROM SEL_AumAvg INNER JOIN FeesRate ON (SEL_AumAvg.EconomicPeriod = FeesRate.EconomicPeriod) AND (SEL_AumAvg.IsinId = FeesRate.IsinId)
    WHERE (((FeesRate.RangeCalculation) Is Not Null));

    Avec [RangeCalculation]=Tranche([MonChamp],1000,0.10,"AUDELA",0.3).

    A+

  14. #14
    Membre régulier
    Profil pro
    Consultant finance
    Inscrit en
    Mars 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 168
    Points : 77
    Points
    77
    Par défaut
    Parfait.

    Merci pour tous tes efforts et ta disponibilité.

Discussions similaires

  1. Bug lors de l'utilisation d'une fonction dans une macro.
    Par monf29 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2007, 14h35
  2. [Syntaxe] utilisation d'une fonction dans mysql
    Par mussara dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 01/04/2007, 19h40
  3. utilisation d'une fonction dans un cham texte
    Par Mat_DZ dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 11/09/2006, 14h16
  4. saisir une fonction dans un formulaire
    Par arnogef dans le forum IHM
    Réponses: 14
    Dernier message: 12/12/2005, 10h40
  5. Utilisation d'une fonction dans une procedure
    Par MaxiMax dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/08/2005, 15h51

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