Code VBA pour report de données d'une année vers une autre

Signaler
-
Messages postés
13932
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 janvier 2021
-
Bonjour à tous,

J'ai un petit soucis avec ma base de donnée Access (Access 2003), et je vais avoir besoin d'aide...

Tous les ans je dois reporter des interventions préventive d'une année sur une autre, selon la périodicité.

J'ai une table qui s'appelle "planning préventif" avec les champs suivants

N° BTP
Semaine interv (avec cadencement de plusieurs semaine pour certains BTP)
Année interv
soldé interv
date de fin du BTP

J'ai une requête "Report preventif" (avec les mêmes champs que la table "planning préventif") afin de pouvoir reporter tous les BTP sur les années suivantes selon leurs périodicités.

Le code VBA ci-dessous ne fonctionne pas très bien, car il ne reporte pas tous cadencements... certains passe dans les mailles du filet et je ne sais pas pourquoi !

Au lieu de reporter 2314 cadencement au total, il n'en reporte que 1706, ce qui fait une différence de 608.


Option Compare Database
Option Explicit

Private Sub CmdReportBTP_Click()
Dim db As Database
Dim rsScan As DAO.Recordset
Dim rsPlan As DAO.Recordset
Dim machine As String
Dim annee As Integer
Dim semaines() As Integer
Dim numeros() As Integer
Dim i As Integer
Dim anneeReport As Integer

anneeReport = InputBox("Saisir l'année de report :")

Set db = CurrentDb
Set rsScan = db.OpenRecordset("report_preventif", dbOpenSnapshot)
Set rsPlan = db.OpenRecordset("Planning preventif", dbOpenDynaset)
i = 1
If rsScan.BOF = True And rsScan.EOF = True Then
MsgBox "Aucun enregistrement", vbCritical
Exit Sub
End If

machine = rsScan.Fields("code machine").Value
annee = rsScan.Fields("année interv").Value

Do While rsScan.EOF = False

If rsScan.Fields("code machine").Value = machine And rsScan.Fields("année interv").Value = annee Then
If annee <= anneeReport Then
rsPlan.AddNew
rsPlan.Fields("N° BTP").Value = rsScan.Fields("N° BTP").Value
rsPlan.Fields("Semaine interv").Value = rsScan.Fields("Semaine interv").Value
rsPlan.Fields("année interv").Value = annee + rsScan.Fields("périodicité").Value
rsPlan.Fields("soldée interv").Value = False
rsPlan.Update
End If
annee = rsScan.Fields("année interv").Value
End If

rsScan.MoveNext
'Ajouter le test si on est pas en EOF
If Not rsScan.EOF Then
If rsScan.Fields("code machine").Value <> machine Then annee = rsScan.Fields("année interv").Value
machine = rsScan.Fields("code machine").Value

End If
Loop
rsScan.Close
rsPlan.Close
Set rsScan = Nothing
Set rsPlan = Nothing

MsgBox "Report des BTP effectué avec succès"

End Sub


Voila! Est-ce que quelqu'un pourrais éventuellement m'aider à résoudre ce petit problème, car moi avec mon petit niveaux je n'y arriverai pas...

Merci d'avance à tous et bonne année !

4 réponses

Messages postés
15519
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
16 janvier 2021
1 434
Bonjour,

Mettre un point d'arret sue cette ligne:

If rsScan.Fields("code machine").Value = machine And rsScan.Fields("année interv").Value = annee Then

Verifiez le contenu des variables precedent cette ligne.
Pour verifier, passez le curseur souris sur les variables
Si ok, appuyez sur la touche F8 pour faire derouler le code ligne par ligne en verifiant a chaque fois le contenu de vos variables
Bonjour f894009,

Merci pour ton commentaire et désolé, pour ma réponse tardive... autres soucis à régler...

Aussi, j'ai oublié de préciser que j'ai une table "preventif" avec les champs suivants :

Code machine
Année interv
Semaine interv
N° BTP
périodicité

