Réinitialisation date VBA access

alamarqu Messages postés 4 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 8 mars 2006 - 7 mars 2006 à 11:03
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 - 8 mars 2006 à 10:53
Pour des mouvements sur ma base access, je souhaite insérer un attribut date qui donne la date et l'heure de mouvements (en fonction de la date système)
Pour cela, mon attribut fait référence à un code VBA:


Code:
,
----

Option Compare Database
Dim résultat
Public Function date_actuelle()
résultat = Now
date_actuelle = résultat
End Function

Seulement, la date change automatiquement pour des mouvements antérieurs à mes nouveaux enregistrements dans la base.

Alors, j'ai rajouté ceci qui modifie la date pour les changements ici sur un champ stock_actuel (ainsi, tous les enregistrements antérieurs gardent leur date de modification.

Option Compare Database
Dim résultat As Date

Public Function date_actuelle(stock_actuel As Variant) As Date If IsNull(stock_actuel) True Then résultat Now
date_actuelle = résultat
End Function

Mais, la solution que j'ai trouvé ne fonctionne pas complètement à la fermeture et la réouverture de la requête.
En effet, même si sur deux enregistrements successifs la date et l'heure sont bien différentes, à la réouverture, tous les enregistrements sont réinitialisés à la valeur de date et heure de la réouverture, alors que le champ (stock_actuel) est rempli (condition if non respectée). Comment éviter que la base les réinitialisent.
Merci de vos réponses.

9 réponses

Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
7 mars 2006 à 14:51
Je ne comprend pas bien ton problème. [stock_actuel] est un champ de quel type? par ailleurs, pourquoi ne pas mettre directement "Now" comme valeur par defaut sur le champ [date_actuelle] de ta table?
0
alamarqu Messages postés 4 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 8 mars 2006
7 mars 2006 à 15:13
[Stock actuel] est de type variant car il peut être single lorsque les champs entrée et sortie sont renseignés ou null lorsqu'ils ne le sont pas.
Aussi, sur mes enregistrements, je veux la date et l'heure chaque mouvement (entrée, sortie,...) qui se répercute forcément sur le même champ [Stock actuel] .
Seulement, si je n'impose pas de condition quant à l'exécution du Now, la date et l'heure vont être mis à jour en permanence.
C'est pourquoi, j'ai imposé par une structure conditionelle d'appliquer le Now lorsque [stock actuel] est null (me protège les lignes avec le stock actuel renseigné en gardant la date effective de modification).
Seulement, VBA n'en tient pas cas dans le cas de la fermeture et la réouverture de ma requête, puisqu'il me réinitialise tous les enregistrements à la valeur de date et heure système de réouverture.
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
7 mars 2006 à 15:45
Je ne comprends toujours pas pourquoi ta date change. Tu as basé ton code de mise à jour sur quel événement? Comment est structuré ton formulaire (peux-tu faire une image pour nous donner une idée?)
Humm! Je crois avoir compris, en fait en même temps que je t'écrivais, j'essayais de m'imaginais ton appli. Si c'est ce que je crois, ton problème n'est pas situé au niveau d'un formulaire comme je le croyais au départ, mais au niveau d'une requête de mise à jour sur laquelle tu fais référence à une fonction pour la mise à jour.
Si c'est bien cela, alors il est normal que cela ne fonctionne pas! Puisque c'est la requête qui met à jour tous les enregistrements qu'elle recense. Ce n'est pas au niveau de ta fonction qu'il faut que tu mettes ton contrôle mais au niveau de ta requête elle-même.
écrit ta requête SQL sur le forum, peut être trouvera t on une solution
0
alamarqu Messages postés 4 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 8 mars 2006
7 mars 2006 à 15:57
voici ma requête en mode SQL

SELECT [Entrées/Sorties de stock].[CODE INTERNE], [Entrées/Sorties de stock].Numéro_de_mvt, [Entrées/Sorties de stock].[Entrée de stock], [Entrées/Sorties de stock].[Sortie de stock], [Entrées/Sorties de stock].Inventaire, calcul_stock_actuel([Entrées/Sorties de stock].[Entrée de stock],[Entrées/Sorties de stock].[Sortie de stock],[Entrées/Sorties de stock].Inventaire) AS Stockactuel, date_actuelle([Stockactuel]) AS Date_de_modif

Pour info (pas utile par rapport à mon pb), voici le code de l'autre fonction utilisée pour le calcul du champ [Stock actuel]

Option Compare Database
Dim entrée As Variant
Dim sortie As Variant
Dim inventaire As Variant
Dim résultat As Variant


Function calcul_stock_actuel(entrée As Variant, sortie As Variant, inventaire As Variant) As VariantIf IsNull(inventaire) True And IsNull(sortie) True Then résultat = entréeIf IsNull(inventaire) True And IsNull(entrée) True Then résultat = sortieIf IsNull(inventaire) True And IsNull(entrée) False And IsNull(sortie) = False Then résultat = entrée - sortieIf IsNull(inventaire) False Then résultat inventaire


