Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/04/2011, 09h52   #1
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Récupérer la valeur d'un champ

Bonjour à tous,

Pourriez-vous me décrire la procédure VBA à utiliser dans un formulaire sur un événement du champ DateDoc pour:

-Récupérer la valeur d'un champ du dernier enregistrement, N°Simple
-Attribuer cette valeur + 1 au champ N°simple de l'enregistrement en création.

Merci à tous.

Marcel
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 20h49   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Tu peux essayer comme ça avec l'événement "sur entrée" du contrôle DateDoc :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub DateDoc_Enter()
Dim lgNumMax As Long
Dim lgNumEnCours As Long
 
' Si l'enregistrement en cours est un nouvel enregistrement
If Me.NewRecord = True Then
   ' Lit la valeur du champ N°Simple de l'enregistrement en cours
   ' et remplace Null par zéro
   lgNumEnCours = Nz(Me.[N°Simple], 0)
   ' Si la valeur est zéro
   If lgNumEnCours = 0 Then
      ' Lire la valeur max du champ N°Simple
      lgNumMax = Nz(DMax("[N°Simple]", "Nom de la Table"), 0)
      ' Affecter cette valeur + 1 au champ N°Simple
      Me.[N°Simple] = lgNumMax + 1
   End If
End If
End Sub
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/04/2011, 23h09   #3
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Récupérer la valeur d'un champ

Bonsoir LedZeppII,

J'ai décortiqué et testé en très peu de temps.
Cela à l'air de fonctionner du tonnerre.
Je ne connaissais pas cette fonction Dmax, et n'aurais pas pensé à évaluer si je suis positionné sur un nouvel enregistrement.
Vu que N°Simple, ne peut jamais être null, je pense que je n'aurais pas besoin de Nz pour attribuer la valeur à lgNumMax. Je l'ai laissé, ça ne gêne quand même pas.
Dès lundi je commencerai mes enregistrements suivants, et après certitude du bon fonctionnement, je n'oublierai pas le tag "Résolu".

Un grand merci.

A+
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 15h01   #4
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonjour Marcello5255,

Tu peux aussi essayer de mettre le code dans l'événement formulaire "Si modification", au lieu de l'événement "sur entrée" du contrôle DateDoc.
Ainsi, dès que tu commence à écrire dans un contrôle ça déclenche l'exécution du code.
C'est ce qui doit se rapprocher le plus du comportement d'un champ NuméroAuto.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Form_Dirty(Cancel As Integer)
Dim lgNumMax As Long
Dim lgNumEnCours As Long
' Si l'enregistrement en cours est un nouvel enregistrement
If Me.NewRecord = True Then
   ' Lit la valeur du champ de l'enregistrement en cours
   ' et remplace Null par zéro
   lgNumEnCours = Nz(Me.[N°Cle], 0)
   ' Si la valeur est zéro
   If lgNumEnCours = 0 Then
      ' Lire la valeur max du champ
      lgNumMax = Nz(DMax("[N°Cle]", "tblClePerso"), 0)
      ' Affecter cette valeur + 1 au champ
      Me.[N°Cle] = lgNumMax + 1
   End If
End If
End Sub
A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2011, 04h53   #5
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Récupérer la valeur d'un champ

Bonjour LedZeppII

Je te confirme le bon fonctionnement de ton code.
Je m'accommoderais aussi bien de l'évènement ' Sur modification du formulaire'

Cependant, au lieu de
-la valeur maximale de tous les enregistrements de ma table,
j’aurais préféré récupérer
-la valeur du champ N°Simple du dernier enregistrement.

Je t’explique pourquoi :

Je constitue l’ID de mes factures de vente avec la concaténation FV/Année/N°simple + 1000.
J’inscrivais manuellement le N°simple

Pour la première facture de chaque année, j’attribue au N°simple + 1000, la valeur 1000
La facture FV/2010/1689 est ainsi classée avant la facture FV/2011/1100, et je garde au fil des années la même structure pour les ID, considérant que je ne ferai jamais plus de 9999 factures dans la même année.

Merci beaucoup pour ton aide.

Marcel.
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2011, 19h13   #6
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Voici une possibilité en ajoutant une restriction dans la fonction DMax, sur le champ [N°Facture], limitant à l'année en cours.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub Form_Dirty(Cancel As Integer)
Dim lgNumMax As Long
Dim lgNumEnCours As Long
' Si l'enregistrement en cours est un nouvel enregistrement
If Me.NewRecord = True Then
   ' Lit la valeur du champ de l'enregistrement en cours
   ' et remplace Null par zéro
   lgNumEnCours = Nz(Me.[N°simple], 0)
   ' Si la valeur est zéro
   If lgNumEnCours = 0 Then
      ' Lire la valeur max du champ pour l'année en cours
      lgNumMax = Nz(DMax("[N°simple]", "Nom de la Table", "[N°Facture] Like 'FV/" & Year(Date) & "/*'"), 1000)
      ' Affecter cette valeur + 1 au champ
      Me.[N°simple] = lgNumMax + 1
   End If
