Trier des enregistrements sur ACCESS
Fermé
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
-
23 mai 2007 à 15:36
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007 - 29 mai 2007 à 22:22
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007 - 29 mai 2007 à 22:22
A voir également:
- Trier des enregistrements sur ACCESS
- Excel trier par ordre croissant chiffre - Guide
- Enregistrer video youtube sur pc - Guide
- Application gratuite pour trier les photos - Guide
- Access appdata - Guide
- Comment enregistrer une musique sur youtube en mp3 - Guide
23 réponses
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
25 mai 2007 à 14:31
25 mai 2007 à 14:31
Tu crées une table sous Access qui porte par exemple le nom TTempo avec au moins 5 champs :
No_Immatriculation [Texte]
Prix [Numérique/Réel simple]
Date_Debut [Date]
Code_Ventilation [Numérique/Octet]
Ligne [Numérique/Réel double]
A partir de là, si j'ai bien compris, tu as une requête qui vient récupérer des enregistrements à partir de formulaires, etc. Ta requête doit avoir un nom, par exemple NomRequête. Donc, il ne reste plus qu'à modifier le programme pour venir vider la table TTempo et y ajouter les enregistrements à partir de ta requête - et par la suite mettre à jour le champ Ligne de TTempo.
Dans le programme suivant, tu n'as qu'à remplacer NomRequête par le vrai nom de ta requête et les champs concernés.
A partir de là, la table TTempo deviendra ta table de travail.
Voilà !
No_Immatriculation [Texte]
Prix [Numérique/Réel simple]
Date_Debut [Date]
Code_Ventilation [Numérique/Octet]
Ligne [Numérique/Réel double]
A partir de là, si j'ai bien compris, tu as une requête qui vient récupérer des enregistrements à partir de formulaires, etc. Ta requête doit avoir un nom, par exemple NomRequête. Donc, il ne reste plus qu'à modifier le programme pour venir vider la table TTempo et y ajouter les enregistrements à partir de ta requête - et par la suite mettre à jour le champ Ligne de TTempo.
Dans le programme suivant, tu n'as qu'à remplacer NomRequête par le vrai nom de ta requête et les champs concernés.
Sub TrierInfos() 'Définition des variables Dim dbCourante As DAO.Database 'Pour la base Dim rstRequete As DAO.Recordset 'Pour la requête Dim intLigne As Integer 'Pour l'incrémentation des numéros de lignes Dim booBoucle As Boolean 'Pour indiquer s'il faut refaire la mise à jour ou pas 'En cas d'erreur, on passe, on oublie le problème On Error Resume Next 'La base de données correspond à la base courante actuellement ouverte Set dbCourante = CurrentDb 'On vide la table temporaire TTempo dbCourante.Execute ("delete * from TTempo") 'On définit la requête qui récupère les infos 'Volontairement j'ai mis NomRequête Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut, Code_Ventilation, Prix from NomRequete") 'On alimente la table TTempo à partir de la requête que tu veux Do Until rstRequete.EOF dbCourante.Execute ("insert into TTempo (No_Immatriculation, Code_Ventilation, Date_Debut, Prix) values (""" & rstRequete!No_Immatriculation & """," & rstRequete!Code_Ventilation & ",""" & rstRequete!Date_Debut & """," & rstRequete!Prix & ")") rstRequete.MoveNext Loop Set rstRequete = Nothing 'Désormais la table TTempo est alimentée et on va travailler maintenant avec elle 'On définit et ouvre une requête qui récupére No_Immatriculation, la Date_Debut et Code_Ventilation (= 1 ou 4) de tous les enregistrements classés par No_Immatriculation et Date_Debut Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut , Code_Ventilation from NomTable order by No_Immatriculation, Date_Debut") 'on initialise les variables intLigne = 1 booBoucle = True 'On effectue une boucle (en partant du premier enregistrement de la requête jusqu'à la fin) - Quand on arrive en fin de requête (EOF - End Of File) on quitte la boucle Do Until rstRequete.EOF 'On place un étiquette utile pour un Goto à venir Boucle2: 'On exécute une requête de mise à jour 'Le champ Ligne de la table TTempo prend la valeur de intLigne quand l'enregistrement correspond à la valeur de No_Immatriculation et de Date_Debut de l'enregistrement de la requête rstRequête. dbCourante.Execute ("update TTempo set Ligne=""" & intLigne & """ where No_Immatriculation=""" & rstRequete!No_Immatriculation & """ and CDate(Date_Debut)=""" & CDate(rstRequete!Date_Debut) & """") 'On passe à l'enregistrement suivant de la requête rstRequête rstRequete.MoveNext 'Si booBoucle est à vrai... If booBoucle = True Then '... et si param de l'enregistrement de la requête vaut 'retour', alors... If rstRequete!Code_Ventilation = 4 Then 'booBoucle passe à faux pour ne pas retourner indéfiniment à Boucle2 booBoucle = False 'On retourne à Boucle2 pour mettre la même valeur intLigne à l'enregistrement suivant 'Ainsi, un No_Immatriculation avec un Code_Ventilation à départ et retour avec des dates consécutives aura le même numéro de ligne intLigne GoTo Boucle2 End If End If 'On remet booBoucle à vrai booBoucle = True 'On incrémente intLigne pour passer au No_Immatriculation suivant différent intLigne = intLigne + 1 Loop 'On se déconnecte de la requête et de la base Set rstRequete = Nothing Set dbCourante = Nothing End Sub
A partir de là, la table TTempo deviendra ta table de travail.
Voilà !
blux
Messages postés
26023
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
6 mai 2024
3 289
23 mai 2007 à 15:50
23 mai 2007 à 15:50
Salut,
ce n'est pas un tri que tu cherches à faire, mais un traitement de concaténation de deux lignes en une.
Je crains qu'il ne faille passer par du VBA...
ce n'est pas un tri que tu cherches à faire, mais un traitement de concaténation de deux lignes en une.
Je crains qu'il ne faille passer par du VBA...
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
23 mai 2007 à 16:02
23 mai 2007 à 16:02
ben je cherche plutot a additionner 2 lignes est ce que tu serais me donner la voie a prendre ?
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
23 mai 2007 à 16:17
23 mai 2007 à 16:17
Bonjour,
Est-ce que la différence de dates entre 'départ' et 'retour' pour un code est toujours égal à 2 jours ?
Si oui, la requête peut être :
SELECT NomTable.code, [NomTable].[prix]+[NomTable_1].[prix] AS PrixTotal, [NomTable_1].[date]-[NomTable].[date] AS DiffDate
FROM NomTable INNER JOIN NomTable AS NomTable_1 ON NomTable.code = NomTable_1.code
WHERE [test01_1].[date]-[test01].[date]=2;
NomTable est à remplacer par le vrai nom de la table concernée.
Il faut que pour chaque code (18 WP 29...) saisi dans un même champ, il y ait un retour et un départ. Dans le cas contraire, tous les enrgistrements ne seront pas récupérés. Il faudrait alors utiliser un INNER JOIN LEFT ou INNER JOIN RIGHT...
Si la différence de jours est aléatoire entre les enregistrements, il fautdrait trouver autre chose...
J'espère avoir bien répondu !
Est-ce que la différence de dates entre 'départ' et 'retour' pour un code est toujours égal à 2 jours ?
Si oui, la requête peut être :
SELECT NomTable.code, [NomTable].[prix]+[NomTable_1].[prix] AS PrixTotal, [NomTable_1].[date]-[NomTable].[date] AS DiffDate
FROM NomTable INNER JOIN NomTable AS NomTable_1 ON NomTable.code = NomTable_1.code
WHERE [test01_1].[date]-[test01].[date]=2;
NomTable est à remplacer par le vrai nom de la table concernée.
Il faut que pour chaque code (18 WP 29...) saisi dans un même champ, il y ait un retour et un départ. Dans le cas contraire, tous les enrgistrements ne seront pas récupérés. Il faudrait alors utiliser un INNER JOIN LEFT ou INNER JOIN RIGHT...
Si la différence de jours est aléatoire entre les enregistrements, il fautdrait trouver autre chose...
J'espère avoir bien répondu !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
23 mai 2007 à 16:20
23 mai 2007 à 16:20
merci pour ta réponse mais la difference entre 2 dates peut etre aléatoire comment je pe faire ?
blux
Messages postés
26023
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
6 mai 2024
3 289
24 mai 2007 à 08:38
24 mai 2007 à 08:38
Du VBA :
- tu définis un recordset trié par immat, date
- tu lis ton recordset
- tu additionnes les valeurs qui t'intéressent toutes les deux lignes
- tu définis un recordset trié par immat, date
- tu lis ton recordset
- tu additionnes les valeurs qui t'intéressent toutes les deux lignes
tu peux m' expliquer en détail car je suis un peu un novice
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
24 mai 2007 à 09:59
24 mai 2007 à 09:59
Une des idées serait de placer un champ supplémentaire dans la table, par exemple 'Ligne' au format Numérique\Entier.
Rajouter du VBA pour venir mettre à jour le champ 'Ligne' de la table...
NomTable, Immat, Date sont à remplacer par les noms corrects de la base de données.
J'ai mis Cdate(...) car je ne connais pas le type et le format du champ...
Une fois le programme terminé, Chaque Retour/Départ d'une Immat aura un numéro de ligne unique, utilisable par la suite dans d'autres requêtes.
Exemple de requête pour additionner les prix par Immat :
J'espère que cela peut aider. Si quelqu'un à une meilleure idée ?
Rajouter du VBA pour venir mettre à jour le champ 'Ligne' de la table...
Sub TrierInfos() Dim dbCourante As DAO.Database Dim rstRequete As DAO.Recordset Dim intLigne As Integer Dim booBoucle as Boolean On Error Resume Next Set dbCourante = CurrentDb Set rstRequete = dbCourante.OpenRecordset("select Immat, date from NomTable order by Immat, date desc") intLigne = 1 booBoucle = True Do Until rstRequete.EOF Boucle2: dbCourante.Execute ("update NomTable set Ligne=""" & intLigne & """ where Immat=""" & rstRequete!Immat & """ and cdate(date)=""" & CDate(rstRequete!Date) & """") rstRequete.MoveNext If booBoucle = True Then booBoucle = False GoTo Boucle2 End If booBoucle = True intLigne = intLigne + 1 Loop Set rstRequete = Nothing Set dbCourante = Nothing End Sub
NomTable, Immat, Date sont à remplacer par les noms corrects de la base de données.
J'ai mis Cdate(...) car je ne connais pas le type et le format du champ...
Une fois le programme terminé, Chaque Retour/Départ d'une Immat aura un numéro de ligne unique, utilisable par la suite dans d'autres requêtes.
Exemple de requête pour additionner les prix par Immat :
SELECT NomTable.Immat, NomTable.Ligne, Sum(NomTable.prix) AS SommeDeprix FROM NomTable GROUP BY NomTable.Immat, NomTable.Ligne;
J'espère que cela peut aider. Si quelqu'un à une meilleure idée ?
blux
Messages postés
26023
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
6 mai 2024
3 289
24 mai 2007 à 10:14
24 mai 2007 à 10:14
- Tu crées une table nommée 'tempo' avec les attributs suivants :
Une colonne 'num' en numeroauto qui est la clé
Une colonne Immat en texte
Une colonne Prix en numérique (entier long)
- Tu mets un bouton dans un formulaire et tu copies le code suivant dans l'évènement 'sur clic' de ton bouton :
On suppose que la table qui contient les données s'appelle table5 et qu'elle a les colonnes 'immat' et 'prix'.
On suppose aussi que les lignes vont deux par deux, il n'y a pas de contrôle si ce n'est pas le cas, ATENTION DONC AUX RESULTATS !!!
Quand tu appuies sur le bouton, il bosse un peu et te remplit la table tempo avec ce que tu souhaites...
Tu peux faire évoluer en fonction de ce que tu souhaites...
Une colonne 'num' en numeroauto qui est la clé
Une colonne Immat en texte
Une colonne Prix en numérique (entier long)
- Tu mets un bouton dans un formulaire et tu copies le code suivant dans l'évènement 'sur clic' de ton bouton :
Dim Rs As DAO.Recordset Dim Rs1 As DAO.Recordset Dim Req As QueryDef Dim Som As Long Set Req = CurrentDb.CreateQueryDef("", "delete * from [tempo]") Req.Execute dbFailOnError Set Rs = CurrentDb.OpenRecordset("tempo", dbOpenTable, dbAppendOnly) Set Rs1 = CurrentDb.OpenRecordset("SELECT * FROM table5 order by immat,date") Rs1.MoveFirst Anc_Immat = "" Som = 0 While Not Rs1.EOF Som = Som + Rs1!Prix Rs1.MoveNext Som = Som + Rs1!Prix With Rs .AddNew !Immat = Rs1!Immat !Prix = Som .Update End With Rs1.MoveNext Som = 0 Wend
On suppose que la table qui contient les données s'appelle table5 et qu'elle a les colonnes 'immat' et 'prix'.
On suppose aussi que les lignes vont deux par deux, il n'y a pas de contrôle si ce n'est pas le cas, ATENTION DONC AUX RESULTATS !!!
Quand tu appuies sur le bouton, il bosse un peu et te remplit la table tempo avec ce que tu souhaites...
Tu peux faire évoluer en fonction de ce que tu souhaites...
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
24 mai 2007 à 11:47
24 mai 2007 à 11:47
j ai réussi a simplifier a savoir quand c ' est un retour ou un départ dans la requète "Tournée"
18 WP 29 1800€ 01/02/2007 1
18 WP 29 800 € 03/02/2007 4
18 WP 29 1400 € 04/02/2007 1
18 Wp 29 600€ 05/02/2007 4
18 WP 29 1200€ 07/02/2007 1
12 AFR 29 500€ 02/02/2007 1
12 AFR 29 1200€ 03/02/2007 4
1 > Départ
2 > Retour
je veux créer une requète qui me calculera la synthèse des tournées par exemple :
18 WP 29 1800+800
18 WP 29 1400+600
18 WP 29 1200
12 AFR 29 500+1200
Critère : les dates entre les jours peuvent etre aléatoire:
Il faut ajouter un départ 1 + un retour 4 qui suit le départ mais étant de la méme immatriculation
il fait donc ajouter un départ avec son retour pour chaque immat
et les départ qui sont tout seul seront plus tard ajouter au retour suivant les enregistrements qui sont effectuer automatiqement
si vous avez des idées ?
et merci d' avance
18 WP 29 1800€ 01/02/2007 1
18 WP 29 800 € 03/02/2007 4
18 WP 29 1400 € 04/02/2007 1
18 Wp 29 600€ 05/02/2007 4
18 WP 29 1200€ 07/02/2007 1
12 AFR 29 500€ 02/02/2007 1
12 AFR 29 1200€ 03/02/2007 4
1 > Départ
2 > Retour
je veux créer une requète qui me calculera la synthèse des tournées par exemple :
18 WP 29 1800+800
18 WP 29 1400+600
18 WP 29 1200
12 AFR 29 500+1200
Critère : les dates entre les jours peuvent etre aléatoire:
Il faut ajouter un départ 1 + un retour 4 qui suit le départ mais étant de la méme immatriculation
il fait donc ajouter un départ avec son retour pour chaque immat
et les départ qui sont tout seul seront plus tard ajouter au retour suivant les enregistrements qui sont effectuer automatiqement
si vous avez des idées ?
et merci d' avance
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
24 mai 2007 à 12:00
24 mai 2007 à 12:00
Il faut, par exemple, reprendre ce que j'ai expliqué précédemment, au point 7. Ensuite, pour ne pas tenir compte des départs seuls, il faut juste modifier la requète d'interrogation :
SELECT NomTable.Immat, NomTable.Ligne, Sum(NomTable.Prix) AS SommeDePrix, Count(NomTable.Ligne) AS CompteDeLigne FROM NomTable GROUP BY NomTable.Immat, NomTable.Ligne HAVING (Count(NomTable.Ligne)=2);
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
24 mai 2007 à 14:25
24 mai 2007 à 14:25
est ce que tu peux s il te plait m expliquer clairement comment faire le VBA, je sai pas tro comment faire.
le calcul ser fera de requète à requète ?
le calcul ser fera de requète à requète ?
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
24 mai 2007 à 17:14
24 mai 2007 à 17:14
Voici le code VBA corrigé et expliqué :
Voilà ce que le programme fait (juste en exemple) :
Immat date prix param Ligne
15 AP 29 10/03/2007 1789 départ 1
15 AP 29 12/03/2007 600 retour 1
15 AP 29 13/03/2007 600 départ 2
15 AP 29 14/03/2007 500 retour 2
15 AP 29 15/03/2007 1400 départ 3
15 AP 29 18/03/2007 500 retour 3
16 AP 29 09/03/2007 600 départ 4
16 AP 29 17/03/2007 500 retour 4
16 AP 29 17/05/2007 500 départ 5
18 WP 29 11/03/2007 1300 départ 6
18 WP 29 13/03/2007 600 retour 6
18 WP 29 18/06/2007 600 départ 7
Le code VBA ne met que le champ Ligne à jour. Ensuite, tu peux mettre en place de nouvelles requêtes ou d'autres codes VBA. Dans tous les cas, les bonnes paires d'Immat sont désormais bien regroupées.
Pour refaire la somme d'Immat, tu peux reprendre :
Voilà !
Sub TrierInfos() 'Définition des variables Dim dbCourante As DAO.Database 'Pour la base Dim rstRequete As DAO.Recordset 'Pour la requête Dim intLigne As Integer 'Pour l'incrémentation des numéros de lignes Dim booBoucle As Boolean 'Pour indiquer s'il faut refaire la mise à jour ou pas 'En cas d'erreur, on passe, on oublie le problème On Error Resume Next 'La base de données correspond à la base courante actuellement ouverte Set dbCourante = CurrentDb 'On définit et ouvre une requête qui récupére l'Immat, la date et le param (= retour ou départ) de tous les enregistrements classés par Immat et date Set rstRequete = dbCourante.OpenRecordset("select Immat, date,param from NomTable order by Immat,date") 'on initialise les variables intLigne = 1 booBoucle = True 'On effectue une boucle (en partant du premier enregistrement de la requête jusqu'à la fin) - Quand on arrive en fin de requête (EOF - End Of File) on quitte la boucle Do Until rstRequete.EOF 'On place un étiquette utile pour un Goto à venir Boucle2: 'On exécute une requête de mise à jour 'Le champ Ligne prend la valeur de intLigne quand l'enregistrement correspond à la valeur de Immat et de date de l'enregistrement de la requête rstRequête. dbCourante.Execute ("update NomTable set ligne=""" & intLigne & """ where Immat=""" & rstRequete!Immat & """ and cdate(date)=""" & CDate(rstRequete!Date) & """") 'On passe à l'enregistrement suivant de la requête rstRequête rstRequete.MoveNext 'Si booBoucle est à vrai... If booBoucle = True Then '... et si param de l'enregistrement de la requête vaut 'retour', alors... If rstRequete!param = "retour" Then 'booBoucle passe à faux pour ne pas retourner indéfiniment à Boucle2 booBoucle = False 'On retourne à Boucle 2 pour mettre la même valeur de intLigne à l'enregistrement du Immat avec le param à 'retour' 'Ainsi, un Immat avec un 'param' à départ et 'retour' avec des dates consécutives au le même numéro de ligne intLigne GoTo Boucle2 End If End If 'On remet booBoucle à vrai booBoucle = True 'On incrémente intLigne pour passer à l'Immat suivant différent intLigne = intLigne + 1 Loop 'On se déconnecte de la requête et de la base Set rstRequete = Nothing Set dbCourante = Nothing End Sub
Voilà ce que le programme fait (juste en exemple) :
Immat date prix param Ligne
15 AP 29 10/03/2007 1789 départ 1
15 AP 29 12/03/2007 600 retour 1
15 AP 29 13/03/2007 600 départ 2
15 AP 29 14/03/2007 500 retour 2
15 AP 29 15/03/2007 1400 départ 3
15 AP 29 18/03/2007 500 retour 3
16 AP 29 09/03/2007 600 départ 4
16 AP 29 17/03/2007 500 retour 4
16 AP 29 17/05/2007 500 départ 5
18 WP 29 11/03/2007 1300 départ 6
18 WP 29 13/03/2007 600 retour 6
18 WP 29 18/06/2007 600 départ 7
Le code VBA ne met que le champ Ligne à jour. Ensuite, tu peux mettre en place de nouvelles requêtes ou d'autres codes VBA. Dans tous les cas, les bonnes paires d'Immat sont désormais bien regroupées.
Pour refaire la somme d'Immat, tu peux reprendre :
SELECT NomTable.Immat, NomTable.Ligne, Sum(NomTable.Prix) AS SommeDePrix, Count(NomTable.Ligne) AS CompteDeLigne FROM NomTable GROUP BY NomTable.Immat, NomTable.Ligne HAVING (Count(NomTable.Ligne)=2);
Voilà !
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
25 mai 2007 à 11:31
25 mai 2007 à 11:31
j' ai essayer ton Code mais ca marche pas ca fait planter l' ordi.
cé peut etre à cause des noms de champs
nom requète >> "RST"
Immat >> "No_Immatriculation
date >> Date_Debut
param >> Code_Ventilation 1= depart 4= retour
Cdate =????
cé peut etre à cause des noms de champs
nom requète >> "RST"
Immat >> "No_Immatriculation
date >> Date_Debut
param >> Code_Ventilation 1= depart 4= retour
Cdate =????
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
25 mai 2007 à 11:49
25 mai 2007 à 11:49
Il faut alors remplacer le nom des champs que j'avais placés avec les bons car, au départ, je ne les connaissais pas. Donc Immat devient No_Immatriculation ; date devient Date_Debut et param devient Code_Ventilation.
Ensuite,
Dans le programme, NomTable est à remplacer par le nom de la table dans laquelle se trouvent les enregistrements (en particulier les champs No_Immatriculation, Date_Debut et Code_Ventilation.
Le code VBA met à jour cette table et nom pas une requête. Sinon, cela ne peut pas marcher !
CDate(...) est une commande pour transformer des nombres ou des chaînes de caractères au format date. Par exemple : Cdate("25/05/2007") devient #25/05/2007# ou 25/05/2007 (soit une date).
Sinon, il faut vérifier le nom de la table, des champs, le format et le type de chaque champ... Sur mon poste, tout fonctionne !
Ensuite,
If rstRequete!param = "retour"devient alors
If rstRequete!Code_Ventilation=4
Dans le programme, NomTable est à remplacer par le nom de la table dans laquelle se trouvent les enregistrements (en particulier les champs No_Immatriculation, Date_Debut et Code_Ventilation.
Le code VBA met à jour cette table et nom pas une requête. Sinon, cela ne peut pas marcher !
CDate(...) est une commande pour transformer des nombres ou des chaînes de caractères au format date. Par exemple : Cdate("25/05/2007") devient #25/05/2007# ou 25/05/2007 (soit une date).
Sinon, il faut vérifier le nom de la table, des champs, le format et le type de chaque champ... Sur mon poste, tout fonctionne !
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
25 mai 2007 à 12:08
25 mai 2007 à 12:08
a ok j' ai compri mais le probleme est que les differentes variables proviennent de différentes tables avec prés de 300000 enregistrements.
moi le tri doit s 'effectuer dans ma requete car pour la date de début je la choisi entre deux date dans mon formulaire.
cela ne pourrai pas marcher dans ma requete ?
moi le tri doit s 'effectuer dans ma requete car pour la date de début je la choisi entre deux date dans mon formulaire.
cela ne pourrai pas marcher dans ma requete ?
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
25 mai 2007 à 12:14
25 mai 2007 à 12:14
Code_Ventilation > 2_Cdes_Mvts_Emballag
Date_Debut > 2_Tournees1
No_Immatriculatio> 2_Vehicules
Date_Debut > 2_Tournees1
No_Immatriculatio> 2_Vehicules
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
25 mai 2007 à 12:20
25 mai 2007 à 12:20
Vu comment sont classés tes données et que tu veux ce que tu veux faire, travailler directement avec plusieurs tables et surtout différentes requêtes n'est pas simple.
Mieux vaut passer alors par une table temporaire (qui contiendra entre autre Code_Ventilation, Date_Debut, No_Immatriculation et Ligne) dans la quelle tu intègres ce que tu veux à partir de tes différentes requêtes et informations. Ensuite, tu travailles à partir de cette table temporaire...
Mieux vaut passer alors par une table temporaire (qui contiendra entre autre Code_Ventilation, Date_Debut, No_Immatriculation et Ligne) dans la quelle tu intègres ce que tu veux à partir de tes différentes requêtes et informations. Ensuite, tu travailles à partir de cette table temporaire...
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
25 mai 2007 à 12:33
25 mai 2007 à 12:33
comment je fais pour creer cette table temporaire ?
excuse moi de te faire perdre ton temps mais tu es le seul à pouvoir m' aider
excuse moi de te faire perdre ton temps mais tu es le seul à pouvoir m' aider
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
25 mai 2007 à 15:38
25 mai 2007 à 15:38
Option Compare Database
Sub TrierInfos()
'Définition des variables
Dim dbCourante As DAO.Database 'Pour la base
Dim rstRequete As DAO.Recordset 'Pour la requête
Dim intLigne As Integer 'Pour l'incrémentation des numéros de lignes
Dim booBoucle As Boolean 'Pour indiquer s'il faut refaire la mise à jour ou pas
'En cas d'erreur, on passe, on oublie le problème
On Error Resume Next
'La base de données correspond à la base courante actuellement ouverte
Set dbCourante = CurrentDb
'On vide la table temporaire TTempo
dbCourante.Execute ("delete * from TTempo")
'On définit la requête qui récupère les infos
'Volontairement j'ai mis NomRequête
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut, Code_Ventilation, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris from RST")
'On alimente la table TTempo à partir de la requête que tu veux
Do Until rstRequete.EOF
dbCourante.Execute ("insert into TTempo (No_Immatriculation, Code_Ventilation, Date_Debut, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris) values (""" & rstRequete!No_Immatriculation & """," & rstRequete!Code_Ventilation & ",""" & rstRequete!Date_Debut & """," & rstRequete!Montant_CA & """," & rstRequete!Tournee & """," & rstRequete!Distance_en_Kilometr & """," & rstRequete!SommeDePris & ")")
rstRequete.MoveNext
Loop
Set rstRequete = Nothing
'Désormais la table TTempo est alimentée et on va travailler maintenant avec elle
'On définit et ouvre une requête qui récupére No_Immatriculation, la Date_Debut et Code_Ventilation (= 1 ou 4) de tous les enregistrements classés par No_Immatriculation et Date_Debut
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut , Code_Ventilation from TTempo order by No_Immatriculation, Date_Debut")
'on initialise les variables
intLigne = 1
booBoucle = True
'On effectue une boucle (en partant du premier enregistrement de la requête jusqu'à la fin) - Quand on arrive en fin de requête (EOF - End Of File) on quitte la boucle
Do Until rstRequete.EOF
'On place un étiquette utile pour un Goto à venir
Boucle2:
'On exécute une requête de mise à jour
'Le champ Ligne de la table TTempo prend la valeur de intLigne quand l'enregistrement correspond à la valeur de No_Immatriculation et de Date_Debut de l'enregistrement de la requête rstRequête.
dbCourante.Execute ("update TTempo set Ligne=""" & intLigne & """ where No_Immatriculation=""" & rstRequete!No_Immatriculation & """ and CDate(Date_Debut)=""" & CDate(rstRequete!Date_Debut) & """")
'On passe à l'enregistrement suivant de la requête rstRequête
rstRequete.MoveNext
'Si booBoucle est à vrai...
If booBoucle = True Then
'... et si param de l'enregistrement de la requête vaut 'retour', alors...
If rstRequete!Code_Ventilation = 4 Then
'booBoucle passe à faux pour ne pas retourner indéfiniment à Boucle2
booBoucle = False
'On retourne à Boucle2 pour mettre la même valeur intLigne à l'enregistrement suivant
'Ainsi, un No_Immatriculation avec un Code_Ventilation à départ et retour avec des dates consécutives aura le même numéro de ligne intLigne
GoTo Boucle2
End If
End If
'On remet booBoucle à vrai
booBoucle = True
'On incrémente intLigne pour passer au No_Immatriculation suivant différent
intLigne = intLigne + 1
Loop
'On se déconnecte de la requête et de la base
Set rstRequete = Nothing
Set dbCourante = Nothing
End Sub
j' ai rentrer ca mais ca fait planter l'ordi comment je dois faire ??
Sub TrierInfos()
'Définition des variables
Dim dbCourante As DAO.Database 'Pour la base
Dim rstRequete As DAO.Recordset 'Pour la requête
Dim intLigne As Integer 'Pour l'incrémentation des numéros de lignes
Dim booBoucle As Boolean 'Pour indiquer s'il faut refaire la mise à jour ou pas
'En cas d'erreur, on passe, on oublie le problème
On Error Resume Next
'La base de données correspond à la base courante actuellement ouverte
Set dbCourante = CurrentDb
'On vide la table temporaire TTempo
dbCourante.Execute ("delete * from TTempo")
'On définit la requête qui récupère les infos
'Volontairement j'ai mis NomRequête
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut, Code_Ventilation, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris from RST")
'On alimente la table TTempo à partir de la requête que tu veux
Do Until rstRequete.EOF
dbCourante.Execute ("insert into TTempo (No_Immatriculation, Code_Ventilation, Date_Debut, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris) values (""" & rstRequete!No_Immatriculation & """," & rstRequete!Code_Ventilation & ",""" & rstRequete!Date_Debut & """," & rstRequete!Montant_CA & """," & rstRequete!Tournee & """," & rstRequete!Distance_en_Kilometr & """," & rstRequete!SommeDePris & ")")
rstRequete.MoveNext
Loop
Set rstRequete = Nothing
'Désormais la table TTempo est alimentée et on va travailler maintenant avec elle
'On définit et ouvre une requête qui récupére No_Immatriculation, la Date_Debut et Code_Ventilation (= 1 ou 4) de tous les enregistrements classés par No_Immatriculation et Date_Debut
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut , Code_Ventilation from TTempo order by No_Immatriculation, Date_Debut")
'on initialise les variables
intLigne = 1
booBoucle = True
'On effectue une boucle (en partant du premier enregistrement de la requête jusqu'à la fin) - Quand on arrive en fin de requête (EOF - End Of File) on quitte la boucle
Do Until rstRequete.EOF
'On place un étiquette utile pour un Goto à venir
Boucle2:
'On exécute une requête de mise à jour
'Le champ Ligne de la table TTempo prend la valeur de intLigne quand l'enregistrement correspond à la valeur de No_Immatriculation et de Date_Debut de l'enregistrement de la requête rstRequête.
dbCourante.Execute ("update TTempo set Ligne=""" & intLigne & """ where No_Immatriculation=""" & rstRequete!No_Immatriculation & """ and CDate(Date_Debut)=""" & CDate(rstRequete!Date_Debut) & """")
'On passe à l'enregistrement suivant de la requête rstRequête
rstRequete.MoveNext
'Si booBoucle est à vrai...
If booBoucle = True Then
'... et si param de l'enregistrement de la requête vaut 'retour', alors...
If rstRequete!Code_Ventilation = 4 Then
'booBoucle passe à faux pour ne pas retourner indéfiniment à Boucle2
booBoucle = False
'On retourne à Boucle2 pour mettre la même valeur intLigne à l'enregistrement suivant
'Ainsi, un No_Immatriculation avec un Code_Ventilation à départ et retour avec des dates consécutives aura le même numéro de ligne intLigne
GoTo Boucle2
End If
End If
'On remet booBoucle à vrai
booBoucle = True
'On incrémente intLigne pour passer au No_Immatriculation suivant différent
intLigne = intLigne + 1
Loop
'On se déconnecte de la requête et de la base
Set rstRequete = Nothing
Set dbCourante = Nothing
End Sub
j' ai rentrer ca mais ca fait planter l'ordi comment je dois faire ??
EBasta
Messages postés
37
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
25 mai 2007
31
25 mai 2007 à 16:20
25 mai 2007 à 16:20
Il y a des erreurs de guillemets dans la requête d'insertion.
Il faut placer 3 guillemets """ pour des champs en texte ou date et un seul pour des champs au format numérique. Dans ce que tu as tapé, tout se mélange.
Il faut donc regarder la concordance des guillemets avec le format du champ de la requête. J'ai corrigé la commande en considérant que rstRequete!Montant_CA, rstRequete!Distance_en_Kilometr et rstRequete!SommeDePris comme numérique - et rstRequete!Tournee comme caractères.
Essaie alors à nouveau. Sinon, quel type de plantage ou de message d'erreur apparaît ?
Il faut placer 3 guillemets """ pour des champs en texte ou date et un seul pour des champs au format numérique. Dans ce que tu as tapé, tout se mélange.
Il faut donc regarder la concordance des guillemets avec le format du champ de la requête. J'ai corrigé la commande en considérant que rstRequete!Montant_CA, rstRequete!Distance_en_Kilometr et rstRequete!SommeDePris comme numérique - et rstRequete!Tournee comme caractères.
dbCourante.Execute ("insert into TTempo (No_Immatriculation, Code_Ventilation, Date_Debut, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris) values (""" & rstRequete!No_Immatriculation & """," & rstRequete!Code_Ventilation & ",""" & rstRequete!Date_Debut & """," & rstRequete!Montant_CA & ",""" & rstRequete!Tournee & """," & rstRequete!Distance_en_Kilometr & "," & rstRequete!SommeDePris & ")")
Essaie alors à nouveau. Sinon, quel type de plantage ou de message d'erreur apparaît ?
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
25 mai 2007 à 17:13
25 mai 2007 à 17:13
ca met rien mais cé long et ca fait rien
quand je met fermer ca me met le programme ne repond pas ??
quand je met fermer ca me met le programme ne repond pas ??
fanchichon29
Messages postés
45
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
6 juin 2007
29 mai 2007 à 09:40
29 mai 2007 à 09:40
ca marche pas ca plante poirtant j ai éccri tous ca.
tournée est en texte
Sub TrierInfos()
'Définition des variables
Dim dbCourante As DAO.Database 'Pour la base
Dim rstRequete As DAO.Recordset 'Pour la requête
Dim intLigne As Integer 'Pour l'incrémentation des numéros de lignes
Dim booBoucle As Boolean 'Pour indiquer s'il faut refaire la mise à jour ou pas
'En cas d'erreur, on passe, on oublie le problème
On Error Resume Next
'La base de données correspond à la base courante actuellement ouverte
Set dbCourante = CurrentDb
'On vide la table temporaire TTempo
dbCourante.Execute ("delete * from TTempo")
'On définit la requête qui récupère les infos
'Volontairement j'ai mis NomRequête
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut, Code_Ventilation, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris from RST")
'On alimente la table TTempo à partir de la requête que tu veux
Do Until rstRequete.EOF
dbCourante.Execute ("insert into TTempo (No_Immatriculation, Code_Ventilation, Date_Debut, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris) values (""" & rstRequete!No_Immatriculation & """," & rstRequete!Code_Ventilation & ",""" & rstRequete!Date_Debut & """," & rstRequete!Montant_CA & ",""" & rstRequete!Tournee & """," & rstRequete!Distance_en_Kilometr & "," & rstRequete!SommeDePris & ")")
rstRequete.MoveNext
Loop
Set rstRequete = Nothing
'Désormais la table TTempo est alimentée et on va travailler maintenant avec elle
'On définit et ouvre une requête qui récupére No_Immatriculation, la Date_Debut et Code_Ventilation (= 1 ou 4) de tous les enregistrements classés par No_Immatriculation et Date_Debut
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut , Code_Ventilation from TTempo order by No_Immatriculation, Date_Debut")
'on initialise les variables
intLigne = 1
booBoucle = True
'On effectue une boucle (en partant du premier enregistrement de la requête jusqu'à la fin) - Quand on arrive en fin de requête (EOF - End Of File) on quitte la boucle
Do Until rstRequete.EOF
'On place un étiquette utile pour un Goto à venir
Boucle2:
'On exécute une requête de mise à jour
'Le champ Ligne de la table TTempo prend la valeur de intLigne quand l'enregistrement correspond à la valeur de No_Immatriculation et de Date_Debut de l'enregistrement de la requête rstRequête.
dbCourante.Execute ("update TTempo set Ligne=""" & intLigne & """ where No_Immatriculation=""" & rstRequete!No_Immatriculation & """ and CDate(Date_Debut)=""" & CDate(rstRequete!Date_Debut) & """")
'On passe à l'enregistrement suivant de la requête rstRequête
rstRequete.MoveNext
'Si booBoucle est à vrai...
If booBoucle = True Then
'... et si param de l'enregistrement de la requête vaut 'retour', alors...
If rstRequete!Code_Ventilation = 4 Then
'booBoucle passe à faux pour ne pas retourner indéfiniment à Boucle2
booBoucle = False
'On retourne à Boucle2 pour mettre la même valeur intLigne à l'enregistrement suivant
'Ainsi, un No_Immatriculation avec un Code_Ventilation à départ et retour avec des dates consécutives aura le même numéro de ligne intLigne
GoTo Boucle2
End If
End If
'On remet booBoucle à vrai
booBoucle = True
'On incrémente intLigne pour passer au No_Immatriculation suivant différent
intLigne = intLigne + 1
Loop
'On se déconnecte de la requête et de la base
Set rstRequete = Nothing
Set dbCourante = Nothing
End Sub
tournée est en texte
Sub TrierInfos()
'Définition des variables
Dim dbCourante As DAO.Database 'Pour la base
Dim rstRequete As DAO.Recordset 'Pour la requête
Dim intLigne As Integer 'Pour l'incrémentation des numéros de lignes
Dim booBoucle As Boolean 'Pour indiquer s'il faut refaire la mise à jour ou pas
'En cas d'erreur, on passe, on oublie le problème
On Error Resume Next
'La base de données correspond à la base courante actuellement ouverte
Set dbCourante = CurrentDb
'On vide la table temporaire TTempo
dbCourante.Execute ("delete * from TTempo")
'On définit la requête qui récupère les infos
'Volontairement j'ai mis NomRequête
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut, Code_Ventilation, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris from RST")
'On alimente la table TTempo à partir de la requête que tu veux
Do Until rstRequete.EOF
dbCourante.Execute ("insert into TTempo (No_Immatriculation, Code_Ventilation, Date_Debut, Montant_CA, Tournee, Distance_en_Kilometr, SommeDePris) values (""" & rstRequete!No_Immatriculation & """," & rstRequete!Code_Ventilation & ",""" & rstRequete!Date_Debut & """," & rstRequete!Montant_CA & ",""" & rstRequete!Tournee & """," & rstRequete!Distance_en_Kilometr & "," & rstRequete!SommeDePris & ")")
rstRequete.MoveNext
Loop
Set rstRequete = Nothing
'Désormais la table TTempo est alimentée et on va travailler maintenant avec elle
'On définit et ouvre une requête qui récupére No_Immatriculation, la Date_Debut et Code_Ventilation (= 1 ou 4) de tous les enregistrements classés par No_Immatriculation et Date_Debut
Set rstRequete = dbCourante.OpenRecordset("select No_Immatriculation, Date_Debut , Code_Ventilation from TTempo order by No_Immatriculation, Date_Debut")
'on initialise les variables
intLigne = 1
booBoucle = True
'On effectue une boucle (en partant du premier enregistrement de la requête jusqu'à la fin) - Quand on arrive en fin de requête (EOF - End Of File) on quitte la boucle
Do Until rstRequete.EOF
'On place un étiquette utile pour un Goto à venir
Boucle2:
'On exécute une requête de mise à jour
'Le champ Ligne de la table TTempo prend la valeur de intLigne quand l'enregistrement correspond à la valeur de No_Immatriculation et de Date_Debut de l'enregistrement de la requête rstRequête.
dbCourante.Execute ("update TTempo set Ligne=""" & intLigne & """ where No_Immatriculation=""" & rstRequete!No_Immatriculation & """ and CDate(Date_Debut)=""" & CDate(rstRequete!Date_Debut) & """")
'On passe à l'enregistrement suivant de la requête rstRequête
rstRequete.MoveNext
'Si booBoucle est à vrai...
If booBoucle = True Then
'... et si param de l'enregistrement de la requête vaut 'retour', alors...
If rstRequete!Code_Ventilation = 4 Then
'booBoucle passe à faux pour ne pas retourner indéfiniment à Boucle2
booBoucle = False
'On retourne à Boucle2 pour mettre la même valeur intLigne à l'enregistrement suivant
'Ainsi, un No_Immatriculation avec un Code_Ventilation à départ et retour avec des dates consécutives aura le même numéro de ligne intLigne
GoTo Boucle2
End If
End If
'On remet booBoucle à vrai
booBoucle = True
'On incrémente intLigne pour passer au No_Immatriculation suivant différent
intLigne = intLigne + 1
Loop
'On se déconnecte de la requête et de la base
Set rstRequete = Nothing
Set dbCourante = Nothing
End Sub
29 mai 2007 à 22:22
mais kan je met fermer ca met que le programme ne repond pas