Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2010, 11h03   #1
Membre confirmé
 
Avatar de casavba
 
Inscription : juillet 2007
Messages : 446
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 446
Points : 251
Points : 251
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 :
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" :

Citation:
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

Citation:
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 :

Citation:
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
casavba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 22h26   #2
Membre régulier
 
Homme Bruno Escaron
Inscription : janvier 2010
Messages : 84
Détails du profil
Informations personnelles :
Nom : Homme Bruno Escaron
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 84
Points : 96
Points : 96
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 :
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
B_SKO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 23h04   #3
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

une proposition dans le même sens :
Code :
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 :
   strSql = strSql & " Where " & strWhere & " And (([Field10]) Is Null)"
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 12h25   #4
Membre confirmé
 
Avatar de casavba
 
Inscription : juillet 2007
Messages : 446
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 446
Points : 251
Points : 251
Merci Bcp à vous deux.

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

Merci spécial à LedZeppII
casavba est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h32.


 
 
 
 
Partenaires

Hébergement Web