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 :

.LDB ne se remet pas à jour après déconnection user


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 232
    Points : 554
    Points
    554
    Par défaut .LDB ne se remet pas à jour après déconnection user
    Salut,

    Comme bcps de posts à ce sujet, je voudrait compacter ma base dorsale lors de la fermeture de la frontale.

    Elle se trouve en réseau, j'ai donc fait une seconde base qui s'ouvre à la fermeture de la frontale et qui teste qui est encore connecté.

    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
    Public Sub compacter_db()
        DoCmd.SetWarnings False
     
        Dim rep
        Dim sNomBaseTmp As String
        Dim sNomBase As String
        Dim fs As FileSystemObject
        Dim folder As folder
        Dim utilise As Boolean
     
        utilise = False
     
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set folder = fs.GetFolder("M:\Bases\")
     
        'Boucle parcourant l'ensemble des fichiers présents dans le dossier de la bdd
        For Each fc In folder.Files
            'teste si le fichier .ldb existe
            If fc.Name = "Nom Base.ldb" Then
                utilise = True
                Me.InsideHeight = 4635
                Me.Etiq_titre_CompactOK.Visible = False
                Me.Etiq_titre_CompactNOK.Visible = True
                Me.Liste_Connecté.Visible = True
                Me.Cmd_Refresh.Visible = True
                WHO_IS
                Exit Sub
            End If
        Next
     
        If utilise = False Then 'Plus aucun utilisateur de connecté à la bdd
            'Compactage de la BDD
            sNomBase = "M:\Bases\Nom Base.mdb"
            sNomBaseTmp = "M:\Bases\Nom Base.mdb.tmp"
     
            DBEngine.CompactDatabase sNomBase, sNomBaseTmp
            DoEvents
            Kill sNomBase
            FileCopy sNomBaseTmp, sNomBase
            Kill sNomBaseTmp
            DoCmd.SetWarnings True
            Me.Cmd_Quit.SetFocus
            Me.Cmd_Refresh.Visible = False
            Me.Etiq_titre_CompactOK.Visible = True
            Me.Etiq_titre_CompactNOK.Visible = False
            Me.Liste_Connecté.Visible = False
            Me.InsideHeight = 2370
        End If
    End Sub
    Le problème, c'est que si 2 users ont ouvert la frontale, puis un se déconnecte, il reste inscrit dans le .lDB

    Dans la liste, le nom des deux users reste inscrit et donc l'admin croit qu'il y a toujours un user de connecté.

    Je sais qu'il existe une appli pour voir qui est connecté, le problème c'est qu'il faut ensuite ouvrir la base et la compacter. Le code de cette appli n'étant pas dispo, on ne sait pas ajouter un bouton compactage de la base.

    Comment cette appli fait-elle pour remettre le .LDB à jour.

    Merci pour vos réponses.

    A+

  2. #2
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonsoir,

    Le problème, c'est que si 2 users ont ouvert la frontale, puis un se déconnecte, il reste inscrit dans le .lDB

    Dans la liste, le nom des deux users reste inscrit et donc l'admin croit qu'il y a toujours un user de connecté.
    Non... (ou alors c'est un peu mal exprimé)

    Lorsque le .ldb est créé à la première connection d'un premier utilisateur, les connections suivantes viennent s'y ajouter...

    Un utilisateur qui se déconnecte reste effectivement présent dans le .ldb jusqu'à déconnection de tous les utilisateurs (à ce moment là, le .ldb est détruit).

    On trouve un code dans la FAQ qui permet de "mettre à jour" les connections (par ADO) et donc d'avoir un état réel des connections à un instant "T"...

    Pour ma part, je préfèrerais un test "grossier". Si le .ldb n'existe pas, personne n'est connecté. Dans le cas contraire, un utilisateur au moins est susceptible d'être connecté.

    On trouve également dans la FAQ de quoi déconnecter tous les utilisateur...

    Pour des tests plus fins, j'ai abandonné les codes présentés usuellement sur les forums et je me suis tourné vers l'utilisation d'une dll (msldburs.dll).

    Gratuite, pas besoin d'être registrée, un minimum de code... Google est ton ami...

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 232
    Points : 554
    Points
    554
    Par défaut
    Salut Domi2,

    Merci pour ta réponse.

    Oui effectivement, j'ai trouvé le code ADO, mais il ne veut pas ouvrir la connection avec la base 'Vous n'avez pas l'autorisation nécessaire.......'
    J'utilise un .mdw avec login et PW donc


    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
    Sub ShowUsers()
     
        Dim oCn As ADODB.Connection, r As ADODB.Recordset
        Dim strDBfullName As String, strLst As String, strTxt As String
        Dim i As Integer, p As Integer
     
        strDBfullName = "M:\NomBase.mdb"
        Set oCn = New ADODB.Connection
        oCn.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
                               "DATA SOURCE=" & strDBfullName
        oCn.Open
     
        Set r = oCn.OpenSchema(adSchemaProviderSpecific, , _
                               "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
     
        ' En tête de colonnes
        For i = 1 To r.Fields.Count
            strLst = strLst + r.Fields(i - 1).Name & ";"
        Next
     
        ' Données
        While Not r.EOF
           For i = 1 To r.Fields.Count
               strTxt = CStr(Nz(r.Fields(i - 1).Value))
               p = InStr(1, strTxt, vbNullChar)
               If p > 1 Then strTxt = Left(strTxt, p - 1)
               strLst = strLst + strTxt & ";"
           Next
           r.MoveNext
        Wend
     
        r.Close
        Set oCn = Nothing
     
        Me.Liste_Connecté.RowSource = strLst
     
    End Sub
    Il faudrait donc que je place le login et le PW dans le code pour permettre la connction.

    J'aimerais quand même connaitre les users connectés afin de pouvoir leur dire de se déconnecter.


    Merci pour ton aide
    A+

  4. #4
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

    Je ne suis pas du tout connaisseur en matière de sécurité...

    Je n'ai aucune idée si le fichier .ldb est également sécurisé, et comment y remédier le cas échéant.

    As-tu regardé du côté de la dll ?

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 232
    Points : 554
    Points
    554
    Par défaut
    Re,

    Oui, j'ai jeté un œil, le problème c'est que je regarde dans le .ldb de ma base à partir d'une autre base et je ne sait pas comment placer le login et le PW dans le code de la connection ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    strDBfullName = "M:\NomBase.mdb"
        Set oCn = New ADODB.Connection
        oCn.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
                               "DATA SOURCE=" & strDBfullName
        oCn.Open
     
        Set r = oCn.OpenSchema(adSchemaProviderSpecific, , _
                               "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
    Donc il me dit que je n'ai pas les droits.
    Il existe des prog qui font le contrôle des connectés et ça fonctionne très bien, le problème c'est qu'il n'y a pas l'option pour compacter la base si il n'y a plus de connectés.

    Si qq à une idée.
    A+

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 232
    Points : 554
    Points
    554
    Par défaut
    Salut,

    Je suis toujours avec mon problème des users connectés.

    Voilà ce que j'ai mis

    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
    99
    100
    101
    Par la librairie MSLDBUSR.DLL(GetUsers)
    Cette procédure vous permet d'obtenir la liste des utilisateurs d'une base de données à l'aide de la base MDB, ainsi que le nombre d'utilisateurs et leur type. La valeur retournée par cette fonction sera une valeur booléenne qui sera True si l'exécution est réussie et False en cas d'erreur. 
    La fonction mettra à votre disposition des variables que vous utiliserez dans votre application:
    LDBUsersList() Contient la liste des utilisateurs (String) sous forme de tableau.
    LDBUsersError  Contient le type d'erreur rencontrée (String) si la valeur retournée est false
    LDBUsersCount Contient le nombre (Long) d'utilisateurs si la valeur retournée est True et le numéro de l'erreur si la valeur retournée est False.
    LDBusersLooper est une variable Integer à votre disposition pour boucler dans le tableau des utilisateurs.
     
    Syntaxe:
        Variable Boolean = GetUsers( [<Nom de base MDB>] [ , <UsersType>] )
    <Nom de base MDB> : Facultatif, si non indiqué la base en cours est prise par défaut.
    <UsersType> : Vous indiquez le type d'utilisateurs que vous désirez lister.
    Valeurs de UsersType
    Valeur	Description
    LDBAllUsers	Tous les utilisateurs depuis que la base a été lancée ( depuis que le ldb a été créé)
    LDBLoggedUsers	Tous les utilisateurs actuellement connectés (valeur par défaut)
    LDBCorruptUsers	Tous les utilisateurs ayant pu causer la corruption ou connectés lors de la corruption
     
    Exemple d'utilisation:
    Private Sub Commande0_Click()
        If Not GetUsers("C:\essais.mdb", LDBLoggedUsers) Then
            MsgBox LDBUsersCount & " / " & LDBUsersError _
                & vbCrLf & "Voir votre administrateur."
        Else
            Debug.Print LDBUsersCount  ' nombre d'utilisateurs
            For LDBusersLooper = 0 To LDBUsersCount - 1
                Debug.Print LDBUsersList(LDBusersLooper) ' nom des utilisateurs
            Next
        End If
    End Sub
    L'exemple ci-dessus vous permet d'afficher le nombre d'utilisateurs et la liste des utilisateurs actuellement connectés dans la fenêtre d'exécution.
    Fonction  (GetUsers):
    Option Compare Database
    Option Explicit
    ' Valeurs des codes d'options
    ' 1 = Tous les utilisateurs depuis que la base a été lancée
    '     ( depuis que le ldb a été créé)
    ' 2 = Tous les utilisateurs actuellement connectés
    ' 4 = Tous les utilisateurs ayant pu causer la corruption ou
    '     connectés lors de la corruption
    Public Enum OptLDBUsers
        LDBAllUsers = &H1
        LDBLoggedUsers = &H2
        LDBCorruptUsers = &H4
    End Enum
    Public LDBUsersList() As String
    Public LDBUsersError As String
    Public LDBUsersCount As Long
    Public LDBusersLooper As Integer
    Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" _
        (LDBUsersList() As String, ByVal lpszFilename As String, _
        ByVal nOptions As Long) As Integer
     
    Public Function GetUsers(Optional StrDbPath As String = "", _
        Optional UsersType As OptLDBUsers = LDBLoggedUsers) As Boolean
        ReDim LDBUsersList(1) As String
        GetUsers = False
        LDBUsersError = ""
        LDBUsersCount = 0
        On Error GoTo Err_GetUsers
        If IsMissing(StrDbPath) Or StrDbPath = "" Then
            StrDbPath = CurrentDb.Name
        End If
        LDBUsersCount = LDBUser_GetUsers(LDBUsersList(), StrDbPath, UsersType)
        Select Case LDBUsersCount
            Case -1
                LDBUsersError = "Impossible ouvrir le fichier LDB"
            Case -2
                LDBUsersError = "Aucun utilisateur connecté"
            Case -3
                LDBUsersError = "Impossible créer liste utilisateurs"
            Case -4
                LDBUsersError = "Impossible redimensionner liste utilisateurs"
            Case -5
                LDBUsersError = "Arguments passés invalides"
            Case -6
                LDBUsersError = "Erreur allocation mémoire"
            Case -7
                LDBUsersError = "Mauvais index"
            Case -8
                LDBUsersError = "Dépassement mémoire"
            Case -9
                LDBUsersError = "Argument invalide"
            Case -10
                LDBUsersError = "LDB corrompue"
            Case -11
                LDBUsersError = "Argument invalide"
            Case -12
                LDBUsersError = "Impossible de lire le fichier MDB"
            Case -13
                LDBUsersError = "Impossible d'ouvrir le fichier MDB"
            Case -14
                LDBUsersError = "Fichier LDB non trouvé"
            Case Else
                GetUsers = True
        End Select
        Exit Function
    Err_GetUsers:
        LDBUsersError = Err.Description
        LDBUsersCount = 0
    End Function
    Le code fonctionne très bien, la liste se remet à jour.

    Mais dans ma liste je n'ai que le nom du PC et pas celui des connectés (login)
    C'est plus pratique de savoir qui est connecté par son nom que par celui du PC.

    Avez-vous une idée.

    Merci A+

  7. #7
    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 759
    Points
    7 759
    Par défaut
    Bonjour,

    essaie comme ça pour utiliser un fichier groupe de travail:
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    strDBfullName = "M:\NomBase.mdb"
    strMdw = "Chemin\FicherGroupeDeTravail.mdw"
        Set oCn = New ADODB.Connection
        oCn.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
                               "DATA SOURCE=" & strDBfullName & ";" & _
                               "User Id=NomUtilisateur;" & _
                               "Password=MotDePasse;" & _
                               "Jet OLEDB:System Database=" & strMdw & ";"
        oCn.Open
     
        Set r = oCn.OpenSchema(adSchemaProviderSpecific, , _
                               "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
    A+

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 232
    Points : 554
    Points
    554
    Par défaut
    Salut LedZepII

    Merci pour le code, il fonctionne bien.

    J'essaye de l'adapter car ma base qui controle si mon appli est fermée utilise le même .mdw donc j'ai un user connecté évidemment.

    Si tu as encore des idées

    Merci
    A+

  9. #9
    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 759
    Points
    7 759
    Par défaut
    Bonsoir,

    La méthode ADO (UserRoster) utilise une connexion à la base.
    Dans la liste des utilisateurs connectés, il faut déduire la connexion de la méthode UserRoster.

    En restant sur la technique de lecture du fichier ldb, voici mon code pour tester si une connexion est réelle ou pas:
    Code vb : 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
    99
    100
    Option Explicit
     
    Private Type typLDBEntry
        wksta As String * 32
        User As String * 32
    End Type
     
    Public Type typLDBUser
        wksta As String
        User As String
        Connected As String
    End Type
     
    Private Const GENERIC_READ = &H80000000
    Private Const GENERIC_WRITE = &H40000000
    Private Const FILE_SHARE_READ = 1
    Private Const FILE_SHARE_WRITE = 2
    Private Const OPEN_EXISTING = 3
     
    Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" ( _
            ByVal lpFileName As String, ByVal dwAccess As Long, _
            ByVal dwShareMode As Long, ByVal lpSecurityAttr As Long, _
            ByVal dwCreationDisposition As Long, _
            ByVal dwFlagAndAttr As Long, ByVal hTemplateFile As Long) As Long
     
    Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hHandle As Long) As Long
     
    Private Declare Function LockFile Lib "kernel32.dll" ( _
            ByVal hFile As Long, _
            ByVal fileOffsetLow As Long, ByVal fileOffseyHigh As Long, _
            ByVal nbBytesLow As Long, ByVal nbBytesHigh As Long) As Long
     
    Private Declare Function UnlockFile Lib "kernel32.dll" ( _
            ByVal hFile As Long, _
            ByVal fileOffsetLow As Long, ByVal fileOffseyHigh As Long, _
            ByVal nbBytesLow As Long, ByVal nbBytesHigh As Long) As Long
     
    Function ReadLdb(strDB As String, ByRef arrUsrs() As typLDBUser, _
                     ByRef strErrMsg As String) As Long
    Dim strLDB As String, f As Integer, hFile As Long
    Dim rec As typLDBEntry, strWsta As String, strUsr As String
    Dim usrPos As Long, usrCnt As Long, retVal As Long
    Dim NbConnected As Long
     
    ' Attention : là j'ai fait simple
    strLDB = Replace(strDB, ".mdb", ".ldb")
     
    If Dir(strLDB) = "" Then
       If Not IsFileUnused(strDB, strErrMsg) Then ReadLdb = &H10000
       Exit Function
    End If
     
    hFile = CreateFile(strLDB, GENERIC_READ, _
                       FILE_SHARE_READ + FILE_SHARE_WRITE, _
                       0, OPEN_EXISTING, 0, 0)
    f = FreeFile()
    Open strLDB For Binary As #f
    Do
      Get #f, , rec
      strWsta = Left(rec.wksta, InStr(1, rec.wksta, vbNullChar) - 1)
      strUsr = Left(rec.User, InStr(1, rec.User, vbNullChar) - 1)
      usrPos = usrPos + 1
      If Len(strUsr) > 0 Then
         usrCnt = usrCnt + 1
         ReDim Preserve arrUsrs(1 To usrCnt)
         arrUsrs(usrCnt).wksta = strWsta
         arrUsrs(usrCnt).User = strUsr
         retVal = LockFile(hFile, &H10000000 + usrPos, 0, 1, 0)
         If retVal Then
            retVal = UnlockFile(hFile, &H10000000 + usrPos, 0, 1, 0)
            arrUsrs(usrCnt).Connected = "Non"
         Else
            arrUsrs(usrCnt).Connected = "Oui"
            NbConnected = NbConnected + 1
         End If
      End If
    Loop Until EOF(f)
    Close f
    retVal = CloseHandle(hFile)
    ReadLdb = NbConnected
    End Function
     
    Function IsFileUnused(strFile, ByRef strErrMsg) As Boolean
    Dim f As Integer, blnReturn As Boolean
     
    blnReturn = True
    If Dir(strFile) = "" Then
       strErrMsg = "Fichier n'existe pas"
       blnReturn = False
    Else
       f = FreeFile()
       On Error Resume Next
       Open strFile For Binary Access Read Shared As #f
       strErrMsg = Err.Description
       Close f
       On Error GoTo 0
       If Len(strErrMsg) > 0 Then blnReturn = False
    End If
    IsFileUnused = blnReturn
    End Function
    Exemple d'utilisation:
    Code vb : 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
    Sub testReadLdb()
    Dim arrUsrs() As typLDBUser, NbConnectes As Long, i As Long
    Dim strErrMsg As String
    Const strDB = "C:\Documents and Settings\Administrateur\Mes documents\db_1.mdb"
     
    NbConnectes = ReadLdb(strDB, arrUsrs, strErrMsg)
    If NbConnectes = &H10000 Then
       Debug.Print strErrMsg
    ElseIf NbConnectes Then
       Debug.Print "Ordinateur", "Utilisateur", "Connecté"
       For i = 1 To UBound(arrUsrs)
         Debug.Print arrUsrs(i).wksta, arrUsrs(i).User, arrUsrs(i).Connected
       Next
    Else
       Debug.Print "base libre"
    End If
    End Sub
    Autrement, solution toute faite : Visionneuse des Utilisateurs d'une base de données Access d'Argyronet.

    A+

  10. #10
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonsoir,

    @LedZeppII,

    Tes codes de tests de connections fonctionnent

    A titre tout à fait informatif, as-tu déjà essayé de tester la dll que j'ai indiquée ci-avant ?

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  11. #11
    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 759
    Points
    7 759
    Par défaut
    Bonsoir Domi2,

    Non je ne l'ai pas essayé.
    Mais je la connais car elle est avec le téléchargement du livre blanc "Jetlock.doc" qui m'a permit de trouver comment vérifier l'existance d'un verrou utilisateur sur le fichier ldb.

    A+

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 232
    Points : 554
    Points
    554
    Par défaut
    Salut,

    Comme il y a pas mal de visite sur ce post, je mets mon code.


    Dans un formulaire il y a une zone de liste :
    Name: Liste_Connecté
    Origine source: Table/Requête
    Contenu: SELECT tblConnectes.Utilisateur, tblConnectes.Ordinateur, Count(*) AS NbConnexions FROM tblConnectes GROUP BY tblConnectes.Utilisateur, tblConnectes.Ordinateur;
    Colonne liées: 1
    Nbre colonne: 3
    Largeurs colonnes: 3,501cm;3,501cm;3cm
    En-têtes de colonnes: oui

    Une Zone de texte :
    Name: txtLstConnectesDateHeure 'pour afficher la date et l'heure du scan

    Une Table :
    Name: tblConnectes
    Champ 1: Ordinateur
    Champ 2: Utilisateur
    Format des champs: Texte

    J'ai également placé un bouton scan afin de refaire un scan pour vérifier les connecté. Vous pouvez placer un timer pour effectuer la vérification automatiquement.

    Le code Scan_Connect() s'exécute avec l'événement sur ouverture

    Au début d'un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Option Compare Database
    Option Explicit
    Public CheminAppli_Base_Data As String 'Chemin complet de la Base des DATA (Dorsale)
    Public StrPassWord_User As String 'Mot de passe du User pour la connection
    Public StrChemin_MDW As String 'Chemin complet du .MDW (Groupe de travail)
    Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
                                            (ByVal lpBuffer As String, nSize As Long) As Long
    Procédure du scan :

    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
    99
    100
     
     
    Public Sub Scan_Connect() 'Voir qui est connectés à la Base
        Dim oCn As ADODB.Connection, r As ADODB.Recordset
        Dim arrCnx(), strTxt As String, strThisComputer
        Dim blnIgnore As Boolean
        Dim p As Integer, row As Integer, col As Integer
        Dim StrUserConnect As String 'Nom du User
     
        StrPassWord_User = ""
        StrChemin_MDW = ""
        StrUserConnect = CurrentUser 'Donne le nom de l'utilisateur courant
     
        Chemin_Appli 'Va à la procédure pour le chemin de l'appli
        Chemin_MDW 'Va à la procédure pour le chemin .MDW
     
        Pass_Word (StrUserConnect) 'Va à la procédure avec l'User en paramètre
     
        Set oCn = New ADODB.Connection
        oCn.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;" & _
                               "DATA SOURCE=" & CheminAppli_Base_Data & ";" & _
                               "User Id=" & StrUserConnect & ";" & _
                               "Password=" & StrPassWord_User & ";" & _
                               "Jet OLEDB:System Database=" & StrChemin_MDW & ";"
     
        oCn.Mode = adModeRead
     
        On Error GoTo ERRH
     
        oCn.Open
     
        Set r = oCn.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
        ' Copie le recordset dans un tableau
        ' 1ere colonne (indice 0) : Ordinateur
        ' 2eme colonne (indice 1) : Utilisateur Access
        arrCnx = r.GetRows()
     
        r.Close
        Set r = Nothing
        oCn.Close
        Set oCn = Nothing
     
        ' Nettoye le tableau
        For row = LBound(arrCnx, 2) To UBound(arrCnx, 2)
            For col = LBound(arrCnx, 1) To UBound(arrCnx, 1)
                strTxt = CStr(Nz(arrCnx(col, row)))
                p = InStr(1, strTxt, vbNullChar)
                If p > 1 Then strTxt = Left(strTxt, p - 1)
                arrCnx(col, row) = strTxt
            Next
        Next
     
        ' Vide la table tblConnectes
        DoCmd.SetWarnings False
        DoCmd.RunSQL "DELETE FROM tblConnectes"
        DoCmd.SetWarnings True
     
        ' Récupère le nom de l'Ordinateur
        strThisComputer = Environ("COMPUTERNAME")
        If strThisComputer = "" Then
           strThisComputer = NomOrdinateur()
        End If
     
        blnIgnore = True
     
        ' Ajoute les connexions dans la table à l'exception de la
        ' première connexion trouvée ayant le même nom d'Ordinateur
        ' et d'utilisateur que celui qui exécute ce code
        For row = LBound(arrCnx, 2) To UBound(arrCnx, 2)
            If arrCnx(0, row) = strThisComputer And _
               arrCnx(1, row) = Application.CurrentUser() _
               And blnIgnore Then
               blnIgnore = False
             Else
               DoCmd.SetWarnings False
               DoCmd.RunSQL "INSERT INTO tblConnectes(Ordinateur, Utilisateur) " & _
                     "VALUES('" & arrCnx(0, row) & "', '" & arrCnx(1, row) & "')"
               DoCmd.SetWarnings True
            End If
        Next
     
        ' Raffraichir la liste List_Connectes
        Forms!F_List_Connectes.Form.Liste_Connecté.Requery
        ' Met la date et l'heure de version de la liste dans la
        ' zone de texte txtLstConnectesDateHeure
        Forms!F_List_Connectes.Form.txtLstConnectesDateHeure = Now()
        Exit Sub
     
    ERRH:
        If Not r Is Nothing Then
           If r.State <> adStateClosed Then r.Close
           Set r = Nothing
        End If
        If Not oCn Is Nothing Then
           If oCn.State <> adStateClosed Then oCn.Close
           Set oCn = Nothing
        End If
     
        MsgBox "Erreur " & CStr(err.Number) & " : " & err.Description
    End Sub
    Procédure pour trouver le chemin du .MDW:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Sub Chemin_MDW()
        'Récupération du chemin .mdw dans la table param
        'Si vous n'avez pas de table param, placer le chemin complet
        'StrChemin_MDW ="Chemin Complet du .MDW"
     
        Dim TableParam As New ADODB.Recordset
        TableParam.Open "T_param", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
        TableParam.MoveFirst
        StrChemin_MDW = TableParam("Chemin_mdw") 'Donne à la variable le chemin du .mdw
        TableParam.Close
    End Sub
    Procédure de récupération du chemin de la Base Dorsale:

    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
     
    Public Sub Chemin_Appli()
        'Récupération du chemin de la Base des DATA .mdb
        Dim X As String, i As Integer
        Dim Path As String
        Dim VarTableLiée As String
        Dim db As Database, Ret
     
        'Déclaration des variables
        Dim dbBase As DAO.Database
        Dim tbdTables As DAO.TableDef
        'Instancie la base courrante
        Set dbBase = CurrentDb
     
        'Boucle Parcourant toutes les tables de la Bdd en cours
        For Each tbdTables In dbBase.TableDefs
            'Teste l'attribut de la table pour savoir si c'est une table liée
            If tbdTables.Attributes And dbAttachedTable Then
                VarTableLiée = tbdTables.Name    'Donne le nom de la table à la variable
            End If
        Next tbdTables
     
        Set db = CurrentDb()
        Ret = db.TableDefs(VarTableLiée).Connect
        CheminAppli_Base_Data = Right(Ret, Len(Ret) - (InStr(1, Ret, "DATABASE=") + 8))
    End Sub
    Procédure pour trouver le nom du PC:

    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
    Private Function NomOrdinateur() As String
     
        Dim sComputerName As String
        Dim iSize As Long
     
        'Un premier appel pour avoir le nombre de caractères nécéssaire pour sComputerName
        GetComputerName sComputerName, iSize
     
        'On met sComputerName à la bonne taille
        sComputerName = Space(iSize)
     
        'Appel final
        GetComputerName sComputerName, iSize
        NomOrdinateur = sComputerName
     
        'PS : On aurait aussi pu déclarer sComputerName avec une taille assez grande :
        '     (dim sComputerName as string*32).
        '     Un seul appel de GetComputerName aurait alors suffit
    End Function

    Voilà, avec toutes les info trouvées ici même j'ai fait qq chose qui me convient, si ca peut vous aider, c'est avec plaisir.

    Merci à tous
    A+
    PS: Je place résolu mais il peut rester ouvert pour renseignement complémentaire.

  13. #13
    gph
    gph est déconnecté
    Membre habitué Avatar de gph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2005
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 99
    Points : 134
    Points
    134
    Par défaut
    L'explication est là pourle LDB : http://support.microsoft.com/kb/208778/fr

    Un lien à la fin permet de montrer un code pour lister les usagers connectés.

    D'ailleurs cela semble très proche de ce que tu as écris.
    Merci pour ton code.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/06/2015, 07h19
  2. Mon ListView ne se remet pas à jour en temps réel
    Par c.piette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/05/2015, 07h55
  3. [script.aculo.us] element.observer ne se met pas à jour après un ajax.updater
    Par PapyFouras dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 16/01/2010, 11h19
  4. [CKEditor] browser server files => ne se met pas a jour apres un CreateFolder
    Par otb82 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 20/02/2007, 11h52
  5. [CR 8.5] Objet ole lié (BMP) ne se remet pas à jour .
    Par rodrigue50 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 12/02/2004, 10h43

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