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 :

[VBA-A97] DAO : Suppression champs et création MCD...


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Par défaut [VBA-A97] DAO : Suppression champs et création MCD...
    Bonjour à tous...

    J'ai quelques questions pour vous concernant la modification de tables et la création de relations par DAO...

    Je remercie également Tofalu pour son excellent tuto ici.

    1er blocage : j'ai X tables dans une db pour lesquels je dois créer le MCD après une ré-importation de toutes ces tbl via ODBC.
    Sur les conseils de Tofalu j'ai donc créer dans une tbl spécifique "tblRelation" ces relations avec ces champs :
    TablePrincipale__________Texte
    Champprincipal__________Texte
    TableSecondaire ________Texte
    ChampSecondaire _______Texte
    MAJEnCascade __________Oui/Non
    SuppressionEnCascade ___Oui/Non

    Ensuite je dois donc créer les relations avec chacun des enregistrements à l'aide de ce 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
    Private Function CreerRelationTable()
    Dim oDb As DAO.Database
    Dim oRlt As DAO.Relation
    Dim oFld As DAO.Field
    Set oDb = CurrentDb
    'Crée la relation
    Set oRlt = oDb.CreateRelation
    'Définit les propriétés
    oRlt.Attributes = dbRelationUpdateCascade
    oRlt.ForeignTable = [tblRelation]![TableSecondaire].Value
    oRlt.Name = [tblRelation]![ChampPrincipal].Value
    oRlt.Table = [tblRelation]![TablePrincipale].Value
    'Crée le champ dans la relation
    Set oFld = oRlt.CreateField([tblRelation]![ChampPrincipal].Value)
    'Définit le nom de la clé externe
    oFld.ForeignName = [tblRelation]![ChampSecondaire].Value
    'Ajoute le champ
    oRlt.Fields.Append oFld
    'Rafraîhit la collection Relations
    oDb.Relations.Refresh
    'Ajoute la relation
    oDb.Relations.Append oRlt
    'Rafraîhit la collection Relations
    oDb.Relations.Refresh
    'Ferme la base de données
    oDb.Close
    Set oDb = Nothing
    End Function
    Ma question : Comment structurer le code pour lire l'ensemble des enregistrements et créer toutes les relations de la tblRelation...Surement à l'aide d'un Do...Loop...?

    2ème blocage : même principe que le 1er lol; je dois supprimer, dans toutes mes tables importées, des champs qui ne me servent pas. J'ai donc créé une tblChampASupprimer avec :
    TableSource_______________Texte
    ChampASupprimer__________Texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Function SupprimerChamp (oBaseDeDonnees As DAO.Database, strNomTable As String,
     strNomChampASupprimer As String) As Boolean
     
      'Récupère la table
       Set oTbl = oBaseDeDonnees.TableDefs(strNomTable)
      'Supprime le champ
      oTbl.Fields.Delete (strNomChampASupprimer)
      'Renvoie True
      SupprimerChamp = True
     Exit Function
    Ma question : Comment structurer le code pour lire l'ensemble des enregistrements et supprimer tous les champs de la tblChampASupprimer ...Surement à l'aide d'un Do...Loop...?

    Enorme merci à tous...je suis prêt à apprendre en suivant vos conseils ;-)
    @+

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Par défaut
    Bonjour à tous...

    Tofalu m'a précisé qu'il fallait parcourir les lignes de la table avec un recordset (voir son tutos pour les détails) mais je n'arrive pas à comprendre comment le structurer...je sais je suis pas très malin mais bon...;-)

    Pouvez-vous m'orienter et ùe filer un tit coup de main...

    Merci à tous...
    @+

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Par défaut
    Re-Bonjour,

    Je fais une proposition pour la 2ème partie concernant la liste des champs à supprimer stockée dans une table :
    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
    Private Function IndexerChamp()
    Set oRst = oDb.OpenRecordset("tblChampAIndexer", dbOpenTable)
    'Se place sur le premier enregistrement
    oRst.MoveFirst
    IndexerChampSub
    'Se place sur l'enregistrement suivant
    oRst.MoveNext
    IndexerChampSub
    'Libération des objets
    oRst.Close
    Set oRst = Nothing
    End Function
    *************************************************
    Private Function IndexerChampSub()
    'Set oRst = oDb.OpenRecordset("tblChampAIndexer", dbOpenTable)
    'Instancie la table
    Set oTbl = oDb.TableDefs(oRst.Fields("TableSource").Value)
    'Crée l'index en le nommant
    Set oInd = oTbl.CreateIndex(oRst.Fields("ChampAIndexer").Value)
    'Cree le champ dans l'index
    Set oFld = oInd.CreateField(oRst.Fields("ChampAIndexer").Value)
    'Ajoute le champ à la collection Fields
    oInd.Fields.Append oFld
    'Définit la clé primaire
    oInd.Primary = True
    'Ajoute l'index à la table
    oTbl.Indexes.Append oInd
    'Rafraichit la collection
    oTbl.Indexes.Refresh
    'Libération des objets
    Set oTbl = Nothing
    Set oInd = Nothing
    Set oFld = Nothing
    End Function
    Dois-je partir sur ce principe ? Comment mieux organiser le code pour ne pas répéter la suppression en "dur" à chaque changement d'enregistrements,...
    Dans le tuto, il y a un :
    Pour parcourir l'ensemble des enregistrements d'un Recordset, vous procéderez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'Tant que non fin du recordset
    While Not oRecordset.EOF
      'Passer au suivant
      oRecordset.MoveNext
    Wend
    Comment l'utiliser dans mon cas : à chaque enregistrement, réaliser la suppression dans la table X sur le champ Y...

    Merci d'avance à tous ;-)

    P.S. Par contre dans le code que je vous ais donné, j'ai une erreur "Erreur 3022, Modifications non effectuées: risque de doublons dans champs index, clé primaire ou relation interdisant les doublons"
    Dans la tblChampAIndexer j'ai 2 enregistrements : Table1/IdRef et Table2/IdRef. Le problème vient surement du fait que j'ai 2 champs nommés à l'identique dans les 2 tables, ce qui est normal dans mon cas. Comment contourner l'erreur ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Par défaut
    Re à tous...

    En attendant des réponses sur mes questions, que me conseillez-vous pour indenter le code en ligne ou autre et d'assez fiable ;-)

    Merci à tous...

  5. #5
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Alors, si on prend la table tblRelation, le parcours de cette table, sera obtenu par quelque chose de ce style :

    Sub CreerRelationDepuisTable()
    Dim oDb As DAO.Database
    Dim oRst As DAO.Recordset
    Set oDb = CurrentDb
    Set oRst = oDb.OpenRecordset("tblRelation")
    With oRst
    While Not .EOF
    creerUneRelation oDb, _
    .Fields("TablePrincipale").Value, _
    .Fields("ChampPrincipal").Value, _
    .Fields("TableSecondaire").Value, _
    .Fields("ChampSecondaire").Value, _
    .Fields("MAJEnCascade").Value, _
    .Fields("SuppressionEnCascade").Value
    .MoveNext
    Wend
    End With
    End Sub
    Cette boucle fait donc appel à la methode creerUneRelation :

    Sub creerUneRelation(oDb As DAO.Database, _
    strTablePrincipale As String, _
    strChampPrincipal As String, _
    strTableSecondaire As String, _
    strChampSecondaire, _
    bMaj As Boolean, bDel As Boolean)
    Dim oRlt As DAO.Relation
    'Crée la relation
    Set oRlt = oDb.CreateRelation
    oRlt.Attributes = IIf(bMaj, dbRelationUpdateCascade, 0) + _
    IIf(bDel, dbRelationDeleteCascade, 0)
    oRlt.ForeignTable = strTableSecondaire
    oRlt.Name = strTablePrincipale & strTableSecondaire
    oRlt.Table = strTablePrincipale
    'Crée le champ dans la relation
    Set oFld = oRlt.CreateField(strChampPrincipal)
    'Définit le nom de la clé externe
    oFld.ForeignName = strChampSecondaire
    'Ajoute le champ
    oRlt.Fields.Append oFld
    'Rafraîhit la collection Relations
    oDb.Relations.Refresh
    'Ajoute la relation
    oDb.Relations.Append oRlt
    'Rafraîhit la collection Relations
    oDb.Relations.Refresh
    End Sub
    Je n'ai pas pu tester donc il ne serait pas étonnant qu'il y ait quelques petit soucis

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 310
    Par défaut
    Voici l'erreur qui ressort en brut de code : :-)
    "Erreur 3201 : Vous ne pouvez pas ajouter ou modifier un enregistrement car l'enregistrement connexe est requis dans la table 'XXX'"

    !?:;?/!;?,!:,: ?

Discussions similaires

  1. [VBA][ACCESS]suppression champs vides
    Par k_pone dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/06/2007, 16h01
  2. Réponses: 2
    Dernier message: 09/01/2007, 19h57
  3. Réponses: 6
    Dernier message: 11/06/2006, 22h03
  4. Réponses: 2
    Dernier message: 08/06/2006, 06h29
  5. Réponses: 1
    Dernier message: 31/05/2006, 17h59

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