Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
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 24/09/2011, 23h05   #1
Invité de passage
 
Inscription : août 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 6
Points : 1
Points : 1
Par défaut Utilisation de Rechdom dans une requete.

Bonjour

Je tourne dans les forums et je n'arrive pas à régler mon problème.

J'ai une table "RELEVES", qui comporte des champs [NumRelevé], [N°Compteur], [DateRelevé], [Index],...

J'ai construit une requête, dont le but est de calculer, pour chaque date de relève, la conso correspondante (résultante de Index-Index(n-1) ).

Je fais donc un tri croissant sur [N°compteur] et sur [dateRelevé].
Pour le champ conso, j'ai écrit l'expression suivante:
Code :
Expr2: RechDom("[Index]";"[RELEVES]";"[NumRelevé]=" & [NumRelevé]-1)
Et ... j'ai un problème, vous vous en doutez !!! La formule coince et j'ai le message suivant : "erreur de compilation dans l'expression DLookUp ..."


J'ai pensé que ça venait du fait que [NumRelevé] est un champ numérique, et j'ai essayé de cooriger la fin de la formule en mettant
Code :
& Car(34) [NumRelevé] -1 &Car(34)"")
... mais ça ne fonctionne pas mieux

Je suis visiblement passée à côté de quelque chose, mais j'ai beau regarder les forum et les tutos de microsoft, je reste plantée....

Je vous remercie d'avance pour votre aide

Céline
hobbes34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2011, 11h51   #2
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 087
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 087
Points : 11 622
Points : 11 622
Bonjour,

La syntaxe est correcte cependant tu utilises INDEX qui est un mot réservé...

Pour avoir cette liste consulter Mots Réservés dans l'aide ACCESS.

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2011, 21h06   #3
Invité de passage
 
Inscription : août 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 6
Points : 1
Points : 1
Bonsoir Loufab
Merci de ta réponse.
En fait, dans la formule j'utilise un champ qui s'appelle [Index HP bleu] et pour la question, je l'avais synthétisé en [Index].
A priori, tu me dit que la syntaxe est bonne ...

Par contre, je re-précise que je cherche à faire ce calcul dans une requête.
Est-ce qu'il faut que je passe par un formulaire?

Céline
hobbes34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2011, 22h27   #4
Invité de passage
 
Inscription : août 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 6
Points : 1
Points : 1
Petit correctif....

A force d'insister, je me suis aperçue que meme le simple calcul de Année(datedébutConso) me posait un souci car j'avais le message d'erreur "Erreur de compilation..."

J'ai vérifié les références de mon projet (en VBA: outils/référence). Visiblement rien d'anormal, mais après fermeture de VBA, comme par hasard tout fonctionnait
Bref!

Cependant, ma formule ne fonctionne pas...

En effet, j'ai un parc de 9 compteurs (électriques) et j'enregistre les factures (et les relevés) au fur et à mesure que je reçois les factures.
J'incrémente mon numéroauto [NumRelevé] à chaque nouvelle facture mais pas à chaque nouvelle facture du compteur en particulier.
Ainsi, Numrelevé=10 peut concerner le compteur 1 alors que Numrelevé=11 peut concerner le compteur 3...
Donc, ma formule RechDom telle que je l'ai écrite précédemment mélange tous mes compteurs, malgré le fait que je trie les compteurs par ordre croissant au préalable

Si je créé un champ: [Champ1] qui numérote les relevés propres à chaque compteur, et que j'écris le critère de ma formule de la façon suivante:

