Requête Access, fonction Replace mode multiple
zanys Messages postés 47 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je travaille sous Access 2007-2016 et sous forme de requêtes.
J'ai construit une requête me donnant le tableau ci dessous :
Champ1
20
21
22
23
....
...
et je dois transformer les valeurs du champ1 dans une autre colonne champ2
20 --> 60
22 --> 62
24 --> 64
23 --> 63
....
etc
Je pensais faire en SQL un replace imbriqué...
genre : Replace(Replace(champ1, '20', '60'), '21', '61') AS champ2
mais j'ai 16 modifications à faire (16 imbrications de replace) et du coup, j'ai le droit à un joli message m'indiquant que comme je dépasse les 1024 caractères ça ne peut pas fonctionner pour le mode création... enfin si j'ai bien compris... du coup je perds tout mes champs après le champ1 quand je passe en mode création...
Y'a-t-il un autre moyen avec la fonction replace que de faire des imbrications et éviter ce message de dépassement ?
Merci pour votre aide précieuse.
Amicalement,
Zanys
- Deezer sur freebox
- Mode avion - Guide
- Fonction si et - Guide
- Mode sécurisé samsung - Guide
- God mode - Guide
- Mode d'emploi - Guide
7 réponses
Bonjour,
Je vous conseille cette méthode.
Créer une table de correspondance
Créez une table TableCorrespondance avec deux colonnes :
AncienneValeur (20, 21, 22, 23, 24...)
NouvelleValeur (60, 61, 62, 63, 64...)
Puis utilisez une jointure :
SELECT t1.champ1, Nz(tc.NouvelleValeur, t1.champ1) AS champ2 FROM votre_table t1 LEFT JOIN TableCorrespondance tc ON t1.champ1 = tc.AncienneValeur
Bon en fait, j'ai fait ainsi..
Mon projet est un peu plus complexe...
mais j'ai créé tout de même une table de correspondance...
J'ai lié l'ancienne valeur (AOFUNCTION de la table VIBDAO) à l'ancienne valeur inclue dans ma table de correspondance... et j'extraie la nouvelle valeur associée de la table de correspondance...
ce qui me donne en SQL :
avec à la fin :
Ca fonctionne plutot bien, sauf que j'ai des anciennes valeurs (AOFUNCTION) à vide... et dans ce cas, la ligne complete n'est pas affichée, et j'aimerais qu'elle soit affichée... avec ancienne valeur à vide et nouvelle valeur à vide...
J'ai essayé dans ma table de correspondance de créer deux cellules vides pour ancienne et nouvelle valeur, mais ça ne fonctionne pas...
C'est pas très compréhensible je pense , mais bon....
Je continue mes recherches...
(A quoi sert le Nz)
Parfait ! Je vois exactement votre problème. Vous utilisez un INNER JOIN qui exclut les lignes où AOFUNCTION est vide/null, alors que vous voulez les conserver.
Solution : Remplacer INNER JOIN par LEFT JOIN
Voici ce qu'il faut modifier dans votre requête :
Au lieu de :
INNER JOIN [Table correspondance fonctions] ON VIBDAO.AOFUNCTION = [Table correspondance fonctions].[Ancienne fonction]
Utilisez :
LEFT JOIN [Table correspondance fonctions] ON VIBDAO.AOFUNCTION = [Table correspondance fonctions].[Ancienne fonction]
Explication des jointures
INNER JOIN : Ne retourne que les lignes où il y a une correspondance dans les deux tables
LEFT JOIN : Retourne TOUTES les lignes de la table de gauche (VIBDAO), même s'il n'y a pas de correspondance dans la table de droite
À propos de la fonction Nz()
La fonction Nz() (Null to Zero) remplace les valeurs nulles par une valeur par défaut :
-- Syntaxe Nz(expression, valeur_si_null) -- Exemple Nz([Nouvelle fonction], "") AS AOFUNCTION
Cela vous donnera :
Si AOFUNCTION a une correspondance → affiche la nouvelle valeur
Si AOFUNCTION est vide/null → affiche une chaîne vide ""
Votre requête modifiée devrait ressembler à :
SELECT VIBDAO.AOID AS OBJIDENT, "Z038" AS [Ancien AOTYPE], "4BAT" AS AOTYPE, VIBDAO.AONR, Left(VIBDAO.AOID, 14) AS PARENTNODE, "" AS ANCIEN_CODE, VIBDAO.XAO, VIBDAO.DOORPLT, Nz([Table correspondance fonctions].[Nouvelle fonction], "") AS AOFUNCTION FROM VIBDAO LEFT JOIN [Table correspondance fonctions] ON VIBDAO.AOFUNCTION = [Table correspondance fonctions].[Ancienne fonction]
Cela devrait résoudre votre problème et afficher toutes les lignes, même celles avec AOFUNCTION vide !
Ohhhh…. Que dire… un énorme merci pour avoir passé du temps à m’expliquer la solution…
j’avoue je suis en congés, mais dès mon retour au travail le 21 juillet, je testerais… mais je suis sûre que ça fonctionnera.
Vraiment un énorme merci pour la solution et les explications, c’est très sympathique !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionPar contre, j'ai un autre soucis sur le même projet...
J'ai créé 6 requêtes 2-1 2-2 2-3 .... etc qui, avec une macro, me donnent automatiquement en résultat 6 fichiers excel distincts...
J'aimerais qu'une macro me lancent ces 6 requêtes mais au final, mette automatiquement le contenu de ces 6 requêtes dans un seul fichier excel... Est ce possible ?
Merci beaucoup pour cette solution.
J'avoue que j'y ai pensé... mais je pensais qu'on pouvait faire un "replace multiple" sans imbrications genre replace (champ, (val1, nouvelle val1), (val2, nouvelle val2), ....)
Je vais tester cette solution de table de correspondance.
Merci encore.