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

VBA Access Discussion :

Transformation des IF en une table dynamique


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de casavba
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 464
    Par défaut Transformation des IF en une table dynamique
    Bonjour,

    Je suis en train de transformer une règle de détermination des valeurs d'un champ d'une table codée en dur en vba en une table pour permettre aux utilisateurs de modifier ou d'ajouter des conditions.

    Exemple:

    Voici un extrait de la règle codée en dur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF DATA.Field1="TOTO" And DATA.Field2="1" AND DATA.Field3="RER" AND DATA.Field4="POP" And DATA.Field5="GTO" THEN
    DATA.Field10="OK"
    ELSE IF DATA.Field1="TATA" and DATA.Field4="MOM" and DATA.Field7="PAP" THEN
    DATA.Field10="NOK"
    ELSEIF DATA.Field6="ABCD" And DATA.Field8="LOL"
    THEN
    DATA.Field10="KON"
    ...etc
    END IF
    Cette règle a été transformée en table nommée "Règle" :

    Field1..........Field2..........Filed3..........Filed4..........Field5..........Filed6..........Field7..........Filed8..........Field9..........Field10
    TOTO............1...............RER.............POP.............GTO.............Vide............Vide............Vide............Vide............OK

    TATA..........Vide............Vide............MOM.............Vide............Vide............PAP...............Vide............Vide.............NOK

    Vide............Vide............Vide............Vide............Vide............ABCD............Vide.............LOL.............Vide............KON

    ...etc
    Vide veut dire ici n'importe quelle valeur.

    Ma table de données est la suivante

    Field1..........Field2..........Filed3..........Filed4..........Field5..........Filed6..........Field7..........Filed8..........Field9..........Field10
    TOTO............1...............RERAB...........POP.............GTO.............RUE.............JAZZ............HARD............PETER............

    TATA..........SNCF............KIKI............MOM.............COUP............BUZZ............PAP...............2000............5800.............

    TITI............THALY............HGOL............KIPL............CHAT............ABCD............8900.............LOL.............4562............

    TATA............THALY............HGOL............MOM.............CHAT............ABCD............PAP.............LOLO.............4562............


    ...etc
    Donc Après application de la règle le résultat est le suivant :

    Field1..........Field2..........Filed3..........Filed4..........Field5..........Filed6..........Field7..........Filed8..........Field9..........Field10
    TOTO............1...............RERAB...........POP.............GTO.............RUE.............JAZZ............HARD............PETER............

    TATA..........SNCF............KIKI............MOM.............COUP............BUZZ............PAP...............2000............5800.............NOK

    TITI............THALY............HGOL............KIPL............CHAT............ABCD............8900.............LOL.............4562............KON

    TATA............THALY............HGOL............MOM.............CHAT............ABCD............PAP.............LOLO.............4562............


    ...etc
    La difficulté est que je n'arrive pas à modéliser correctement.

    Quelle est pour vous la meilleure méthode ? des recordsets ?

    Merci beaucoup

  2. #2
    Membre éprouvé Avatar de B_SKO
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 95
    Par défaut
    Bonjour,

    Je n'ai pas de solution direct en SQL sans doute elle existe SQL fait des merveilles parfois !
    Mais effectivement avec un recordset tu lis ta table règle qui te permet de générer une requété SQL du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     UPDATE Regles SET Regles.Fiel10 = "Taty"
    WHERE (((Regles.Field1)="Toto"));
    Pour chaque règle de ta table tu exécute une requête...

    Bon courage

  3. #3
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    une proposition dans le même sens :
    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
    Dim strTblRegles As String, strTblData As String
    Dim rsRegles As DAO.Recordset
    Dim strSql As String, strWhere As String
    Dim idx As Integer
     
    strTblRegles = "tblRegles"
    strTblData = "tblData"
     
    Set rsRegles = CurrentDb.OpenRecordset(strTblRegles)
    ' Parcourir table des règles
    Do While Not rsRegles.EOF
       strWhere = ""
       ' Lire chaque champ à la recherche d'un critère
       For idx = 0 To rsRegles.Fields.Count - 1
           ' Si Champ n'est pas Vide et Champ n'est pas Field10
           If Len(Nz(rsRegles(idx), "")) > 0 And rsRegles.Fields(idx).Name <> "Field10" Then
              If Len(strWhere) > 0 Then strWhere = strWhere & " And "
              strWhere = strWhere & "([" & rsRegles.Fields(idx).Name & "]='" & rsRegles(idx) & "')"
           End If
       Next
       strSql = "Update [" & strTblData & "] Set [Field10] = '" & rsRegles("Field10") & "'"
       strSql = strSql & " Where " & strWhere
       CurrentDb.Execute strSql, dbFailOnError
       rsRegles.MoveNext
    Loop
    Cela suppose que les champs de la table des règles ont exactement les mêmes noms que les champs de table à mettre à jour.

    Cela suppose aussi qu'il n'y a pas chevauchement des règles (il n'existe aucun enregistrement de la table de données pour lequel plus d'une règle est valable).
    Dans ce cas contraire, il faut définir un ordre de priorité des règles, et ajouter une condition Field10 Est Null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       strSql = strSql & " Where " & strWhere & " And (([Field10]) Is Null)"
    A+

  4. #4
    Membre éclairé Avatar de casavba
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 464
    Par défaut
    Merci Bcp à vous deux.

    Après quelques adaptations j'ai trouvé la solution idéale.

    Merci spécial à LedZeppII

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

Discussions similaires

  1. rajouter des colonnes à une table dynamique
    Par winsy dans le forum Composants
    Réponses: 2
    Dernier message: 27/10/2009, 13h52
  2. Réponses: 3
    Dernier message: 11/01/2007, 14h58
  3. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50
  4. Copie des données d'une table d'une base Interbase 6
    Par Djedjeridoo dans le forum InterBase
    Réponses: 6
    Dernier message: 02/02/2004, 09h39
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

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