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 :

Clef primaire et Indexes uniques d'un DAO Recordset ?


Sujet :

VBA Access

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Clef primaire et Indexes uniques d'un DAO Recordset ?
    Bonjour à vous et merci de votre aide et de votre temps.

    J'aimerai pour une fonction de suivi d'ajout, modification et suppression récupérer la clef primaire et les indexes uniques associés à un enregistrement dans un objet DAO.recordset.
    Le Recordset peut être alimenté par une table ou une requête.

    Le but est d'avoir dans une table de suivi qui comporte entre autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Index : NomChampIndex1, Valeur ChampIndex1 |  ... | NomChampIndexN, Valeur ChampIndexN
    Sans avoir à préciser à la main les champs intéressants.

    J'ai bien trouvé la collection Indexes mais sur les DAO.Tabledef mais pas pour les DAO.Recordset.

    Est-ce qu'il existe un astuce ou une propriété que j'aurai manquée pour les obtenir avec les recordsets ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 881
    Points : 4 758
    Points
    4 758
    Par défaut
    Bonjour Marot,
    La collection Indexes ne s'applique effectivement qu'aux tables. Et c'est bien normal, qu'en penses-tu ?
    On crée une clé primaire ou des index seulement sur une table.
    A +

    Michel
    "Always look at the bright side of life." Monty Python.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci de ta réponse.

    Oui je sais que les indexes sont définis au niveau des tables mais si par exemple le recordset est de type Table, il est capable de les utiliser. Si il est de type dynaset il ne peut pas.

    Je cherche un moyen d'accéder à cette information pour tous les recordsets alimentés par une requête ou une table. La BD le sait bien, elle, qu'il y a un index unique ou pas.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 881
    Points : 4 758
    Points
    4 758
    Par défaut
    Effectivement, je ne m'étais pas encore posé cette question.
    du coup j'ai fait un coup de Google.
    Vois si le lien suivant https://msdn.microsoft.com/en-us/lib.../ff194103.aspx peut t'aider

    A+
    "Always look at the bright side of life." Monty Python.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci de ta recherche,

    Hélas je l'avais trouvé mais cela permet d'assigner un index à une recherche si il existe pas de savoir quels sont les indexes existants.
    De plus cela ne marche que sur les recordsets de type Table.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 881
    Points : 4 758
    Points
    4 758
    Par défaut
    Voici ce que j'en pense :
    les requetes utilisent automatiquement les index des tables sources des requetes (quelque soit le type de requete). Sinon j'en saurais quelque chose (depuis 10 ans).

    Mais pour savoir exactement quels index ou clés sont utilisés, c'est nettement plus coriace. Je crois me rappeller que dans un tuto de ... sur les performances d'une base, sur une ancienne version d'Access, il était possible de restituer le log qui décomposait l'utilisation (en mode Rushmore ..etc) d'une requete par JET.
    Quel est ton besoin exactement ?

    A+
    "Always look at the bright side of life." Monty Python.

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Je souhaite faire un suivi des modifications faites par mes utilisateurs.

    Dans l'idéal je lui passe le formulaire qui vient de faire l'action et le système écrit les informations sur la données modifiées.

    Par exemple (en clair) :

    Le 2015-12-17 à 12h30, l'utilisateur XYZ a modifié le champ TempsAlloue pour 1000 pour l'enregistrement dont la clef primaire est 12347 et l'index unique est Annee=2015, TypeProduction="Achat" via le sous-formulaire "sfrmSaisieTemps" dans le formulaire "frmSaisie".

    Je peux bien sur coder les champs moi-même mais cela va être spécifique à chaque formulaire et à maintenir à la main ... pas cool quand l'application n'est pas vraiment finale.

    Le but étant pour un utilisateur non informaticien de savoir ce qui a été fait par qui avec y compris les suppressions d'enregistrements.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 881
    Points : 4 758
    Points
    4 758
    Par défaut
    bonjour, Marot,

    Voici une fonction que j'utilise dans un contexte bien de consultation/modification précis. (moi aussi, dans le but de suivre toutes les modifications/suppressions des enregistrements)
    Si cela peut t'inspirer ...

    --------------------------------------------------------------------------------------------------------------------
    Champ de la table T_log_dataChange (dans laquelle j'enregistre les modifications / suppressions)
    ' SELECT Obj_id, Obj_type, Tbl_name, Tbl_PK_name, Tbl_PK_value, Col_name, Col_type, OldValue, NewValue, Obj_dateModif, Obj_userModif
    ' FROM T_log_dataChange
    ---------------------------------------------------------------------------------------------------------------------
    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
     
    Public Function fctSaveLocalRecord(ByVal sTypeEnr As String, _
                                       ByVal sWkgTable As String, _
                                       ByVal sTargetTable As String, _
                                       ByVal sPK_name As String, _
                                       ByVal intPK_id As Long) As Boolean
        Dim oRs1 As DAO.Recordset, oRs2 As DAO.Recordset
        Dim strErrMsg As String, strSql As String, i As Integer, l1 As Long
        Dim lIdAccess05 As Long, lIdAccess07 As Long
        ' 23/02/2011    MN  Creation
        ' 2015-07-12    MN  Adapté à IG
     
        ' sTypeEnr :        type pouvant servir à déterminer la table cible : pas utilisé ici.
        ' sWkgTable :       table de travail (c'est une table avec la même structure (mais pas de numAuto !) que la table cible (table liée) dans laquelle je ne recopie que l'enregistrement à modifier et que je place en source du formulaire en mode  Modification
        ' sTargetTable :    table cible
        ' sPK_name :        nom de la colonne de l'index de la table (doit être identique pour sWkgTable et sTargetTable)
        ' intPK_id :        identifiant de l'enregistrement à Enregistrer ( INSERT (création) si = 0 ; sinon UPDATE)
     
        If gMyDb Is Nothing Then Set gMyDb = CurrentDb
     
        If Nz(intPK_id, 0) = 0 Then
            ' C'est une CREATION
            l1 = InsertLocalRecord(sWkgTable, sTargetTable)
     
     
        Else
            ' C'est une MODIFICATION
            Set oRs1 = gMyDb.OpenRecordset(sWkgTable, dbOpenSnapshot)
            If oRs1.Recordcount > 0 Then
                oRs1.MoveLast
                oRs1.MoveFirst
                ' 1 seule ligne
                strSql = "SELECT * FROM " & sTargetTable & " WHERE " & sPK_name & " = " & intPK_id
                Set oRs2 = gMyDb.OpenRecordset(strSql, dbOpenDynaset, dbSeeChanges)
                If oRs2.Recordcount > 0 Then
                    oRs2.MoveLast
                    oRs2.MoveFirst
                    ' 1 seule ligne
                    oRs2.Edit
                    For i = 1 To oRs1.Fields.Count - 1
                        'Debug.Print oRs2.Fields(i).Name
     
                        ' On journalise seulement si c'est un champs modifié
                        ' --------------------------------------------------
                        If i < oRs1.Fields.Count - 3 Then
                            ' on n'enregistre pas les 2 dernières colonnes '..._dateModif' et '..._userModif'
                            If Nz(oRs2.Fields(i)) <> oRs1.Fields(i) Then
                                ' Mettre ds un journal les champs modifiés
                                strSql = "INSERT INTO T_log_dataChange " _
                                       & " (Obj_type, Tbl_name, Tbl_PK_name, Tbl_PK_value," _
                                       & "  Col_name, Col_type, OldValue, NewValue," _
                                       & " Obj_dateModif, Obj_userModif) VALUES " _
                                       & " ('UPDATE' ,'" & sTargetTable & "','" & sPK_name & "', " & intPK_id _
                                       & " ,'" & oRs1.Fields(i).Name & "','" & gMyDb.TableDefs(sTargetTable).Fields(oRs1.Fields(i).Name).Type & "' ,'" & TraiterChaineSql(CStr(Nz(oRs2.Fields(i)))) & "','" & TraiterChaineSql(CStr(Nz(oRs1.Fields(i)))) _
                                       & "', " & FormatDateUS(Now) & " ,'" & Environ("USERNAME") & "')"
                                Debug.Print strSql
                                gMyDb.Execute strSql
                            End If
                        End If
     
                        ' on sauve la valeur dans la base distante
                        ' ----------------------------------------
                        oRs2.Fields(i) = oRs1.Fields(i)
                    Next i
                    oRs2.Update
     
     
                    'End Select
     
                End If
            End If
     
        End If
     
        fctSaveLocalRecord = True
     
    Exit_0:
        Set oRs1 = Nothing: Set oRs2 = Nothing
        Exit Function
     
    Err_0:
        fctSaveLocalRecord = False
        Resume Exit_0
     
    End Function
    Bon w-e
    "Always look at the bright side of life." Monty Python.

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci Micniv.

    C'est toujours intéressant de voir comment les autres résolves les problèmes qu'on rencontre. Personnellement je vais faire un journal des modifications, pas une version historique des données. Cela permet de suivre l'évolution des données sans connaître les tables spécifiques.

    Mon point n'est pas dans le suivi des modifications elles-mêmes mais dans la détermination des clefs primaires et uniques d'un recordset SANS avoir à les spécifier manuellement.

    Tu passe recordset à la fonction et elle se débrouille toute seule pour trouver les indexes concernés.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. [AC-2007] Index et Clef Primaire
    Par triaguae dans le forum Modélisation
    Réponses: 2
    Dernier message: 06/08/2010, 13h26
  2. clef primaire ou index unique
    Par jose.ignacio.agata dans le forum SQL
    Réponses: 1
    Dernier message: 25/01/2008, 13h25
  3. index et clef primaire et étrangère
    Par stos dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/09/2006, 08h59
  4. Clef primaire access, Indexé avec doublon
    Par Asurmena dans le forum Access
    Réponses: 1
    Dernier message: 05/06/2006, 11h04
  5. Difference entre Clef primaire et Index
    Par vijeo dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 16/05/2006, 16h07

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