J'ai déjà réalisé plusieurs fois des arrêts sur cette lignes, et les variables "machine" et "annee" recopie bien les bonnes valeurs.

Mais certaines lignes sont ignorées ! et je n'arrive pas à trouver la cause !

Est-ce un couac dans le code ou est-ce la requête "Report preventif" ?

Merci pour ton aide :)
Messages postés
13932
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 janvier 2021
784
bonjour, nous as-tu dit combien de lignes étaient affichées quand tu ouvrais la requête "Report preventif" ?
Bonjour yg_be,

12627 lignes
Messages postés
13932
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 janvier 2021
784
voilà ce que je retiens de ton code:
anneeReport = InputBox("Saisir l'année de report :")
Set rsScan = db.OpenRecordset("report_preventif", dbOpenSnapshot)
Set rsPlan = db.OpenRecordset("Planning preventif", dbOpenDynaset)
machine = rsScan.Fields("code machine").Value
annee = rsScan.Fields("année interv").Value
Do While rsScan.EOF = False
	If rsScan.Fields("code machine").Value = machine And rsScan.Fields("année interv").Value = annee Then
		If annee <= anneeReport Then
			rsPlan.AddNew
		End If
		annee = rsScan.Fields("année interv").Value
	End If
	rsScan.MoveNext
	If Not rsScan.EOF Then
		If rsScan.Fields("code machine").Value <> machine Then annee = rsScan.Fields("année interv").Value
		machine = rsScan.Fields("code machine").Value
	End If
Loop


je crois deviner que la requete report_preventif classe les données par machine puis par année.
si je comprends ton code, il ne traite pas, pour chaque machine, le premier enregistrement de chaque année, sauf pour la première année.
ton code me semble particulièrement maladroit.
entr'autres, pourquoi tester "rsScan.Fields("code machine").Value = machine", je pense qu'il est toujours vrai.
Messages postés
13932
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 janvier 2021
784
peux-tu utiliser les balises de code quand tu partages to code:https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Option Compare Database
Option Explicit

Private Sub CmdReportBTP_Click()
Dim db As Database
Dim rsScan As DAO.Recordset
Dim rsPlan As DAO.Recordset
Dim machine As String
Dim annee As Integer
Dim semaines() As Integer
Dim numeros() As Integer
Dim i As Integer
Dim anneeReport As Integer

anneeReport = InputBox("Saisir l'année de report :")

Set db = CurrentDb
Set rsScan = db.OpenRecordset("report_preventif", dbOpenSnapshot)
Set rsPlan = db.OpenRecordset("Planning preventif", dbOpenDynaset)
i = 1
If rsScan.BOF = True And rsScan.EOF = True Then
    MsgBox "Aucun enregistrement", vbCritical
    Exit Sub
End If

machine = rsScan.Fields("code machine").Value
annee = rsScan.Fields("année interv").Value

Do While rsScan.EOF = False
    
    If rsScan.Fields("code machine").Value = machine And rsScan.Fields("année interv").Value = annee Then
        If annee <= anneeReport Then
            rsPlan.AddNew
            rsPlan.Fields("N° BTP").Value = rsScan.Fields("N° BTP").Value
            rsPlan.Fields("Semaine interv").Value = rsScan.Fields("Semaine interv").Value
            rsPlan.Fields("année interv").Value = annee + rsScan.Fields("périodicité").Value
            rsPlan.Fields("soldée interv").Value = False
            rsPlan.Update
        End If
        annee = rsScan.Fields("année interv").Value
    End If
    
    rsScan.MoveNext
    'Ajouter le test si on est pas en EOF
    If Not rsScan.EOF Then
        If rsScan.Fields("code machine").Value <> machine Then annee = rsScan.Fields("année interv").Value
        machine = rsScan.Fields("code machine").Value
        
    End If
Loop
rsScan.Close
rsPlan.Close
Set rsScan = Nothing
Set rsPlan = Nothing

MsgBox "Report des BTP effectué avec succès"

End Sub