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 21/01/2011, 15h38   #1
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Par défaut VBA - Alimentation d'une liste par un recordset

Bonjour,

Bonne année à toutes et tous!!

Je poste ceci parceque je m'embrouille un peu.

Chaque enregistrement corresponds à un objet qui peut ou non avoir été prêté (le champs Dates.[In] stocke l'info 1=non prêté; 2 = en prêt). Par ailleurs, a chaque prêt et retour de prêt j'ai une date (stockée dans la table Dates). Et dans la table PAC (correspondant aux descriptions d'items j'ai les infos liés à l'item en question. Un item peut avoir été prêté et^être rentré plusieurs fois. L'info est stocké chronologiquement dans les tables Dates et PAC

Je souhaiterai faire apparaitre dans une liste (d'un formulaire non lié) tous les items qui sont actuellement prêtés (avec leurs informations). Actuellement, j'ai pensé à une liste alimentée par valeurs. Mais ca devrait être possible d'avoir plutôt une liste alimentée par Table/Query, je pense.

J'ai pensé faire cela par des requêtes mais je m'en sortais pas. Alros je me suis tourné vers le VBA et les recordsets.

Ici dessous, Je vous mets le code correspondant pour alimenter la liste à l'ouverture du formulaire. Mais ce code ne fonctionne pas...
Avez vous des suggestions pour l'améliorer ou peut-être d'autres piste pour faire ce que je souhaite?

Un tout grand merci et à bientôt



Code :
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
 
Private Sub Form_Load()
 
Dim SQL2 As String
Dim db As DAO.Database
Dim rs01 As DAO.Recordset 'recordset pour les enregistrements
Dim rs02 As DAO.Recordset 'recordset pour les enregistrements
Dim rs02Filtre As DAO.Recordset 'recordset pour les enregistrements
Dim BytPosition() As Byte 'pour stocker le bookmark
 
Dim tnummic As String
Dim tsubnummic As String
Dim strList2 As String
 
strList2 = "MIC;Pims;Greffe;Descriptif;Date;Local;IniLab;Mouvement" 'initialisation des titres des colonnes
 
Set db = CurrentDb()
 
SQL2 = "SELECT PAC.ID AS PAC_ID, PAC.NumPIMS, PAC.NumMIC, PAC.NumSousDossierMIC, PAC.NumGref, PAC.Descriptif, PAC.IDDate, Dates.ID AS Dates_ID, Dates.Date, Dates.[In], Dates.IDLocal, Dates.IDIniLab "     ', (PAC!NumMIC) & "-" & (PAC!NumSousDossierMIC) AS MIC
SQL2 = SQL2 & "FROM Dates INNER JOIN PAC ON Dates.ID = PAC.IDDate "
SQL2 = SQL2 & "ORDER BY Dates.Date;"
 
Set rs02 = db.OpenRecordset(SQL2, dbOpenDynaset) 'initialise le rs sur les 2 tables principales et trie sur la date
 
rs02.MoveFirst 'on se met au début du rs
rs02.FindFirst ("Dates.[In] = 2") 'on cherche le premier enregistrement qui est en prêt
 
 
While Not rs02.EOF 'tant qu'on n'est pas à la fin du rs on continue
 
    BytPosition = rs02.Bookmark 'on bookmark la position de cet enregistrement pour y revenir si besoin
'ici on stocke des valeurs qui vont servir pour filtrer le rs
    tnummic = rs02.Fields("PAC.NumMIC")
    tsubnummic = rs02.Fields("PAC.NumSousDossierMIC")
    tdate = rs02.Fields("Dates.Date")
 
    'on filtre le rs02 sur base des 3 champs, on recherche uniquement les Dates.[In] =1 pour une date ultérieure
    rs02.Filter = "((PAC.NumMIC) = " & tnummic & " And (PAC.NumSousDossierMIC) = " & tsubnummic & " And (Dates.Date) > " & tdate & " And (Dates.[In] = " & 1 & "))"
    Set rs02Filtre = rs02.OpenRecordset
 
        If rs02Filtre.RecordCount > 0 Then        'il y a des données dans le rs filtré alors c'est qu'on a un echantillon In de date supérieure pour la PAC
        'on laisse tomber le out courant et on recherche le sur out suivant
        Else 'on est à la fin du fichier
        'on revient alors à l'enregistrement
            rs02.Bookmark = BytPosition
        'et on récolte les données à afficher dans la liste
            For i = 1 To 12
                strList2 = strList2 & rs02.Fields(i)
            Next i
        End If
 
    rs02.Filter = ""
    rs02.FindNext ("Dates.[In] = 2")
 
Wend
 
 
 
 
SQL2 = ""
rs02.Close
rs02Filtre.Close
db.Close
Set rs02Filtre = Nothing
Set rs02 = Nothing
Set db = Nothing
 
End Sub
Dermochelys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 19h04   #2
Membre Expert
 
Femme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 480
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Ain (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 480
Points : 1 024
Points : 1 024
Bonjour,
J'ai une proposition pour une solution par requêtes :
  1. Créer une requête (DernierEtat) qui liste la date du dernier état de chaque item :
    Code :
    SELECT Dates.ID AS DerID, Max(Dates.Date) AS DerDate FROM Dates GROUP BY Dates.ID
  2. Créer une deuxième requête qui lie la requête DernierEtat aux tables PAC et Dates pour construire la liste :
    Code :
    1
    2
    3
    4
    SELECT PAC.ID AS PAC_ID, PAC.NumPIMS, PAC.NumMIC, PAC.NumSousDossierMIC, PAC.NumGref, PAC.Descriptif, PAC.IDDate, Dates.ID AS Dates_ID, Dates.Date, Dates.[In], Dates.IDLocal, Dates.IDIniLab
    FROM (Dates INNER JOIN PAC ON Dates.ID = PAC.IDDate) INNER JOIN DernierEtat ON (Dates.Date = DernierEtat.DerDate) AND (Dates.ID = DernierEtat.DerID)
    WHERE Dates.[In] = 2
    ORDER BY Dates.Date
Est-ce que ça correspond au résultat attendu ?
tedo01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h11   #3
Membre du Club
 
Homme Yves
Inscription : novembre 2006
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yves
Localisation : Belgique

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2006
Messages : 114
Points : 50
Points : 50
Bonjour Tedo01,

Merci pour avoir regardé cela.
Le résultat que j'obtiens est l'affichage de tous les items qui ont été en prêt (2) même s'ils sont rentrés depuis. Ceux qui sont toujours en prêts et toujours pas rentrés sont bien repris dans l'ensemble de la liste, mais en mélange.

Ce que je souhaite c'est afficher uniquement ceux qui ne sont pas revenus du prêt.

Ce que j'ai fais comme solution, c'est de mettre un champs supplémentaire (Flag) à ma table de prêt en plus du champ prêté/pas prêté (In-Out).
Ou pour dire les choses plus pratiquement:
- j'encode un item qui rentre en stock => nouvelle ligne dans la table: je mets le champs prêté/pas prêté sur "pas prêté" et le champs Flag sur "1"
- je prête l'item => nouvelle ligne dans la table: je mets le champs prêté/pas prêté sur "prêté" et le Flag sur "0"
- je recois de retour l'item en prêt => nouvelle ligne dans la table: je mets le champs prêté/pas prêté sur "pas prêté" et le champs Flag, correspondant à l'enregistrement du prêt de cet item (donc x ligne avant dans la table), sur "1". Ce qui indique que l'item qui était en prêt est bien rentré.

Et ainsi pour chaque item

A un instant T, si je veux savoir les items qui sont toujours en prêt, je fais une requète sur tous les enregistrements qui sont sur "prêté" et pour lequel le Flag est sur "0". Ca me donne tout ceux qui doivent encore rentrer.


Bon peut-être pas très élégant mais ça fonctionne

Voili, voilà
Dermochelys 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 02h22.


 
 
 
 
Partenaires

Hébergement Web