Code :
Expr2: RechDom("[IndexHP]";"[RELEVES]";"[Champ1]=" & [Champ1]-1)
Ca fonctionne (dans une table où je n'ai que le compteur1).

Par contre, c'est fastidieux de créer encore un champ.

Pour contourner le probleme, j'aimerais m'appuyer sur les dates, mais je n'arrive pas à trouver le bon critère. J'ai essayé:
[Date de Début] (c'est à dire du champ à chercher) = [Date de Fin] (c'est à dire du Champ considéré
Mais ma colonne reste désespérément vide...
Merci pour votre aide
hobbes34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2011, 23h16   #5
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir hobbes34

Citation:
Envoyé par hobbes34 Voir le message
J'ai une table "RELEVES", qui comporte des champs [NumRelevé], [N°Compteur], [DateRelevé], [Index],...

J'ai construit une requête, dont le but est de calculer, pour chaque date de relève, la conso correspondante (résultante de Index-Index(n-1) ).
en mode SQL (adapter les noms de tables &champs):
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT r1.numreleve,
       r1.n°compteur,
       r1.datereleve,
       r1.valeurindex,
       (SELECT TOP 1 r2.valeurindex
        FROM   releve r2
        WHERE  r2.n°compteur = r1.n°compteur
               AND r2.datereleve < r1.datereleve
        ORDER  BY r2.datereleve DESC) AS valeurindexprecedent
FROM   releve r1
ORDER  BY r1.n°compteur,
          r1.datereleve;

le champ calculé [valeurindexprecedent] retourne la valeur de l'index précédent pour le compteur en cours.
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 09h40   #6
Invité de passage
 
Inscription : août 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 6
Points : 1
Points : 1
Bonjour f-leb

Merci pour ta réponse. J'ai cependant une question dans le code que tu as tapé. A quoi correspondent les 2 expressions "releve". J'ai bien fait la correspondance entre r1, r2 et les autres champs, mais je ne comprends pas à quoi "releve" renvoie.
Merci d'avance

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT r1.numreleve,
       r1.n°compteur,
       r1.datereleve,
       r1.valeurindex,
       (SELECT TOP 1 r2.valeurindex
        FROM   releve r2
        WHERE  r2.n°compteur = r1.n°compteur
               AND r2.datereleve < r1.datereleve
        ORDER  BY r2.datereleve DESC) AS valeurindexprecedent
FROM   releve r1
ORDER  BY r1.n°compteur,
          r1.datereleve;
hobbes34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 18h38   #7
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonjour,

Citation:
Envoyé par hobbes34 Voir le message
J'ai cependant une question dans le code que tu as tapé.
tu n'as pas dit si le code marchait

Citation:
A quoi correspondent les 2 expressions "releve".
juste après le FROM, il s'agit bien de la table [RELEVES] de ton premier message.

le SELECT TOP 1... est une sous-requête qui utilise aussi la table [RELEVES], comme je m'en sers deux fois il faut passer par des alias de tables (des noms de substitution pour les tables).

J'aurais pu aussi écrire:...FROM releve AS r1.

Pour essayer d'expliquer:

Code :
1
2
3
4
5
6
7
8
SELECT r1.numreleve,
       r1.n°compteur,
       r1.datereleve,
       r1.valeurindex,
       (champ calculé) AS valeurindexprecedent
FROM   releve r1
ORDER  BY r1.n°compteur,
          r1.datereleve;
pour chaque ligne de la table [RELEVE] (avec r1 comme substitut de nom), j'ai un champ calculé (avec valeurindexprecedent comme nom de champ)...

Code :
1
2
3
4
5
(SELECT TOP 1 r2.valeurindex
        FROM   releve r2
        WHERE  r2.n°compteur = r1.n°compteur
               AND r2.datereleve < r1.datereleve
        ORDER  BY r2.datereleve DESC) AS valeurindexprecedent
pour chaque ligne relevé de la table r1, je prends les lignes de la table r2 qui ont le même n°Compte mais avec des dates antérieures, le TOP 1 ne conservant l'index du relevé le +récent.

Suis-je clair ?
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/09/2011, 21h50   #8
Invité de passage
 
Inscription : août 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 6
Points : 1
Points : 1
Bonsoir f-leb

Excuse moi pour le délai de réponse, je n'arrivais pas à mettre en forme le code (je me prenais les pieds dans le tapis de l'indentation)...

Mais a priori, maintenant c'est OK...

Citation:
Citation:
J'ai cependant une question dans le code que tu as tapé.
tu n'as pas dit si le code marchait
Je n'ai pas répondu, car, avec mon problème sur le terme "releve", le code ne marchait pas...

J'ai bien compris l'histoire des alias de tables et j'avais d'emblée remplacé les r1 et r2 par ma table relevé et son image, grâce à une liaison sur la clé primaire, ce qui donne en sql, avec mes vrais noms de table:
Code :
1
2
SELECT 
FROM H_NRJ_RELEVES INNER JOIN H_NRJ_RELEVES AS H_NRJ_RELEVES_1 ON H_NRJ_RELEVES.NumRelevé = H_NRJ_RELEVES_1.NumRelevé;
La deuxième table est directement nommée H_RELEVES_1 par Access.

Pour transposer ton code dans ma requête, j'ai appelé la deuxième table r2.

Lorsque j'essaie de transposer ton code, dans ma requête, ça donne:
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT   H_NRJ_RELEVES.numrelevé,
               H_NRJ_RELEVES.n°compteurEnergie,
               H_NRJ_RELEVES.dateFinConso,
               H_NRJ_RELEVES.[Index HP Bleu],
              (SELECT   TOP 1 r2.[Index HP Bleu]
                            FROM   r2
                            WHERE  r2.n°compteurEnergie = r1.n°compteurEnergie
                                          AND r2.dateFinConso < r1.dateDateFinConso
                            ORDER  BY r2.dateFinConso DESC) AS valeurindexprecedent
FROM H_NRJ_RELEVES INNER JOIN H_NRJ_RELEVES AS r2 ON H_NRJ_RELEVES.NumRelevé = r2.NumRelevé
ORDER BY H_NRJ_RELEVES.n°compteurEnergie, H_NRJ_RELEVES.dateFinConso;
Si je bascule en mode Création, les champs semblent bien se générer, mais lorsque je tente d'exécuter la requête, un message d'erreur me dit que Microsoft Jet ne peut pas trouver la table r2... Pourtant, elle est bien déclarée !

NB: par ailleurs, je n'ai pas réussi à savoir où déclarer le nom de la première table comme étant r1...

Merci pour ton aide
hobbes34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 22h02   #9
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 446
Points : 4 446
bonsoir,

Code sql :
...FROM H_NRJ_RELEVES INNER JOIN H_NRJ_RELEVES AS r2 ON ...
pourquoi cette "auto-jointure" (jointure de H_NRJ_RELEVES avec elle-même) ?

Sur le modèle de la requête de mon message précédent, cela donnerait:

Code sql :
1
2
3
4
5
6
7
8
9
10
11
SELECT   r1.numrelevé,
               r1.n°compteurEnergie,
               r1.dateFinConso,
               r1.[INDEX HP Bleu],
              (SELECT   TOP 1 r2.[INDEX HP Bleu]
                            FROM  H_NRJ_RELEVES r2
                            WHERE  r2.n°compteurEnergie = r1.n°compteurEnergie
                                          AND r2.dateFinConso < r1.dateDateFinConso
                            ORDER  BY r2.dateFinConso DESC) AS valeurindexprecedent
FROM H_NRJ_RELEVES r1
ORDER BY r1.n°compteurEnergie, r1.dateFinConso;
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 09h31   #10
Invité de passage
 
Inscription : août 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 6
Points : 1
Points : 1
Bonjour f-leb
Citation:
Code :
...FROM H_NRJ_RELEVES INNER JOIN H_NRJ_RELEVES AS r2 ON ...
pourquoi cette "auto-jointure" (jointure de H_NRJ_RELEVES avec elle-même) ?
Je faisais cette autojointure car je ne comprenais pas comment les deux tables pouvaient "s'harmoniser".
En fait, j'avais remarqué qu'avec l'assistant de création de requete, si on selectionnait 2 fois la même table, l'une des deux prenait un nom avec le suffixe "_1". Et lorsqu'on est dans cette situation, si on ne fait pas de jointure, lorsque l'on exécute, ça démultiplie les champs....

Citation:
Quant à ce code, je butais sur le fait qu'il n'y ait pas de "mot" entre le nom de la table et son nom déclaré.

Enfin, ce qui bugait depuis le début dans mon histoire, c'est que j'écrivais

Code :
FROM  H_NRJ_RELEVES_1 r2
dans la sous-requête, car je considérais que r2 renvoyait bien à l'image (l'alias) de la première table...

Merci beaucoup pour ton aide.
La requête fonctionne à merveille maintenant.
Il me reste à déclarer le message comme résolu...
hobbes34 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 17h56.


 
 
 
 
Partenaires

Hébergement Web