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 03/01/2011, 12h11   #1
Membre du Club
 
Inscription : avril 2002
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 124
Points : 46
Points : 46
Par défaut Update l'opération dois utiliser une requête qui peut être mise à jour

Bonjour,
Meilleurs voeux pour la nouvelle année

J'ai un problème avec la requete suivante
Code :
UPDATE Tbl_DataNavette_NAV INNER JOIN TMP_HDebCondPrec ON Tbl_DataNavette_NAV.Numéro = TMP_HDebCondPrec.Numéro SET Tbl_DataNavette_NAV.DebCondPrec = [HCondecprec];
Je ne comprends pas pourquoi la modification d'enregistrement est vérouillé


la requette TMP_HDebCondPrec
Code :
1
2
SELECT (select max(hour(nav1.[Début conduite])*3600+Minute(nav1.[Début conduite])*60+Second(nav1.[Début conduite])) from tbl_datanavette_nav as nav1 where (Tbl_DataNavette_NAV.[Début conduite]>[nav1].[Début conduite]) AND (Tbl_DataNavette_NAV.Date=[nav1].[date]) and tbl_datanavette_nav.[Lieu d'arrêt] = nav1.[Lieu d'arrêt]) AS Expr2, Tbl_DataNavette_NAV.Numéro, IIf(IsNull([expr2]),0,[expr2]) AS HCondecPrec
FROM Tbl_DataNavette_NAV;
car je n'arrive pas à intégrer cette fonction dans une requete mise à jour

J'ai commencer par essayer en une seul requete :
Code :
1
2
UPDATE Tbl_DataNavette_NAV SET Tbl_DataNavette_NAV.DebCondPrec = 
(select max(hour(nav1.[Début conduite])*3600+Minute(nav1.[Début conduite])*60+Second(nav1.[Début conduite])) from tbl_datanavette_nav as nav1 where (Tbl_DataNavette_NAV.[Début conduite]>[nav1].[Début conduite]) AND (Tbl_DataNavette_NAV.Date=[nav1].[date]) and tbl_datanavette_nav.[Lieu d'arrêt] = nav1.[Lieu d'arrêt]);

Merci pour votre aide
tornade69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 12h43   #2
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Tornade69,

Bonne année 2011 à toi aussi.

Ce message apparaît, entre autres, quand Access trouve plusieurs enregistrements à mettre à jour pour la même clé.

Si tu veux poster la liste de tes tables concernées, avec leur clé primaire, ainsi que ce que tu veux obtenir "en français", nous pourrons étudier le problème.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 14h31   #3
Membre du Club
 
Inscription : avril 2002
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 124
Points : 46
Points : 46
Merci,

J'ai 3 colonnes (pour faire au plus simple)
Date
Lieu
Horaire

Je dois calculer par rapport à chaque date, et lieu quel est l'horaire précédent de passage.
donc j'ai fait une requete qui calcul par rapport à une date et un lieu, la valeur max inférieur à la valeur courante de l'horaire.
Code :
1
2
 
(select max(hour(nav1.[Début conduite])*3600+Minute(nav1.[Début conduite])*60+Second(nav1.[Début conduite])) from tbl_datanavette_nav as nav1 where (Tbl_DataNavette_NAV.[Début conduite]>[nav1].[Début conduite]) AND (Tbl_DataNavette_NAV.Date=[nav1].[date]) and tbl_datanavette_nav.[Lieu d'arrêt] = nav1.[Lieu d'arrêt])

Malheureusement, je suis obliger de stocker la valeur. car quand cette requête est ensuite utilisé par une autre requete, et exploiter depuis Excel ... cela met plus 2 heures à faire la mise a jour. (sans cette colone a calculé, il met 2 min) d'ou la solution de stocker la valeur.

Sauf que cela fonctionne très bien en requete sélection, mais pas en mise à jour.

NB: je fais aussi au passage une conversion en seconde

Merci
Tornade
tornade69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 18h53   #4
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Tu n'as pas, réellement, répondu à la question. Donc, si j'ai bien compris, la table en cause est la suivante :

Table Tbl_DataNavette_NAV :
- Date
- Lieu
- Horaire
- Horaire_precedent
==> clé primaire Date/Lieu/Horaire.


2 questions :
  1. Il y a bien une ligne par Date/Lieu/Horaire ?
  2. L'objectif est bien de calculer l'horaire précédent pour une même date, un même lieu et un même horaire ?
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 07h55   #5
Membre du Club
 
Inscription : avril 2002
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 124
Points : 46
Points : 46
Bonjour,

Je précise, la clé primaire est un champs numéro auto, basic.
Pas de clé primaire composée.

Oui sachant aussi qu'il peut ne pas avoir d'horaire précédent.
Par contre il peut exister pour une même date, un même horaire, un même lieu, mais un véhicule différent.

en fait la table comporte plus de champs, seulement les significatifs pour cette requete :
num : numauto
véhicule : texte
lieu : texte
date : date
horaire : heure
horaire précédent : entier long (stockage des infos en secondes)

Toutes les données (sauf horaire précédent) sont issue d'un import.

