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 :

Modification d'une table liée [AC-2002]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 112
    Par défaut Modification d'une table liée
    Bonjour

    Environnement : Access 2002 SP3, Windows XP

    J'ai lu et vérifié qu'on ne pouvait pas modifier la structure de tables liés.
    Il faut pourtant que je trouve un moyen de les modifier sans sortir de mon application, d'où le raisonnement suivant - peut-être erroné :
    - je supprime les liens en cours
    - j'ouvre la base des tables que je veux attacher, dans un autre workspace
    - je change la structure
    - je re-crée les liens

    ci-joint le code qui devrait faire ça :
    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
     
     
    Sub alter_ation(ByVal Fichier As String)
     
    Dim dbs, db As Database
    Dim tdf As TableDef
     
    Set dbs = CurrentDb
     
    ' Elimination des liens
    For Each tdf In dbs.TableDefs
    If Len(tdf.Connect) > 0 Then
        DoCmd.DeleteObject acTable, tdf.Name
    End If
    Next
    Set wrk = CreateWorkspace("", "admin", "", dbUseJet)
     
    Set db = wrk.OpenDatabase(Fichier)
     
    For Each tdf In db.TableDefs
    'Altération table Risques
        If tdf.Name = "Risques_PALIER" Then
            If Not ExisteChamp(tdf.Name, "Date_ident") Then
                CurrentProject.Connection.Execute "ALTER TABLE " & tdf.Name & " ALTER COLUMN [Gravité_Risque] string(15)"
                CurrentProject.Connection.Execute "ALTER TABLE " & tdf.Name & " ALTER COLUMN [Proba_Risque] string(12)"
                CurrentProject.Connection.Execute "ALTER TABLE " & tdf.Name & " ADD COLUMN [Num_factor] string(3)"
                CurrentProject.Connection.Execute "ALTER TABLE " & tdf.Name & " ADD COLUMN [Date_ident] date"
                CurrentProject.Connection.Execute "ALTER TABLE " & tdf.Name & " ADD COLUMN [Date_maj] date"
                CurrentProject.Connection.Execute "ALTER TABLE " & tdf.Name & " ADD COLUMN [Tendance] byte"
                CurrentProject.Connection.Execute "ALTER TABLE " & tdf.Name & " ADD COLUMN [Phase] string(30)"
            End If
        End If
     
    Next
     
    ' Re-Mise en place des liens
    For Each TB In db.TableDefs
        DoCmd.TransferDatabase acLink, "Microsoft Access", Fichier, acTable, TB.Name, TB.Name, False
    Next
    End Sub
    Mais cela ne fonctionne pas.
    Access me dit : "Table ou contrainte non trouvée" sur le premier "Alter column".
    Or il a pourtant trouvé la table puisqu'il est entré dans le "If".

    A votre avis, qu'est ce qui cloche dans le raisonnement (ou dans le code) ?

    merci à vous
    cordialement

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Par défaut
    Bonjour
    Je suis amené à faire régulièrement cette manipulation.
    Par contre, pas besoin de casser les liens, ni de créer un WorkSpace.
    Tu fais simplement un Opendatabase dans une variable Database de ta base source
    Tu fais un Tabledefs sur la table à modifier
    Tu fait un CreateField de ton champ

    Et c'est tout, la table liée sera à jour.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 112
    Par défaut
    Merci fgiambelluco

    J'ai essayé ta solution
    J'arrive à créer le champ par CreateField (et nom par le SQL ALTER TABLE) mais j'ai une erreur au moment de l'append :
    "Le moteur de base de données n'a pas pu verrouiller la table car elle est déjà utilisée par une autre personne ou un autre processus".

    D'autre part, comment modifier la taille d'un champ existant déjà avec cette méthode ?

    Merci en tout cas pour l'intérêt que tu as porté à ma question
    cordialement
    MadMax

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Par défaut
    Bonjour
    "Le moteur de base de données n'a pas pu verrouiller la table car elle est déjà utilisée par une autre personne ou un autre processus".
    Il semblerait que lorsque tu exécutes ton code, la table soit déjà ouverte (un formulaire ?)
    A vérifier

    D'autre part, comment modifier la taille d'un champ existant déjà avec cette méthode ?
    Pas de chance, la propriété Size ne peut être modifiée que lors de la création du champ.

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 944
    Par défaut
    Re
    On peut changer la taille d'un champ en SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DoCmd.RunSQL ("Alter Table clients alter column NomClient varchar(75)")
    Table :clients, champ : nomClient , type : texte sur 75

    Pour créer un champ en SQL, remplace alter column par add column

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 112
    Par défaut
    Encore Merci fgiambelluco

    Effectivement, il y avait un formulaire encore ouvert.
    Une fois fermé, la modification fonctionne.

    Cette solution va me simplifier la vie en m'évitant de passer sur chaque poste pour faire évoluer les bases.

    Je suis encore étonné que ce soit possible : j'ai vraiment appris quelque chose !!!

    Bravo pour ton investissement dans ce forum.

    cordialement
    MadMax

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

Discussions similaires

  1. [AC-2007] Modification d'une table liée non répercutée sur une combobox
    Par Frantisch dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/04/2014, 07h58
  2. [AC-2010] Modif de la valeur d'un champ d'une table liée par ODBC
    Par voilyon dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 12/09/2013, 17h31
  3. Modification champ d'une table liée
    Par lustucrette dans le forum Développement
    Réponses: 2
    Dernier message: 06/02/2013, 16h20
  4. Rafraichir une table liée après modification des liaisons
    Par Diablange dans le forum VBA Access
    Réponses: 5
    Dernier message: 24/08/2010, 09h10
  5. Modification d'une table liée
    Par jmde dans le forum VBA Access
    Réponses: 1
    Dernier message: 10/06/2008, 05h16

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