calcul_stock_actuel = résultat
End Function

En passant, merci de votre aide.
0

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

Posez votre question
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
7 mars 2006 à 17:20
ok. bon je confirme, en l'état, il s'agit d'un simple requête de sélection sur laquelle tu applique pour le champ [Stockactuel] la valeur d'une fonction appelé "date_actuelle".
Ma question est à quoi te sert cette requête? Je m'explique un peut mieux, as tu besoins de cette requête dans l'affichage d'un formulaire, d'un Etat ou autres.
En général lorsque je fait des champs [date MAJ] dans mes bases, je les modifies au travers des formulaires de l'application en affectant un code vba sur l'évennement "après MA...." par exemple. Ce qui à pour effet de modifier la valeur du champ [date MAJ] de l'enregistrement courant dans le formulaire en question.
Si tu ne souhaite pas mettre ces champs dans ton formulaire, il est aussi possible de modifier le champ soit en créant un deuxième recordset filtré sur l'enregistrement courant du formulaire ou encore de créer toujours sous vba une requête sql de type

SQL=" UPDATE [MaTable].MonchampRef SET [MaTable].DateMAJ = Now() " & _
" WHERE ((( [MaTable].MonchampRef )=[Formulaires]![MonForm]![MonchampRef])); "
CurrentDb.Execute SQL
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
7 mars 2006 à 17:41
Sinon juste pour ta fonction de calcul, perso je l'aurais ecrit plutôt comme ça:

Function calcul_stock_actuel(entrée As Variant, sortie As Variant, inventaire As Variant) As Variant
Dim résultat As Variant


If IsNull(inventaire) Then
If IsNull(sortie) And Not IsNull(entrée) Then
résultat = entrée
ElseIf IsNull(entrée) And Not IsNull(sortie) Then
résultat = sortie
ElseIf Not IsNull(entrée) And Not IsNull(sortie) Then
résultat = entrée - sortie
End If
Else:
résultat = inventaire
End If
calcul_stock_actuel = résultat
End Function

C'est la même chose mais je trouve ça plus facile à lire et a déchiffrer (mais c'est une question de gouts)
0
alamarqu Messages postés 4 Date d'inscription lundi 20 février 2006 Statut Membre Dernière intervention 8 mars 2006
8 mars 2006 à 09:28
Bonjour,

Merci Tuning Max de tes réponses.
En effet, je souhaite afficher ces champs dans un formulaire attaché: je dois donc créer un code événement avant MAJ, mais comment? par générateur d'expression ou de code?
Je m'explique: si je procède de cette manière pour la fonction now, je peux peut-être faire la même chose pour le calcul de mon stock actuel; mais comment insérer le code que j'ai envoyé à ce sujet et faire en sorte que le résultat du stock actuel soit pris celui du calcul à partir des valeurs d'entrée, sortie, inventaires présentes sur le formulaire?
Je n'ai jamais procéder de cette manière, et il est vrai que cela pourrait me simplifier les calculs sans avoir à générer des requêtes juste pour cela.
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
8 mars 2006 à 10:49
En fait ce n'est pas très compliqué. Si j'ai bien compris la situation, dans les propriétés de ton formulaire (pas des champs mais du formulaire directement), sur l'onglet "Evénement" et à la ligne "Après MAJ..." lorsque tu clique sur le petit bouton à droite de la ligne en question, tu dois avoir une boîte de dialogue comme ci-dessous:

Tu choisis alors "Générateur de code" pour ouvrir la fenêtre de code vba avec le code événement comme ci-dessous
Private Sub Form_AfterUpdate()

End Sub

il ne te reste plus qu'a inscrire le code que tu souhaite un peu comme ça:
Private Sub Form_AfterUpdate()
On error resume next ' Gère les erreures qui pourrait survenir
Me![Mon_Champ_Date_MAJ] = Now ' "Me" fait reference au formulaire en cours d'utilisation et Now est une fonction prédéfinis de vb qui donne la date et l'heure actuelle

End Sub

Voilà un exemple simple qui mettra à jour automatiquement le champ [Mon_Champ_Date_MAJ] de l'enregistrement en cours sur le formulaire, après chaque mise à jour du recordset
0
Tuning Max Messages postés 314 Date d'inscription mercredi 15 juin 2005 Statut Membre Dernière intervention 31 août 2006 1
8 mars 2006 à 10:53
A oui j'oublié, pour l'appel d'une fonction, rien de plus simple,
Private Sub Form_AfterUpdate()
On error resume next ' Gère les erreures qui pourrait survenir
Me![Mon_Champ_Date_MAJ] = Now ' "Me" fait reference au formulaire en cours d'utilisation et Now est une fonction prédéfinis de vb qui donne la date et l'heure actuelle

Me![Mon_Champ_Volume] = calcul_stock_actuel(Valeur entrée, Valeur sortie, Valeur)
End Sub
0
Rejoignez-nous