Trier des enregistrements sur ACCESS

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 ...

23 réponses

Résumé de la discussion

Le sujet porte sur le tri des données ligne par ligne et l’agrégation des départs et retours pour la même immatriculation, 15 AP 29 1789+600 et 15 AP 29 1400+500. Des solutions Access proposent une table temporaire TTempo et une requête qui récupère les enregistrements, puis un script VBA qui alimente TTempo et met à jour le champ Ligne pour regrouper départ et retour. D’autres répondants indiquent qu’il faut adapter les noms de champs (No_Immatriculation, Date_Debut, Code_Ventilation), traiter les dates avec CDate et gérer les cas où les dates varient ou sont imprécises. En parallèle, certains suggèrent de simplifier en considérant un tuple de deux dates par immatriculation et d’ajouter les départs isolés au retour suivant pour éviter les écarts.

Bobot (l’IA à votre service)
  1. 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.

    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à !
    1
    1. tu peux m aider s il te plait . en fait ca fait rien
      mais kan je met fermer ca met que le programme ne repond pas
      0
  2. Modérateur
    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...
    0
    1. ben je cherche plutot a additionner 2 lignes est ce que tu serais me donner la voie a prendre ?
      0
      1. 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 !
        0
        1. merci pour ta réponse mais la difference entre 2 dates peut etre aléatoire comment je pe faire ?
          0
          1. Modérateur
            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
            0
            1. tu peux m' expliquer en détail car je suis un peu un novice
              0
              1. 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...

                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 ?
                0
            2. Modérateur
              - 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 :
              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...
              0
              1. 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
                0
                1. 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);
                  0
                2. 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 ?
                  0
              2. Voici le code VBA corrigé et expliqué :

                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à !
                0
                1. 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 =????
                  0
                  1. 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,
                    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 !
                    0
                    1. 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 ?
                      0
                      1. Code_Ventilation > 2_Cdes_Mvts_Emballag
                        Date_Debut > 2_Tournees1
                        No_Immatriculatio> 2_Vehicules
                        0
                        1. 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...
                          0
                          1. comment je fais pour creer cette table temporaire ?
                            excuse moi de te faire perdre ton temps mais tu es le seul à pouvoir m' aider
                            0
                            1. 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 ??
                              0
                              1. 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.

                                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 ?
                                0
                                1. ca met rien mais cé long et ca fait rien
                                  quand je met fermer ca me met le programme ne repond pas ??
                                  0
                                  1. 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
                                    0
                                    • 1
                                    • 2