L'objectif est de calculer l'horaire précédent pour ensuite calculer le temps d'attente entre 2 passages de véhicule. Donc pour un jour donné, il y a le premier passage, qui n'a pas d'horaire précédent (c'est normal), et parfois comme 2 véhicules partent même temps, c'est la raison pour une même, un même horaire, et même lieu.

J'espère avoir été plus clair.

Merci
tornade69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 12h42   #6
Expert Confirmé
 
Avatar de Richard_35
 
Homme
Inscription : juillet 2007
Messages : 2 176
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : juillet 2007
Messages : 2 176
Points : 2 805
Points : 2 805
Bonjour Tornade69,

Si, même avec un identifiant unique (num), cela ne fonctionne pas, je pense que la requête intermédiaire "n'a pas le temps" de travailler, en quelque sorte.

Essaies ceci, via l'assistant :

Créer une requête R1 :
- ajout table Tbl_DataNavette_NAV (FROM) ;
- ajout table Tbl_DataNavette_NAV (renommée par Access Tbl_DataNavette_NAV_1) (FROM) ;
- lier par Date et Lieu (JOIN) ;
- sélection Date et Lieu (SELECT) ;
- sélectionner Horaire de Tbl_DataNavette_NAV (SELECT) ;
- sélectionner Horaire de Tbl_DataNavette_NAV_1 (SELECT) ;
- critères Horaire de Tbl_DataNavette_NAV_1 < Horaire de Tbl_DataNavette_NAV (WHERE).
==> donne la liste de tous les horaires inférieurs à tous les enregistrements de Tbl_DataNavette_NAV.

Créer une requête R2 :
- ajout requête R1 (FROM) ;
- type "Création de table" => table R2_tb (INSERT) ;
- regroupement (GROUP BY) ;
- sélection Date et Lieu (SELECT) ;
- sélectionner Horaire de Tbl_DataNavette_NAV (SELECT) ;
- sélectionner Max(Horaire de Tbl_DataNavette_NAV_1) (SELECT).
==> crée une table contenant la liste des enregistrements de Tbl_DataNavette_NAV avec l'horaire immédiatement précédent à l'horaire de base.

Créer une requête R3 :
- ajout table Tbl_DataNavette_NAV (FROM) ;
- ajout table R2_tb (FROM) ;
- type "mise à jour" (UPDATE) ;
- lier par Date, Lieu, Horaire (JOIN) ;
- mise à jour "Horaire_precedent de Tbl_DataNavette_NAV" = "Horaire de R2_tb" (qui est le Max précédemment calculé dans R2).
==> mise à jour finale de la table initiale.

A tester.
__________________
Dis-nous et à bientôt,
Richard.
----------------------------------------------------------------------------------------------
En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !
Richard_35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 19h37   #7
Membre du Club
 
Inscription : avril 2002
Messages : 124
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 124
Points : 46
Points : 46
En fait j'ai eu un flash ce matin, et j'ai fait une requete création de table direct

Code :
1
2
SELECT Right(Year([date]),2) & DatePart("ww",[Date],7,2) AS Semaine, Tbl_DataNavette_NAV.*, Hour([Début conduite])*3600+Minute([Début conduite])*60+Second([Début conduite]) AS HCondDec1, (select max(hour(nav1.[Début conduite])*3600+Minute(nav1.[Début conduite])*60+Second(nav1.[Début conduite])) from tbl_datanavette_nav as nav1 where (Tbl_DataNavette_NAV.[Début conduite]>[nav1].[Début conduite]) AND (Tbl_DataNavette_NAV.Date=[nav1].[date]) and tbl_datanavette_nav.[Lieu d'arrêt] = nav1.[Lieu d'arrêt]) AS HattPrec, [hconddec1]-[hattprec] AS Hattdec, Hour([Fin de conduite])*3600+Minute([Fin de conduite])*60+Second([Fin de conduite]) AS HCondFin, (select max(hour(nav1.[Début conduite])*3600+Minute(nav1.[Début conduite])*60+Second(nav1.[Début conduite])) from tbl_datanavette_nav as nav1 where (Tbl_DataNavette_NAV.[Début conduite]>[nav1].[Début conduite]) AND (Tbl_DataNavette_NAV.Date=[nav1].[date]) and tbl_datanavette_nav.[Lieu d'arrêt] = nav1.[Lieu d'arrêt]) AS HCondDec2, Hour([Début conduite])*3600+Minute([Début conduite])*60+Second([Début conduite]) AS hconddec INTO Qry_Semaine
FROM Tbl_DataNavette_NAV;
J'ai mis tous le code dans une requete création de table, et cela a fonctionné. Par contre elle met 10 min a tourner.

Le plus drôle c'est que je n'ai pas de double dans la table final ???

C'est pas très propre, et surtout beaucoup moins bien, mais cela fonctionne.

Par contre j'ai pas eu l'idée de remettre à jour la table final ...

Un grand merci pour ton aide, cela faisait plusieurs heures que je callais sur cette fonction.
PS : J'ai fait un test sur SQL et la elle fonctionne ... Moi je comprends pas

Tornade
tornade69 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 15h00.


 
 
 
 
Partenaires

Hébergement Web