Trier des enregistrements sur ACCESS

Fermé
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007 - 23 mai 2007 à 15:36
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007 - 29 mai 2007 à 22:22
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

EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
25 mai 2007 à 14:31
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
29 mai 2007 à 22:22
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
blux Messages postés 26023 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 6 mai 2024 3 289
23 mai 2007 à 15:50
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
23 mai 2007 à 16:02
ben je cherche plutot a additionner 2 lignes est ce que tu serais me donner la voie a prendre ?
0
EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
23 mai 2007 à 16:17
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
23 mai 2007 à 16:20
merci pour ta réponse mais la difference entre 2 dates peut etre aléatoire comment je pe faire ?
0
blux Messages postés 26023 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 6 mai 2024 3 289
24 mai 2007 à 08:38
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
fanchichon29
24 mai 2007 à 09:34
tu peux m' expliquer en détail car je suis un peu un novice
0
EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
24 mai 2007 à 09:59
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
blux Messages postés 26023 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 6 mai 2024 3 289
24 mai 2007 à 10:14
- 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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
24 mai 2007 à 11:47
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
EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
24 mai 2007 à 12:00
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
24 mai 2007 à 14:25
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
EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
24 mai 2007 à 17:14
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
25 mai 2007 à 11:31
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
EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
25 mai 2007 à 11:49
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
25 mai 2007 à 12:08
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
25 mai 2007 à 12:14
Code_Ventilation > 2_Cdes_Mvts_Emballag
Date_Debut > 2_Tournees1
No_Immatriculatio> 2_Vehicules
0
EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
25 mai 2007 à 12:20
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
25 mai 2007 à 12:33
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
25 mai 2007 à 15:38
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
EBasta Messages postés 37 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 25 mai 2007 31
25 mai 2007 à 16:20
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
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
25 mai 2007 à 17:13
ca met rien mais cé long et ca fait rien
quand je met fermer ca me met le programme ne repond pas ??
0
fanchichon29 Messages postés 45 Date d'inscription mercredi 16 mai 2007 Statut Membre Dernière intervention 6 juin 2007
29 mai 2007 à 09:40
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