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 :

Perte du modèle relationnel avec ce code...


Sujet :

VBA Access

  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 Perte du modèle relationnel avec ce code...
    Bonjour à tous...

    J'ai 4 tables physique dans un db qui ont des relations entre elles.
    Ces 4 tables sont mise à jour quotidiennement via un import ODBC externe à 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
    29
    30
    31
    32
    Private Function Importation()
    'Lancement de l'importation de la table
            DoCmd.TransferDatabase acImport, "Base de données ODBC", "ODBC;DSN=GGA60;", acTable, "none." & tblImport, "none_" & tblImport
                'Suppression de la table déjà présente dans la db
                 DoCmd.DeleteObject acTable, "none_" & tblImport
                     'Renommage de la table venant d'être importée
                      DoCmd.Rename "none_" & tblImport, acTable, "none_" & tblImport & "1"
    End Function
    Private Sub fraImportProd_Click()
    On Error GoTo MessageErreur
     
            'Définition de la table a importer
            tblImport = "ARTST"
                'Lancement de l'importation via la Function Importation()
                Importation
                    'Avancement de la progressbar de 25% du total
                    pgbAvancement.Value = pgbAvancement.Value + 25
            tblImport = "CDIPP"
                Importation
                    pgbAvancement.Value = pgbAvancement.Value + 25
            tblImport = "HALOA_DET"
                Importation
                    pgbAvancement.Value = pgbAvancement.Value + 25
            tblImport = "PLMAT"
                Importation
                    pgbAvancement.Value = pgbAvancement.Value + 25
        pgbAvancement.Value = 0
    Exit Sub
    MessageErreur:
    MsgBox "Erreur " & Err.Number & vbCrLf & Err.Description
    Resume Next
    End Sub
    La difficulté que je rencontre avec ce code est que si je défini les champs "clés" et si je crée des relations entre les tables je ne peux ensuite plus supprimer ou renommer ces tables car des relations existes.
    Comment peut-on faire pour supprimer toutes les relations et les recréer via le code + définir les clés dans chaque tables puisque après l'import je n'en ai plus aucune ?
    Merci à tous pour votre aide précieuse...
    @+

    P.S. Comment pourrais-je diminuer le nb de ligne de la boucle :
    Nom de la tbl à importer, Lancement de la fonction; Avancement de la progressbar...Merci ;-)

  2. #2
    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
    Toutes les réponses concernant les relations et la modification de la structure d'une base de données


    http://warin.developpez.com/access/dao

  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
    Salut Tofalu !

    Cool je ne connaissais pas ce tuto...VIVA DAO !!!

    Cependant si vous avez une idée de quel algo serait le plus adapté, je vous écoute ;-)

    Meci beaucoup...

    Edit : je viens de potasser le
    4.6.5. Opérations sur les relations

    c'est super intéressant...mais je n'arrive pas à enchaine la création de plusieurs relations de suite !!! Merci

  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-Bonjour à tous...
    Après avoir potasser et tester 2 question me viennent alors à l'esprit :

    -> Pour supprimer les relations existantes j'utilise donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Function SupprimerRelationTable(oBaseDeDonnees As DAO.Database, strNomTable As String) As Integer
    'Pour chaque relation,
    For Each oRlt In oBaseDeDonnees.Relations
      'si la table est utilisée
     If oRlt.Table = strNomTable Or oRlt.ForeignTable = strNomTable Then
       'Supprime la relation
       oBaseDeDonnees.Relations.Delete oRlt.Name
       oBaseDeDonnees.Relations.Refresh
       'Incrémente le compteur
       SupprimerRelationTable = SupprimerRelationTable + 1
     End If
    Next oRlt
    End Function
    Appelé par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'Supprime les relations de la table désignée
        MsgBox SupprimerRelationTable(oDb, "none_" & strNomTable)
    N'existe-t-il pas un moyen plus simple qui supprime toutes les relations présentes dans la db car en réalité j'ai 30 tables + comment faire pour lancer la suppression des relations sans avoir de MsgBox ?

    -> Ensuite, une fois l'importation faite je vais devoir recréer toutes les relations mais je ne comprends pas comment "structurer" le code pour créer 50 relations par exemple...
    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
    'Crée la relation
    Set oRlt = oDb.CreateRelation
    'Définit les propriétés
    oRlt.Attributes = dbRelationDontEnforce
    oRlt.ForeignTable = strNomTableEtrangere 
    oRlt.Name = strNomRelation
    oRlt.Table = strNomTableSource
    'Crée le champ dans la relation
    Set oFld = oRlt.CreateField(strNomChampSource)
    'Définit le nom de la clé externe
    oFld.ForeignName = strNomChampEtranger
    '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
    Merci à tous pour votre aide...

  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
    Pour supprimer toutes les relations, il suffit de parcourir la collection Database.Relations et de supprimer les éléments.

    Sub SupprimerToutesRelations()
    Dim oDb As DAO.Database
    Set oDb = CurrentDb
    With oDb.Relations
    While .Count > 0
    .Delete oDb.Relations(0).Name
    .Refresh
    Wend

    End Sub
    -> Ensuite, une fois l'importation faite je vais devoir recréer toutes les relations mais je ne comprends pas comment "structurer" le code pour créer 50 relations par exemple...

    Le plus simple serait de définir un fichier texte qui va contenir les différentes propriétés des relations (en colonne) ou bien encore une table utilitaire, ensuite, pour chaque ligne du fichier, appeler une procédure qui créera la relation

    Comme colonne tu auras besoin de :

    TablePrincipale
    Champ principal
    Table secondaire
    Champ secondaire
    Mise A jour en cascade
    Suppression en cascade


    Pas trés compliqué, il suffit de bien poser sur papier ce que tu souhaites faire et décomposer un maximum en procédure - en tout cas, un sujet trés interressant

  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
    Bonjour Tofalu et Merci, Bonjour à tous...

    Clair que c'est un sujet très intéressant, et ceci grâce à vous tous ;-)

    Pour la suppression de l'ensemble des relations j'ai bien pigé le truc ;-)

    Par contre pour la création des relations, j'ai donc crée un tblRelation avec les champs suivants comme tu me l'a indiqué :
    TablePrincipale__________Texte
    Champprincipal__________Texte
    TableSecondaire ________Texte
    ChampSecondaire _______Texte
    MAJEnCascade __________Oui/Non
    SuppressionEnCascade ___Oui/Non

    Puis je crée la fonction suivante si j'ai bien compris ???
    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
    Private Function CreerRelationTable()
    '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
    Mais Est-ce que toutes les lignes seront parcourus, je pense pas, il faut sans doute faire une boucle ou un truc dans le genre que je n'ai jamais utilisé...

    Et ensuite dans ma procédure j'appel la fonction tout simplement...?

    Merci beaucoup

  7. #7
    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-re-re-re à tout le monde...

    En m'inspirant de la réflexion de Tofalu pour mettre les diverses relations dans une tbl spécifique, je me dis que l'on pourrait faire de même avec les champs à supprimer via le code du tuto DAO et une tblChampASupprimer qui contiendrais 2 champs :
    TableSource
    ChampASupprimer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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
    Mais une fois la tbl existante, pouvez-vous me dire comment modifier le code...?

    Merci à tous...

  8. #8
    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 tout le monde...

    Dans les 2 cas que je viens de citer il faut surement que j'utilise un Do...Loop mais je ne sais pas comment.

    Il serait peut-être intéressant que je clos ce fil dont le sujet de départ est résolu et que je reparte sur un nouveau fil ?

    Merci pour votre aide.

    Edit : La suite se trouve ICI puisque le sujet intial est résolu ;-)

  9. #9
    Membre éclairé Avatar de kirgan
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 127
    Par défaut
    Etant donné le nombre de nouvelles réponses, je pense bien! Tu pourrais même insérer ici le lien vers la nouvelle discussion, si quelqu'un veut le follow up

    Je ne peux malheureusement pas vraiment répondre à ta question technique...

  10. #10
    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
    j'ai donc recréer le sujet "proprement" dans ce nouveau fil (enfin il date d'hier mais tjs pas de réponse :-() ;-) ICI

    Merci

  11. #11
    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
    Il faut parcourir les lignes de la table avec un recordset, c'est dans le même tutoriel

  12. #12
    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
    Citation Envoyé par Tofalu
    Il faut parcourir les lignes de la table avec un recordset, c'est dans le même tutoriel
    ah ouais ok j'ai pas été super attentif alors !!

    je regarde et si posterais sur l'autre fil si besoin ;-)

    Merci

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

Discussions similaires

  1. [Acceleo] Génération de code à partir d'un modèle "ecore" avec Acceleo
    Par drseuss dans le forum Eclipse Modeling
    Réponses: 2
    Dernier message: 19/04/2012, 15h32
  2. Vue non compatible avec le code du modèle associé
    Par wassimha dans le forum Débuter
    Réponses: 0
    Dernier message: 26/08/2011, 12h36
  3. Modèles Word avec codes en vb
    Par jlon25 dans le forum VBA Word
    Réponses: 0
    Dernier message: 12/02/2008, 10h03
  4. Diagramme de classes -> Modèle relationnel
    Par ftrifiro dans le forum Diagrammes de Classes
    Réponses: 6
    Dernier message: 11/03/2005, 10h29
  5. Peut-on faire du son juste avec du code assembleur ?
    Par Rick1602 dans le forum Assembleur
    Réponses: 7
    Dernier message: 26/03/2004, 17h39

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