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.
Si ma table HISTORIQUE2008 est vide, la mise en historique se passe à merveille !
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
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 !!!
Partager