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 :

Comparaison et synthétisation de 2 tables dans une 3ème


Sujet :

VBA Access

  1. #1
    Membre averti
    Homme Profil pro
    Eleveur de chèvres dans le Vercors
    Inscrit en
    Mai 2017
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Eleveur de chèvres dans le Vercors

    Informations forums :
    Inscription : Mai 2017
    Messages : 56
    Par défaut Comparaison et synthétisation de 2 tables dans une 3ème
    Bonjour,

    J'aimerais comparer 2 tables sous access ayant la même structure pour synthétiser les données en fonction:
    - S'il y a une valeur (peu importe le chiffre) dans une cellule table 1 et dans la même cellule table 2 alors affiche ok,
    - si valeur dans table 1 et pas 2 alors ko,
    - si pas de valeur dans table 1 mais dans table 2 alors affiche liv non prévue
    - si pas de valeur dans table 1 ni dans table 2 alors ne rien faire.

    J'essaye de résoudre ce problème par SQL (même message posté sur le forum requête et SQL) et par macros pour trouver une solution qui fonctionne au plus vite,
    en macros je me suis inspirée d'un code d'une autre discussion permettant de comparer 2 tables:

    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
    Public Sub ComparerToutesTables2(Synthèse_fériés As String, Réalisé As String, LIEN As String)
       'vide la table résultat
       Dim db As DAO.Database: Set db = CurrentDb
       Call db.Execute("DELETE * FROM Resultat;") 'Exécute du SQL sans message d'alerte de Access.
       db.Close: Set db = Nothing
     
       Dim listeTable As Variant
       listeTable = Array("Synthèse fériés", "Réalisé") 'Mettre ici la liste des tables à traiter
       Dim listeId As Variant
       listeId = Array("LIEN", "L1", "M1", "Me1", "J1", "V1", "S1", "D1", "L2", "M2", "Me2", "J2", "V2", "S2", "D2") 'Mettre ici la liste des chamsp Id utilisés dans les tables
     
       Dim i As Integer: For i = LBound(listeTable) To UBound(listeTable)
          Call ComparerTable("Synthèse_fériés", "Réalisé", "LIEN")
       Next i
    End Sub
    Mais quand je veux l'executer, elle ne s'affiche même pas dans la boite de dialogue "Macro" "Nom de macro",

    Merci d'avance ne serait-ce que pour un point de départ,

    Bonne journée !

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 136
    Par défaut
    Bonjour,

    Le code ci-dessus est du VBA et non une macro cela s'exécute depuis l'éditeur ou avec un bouton dans une fenêtre. Dans excel ce serait considéré comme une macro mais pas dans access

    La requete de comparaison n'est pas très complexe à écrire en SQL et cela ira bien plus vite mais :
    - il faut un champ commun entre les 2 tables (indexé et sans doublon de préférence dans ce cas)
    - elle s'écrit différemment en fonction des cas possibles : champ vide ou null, numérique ou alpha, ligne présente ou non...
    - il y a plein de syntaxes possibles : avec jointures externes, sous-requetes...

    exemple dans un cas simple et avec des jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select a.pk, 'ok' from a inner join b on a.pk=b.pk where not a.champ1 is null and not b.champ1 is null
    union all
    select a.pk, 'liv non prevue' from a left join b on a.pk=b.pk where not a.champ1 is null and b.champ1 is null
    union all
    select a.pk, 'ko' from a right join b on a.pk=b.pk where a.champ1 is null and not b.champ1 is null

  3. #3
    Membre averti
    Homme Profil pro
    Eleveur de chèvres dans le Vercors
    Inscrit en
    Mai 2017
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Eleveur de chèvres dans le Vercors

    Informations forums :
    Inscription : Mai 2017
    Messages : 56
    Par défaut
    Bonjour nico84,

    D'accord merci je comprends mieux

    En clé primaire commune aux 2 tables, je pensais utiliser les codes mais dans un autre forum on m'a fait la remarque que "Il n'est techniquement pas possible de faire correspondre la même clé primaire "deux fois". Si tu as une clé primaire d'un côté, elle sera présente en liaison sur la seconde sous la forme d'une clé étrangère.", du coup j'avais remis ma clé sur les numauto.

    En gros, je voudrais que :
    - s'il trouve une valeur pour tel code dans la cellule au croisement de la ligne du code et de la colonne 1 dans les 2 tables c'est ok,
    - s'il trouve une valeur dans la table "prévu" pour tel code dans la colonne 1 et pas dans la table "réalisé" pour le même code alors c'est NC (Non commandé)
    - et s'il trouve une valeur dans la table "réalisé" pour tel code dans la colonne 1 mais pas dans la table "prévue" pour exactement le même code dans la colonne 1 alors affiche CNP (Commande Non Prévue).

    J'espère avoir exprimé plus clairement mon idée, au départ j'étais sur Excel et j'étais partie sur du rechercheV (pour se référer au même code entre les 2 onglets) imbriqué dans différents SI mais la formule devenait vite complexe et ça me semblais trop "fragile" pour un document qui va être beaucoup utilisé.
    J'ai mis en doc joint un exemple de la structure de mes tables pour être plus claire.

    Je vais tester ton code et je te dis quoi ,

    Merci d'avance !
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 136
    Par défaut
    J'appelais "clé primaire" le champ qui permet la liaison entre les 2 tables et comme il doit être unique des 2 cotés pour que ça marche bien ce n'était pas une grosse erreur mais j'ai modifié mon post

  5. #5
    Membre averti
    Homme Profil pro
    Eleveur de chèvres dans le Vercors
    Inscrit en
    Mai 2017
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Eleveur de chèvres dans le Vercors

    Informations forums :
    Inscription : Mai 2017
    Messages : 56
    Par défaut
    nico_84... ça fonctionne...

    merci ! Si tu savais comme j'en ai les larmes aux yeux, je pensais me prendre la tête avec la mécanique de base pendant encore des plombes !
    Bon il me manque encore 400 enregistrements que je sais pas pourquoi ils apparaissent pas mais bon au moins pour 532 enregistrements ça maaaaaaaaaaaarche !

    Je voulais quand même demander si c'était possible de mettre un champs "générique" pour ne pas avoir renseigner les champs 1 par 1 (j'en ai 14, c'est pas énorme mais ça me soûle un peu de devoir tout écrire et puis une erreure est vite arrivée),
    je suppose qu'il faudrait que j'utilise une boucle de type loop non?

    Mon code donne ça pour le moment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Synthèse.LIEN, 'ok' FROM Synthèse INNER JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=1 AND Réalisé.L1=1
    UNION ALL
    SELECT Synthèse.LIEN, 'NC' from Synthèse LEFT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=1 AND Réalisé.L1=0
    UNION ALL SELECT Synthèse.LIEN, 'CNP' FROM Synthèse RIGHT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=0 AND Réalisé.L1=1;

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 136
    Par défaut
    Il y a généralement plusieurs façons de résoudre un problème mais il n'y a pas de loop en SQL

    Par ailleurs en cas de jointure left ou right il faut prévoir que le champ correspondant peut être nul sinon c'est comme un inner join :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Synthèse.LIEN, 'NC' from Synthèse LEFT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=1 AND (Réalisé.L1=0 or réalisé.l1 is null)
    ou
    SELECT Synthèse.LIEN, 'NC' from Synthèse LEFT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=1 AND nz(Réalisé.L1,0)=0

  7. #7
    Membre averti
    Homme Profil pro
    Eleveur de chèvres dans le Vercors
    Inscrit en
    Mai 2017
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Eleveur de chèvres dans le Vercors

    Informations forums :
    Inscription : Mai 2017
    Messages : 56
    Par défaut
    J'ai essayé quand même en renseignant tous les champs un par un et je me retrouve avec un message d'erreur "expression trop complexe", en effet je me retrouve avec ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Synthèse.LIEN,Synthèse.L1, Synthèse.M1, Synthèse.Me1, Synthèse.J1, Synthèse.V1, Synthèse.S1, Synthèse.D1, Synthèse.L2, Synthèse.M2, Synthèse.Me2, Synthèse.J2, Synthèse.V2, Synthèse.S2, Synthèse.D2, 'ok' FROM Synthèse INNER JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE (((Synthèse.L1=1 AND Réalisé.L1=1) AND ((Synthèse.M1=1 AND Réalisé.M1=1) AND ((Synthèse.Me1=1 AND Réalisé.Me1=1) AND ((Synthèse.J1=1 AND Réalisé.J1=1) AND ((Synthèse.V1=1 AND Réalisé.V1=1) AND ((Synthèse.S1=1 AND Réalisé.S1=1) AND ((Synthèse.D1=1 AND Réalisé.D1=1) AND ((Synthèse.L2=1 AND Réalisé.L2=1) AND ((Synthèse.M2=1 AND Réalisé.M2=1) AND ((Synthèse.Me2=1 AND Réalisé.Me2=1) AND ((Synthèse.J2=1 AND Réalisé.J2=1) AND ((Synthèse.V2=1 AND Réalisé.V2=1) AND ((Synthèse.S2=1 AND Réalisé.S2=1) AND ((Synthèse.D2=1 AND Réalisé.D2=1)))
    UNION ALL
    SELECT Synthèse.LIEN, Synthèse.L1, Synthèse.M1, Synthèse.Me1, Synthèse.J1, Synthèse.V1, Synthèse.S1, Synthèse.D1, Synthèse.L2, Synthèse.M2, Synthèse.Me2, Synthèse.J2, Synthèse.V2, Synthèse.S2, Synthèse.D2, 'NC' from Synthèse LEFT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE (((Synthèse.L1=1 AND Réalisé.L1=0) AND ((Synthèse.M1=1 AND Réalisé.M1=0) AND ((Synthèse.Me1=1 AND Réalisé.Me1=0) AND ((Synthèse.J1=1 AND Réalisé.J1=0) AND ((Synthèse.V1=1 AND Réalisé.V1=0) AND ((Synthèse.S1=1 AND Réalisé.S1=0) AND ((Synthèse.D1=1 AND Réalisé.D1=0) AND ((Synthèse.L2=1 AND Réalisé.L2=0) AND ((Synthèse.M2=1 AND Réalisé.M2=0) AND ((Synthèse.Me2=1 AND Réalisé.Me2=0) AND ((Synthèse.J2=1 AND Réalisé.J2=0) AND ((Synthèse.V2=1 AND Réalisé.V2=0) AND ((Synthèse.S2=1 AND Réalisé.S2=0) AND ((Synthèse.D2=1 AND Réalisé.D2=0)))
    UNION ALL 
    SELECT Synthèse.LIEN, Synthèse.L1, Synthèse.M1, Synthèse.Me1, Synthèse.J1, Synthèse.V1, Synthèse.S1, Synthèse.D1, Synthèse.L2, Synthèse.M2, Synthèse.Me2, Synthèse.J2, Synthèse.V2, Synthèse.S2, Synthèse.D2, 'CNP' FROM Synthèse RIGHT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE (((Synthèse.L1=0 AND Réalisé.L1=1) AND ((Synthèse.M1=0 AND Réalisé.M1=1) AND ((Synthèse.Me1=0 AND Réalisé.Me1=1) AND ((Synthèse.J1=0 AND Réalisé.J1=1) AND ((Synthèse.V1=0 AND Réalisé.V1=1) AND ((Synthèse.S1=0 AND Réalisé.S1=1) AND ((Synthèse.D1=0 AND Réalisé.D1=1) AND ((Synthèse.L2=0 AND Réalisé.L2=1) AND ((Synthèse.M2=0 AND Réalisé.M2=1) AND ((Synthèse.Me2=0 AND Réalisé.Me2=1) AND ((Synthèse.J2=0 AND Réalisé.J2=1) AND ((Synthèse.V2=0 AND Réalisé.V2=1) AND ((Synthèse.S2=0 AND Réalisé.S2=1) AND ((Synthèse.D2=0 AND Réalisé.D2=1)))
    UNION ALL 
    SELECT Synthèse.LIEN, Synthèse.L1, Synthèse.M1, Synthèse.Me1, Synthèse.J1, Synthèse.V1, Synthèse.S1, Synthèse.D1, Synthèse.L2, Synthèse.M2, Synthèse.Me2, Synthèse.J2, Synthèse.V2, Synthèse.S2, Synthèse.D2, ' ' FROM Synthèse RIGHT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE (((Synthèse.L1=0 AND Réalisé.L1=0) AND ((Synthèse.M1=0 AND Réalisé.M1=0) AND ((Synthèse.Me1=0 AND Réalisé.Me1=0) AND ((Synthèse.J1=0 AND Réalisé.J1=0) AND ((Synthèse.V1=0 AND Réalisé.V1=0) AND ((Synthèse.S1=0 AND Réalisé.S1=0) AND ((Synthèse.D1=0 AND Réalisé.D1=0) AND ((Synthèse.L2=0 AND Réalisé.L2=0) AND ((Synthèse.M2=0 AND Réalisé.M2=0) AND ((Synthèse.Me2=0 AND Réalisé.Me2=0) AND ((Synthèse.J2=0 AND Réalisé.J2=0) AND ((Synthèse.V2=0 AND Réalisé.V2=0) AND ((Synthèse.S2=0 AND Réalisé.S2=0) AND ((Synthèse.D2=0 AND Réalisé.D2=0)));
    du coup j'insiste avec ma boucle mais y a vraiment pas moyen? Ou je dois peut-être créer une requête par champs traité mais comment consolider les résultats obtenus par chaque requête dans un tableau?
    Aussi j'abuse un peu mais est-ce qu'il ya possibilité de donner un nom au champs créé au lieu de "Expr1001"?

    Merci d'avance

  8. #8
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 136
    Par défaut
    Quand on fait des tests compliqués ben ... c'est compliqué
    - Il faut tester les select 1 par 1 pour voir où lest le problème
    - comme il n'y a que des AND les parenthèses ne servent à rien
    - expr1 est par défaut mais on peut mettre un alias
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select t.toto as titi from matable as t

  9. #9
    Membre averti
    Homme Profil pro
    Eleveur de chèvres dans le Vercors
    Inscrit en
    Mai 2017
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Eleveur de chèvres dans le Vercors

    Informations forums :
    Inscription : Mai 2017
    Messages : 56
    Par défaut
    Merci beaucoup nico_84 pour ton aide,
    Je clos cette discussion car j'ai enfin réussi à obtenir ma fameuse table:
    Nom : Capture.JPG
Affichages : 248
Taille : 116,4 Ko

    Juste si quelqu'un a le même problème et tombe sur cette discussion, j'ai fait:
    - 1 requête par champs (j'en ai que 14 donc ça va), en adaptant à chaque fois le code SQL au jour concerné (en utilisant remplacer sur word ça va vite)
    ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Synthèse.LIEN, 'OK' FROM Synthèse INNER JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=1 AND Réalisé.L1=1
    UNION ALL
    SELECT Synthèse.LIEN, 'NC' from Synthèse LEFT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=1 AND Réalisé.L1=0
    UNION ALL
    SELECT Synthèse.LIEN, 'CNP' FROM Synthèse RIGHT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=0 AND Réalisé.L1=1
    UNION ALL 
    SELECT Synthèse.LIEN, ' ' FROM Synthèse RIGHT JOIN Réalisé ON Synthèse.LIEN=Réalisé.LIEN WHERE Synthèse.L1=0 AND Réalisé.L1=0;
    pour lundi 1, changer L1 par M1 pour mardi 1 ...

    -puis j'ai synthétisé toutes ces petites requêtes dans une, ce qui donne en mode création:
    Nom : Capture.JPG
Affichages : 242
Taille : 103,2 Ko
    et hop exécuter et voilà!

    Bon après ce n'est que la mécanique de base de mon projet, après je veux en sortir des indicateurs par codes de façon claire grâce à des formulaires, etc.
    Mais ce n'est pas le sujet de cette discussion
    Merci eaucoup pour l'aide,
    A+

  10. #10
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 136
    Par défaut
    Je vais dans le Vercors ce we, si je vois des chèvres je penserai à toi

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Problème d'alter table dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/03/2005, 09h19
  3. [PL/SQL] Charger une table dans une collection
    Par nosnoss dans le forum Oracle
    Réponses: 10
    Dernier message: 03/03/2005, 17h56
  4. Mettre la valeur d'une table dans une CString
    Par Lucier dans le forum MFC
    Réponses: 29
    Dernier message: 26/11/2004, 16h04
  5. concatenation des données d'une table dans une autre
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/10/2004, 11h38

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