Requête Access, fonction Replace mode multiple

zanys Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   -  
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

A voir également:

7 réponses

Bruno83200_6929 Messages postés 625 Date d'inscription   Statut Membre Dernière intervention   141
 

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

0
zanys Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   5
 

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. 

1
zanys Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   5
 

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)

0
Bruno83200_6929 Messages postés 625 Date d'inscription   Statut Membre Dernière intervention   141
 

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 !


0
Zanys
 

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 ! 

0
Bruno83200_6929 Messages postés 625 Date d'inscription   Statut Membre Dernière intervention   141
 

Je suis très heureux d'avoir pu vous apporter mon aide. Cordialement !

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zanys
 

Bonjour,

de retour à mon travail, j'ai testé... 

J'ai l'impression qu'il faut que je modifie toutes les INNER JOIN en LEFT JOIN ? C'est le cas ?

0
Zanys
 

Ah non, autant pour moi... ca ne fonctionne bien avec juste le dernier LEFT JOIN...

0
zanys Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   5
 

Par 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 ?

0