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 :

Code avec itération


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut Code avec itération
    Bonjour à tous,

    Voici mon problème :

    J'ai un formulaire qui correspond dans ma base de données à des visites de patients (ces visites sont numérotées de 4 à 8 car les visites précédentes sont indépendantes et présentent des formulaires différents). Dans ce formulaire on trouve le numéro de patient (NUMPAT), le numéro de la visite (NUMVIS) et la date de la visite.

    Je voudrais vérifier par un contrôle à l'aide d'un code que la date de la visite 5 par exemple est postérieure à la date de la visite 4.
    Je voudrais donc créer un code qui traduise cela :
    - pour NUMPAT=NUMPAT et NUMVIS allant de 5 à 8, rechercher la date de la visite correspondant à NUMVIS=NUMVIS-1 (une itération en fait)
    - ensuite faire une contrôle DateDiff sur la date recherché et la date de visite saisi (ça normalement je sais faire)

    Le gros problème réside surtout dans la mise en place de l'itération, j'avoue que je n'en ai pas la moindre idée, quelqu'un pourrait-il m'aider ?

    Merci beaucoup,

    Tagada_or

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Point à préciser : quand veux-tu effectuer ce contrôle ?
    1/ Au moment de la création d'une nouvelle visite ?
    - Si oui, pour quelle raison ? Si c'est bien modelé, il ne doit pas y avoir de problème...
    2/ Ponctuellement pour voir ?

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  3. #3
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Bonjour Argyronet,

    Merci pour le retour.

    Oui, je souhaite effectuer ce contrôle au moment de la création d'une nouvelle visite.
    Je n'ai pas trouver d'autre moyens de contrôler la succession chronologique des ces dates ni au niveau de la table ni au niveau du formulaire. Y aurait-il une manière de faire qui m’aurait échappé ?

    Merci

    Tagada_or

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Il y a toujours une solution, sinon, il n'y aurait pas de problème...
    Il faut cependant que tu sois plus précis sur le cheminement ; de ce que j'ai compris (et de ce qui doit être selon moi) :
    1. Un patient conserve son ID à vie
    2. Il vient plusieurs fois (la gastrosophiecament le guette) donc il incrément un N° de visite à chaque fois
    3. La date de visite est la date de sa venue et donc de consultation

    Donc tu n'as pas besoin de vérifier la date...
    => pour tout nouvel enregistrement,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewRec = ID et Nz(VisitID,0)+1 et Date(Now)
    pour avoir la visite ID+1, on créé une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function GetMaxNumVisite(Byval IDPatient As Long) As Long
    qui calcule le max de la dernière visite de ce patient (quelle que soit la date) et ajoute 1 s'il y a déjà eu une visite est est égale à 1 si c'est sa première.

    Ca te parles ?

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  5. #5
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    En fait, la visite n'est pas saisi le jour de la visite dans la base de données. Il ne s'agit pas d'une base pour assurer le suivi de consultations mais plutôt d'une sorte de registre où les données saisies peuvent datées de plusieurs années en arrière donc avec la fonction Date(now), cela ne peut pas marcher.

    Tagada_or

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Quand bien même, tu es censé entrer une date.
    J'ai du mal à cerner le pourquoi de cette itération car si tu saisies une nouvelle visite, c'est l'IDVisite qui s'incrémente et pas la date.
    Toutefois, il faut effectivement que la date que du rentreras soit inférieure à celle représentant la dernière visite.

    Donc dans ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function GetMaxNumVisite(Byval IDPatient As Long, ByRef DerniereDate As Date) As Long
    tu ajoutes un paramètre "DerniereDate" qui prendra la valeur de la date de la denière visite s'il elle existe.
    Au moment de l'ajout de ta nouvelle visite, tu contrôles sur le BeforeUpdate() que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cancel = (CLng(Nz(Me.txtDateVisite.value,0)) < CLng(CDate(m_dtmDerniereDate))
    avec un Msgbox éventuellement...

    txtDateVisite est le contrôle de formulaire
    et
    m_dtmDerniereDate est une variable de module privée

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  7. #7
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Merci Argyronet,

    Cependant, j'aurai du préciser que je suis débutante avec Access et j'avoue que vous m'avez totalement perdue avec ces deux codes, je ne comprends pas quelle est leur utilité et où doivent-ils être placés ? Surtout pour le premier.

    Pour plus de précisions, voici un exemple :
    - je suis sur mon formulaire VISITE, j'ai saisi la visite 4 du patient 1
    - je voudrais créer un bouton commande qui me permette d'effectuer un nouvel enregistrement dans ce formulaire VISITE qui contienne déjà le numéro du patient 1 et le numéro de la visite suivante soit la visite 5
    - ensuite lorsque je saisie la date de la visite 5, vérifier que celle-ci n'est pas antérieure à la date de la visite 4

    Je suis désolée, je ne pense pas avoir été très claire et précise dès le départ, mais il est difficile de préciser correctement ce que l'on souhaite faire quand on ne connait pas trop...

    Merci

    Tagada_or

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 169
    Points
    12 169
    Billets dans le blog
    5
    Par défaut
    Humm, ce n'est rien, j'avais compris....

    Je voulais plutôt que ce soit toi qui comprennes ce que tu voulais.
    Bref, voici un exemple :
    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
    95
    96
    97
    98
     
    Option Compare Database
    Option Explicit
     
    Private Sub cmdAjouter_Click()
    Dim lngIDPat                                           As Long
    Dim strValeur                                          As String
     
        If MsgBox("Ajouter un nouveau patient ?", vbQuestion + vbYesNo, "Ajouter") = vbYes Then
            strValeur = InputBox("Quel est le N° du patient concerné ?" & vbCrLf & vbCrLf & "Si c'est un nouveau, entrez 0", "N° requis")
            If IsNumeric(strValeur) Then
                'Nouveau patient (1ère visite) = 0
                'Patient déjà venu > 0
                lngIDPat = CLng(strValeur)
                Call AjouterPatient(lngIDPat)
            Else
                MsgBox "N° incorrect !", vbExclamation
            End If
        End If
    End Sub
     
    Public Sub AjouterPatient(ByVal IDPatient As Long)
    Dim oRS                                                As DAO.Recordset
    Dim SQL                                                As String
    Dim lngNumVisite
    Dim lngIDPatient                                       As Long
    Dim dtmDerniereDate                                    As Date
    Dim strDateVisite                                      As String
     
        'Si le patient est déjà venu
        If IDPatient Then
            'Monte la chaine SQL (requête) pour récupérer les infos
            SQL = "SELECT Max(NUMVIS) AS MaxDeNUMVIS, Max(DATEVIS) AS MaxDeDATEVIS FROM Table1 WHERE NUMPAT=" & IDPatient & ";"
            'Ouvre un recordset pour lire ces infos
            Set oRS = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
            'Avec ce Recordset
            With oRS
                If Not .EOF Then
                    'Si il y a un enregistrement
                    lngIDPatient = IDPatient
                    lngNumVisite = .Fields("MaxDeNUMVIS") + 1
                    dtmDerniereDate = Nz(.Fields("MaxDeDATEVIS").Value, 0)
                End If
                .Close
            End With
        Else
            'S'il n'y en a pas
            'On est obligé d'obtenir un IDPat sauf si IDPat est un AutoIncrément (tu ne l'as pas précisé
            SQL = "SELECT Max(NUMPAT) AS MaxIDPAT FROM Table1 ;"
            Set oRS = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
            With oRS
                If Not .EOF Then
                    lngIDPatient = .Fields("MaxIDPAT") + 1
                Else
                    'Sinon , C'est le premier
                    lngIDPatient = 1
                End If
                .Close
            End With
            lngNumVisite = 1
            dtmDerniereDate = #1/1/1900#
        End If
     
        'On demande la date effective de la visite
    On_Recommence:
        strDateVisite = InputBox("A quelle date votre patient a t-il passé sa visite ?", "Date de visite")
        'Si c'est bien un date
        If IsDate(strDateVisite) Then
            'Et qu'elle est > à la dernière
            If CDate(strDateVisite) >= dtmDerniereDate Then
                'Tout va bien...
            Else
                'sinon, on recommence ou on annule
                If MsgBox("La date que vous avez entré est inférieure à la dernière date :" & dtmDerniereDate & vbCrLf & vbCrLf & "Voulez-vous saisir de nouveau une date valide ?", vbQuestion + vbYesNo, "Quelle date") = vbYes Then
                    GoTo On_Recommence
                Else
                    Exit Sub
                End If
            End If
        Else
            'Pas une date
            If MsgBox("Ce n'est pas une date !" & vbCrLf & vbCrLf & "Voulez-vous saisir de nouveau une date valide ?", vbQuestion + vbYesNo, "Quelle date") = vbYes Then
                GoTo On_Recommence
            Else
                Exit Sub
            End If
        End If
     
        'Ajoute un enregsitrement
        DoCmd.GoToRecord , , acNewRec
        'Affecte les valeurs
        Me.NUMPAT = lngIDPatient
        Me.NUMVIS = lngNumVisite
        Me.DATEVIS = CDate(strDateVisite)
        'Sauve l'enregistrement
        DoCmd.RunCommand acCmdSaveRecord
        MsgBox "C'est OK...", vbInformation
    End Sub
    Bon, ce n'est pas très élaboré mais je pense que cela rejoint ce que tu souhaites.

    Donc, c'est à modifier et peaufiner selon tes besoins

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  9. #9
    Membre à l'essai
    Femme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup argyronet, j'y suis finalement parvenu !

    Tagada_or

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

Discussions similaires

  1. Comment linker avec odbc32.lib dans le code ? (avec gcc)
    Par _Audrey_ dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 06/11/2008, 17h40
  2. Réponses: 1
    Dernier message: 03/02/2006, 10h48
  3. Probleme en compilant le code avec C2.EXE ?!?!?
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/11/2005, 16h13
  4. help sur un petit code avec XMLHttpRequest et setTimeout
    Par grinder59 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/10/2005, 10h22
  5. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14

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