Bonsoir le forum !

Je viens faire appel à vos lumières à propos de mon code en vba pour access.

Explication de la situation :
J'ai une base de données qui entre autre permet d'établir une facture mensuelle. Et pour des raisons d'analyse, je voudrais mettre cette facture en historique tous les mois.

Le code ci-dessous traite une table HISTORIQUE2008 qui comme son nom l'indique stock les différentes factures, et une requête FACTURE_MENSUELLE qui contient de nouvelles données tous les mois.

A savoir : la première procédure appelée demande à l'utilisateur la date de fin de mois qu'il souhaite traiter, et comme elle est déclarée en global, je la récupère dans ce code.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 
Sub MISE_EN_HISTORIQUE()
 
Call COUT_POSTE                                     'Appel de la fonction COUT_POSTE afin de mettre à jour la requête FACTURE_MENSUELLE
 
'Déclarations des variables permettant de remplir la table HISTORIQUE2008
Dim num_parc As String                              'Numéro du parc informatique
Dim numero_uti As String                            'Numéro d'utilisateur
Dim domaine As String                               'Domaine du bien
Dim categorie As String                             'Type du bien
Dim marq As String                                  'Marque du bien
Dim model As String                                 'Modèle du bien
Dim location As Double                              'Coût de la location
Dim service As Double                               'Coût du service
Dim maintenance As Double                           'Coût de la maintenance
Dim logiciel As Double                              'Coût du logiciel
Dim nom_uti As String                               'Nom de l'utilisateur
Dim num_section As String                           'Section analytique du bien
Dim date_comparaison As String                      'Cette variable va permettre d'utiliser la fonction find (utilisable seulement avec une chaîne de caractères (et non une date)
                                                    'Cela va permettre de vérifier que la date saisie n'est pas déjà en historique
 
 
'Déclarations des objets en recordset
'Un recordset correspond à l'image d'une table
Dim FACTURE_MENSUELLE As New ADODB.Recordset
Dim HISTORIQUE2008 As New ADODB.Recordset
 
 
'Ouverture des recordsets
FACTURE_MENSUELLE.Open "FACTURE_MENSUELLE", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
HISTORIQUE2008.Open "HISTORIQUE2008", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
 
'Transfert de la date saisie dans la variable texte date_comparaison
date_comparaison = date_fin_saisie
 
'Test pour voir si la date demandée n'est pas déjà en historique
HISTORIQUE2008.Find (date_comparaison)          'Recherche dans la table HISTORIQUE2008 l'éventuelle présence de la date de fin de mois saisie
 
 
If HISTORIQUE2008.EOF Then                      'Si cette date n'existe pas déjà dans la table HISTORIQUE2008, on peut passer à la mise en historique
    FACTURE_MENSUELLE.MoveFirst                 'Positionnement sur le premier enregistrement de la requête FACTURE_MENSUELLE
    Do Until FACTURE_MENSUELLE.EOF              'Jusqu'à la fin de la requête
 
        'Début du traitement de ligne de la requête FACTURE_MENSUELLE : Récolte des données
        'Récupération des valeurs de la requête FACTURE_MENSUELLE pour les mettre dans les variables afin de remplir la table HISTORIQUE2008
        num_parc = FACTURE_MENSUELLE![num_parc]                     'Copie du numéro de parc informatique de la table FACTURE_MENSUELLE vers la variable num_parc qui va permettre de remplir la table HISTORIQUE2008
        numero_uti = FACTURE_MENSUELLE![numero_uti]                 'Copie du numéro d'utilisateur de la table FACTURE_MENSUELLE vers la variable numero_uti qui va permettre de remplir la table HISTORIQUE2008
        domaine = FACTURE_MENSUELLE![domaine]                       'Copie du domaine du bien de la table FACTURE_MENSUELLE vers la variable domaine qui va permettre de remplir la table HISTORIQUE2008
        categorie = FACTURE_MENSUELLE![categorie]                   'Copie du type de bien de la table FACTURE_MENSUELLE vers la variable categorie qui va permettre de remplir la table HISTORIQUE2008
        marq = FACTURE_MENSUELLE![marq]                             'Copie de la marque du bien de la table FACTURE_MENSUELLE vers la variable marq qui va permettre de remplir la table HISTORIQUE2008
        model = FACTURE_MENSUELLE![model]                           'Copie du modèle du bien de la table FACTURE_MENSUELLE vers la variable model qui va permettre de remplir la table HISTORIQUE2008
        location = FACTURE_MENSUELLE![location]                     'Copie du coût de location du bien de la table FACTURE_MENSUELLE vers la variable location qui va permettre de remplir la table HISTORIQUE2008
        service = FACTURE_MENSUELLE![service]                       'Copie du coût du service du bien de la table FACTURE_MENSUELLE vers la variable service qui va permettre de remplir la table HISTORIQUE2008
        maintenance = FACTURE_MENSUELLE![maintenance]               'Copie du coût de la maintenance du bien de la table FACTURE_MENSUELLE vers la variable maintenance qui va permettre de remplir la table HISTORIQUE2008
        logiciel = FACTURE_MENSUELLE![logiciel]                     'Copie du coût des logiciels de la table FACTURE_MENSUELLE vers la variable logiciel qui va permettre de remplir la table HISTORIQUE2008
        nom_uti = FACTURE_MENSUELLE![nom_uti]                       'Copie du nom d'utilisateur du bien de la table FACTURE_MENSUELLE vers la variable nom_uti qui va permettre de remplir la table HISTORIQUE2008
        num_section = FACTURE_MENSUELLE![num_section]               'Copie de la section analytique de la table FACTURE_MENSUELLE vers la variable num_section qui va permettre de remplir la table HISTORIQUE2008
 
 
        'Les données ont toutes été récoltées, donc il ne reste plus qu'à les saisir
        'Écriture des données récoltées dans le recordset COUT_PAR_POSTE
        HISTORIQUE2008.AddNew                                   'On ajoute une ligne au recordset COUT_PAR_BIEN
        HISTORIQUE2008![date_historique] = date_fin_saisie      'On écrit la valeur du champ date de mise en historique
        HISTORIQUE2008![num_parc_historique] = num_parc         'On écrit la valeur du champ numéro de parc informatique
        HISTORIQUE2008![numero_uti_historique] = numero_uti     'On écrit la valeur du champ numéro d'utilisateur
        HISTORIQUE2008![domaine_historique] = domaine           'On écrit la valeur du champ domaine du bien
        HISTORIQUE2008![categorie_historique] = categorie       'On écrit la valeur du champ type du bien
        HISTORIQUE2008![marq_historique] = marq                 'On écrit la valeur du champ marque du bien
        HISTORIQUE2008![model_historique] = model               'On écrit la valeur du champ modèle du bien
        HISTORIQUE2008![location_historique] = location         'On écrit la valeur du champ coût de la location
        HISTORIQUE2008![service_historique] = service           'On écrit la valeur du champ coût du service
        HISTORIQUE2008![maintenance_historique] = maintenance   'On écrit la valeur du champ coût de la maintenance
        HISTORIQUE2008![logiciel_historique] = logiciel         'On écrit la valeur du champ coût du logiciel
        HISTORIQUE2008![nom_uti_historique] = nom_uti           'On écrit la valeur du champ nom de l'utilisateur
        HISTORIQUE2008![num_section_historique] = num_section   'On écrit la valeur du champ numéro de section analytique
        HISTORIQUE2008.Update                                   'Cette ligne retranscrit le recordset dans la réelle table
 
 
        FACTURE_MENSUELLE.MoveNext                              'Positionnement sur l'enregistrement suivant dans la requête FACTURE_MENSUELLE
 
    Loop
 
Else
 
        MsgBox ("La date de mise en historique saisie existe déjà dans la table Historique2008 !")
 
End If
 
 
'Fermeture des recordsets
HISTORIQUE2008.Close
FACTURE_MENSUELLE.Close
 
End Sub
Si ma table HISTORIQUE2008 est vide, la mise en historique se passe à merveille !
Par contre, lorsqu'il y a déjà des données, la vérification de prééxistance ne fonctionne pas et fait planter Access...
(Je souhaite vérifier à chaque lancement de ce code que la mise en historique n'a pas déjà été faite pour la date demandée)

Quelqu'un a-t-il une idée à me soumettre ?

Merci beaucoup pour votre aide si précieuse !!!