Résolu Access comparer 2 tables et synthétiser les données

  • Auteur de la discussion Nianiania3
  • Date de début

Nianiania3

Nouveau membre
Bonjour,

Je dois développer un outil sur le long terme avec une interface user friendly, c'est pour cela que j'ai choisi de passer par access car avec les formulaires ce sera plus simple d'utilisation pour des gens qui n'ont pas forcément beaucoup de connaissances informatiques.

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.

Mes tables ont exactement les même colonnes (intitulés et nombre) mais le nombre de ligne peut varier.
Les identifiants sont uniques (je les utilise en clé primaire) et identiques, tous les identifiants de la table 1 ("prévu" dans l'exemple ci-joint) sont dans la table 2 ("réalisé") mais tous les identifiants de la table 2 ne sont pas forcément dans la table 1.

J'ai voulu utiliser un NATURAL JOIN mais access bloque sur la syntaxe, du coup j'ai essayé de passer par une macro mais elle ne s'affiche même pas dans la liste des macros.

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

Bonne journée !
 

magellan

Modérâleur
Staff
Bon.

Dans l'ordre:
- Access n'est pas un mauvais choix, il simplifie énormément la vie
- Par contre, côté structure des tables ça risque d'être le foutoir ton truc, surtout si les tables ne sont pas reliées d'une manière ou d'une autre.

Ton problème va être organiser la donnée. Je m'explique: en face de quoi vas-tu faire aller tes états "OK, KO, non prévu"? Je ne saisis pas trop quelle est la donnée qui les corrèle parce que sans cela je ne vois pas trop comment construire ton affichage.

Autre chose: ce qui ne va pas (d'après ce que je comprends) ce sont tes clés primaires. 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.

As-tu un échantillon de données simples pour présenter un peu ce que tu comptes construire? Sans cela ça me paraît obscur au possible.

Mais en admettant ta structure telle que présentée, je ne vois qu'une façon de faire (et encore...)

Ton tableau présentera forcément la "valeur" que tu fais pointer, et une colonne dédiée au résultat
tu ne pourras dès lors pas faire un natural join simple parce que tu vas de la table A vers B et réciproquement
Donc tu auras forcément des recorset "hétérogènes" à concaténer, puis à trier par Identifiant

ça pourrait donner un truc comme ça (à voir, j'ai mis ça grossièrement)
select T1.id, (select case when T1.valeur = T2.valeur then 'OK'
when T2.valeur= 0 then 'KO'
END)
from T1 left outer join T2 on T1.ID= T2.ID
union
select T2.id, (select case when T1.valeur = T2.valeur then 'OK'
when T1.valeur= 0 then 'APPRO
END)
from T2 left outer join T1 on T2.ID= T1.ID

ATTENTION: Ma syntaxe sql est plus que rouillée hein... donc don't blame me si ça ne fonctionne pas aussi facilement ;)
 

Nianiania3

Nouveau membre
Bonjour magellan,

merci de ton intêret pour mon petit probème :)
En effet, il y a une colonne dans chaque table qui fait le lien, c'est un code unique avec 1 ligne de donnée en particulier.

Dans un autre forum (developpez.net), j'ai posté un exemple en pièce jointe xls de la structure de mes tables (sur ce forum je ne peux pas donc j'ai mis le lien vers l'autre discussion):

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 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é.
Je vais remettre la clé primaire sur numauto, merci de la remarque ;)

Je vais tester le code SQL que tu m'as donné et je te dis quoi :)

En tout cas merci d'avance si t'as le temps de jeter un coup d'oeil au doc xls :)
Bonne journée !
 

magellan

Modérâleur
Staff
Meilleure réponse
A ce que je vois, ça sera plus complexe comme requête, puisque tu as de multiples colonnes à faire correspondre, et que chacune peut, ou non, être alimentée. Je ne suis pas certain qu'un code full SQL soit une solution facile à maintenir, notamment si tu es amené à rectifier quoi que ce soit dans la donnée.

De là ce que je ferais dans un premier temps c'est de récupérer toutes les données (si ce n'est pas trop massif en terme de volumétrie) dans deux recordsets contenant tes deux tables, puis de faire des boucles imbriquées pour s'assurer la cohérence. ça n'est pas simple mais ça reste à peu près jouable. En tout cas c'est l'impression que cela me donne.
En gros la structure serait de faire un tableau de données de sorties avec toutes les colonnes identifiées pour le résultat.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 117
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut