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

Access Discussion :

Récupérer des enregistrements en fonction d'une table liée


Sujet :

Access

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 64
    Points : 48
    Points
    48
    Par défaut Récupérer des enregistrements en fonction d'une table liée
    Bonjour, j'ai un soucis pour récupérer des données dans une liste par rapport à une critère.

    J'ai deux tables:
    POSTE
    IdPoste
    NomPoste
    DateBardin 'Date de l'installation d'un bardin sur le poste


    CONTROLE_BARDIN
    IdCOntroleBardin
    DateControle
    IdPoste 'clé étrangère rattachant à la table POSTE
    Un poste peut avoir 0 ou plusieurs controle.



    Le but recherché c'est de récupérer tout les postes dont leur dernier controle est égale ou supérieur à 5ans.
    Si aucun controle n'existe, alors c'est la date d'installation de bardin qui doit etre égale ou supérieur à 5ans


    J'ai donc utilisé des recordsets en VBA pour en premiere lieu récupérer les poste ayant une date de d'installation (DateBardin) , puis un deuxième récupérant les controles de ce postes.

    Ensuite vérifier par des conditions If , si la date est égale ou supérieur à 5ans.
    Si elle correspond aux critères, le nom du poste sera ajouté à une variable.
    Cette variable accumule tous les noms de postes correspondant à cette requetes, et je les sépare par un point virgule , ce qui me permet de remplir une liste présente sur mon formulaire grace à Me.ListePostes.rowsourcetype / row source.


    Voilà le code

    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
    'Déclarations des recordset
    Dim rec As ADODB.Recordset
    Dim rec1 As ADODB.Recordset
    
    'variable pour récupérer le mois et l'année des champs DateControleBardin et DateBardin
    Dim varannee As String
    Dim varmois As String
    
    'variable pour récupérer le mois et l'année en cour
    Dim moisnow As String
    Dim anneenow As String
    
    'variable utilisé pour remplir la liste du formulaire
    Dim varliste As String
    
    'initialisation des recordset
    Set rec = New ADODB.Recordset
    Set rec1 = New ADODB.Recordset
    
    
    'récupération du moi et de l'année en cour
    anneenow = Mid(Date, 7, 4)
    moisnow = Mid(Date, 4, 2)
    
    
    
    
    'ouverture du recordset permettant de récupérer les postes un par un
    rec.Open "SELECT IdPoste,NomPoste,DateBardin FROM POSTE WHERE DateBardin <> null ORDER BY DateBardin DESC", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
    rec.MoveFirst
    
    Do While rec.EOF = False
        
        'ouverture du recordset1 permettant de récupérer les controle fait sur le poste sélectionné
        rec1.Open "SELECT IdControleBardin,DateControleBardin,IdPoste FROM CONTROLE_BARDIN WHERE DateControleBardin <> NULL AND IdPoste= " & rec.Fields(0) & "  ORDER BY DateControleBardin DESC", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
        
        rec1.MoveFirst
        
        
        'Si on est pas à la fin du recordset, récupérer la date et l'année du premier controle
        'qui est le plus récent vu l'order by de la requete
        If rec1.EOF = False Then
        
        varmois = Mid(rec1.Fields(1), 4, 2)
        varannee = Mid(rec1.Fields(1), 7, 4)
            
            'Si la date du controle est = ou plus grande que 5ans alors le nom du poste
            'est affecté à la variable
            If varmois = moisnow And CInt(varannee) + 5 >= CInt(anneenow) Then
                varliste = varliste & ";" & rec.Fields(1)
            End If
            
        Else
        'sinon on vérifie si la DateBardin (date d'installation) est = ou supérieure à 5ans
            varmois = Mid(rec.Fields(2), 4, 2)
            varanne = Mid(rec.Fields(2), 7, 4)
            
            'affectation du poste à la variable
            If varmois = moisnow And CInt(varannee) + 5 >= CInt(anneenow) Then
                varliste = varliste & ";" & rec.Fields(1)
            End If
        End If
        rec.MoveNext
    Loop
    
    'remplissage de la liste par la variable
    Me.Listeposte.RowSourceType = "value list"
    Me.Listeposte.RowSource = varliste

    Une erreur survient au niveau de l'ouverture du deuxième recordset qui dit Erreur d'éxécution '3705' : Cette opération n'est pas possible si l'objet est ouvert

    Pour moi ça voudrait dire qu'on ne peut pas ouvrir un recordset dans un autre recordset, mais bon c'est bisard...

    Si quelqu'un à une idée pour résoudre ce problème !
    Merci

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour,

    Voilà une requête qui je crois renvoie la liste des postes qui n'ont pas eu de contrôle depuis plus de 5 ans
    SELECT tblPoste.IdPoste, tblPoste.NomPoste, Nz(DMax("DateContrôle","tblContrôleBardin","IdPoste = " & [IdPoste]),#1/1/2001#) AS DernierContrôle
    FROM tblPoste
    WHERE (((Nz(DMax("DateContrôle","tblContrôleBardin","IdPoste = " & [IdPoste]),#1/1/2001#))>DateAdd("yyyy",-5,Date())));
    Avec la date du dernier contrôle.
    SI le poste n'a eu aucun contrôle, la date du dernier contrôle est le 1/1/2001

    C'est un peu plus court.

    Bon courage,

    pgz
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 64
    Points : 48
    Points
    48
    Par défaut
    Je vais regarder ça,merci beaucoup!

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

Discussions similaires

  1. [XL-2007] EXCEL Répéter des enregistrements en fonction d'une fréquence
    Par ronankerbi dans le forum Excel
    Réponses: 9
    Dernier message: 01/10/2013, 15h28
  2. Réponses: 2
    Dernier message: 13/06/2013, 09h14
  3. Récupérer des noms de fichier dans une table pour les placer en masque du tfilelist
    Par charliplanete dans le forum Développement de jobs
    Réponses: 11
    Dernier message: 24/08/2011, 17h16
  4. Récupérer des fichiers XML à partir d'une Table
    Par faraway dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/09/2009, 11h32
  5. Récupérer des noms de fichiers dans une table ?
    Par florus dans le forum Access
    Réponses: 5
    Dernier message: 25/03/2006, 17h34

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