IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Récupérer la valeur d'un champ [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Avril 2011
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 160
    Points : 162
    Points
    162
    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

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

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

    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
    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+

  3. #3
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Avril 2011
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 160
    Points : 162
    Points
    162
    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+

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    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 : 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
    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+

  5. #5
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Avril 2011
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 160
    Points : 162
    Points
    162
    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.

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonsoir,

    Voici une possibilité en ajoutant une restriction dans la fonction DMax, sur le champ [N°Facture], limitant à l'année en cours.
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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+

  7. #7
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Avril 2011
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 160
    Points : 162
    Points
    162
    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

  8. #8
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    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 : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    [N°Facture] Like "FV 2011/*"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    "[N°Facture] Like ""FV 2011/*"""
    Possibilité 2 (avec " et Chr(code Acsii de "))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[N°Facture] Like " & Chr(34) & "FV 2011/*" & Chr(34)
    Possibilité 3 (avec ')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[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 : Sélectionner tout - Visualiser dans une fenêtre à part
    "[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+

  9. #9
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Avril 2011
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 160
    Points : 162
    Points
    162
    Par défaut Récuperer la valeur d'un champ
    Merci pour toutes ces précisions.

    Bonne journée

    A+

    Marcel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/09/2005, 07h37
  2. API pour récupérer la valeur d'un champ Edit
    Par buteiduil dans le forum Windows
    Réponses: 4
    Dernier message: 15/05/2005, 23h32
  3. Réponses: 1
    Dernier message: 23/02/2005, 00h40
  4. Récupérer la valeur d'un champ disabled
    Par nebule dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/01/2005, 11h45
  5. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo