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 :

Fields.Attributes = dbAutoIncrField [AC-2013]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    EUC
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : EUC

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Fields.Attributes = dbAutoIncrField
    Hi,
    I send yesterday this mail, but I don't think it passed.


    A VBA Access code was perfectly working in Office 2003, but, now I change to Office 2013…
    I search, but nothing I found on the net response exactly to my problem. Can you help me?
    Here us the 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
    Sub Create_MyTable:
        Set dbs = appAccess.CurrentDb
        sTableName = "MyTable"
        Set tdf = dbs.CreateTableDef(sTableName)
         With tdf
            .Fields.Append .CreateField("Id", dbLong)
            .Fields.Append .CreateField("IdOther", dbLong)
            Set idx = .CreateIndex("Id")
            idx.Fields.Append idx.CreateField("Id")
            idx.Primary = True
            .Indexes.Append idx
        End With
        Set fld = tdf.Fields("id")
        fld.Attributes = dbAutoIncrField                               *Here is the problem
        dbs.TableDefs.Append tdf
    End Sub
    Thanks,
    Alain.

  2. #2
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Février 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Février 2016
    Messages : 12
    Par défaut Citation INUTILE !
    You can see this code (in french) : http://warin.developpez.com/tutoriel...erieurs/#LIV-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
     
     
    Sub CreerTable()
    Dim oDb As DAO.Database
    Dim oNouvelleTable As DAO.TableDef
    Dim oChamp As DAO.Field
    Dim oIndex As DAO.Index
    'Instancie la base de données
        Set oDb = CurrentDb
    'Crée la nouvelle table
        Set oNouvelleTable = oDb.CreateTableDef("Clients")
    'Crée le champ IDClient
        Set oChamp = oNouvelleTable.CreateField("IDClient", dbLong)
    'Définit le champ en numero_auto
        oChamp.Attributes = dbAutoIncrField
    'Ajoute le champ à la table
        oNouvelleTable.Fields.Append oChamp
    'Crée le champ nomClient et l'ajoute
        oNouvelleTable.Fields.Append oNouvelleTable.CreateField("NomClient", _
            dbText, 15)
    'Crée le champ PrenomClient et l'ajoute
        oNouvelleTable.Fields.Append oNouvelleTable.CreateField("PrenomClient", _
            dbText, 25)
    'définit la clé primaire sur l'IDClient
        Set oIndex = oNouvelleTable.CreateIndex("PK_IDClient")
        oIndex.Primary = True
        oIndex.Fields.Append oIndex.CreateField("IdClient")
    'Ajoute l'index à la table
        oNouvelleTable.Indexes.Append oIndex
    'Ajoute la table à la base de données
        oDb.TableDefs.Append oNouvelleTable
     
    'Libère les variables
    oDb.Close
    Set oIndex = Nothing
    Set oChamp = Nothing
    Set oNouvelleTable = Nothing
    Set oDb = Nothing
    End Sub

  3. #3
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut
    Baa01,

    The solution is above :

    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
    Sub Create_MyTable()
     
    Dim Matable As TableDef
    Dim tdfNew As TableDef
    Dim dft As TableDef
    Dim idx As Index
    Set dbs = Application.CurrentDb
    '
        Set tdf = dbs.CreateTableDef("MyTable")
        '
        With tdf
            .Fields.Append .CreateField("Id", dbLong)
            .Fields![Id].Attributes = dbAutoIncrField
            dbs.TableDefs.Append tdf
        End With
        '
        Set dft = dbs.TableDefs!("MyTable")
        '
        Set idx = dft.CreateIndex("PrimaryKey")
        Set Lien = idx.CreateField("Id", dbLong)
        idx.Primary = True
        idx.Unique = True
        '
        idx.Fields.Append Lien
        '
        dft.Indexes.Append idx
        dft.Indexes.Refresh
    End Sub

    however , you're on a French website ! Please use french

    Best regards

    Jimbolion

  4. #4
    Membre à l'essai
    Homme Profil pro
    EUC
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : EUC

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Un grand merci
    Cela fonctionne maintenant, j'ai encore un "petit" problème avec un lien que je veux créer à la place de la table, mais je cherche d'abord. Désolé du retard de la réaction mais plusieurs évènement de ma vie privée ne m'ont pas permis de tester et de réagir rapidement. Pour la langue, désolé, mais c'est une (mauvaise?) habitude. Merci encore.

  5. #5
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut
    Baa01 bonsoir,

    Cela fonctionne maintenant, j'ai encore un "petit" problème avec un lien que je veux créer à la place de la table, mais je cherche d'abord.


    si malgré tes recherches tu n'y arrives pas, nous serons toujours là pour le coup de pouce

    Cldt

    jimbolion

  6. #6
    Membre à l'essai
    Homme Profil pro
    EUC
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : EUC

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Lien avec une table à la place d'une table incluse dans la DB
    Bonsoir,
    Donc depuis mon passage en 2013, j'ai quelques problèmes. Celui de AutoNumber est résolu. Merci !!!
    Mais cette table créée avec DAO ne réagit pas comme les autres.
    Une fois créées, je veux transférer la structure de ces tables dans une autre DB, pour ensuite détruire cette DB temporaire une fois les requêtes effectuées.
    J'utilise pour cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sTableCollection= la liste des tables à transférer
    sTmpFile= La DB temporaire
     
        For Each v In Split(sTableCollection)
            DoCmd.TransferDatabase acLink, "Microsoft Access", sTmpFile, acTable, v, v
        Next
    Seule la table créée via DAO bloque ...

    Merci ...

  7. #7
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut
    Baa01,



    Rien ne différencie une table créée en VBA ou créée via les outils de création !

    As tu un message d'erreur ? Es tu sûr qu'il s'agit bien de cette table, pense à utiliser des points d'arrêt pour suivre pas à pas l’exécution de ton code.

    Cldt

    jimbolion

  8. #8
    Membre à l'essai
    Homme Profil pro
    EUC
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : EUC

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Link DB
    Bonsoir,
    Voilà, je viens de repasser le code et j'ai comme erreur:
    Erreur 3011:
    The Microsoft access engine could not find the object "NomDeLaTable" ...
    Alors que la table existe dans la liste des tables !

    Merci ...

  9. #9
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut
    Baa01

    donc nous allons transformer le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        For Each v In Split(sTableCollection)
            debug.print sTmpFile, acTable, v
            DoCmd.TransferDatabase acLink, "Microsoft Access", sTmpFile, acTable, v, v
        Next
    Dans la fenêtre d’exécution de l’éditeur (ctrl + G) tu devrais avoir la liste des objets !

    ensuite nous contrôlerons la présence de chaque table dans la bonne définition de l'objet sTmpFile (il se peut que tu fasses appel d'un côté à des tables liées et de l'autre à une table locale)

    cldt

  10. #10
    Membre à l'essai
    Homme Profil pro
    EUC
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : EUC

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Tests sur les tables à transférer
    Bonsoir,
    Il y avait donc trois tables dans cette variable.
    J’ai modifié le VBA pour qu’elles soit toutes créées via le même process (DAO)
    J’ai également changé l’ordre de la création des tables, ce qui n’avait aucune influence sur le reste de la procédure.
    J’ai donc modifié le transfert avec vos instructions , voici le résultat :
    Tempfile 0 TblONSyst
    Tempfile 0 TblSystStruct
    Tempfile 0 TblON
    La dernière bloque, les autres sont bien transférées.
    Voici le code de la deuxième (pour exemple):
    CODE
    CreateTblONSyst:
    sTableName = "TblONSyst"
    Set oTdf = oDb.CreateTableDef(sTableName)
    With oTdf
    .Fields.Append .CreateField("IdSyst", dbLong)
    .Fields.Append .CreateField("IdStop", dbLong)
    .Fields.Append .CreateField("Syst_Name", dbText, 40)
    .Fields.Append .CreateField("IdSystLevel", dbLong)
    .Fields.Append .CreateField("Syst_OrderNbr", dbLong)
    .Fields.Append .CreateField("IdSyst_Sup", dbLong)
    .Fields.Append .CreateField("IdSyst87", dbLong)
    .Fields.Append .CreateField("IdSyst67", dbLong)
    For Each v In Split(Mid$(sSysLevels, 5))
    sON = "ON" & v
    .Fields.Append .CreateField(sON, dbLong)
    Next v
    Set oIndex = .CreateIndex("IdSyst")
    oIndex.Fields.Append oIndex.CreateField("IdSyst")
    oIndex.Primary = True
    .Indexes.Append oIndex
    End With
    oDb.TableDefs.Append oTdf
    subHideNavigationPane
    GoSub TableCollection
    Return
    CODE
    Voici le code de celle qui pose problème :
    CODE
    CreateTblON:
    sTableName = "TblON"
    Set oDb = CurrentDb
    Set oTdf = oDb.CreateTableDef(sTableName)
    Set oField = oTdf.CreateField("Id", dbLong)
    oField.Attributes = dbAutoIncrField
    oTdf.Fields.Append oField
    oTdf.Fields.Append oTdf.CreateField("IdSyst", dbLong)
    Set oIndex = oTdf.CreateIndex("PK_Id")
    oIndex.Primary = True
    oIndex.Fields.Append oIndex.CreateField("Id")
    oTdf.Indexes.Append oIndex
    Set oIndex = oTdf.CreateIndex("PK_IdSyst")
    oIndex.Fields.Append oIndex.CreateField("IdSyst")
    oTdf.Indexes.Append oIndex
    oDb.TableDefs.Append oTdf
    subHideNavigationPane
    GoSub TableCollection
    'GoSub TransfertTable
    Return
    CODE

    L'utilisation des objets est différentes entre ces deux création de table, mais celle qui n'a pas été modifiée (la première) passe sans problème ...

    Merci,
    Alain.

  11. #11
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut
    Baa01,

    J'avoue ne plus rien comprendre à ton fil de discussion j'ai l'impression qu'on part d'un problème pour en évoquer un nouveau )
    Quand tu dis çà ne marche pas il me faut un peu de matière pour analyser l'origine de ton problème (code erreur, problème à la compilation) !

    Il faut aussi proscrire les gosub et goto (hormis la gestion d'erreur) de ton code. Ces instructions sont dignes de la programmation de la préhistoire.

    Ensuite le GoSub TableCollection ne fait référence à aucune sous routine de ton code

    maintenant en adaptant le code sans trop cherché à comprendre la syntaxe les deux tables se créent bien dans la base locale


    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
    Function create_table()
    sTableName = "TblON"
    CreateTblONSyst:
    sTableName = "TblONSyst"
    Set oDb = CurrentDb
    Set oTdf = oDb.CreateTableDef(sTableName)
    With oTdf
    .Fields.Append .CreateField("IdSyst", dbLong)
    .Fields.Append .CreateField("IdStop", dbLong)
    .Fields.Append .CreateField("Syst_Name", dbText, 40)
    .Fields.Append .CreateField("IdSystLevel", dbLong)
    .Fields.Append .CreateField("Syst_OrderNbr", dbLong)
    .Fields.Append .CreateField("IdSyst_Sup", dbLong)
    .Fields.Append .CreateField("IdSyst87", dbLong)
    .Fields.Append .CreateField("IdSyst67", dbLong)
    For Each v In Split(Mid$(sSysLevels, 5))
    sON = "ON" & v
    .Fields.Append .CreateField(sON, dbLong)
    Next v
    Set oIndex = .CreateIndex("IdSyst")
    oIndex.Fields.Append oIndex.CreateField("IdSyst")
    oIndex.Primary = True
    .Indexes.Append oIndex
    End With
    oDb.TableDefs.Append oTdf
    'subHideNavigationPane
    '
    CreateTblON:
    sTableName = "TblON"
    Set oDb = CurrentDb
    Set oTdf = oDb.CreateTableDef(sTableName)
    Set oField = oTdf.CreateField("Id", dbLong)
    oField.Attributes = dbAutoIncrField
    oTdf.Fields.Append oField
    oTdf.Fields.Append oTdf.CreateField("IdSyst", dbLong)
    Set oIndex = oTdf.CreateIndex("PK_Id")
    oIndex.Primary = True
    oIndex.Fields.Append oIndex.CreateField("Id")
    oTdf.Indexes.Append oIndex
    Set oIndex = oTdf.CreateIndex("PK_IdSyst")
    oIndex.Fields.Append oIndex.CreateField("IdSyst")
    oTdf.Indexes.Append oIndex
    oDb.TableDefs.Append oTdf
    'subHideNavigationPane
    'GoSub TableCollection
    'GoSub TransfertTable
    'Return
    End Function
    Cordialement

    jimbolion

  12. #12
    Membre à l'essai
    Homme Profil pro
    EUC
    Inscrit en
    Février 2016
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : EUC

    Informations forums :
    Inscription : Février 2016
    Messages : 6
    Par défaut Suite et fin
    Bonsoir,
    Un grand merci pour tout à toi jimbolion !
    C'est vrais c'est un vieux code, mais que je n'ai pas adapté depuis (7 ans?) car il fonctionnait encore très bien. Pourquoi les gosub... Car au début, je voulais rassembler toutes les création de tables dans un même module. Maintenant j'utilise le plus souvent des functions naturellement.
    Pourquoi j’ai posé ces questions ? Car je voulais passer d’un VBA 2003 à 2013 avec un exemple « complexe » avec une DB personnelle. Et je remarque qu’il il y a quelques problèmes. C’est en fait un test pour que mes applications qui tournent aussi depuis des années au boulot, puissent continuer dans un nouvel Office.
    Encore un grand merci pour ta patience..

    Alain.

  13. #13
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut
    Baa01,

    oui je me suis un peu perdu par tes différentes explications !

    mais l'essentiel est que tu sois arrivé à tes fins

    en me relisant je relève ceci :

    maintenant en adaptant le code sans trop cherché à comprendre la syntaxe les deux tables se créent bien dans la base locale
    désolé pour toute personne hostile aux fautes d'orthographe ( Claude)

    jmb

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

Discussions similaires

  1. [2.x] custom form field bind avec attribut de l'entity
    Par Echyzen dans le forum Symfony
    Réponses: 7
    Dernier message: 07/08/2014, 22h34
  2. Réponses: 1
    Dernier message: 24/12/2012, 16h39
  3. Accès aux attributs d'un nested field
    Par chuuby dans le forum jQuery
    Réponses: 22
    Dernier message: 07/05/2012, 12h28
  4. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 15h22
  5. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53

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