Trier des enregistrements sur ACCESS
fanchichon29
Messages postés
45
Statut
Membre
-
fanchichon29 Messages postés 45 Statut Membre -
fanchichon29 Messages postés 45 Statut Membre -
bonjour , je cherche a trier des données ligne par ligne: c' est une peu complexe :
ex:
15 AP 29 1789 € 10/03/2007 1 départ
15 AP 29 600€ 12/03/2007 4 retour
15 AP 29 1400€ 15/03/2007 1 départ
15 AP 29 500€ 17/03/2007 4 retour
18 WP 29 1300€ 11/03/2007 1 départ
18 WP 29 600€ 13/03/2007 4 retour
...
dans ma requète je souhaiterais rassembler chaque départ avec son retour pour la méme immatriculation ex:
15 AP 29 1789+600
15 AP 29 1400+500
18 WP 29 1300+600
ca peut paraitre assez complexe mais ca fait des semaines que je me creuse sur ce probléme. J' en commence à en avoir mal au crane aidez moi ...
ex:
15 AP 29 1789 € 10/03/2007 1 départ
15 AP 29 600€ 12/03/2007 4 retour
15 AP 29 1400€ 15/03/2007 1 départ
15 AP 29 500€ 17/03/2007 4 retour
18 WP 29 1300€ 11/03/2007 1 départ
18 WP 29 600€ 13/03/2007 4 retour
...
dans ma requète je souhaiterais rassembler chaque départ avec son retour pour la méme immatriculation ex:
15 AP 29 1789+600
15 AP 29 1400+500
18 WP 29 1300+600
ca peut paraitre assez complexe mais ca fait des semaines que je me creuse sur ce probléme. J' en commence à en avoir mal au crane aidez moi ...
A voir également:
- Trier des enregistrements sur ACCESS
- Comment trier par ordre alphabétique sur excel - Guide
- Logiciel pour trier les photos automatiquement - Guide
- Access appdata - Guide
- Acer quick access - Forum logiciel systeme
- Excel trier par date ne fonctionne pas ✓ - Forum Excel
23 réponses
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à !
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...
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
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
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 ?
- 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...
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
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);
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à !
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 =????
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 !
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 ?
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...
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
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 ??
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 ?
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 ??
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
mais kan je met fermer ca met que le programme ne repond pas