End If
End Sub
S'il n'y a aucun enregistrement pour l'année en cours ...
Code :
1
2
      ' Lire la valeur max du champ pour l'année en cours
      lgNumMax = Nz(DMax("[N°simple]", "Nom de la Table", "[N°Facture] Like 'FV/" & Year(Date) & "/*'"), 1000)
... DMax renvoie Null et Nz remplace Null par 1000.
Avec la ligne
Code :
1
2
      ' Affecter cette valeur + 1 au champ
      Me.[N°simple] = lgNumMax + 1
N°Simple commencera à 1001.

Sinon, s'il y a des enregistrements pour l'année en cours, N°Simple prendra la valeur du plus grand N°Simple de l'année en cours + 1.

Il me paraît préférable de procéder ainsi, car si on se contentait de prendre la valeur de N°Simple de l'enregistrement précédant, au moment du changement d'année ça ne fonctionnerait pas.
Ou bien il faudrait ajouter un test supplémentaire, pour vérifier que l'année de l'enregistrement précédant est la même que l'année en cours.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 23h42   #7
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Récupérer la valeur d'un champ

Tout bon LedZepp,

J'ai mis un peu de temps pour répondre parce que je devais tester le code et aussi essayer de le comprendre.

Au niveau des tests, j'ai même eu l'occasion de trouver et corriger une erreur.
Je t'avais renseigné la concaténation FV/Année/N° au lieu de FV Année/N°
Le N°simple renvoyé était donc 1001 au lieu de 258 à cause de FV/ au lieu de FV dans le code.

J'ai essayé sur DateDoc_Enter, et sur Form_Dirty. Les deux donnent le même et correct résultat.
Dans le critère, je saisis bien le renvoie de 1000 si champ Null
Par contre au niveau du masque, je crois comprendre que tu le places entre ' et ' mais je vois moins le sens des "
"[N°Facture] Like 'FV/" & Year(Date) & "/*'"),

J'ai consulté un tutoriel de Fabrice Constans, et le ferai encore si nécessaire.

Merci beaucoup pour ton aide.

A+

Marcel
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 19h52   #8
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Citation:
Envoyé par Marcello5255 Voir le message
Dans le critère, je saisis bien le renvoie de 1000 si champ Null
Par contre au niveau du masque, je crois comprendre que tu le places entre ' et ' mais je vois moins le sens des "
"[N°Facture] Like 'FV/" & Year(Date) & "/*'"),
C'est simplement de la syntaxe «chaîne de caractères littérale» SQL imbriquée dans de la syntaxe «chaîne de caractères littérale» Visual Basic.

Les trois arguments de la fonction DMax sont de type chaîne de caractères.
Au niveau Visual Basic, le troisième argument doit être une expression chaîne de caractères.
Ça peut être une seule chaîne de caractères ou la concaténation de plusieurs chaînes de caractères.

Si mon critère SQL est «[N°Facture] commence par FV 2011/*», je peux l'écrire de deux façons en SQL Access :
Code :
[N°Facture] Like "FV 2011/*"
ou
Code :
[N°Facture] Like 'FV 2011/*'
C'est strictement équivalent.

Maintenant, je dois mettre ce critère SQL dans une expression chaîne de caractères Visual Basic.
Possibilité 1 (avec ")
Code :
"[N°Facture] Like ""FV 2011/*"""
Possibilité 2 (avec " et Chr(code Acsii de "))
Code :
"[N°Facture] Like " & Chr(34) & "FV 2011/*" & Chr(34)
Possibilité 3 (avec ')
Code :
"[N°Facture] Like 'FV 2011/*'"
J'utilise la plupart du temps la troisième forme (avec ') que je trouve plus lisible.
Avec cette troisième forme, si je veux que 2011 (l'année) soit dynamique, je coupe la chaîne de caractères en deux chaînes, à gauche et à droite de 2011.
J'enlève 2011 et entre les deux chaînes de caractères j'insère (en concaténant avec l'opérateur &) l'année en cours :
Code :
"[N°Facture] Like 'FV " & Year(Date) & "/*'"
L'expression Year(Date), bien qu'étant numérique sera automatiquement convertie en chaîne de caractères, du fait de l'opérateur de concaténation &.
(10 & 10 donne "1010" et non 20)

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 08h42   #9
Membre régulier
 
Homme Marcel
Directeur technique
Inscription : avril 2011
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Marcel
Localisation : Belgique

Informations professionnelles :
Activité : Directeur technique
Secteur : Industrie

Informations forums :
Inscription : avril 2011
Messages : 100
Points : 97
Points : 97
Par défaut Récuperer la valeur d'un champ

Merci pour toutes ces précisions.

Bonne journée

A+

Marcel
Marcello5255 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h46.


 
 
 
 
Partenaires

Hébergement Web