Trier des enregistrements sur ACCESS

fanchichon29 Messages postés 46 Date d'inscription   Statut Membre -  
fanchichon29 Messages postés 46 Date d'inscription   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 ...

23 réponses

  • 1
  • 2
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. EBasta Messages postés 37 Statut Membre 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.

    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. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
       
      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. blux Messages postés 2060 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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
  3. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    ben je cherche plutot a additionner 2 lignes est ce que tu serais me donner la voie a prendre ?
    0
  4. EBasta Messages postés 37 Statut Membre 31
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    merci pour ta réponse mais la difference entre 2 dates peut etre aléatoire comment je pe faire ?
    0
  7. blux Messages postés 2060 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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
  8. fanchichon29
     
    tu peux m' expliquer en détail car je suis un peu un novice
    0
    1. EBasta Messages postés 37 Statut Membre 31
       
      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
  9. blux Messages postés 2060 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    - 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
  10. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    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. EBasta Messages postés 37 Statut Membre 31
       
      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. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
       
      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
  11. EBasta Messages postés 37 Statut Membre 31
     
    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
  12. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    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
  13. EBasta Messages postés 37 Statut Membre 31
     
    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
  14. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    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
  15. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    Code_Ventilation > 2_Cdes_Mvts_Emballag
    Date_Debut > 2_Tournees1
    No_Immatriculatio> 2_Vehicules
    0
  16. EBasta Messages postés 37 Statut Membre 31
     
    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
  17. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    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
  18. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    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
  19. EBasta Messages postés 37 Statut Membre 31
     
    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
  20. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    ca met rien mais cé long et ca fait rien
    quand je met fermer ca me met le programme ne repond pas ??
    0
  21. fanchichon29 Messages postés 46 Date d'inscription   Statut Membre
     
    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