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 :

Problème d’affichage après réinitialisation par code d’un champ numeroAuto [AC-2010]


Sujet :

VBA Access

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    août 2005
    Messages
    912
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 912
    Points : 1 785
    Points
    1 785
    Par défaut Problème d’affichage après réinitialisation par code d’un champ numeroAuto
    Bonjour,
    J’ai écrit une sub pour réinitialiser un champ numeroAuto.
    Ça marche, mais après exécution, quand je clique sur la table dans le volet de navigation, l’affichage de la table présente une anomalie : le champ numeroAuto est en deuxième position au lieu d’être en première.
    Curieusement dans l’affichage en mode conception de la table, le champ numeroAuto est bien en première position et encore plus curieux si dans le volet de navigation je fais un copier/coller de la table, la table copiée ne présente plus l’anomalie : le champ numeroAuto est bien affiché en première position !

    Voilà le bout de code ultra-simplifié qui pose problème (avec plusieurs variantes en commentaire pour recréer le champ numeroAuto et l’index primaire en vue d’essayer de fixer le bug. Toutes créent le champ et l’index) mais le problème d’affichage subsiste

    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
    Sub MaSub3()
        CurrentDb.TableDefs.Refresh
        strSql = "ALTER TABLE tObjets ADD COLUMN Objets_Id  AUTOINCREMENT NOT NULL CONSTRAINT PrimaryKey PRIMARY KEY ;"
     
        ' Autres variantes de code testées (création du champ numeroAuto, puis de l'index mais le problème 'affichahe est identique
        'strSql = "ALTER TABLE tobjets ADD COLUMN Objets_Id AUTOINCREMENT NOT NULL;"
        ' DoCmd.RunSQL (strSql)
        ' egalement 2 variantes pour creer l'indexprimaire l'index est créé mais le problème d'affichage subsiste
        'strSql = "CREATE INDEX PrimaryKey ON tObjets (Objets_ID)  WITH PRIMARY;"
        'strSql = "ALTER TABLE tObjets ADD PRIMARY KEY (Objets_ID);"
     
        DoCmd.RunSQL (strSql)
        CurrentDb.TableDefs.Refresh
        ' On remet le champ numeroAuto  en première position
        CurrentDb.TableDefs("tobjets").Fields("Objets_Id").OrdinalPosition = 0
        ' egalement testé a tout hasard, mais le problème est identique
        'i = CurrentDb.TableDefs("tobjets").Fields.Count
        'CurrentDb.TableDefs("tobjets").Fields(i - 1).OrdinalPosition = 0
        CurrentDb.TableDefs.Refresh
    End sub
    Une idée sur le pourquoi ?

    Nom : AffichageOk.jpg
Affichages : 209
Taille : 170,3 Ko

    L'affichage apres execution du code
    Nom : ForumPbAffichage.jpg
Affichages : 215
Taille : 167,1 Ko

    La structure de la table à réinitialiser
    Nom : StructureTableAvantEtApresReinitNumAuto.jpg
Affichages : 194
Taille : 188,4 Ko

    PS : si utile je peux poster la base demo de l'anomalie

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    7 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 7 027
    Points : 16 205
    Points
    16 205
    Billets dans le blog
    28
    Par défaut
    Bonsoir Gaby277,

    J’ai écrit une sub pour réinitialiser un champ numeroAuto.
    Habituellement, pour réinitiliser un champ numéro-auto qui existe déjà dans table on utilise le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strSQL = "ALTER TABLE tObjets ALTER COLUMN Objets_Id AUTOINCREMENT(1,1);"
    DoCmd.RunSQL (strSQL)
    avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...AUTOINCREMENT(compteur_début, incrément)
    Comme cela si ta colonne numéro-auto est la 1ère en mode datasheet, elle reste la 1ère.

    Concernant ta méthode, il faudrait voir la propriété ColumnOrder, mais je ne crois pas qu'elle existe pour les objets TableDef.

    Bonne continuation,
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON


    Portez-vous bien

  3. #3
    Expert confirmé
    Homme Profil pro
    Webplanneur
    Inscrit en
    octobre 2007
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : octobre 2007
    Messages : 2 851
    Points : 4 306
    Points
    4 306
    Par défaut
    Salut
    En complément de la réponse de User
    En affichage feuille de données il y a bien la propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.objet_id.ColumnOrder = 1
    Me.objet_nomcourt.ColumnOrder = 2
    Et avec TableDefs, il y a bien la propriété
    OrdinalPosition
    "Le savoir est la seule matière qui s'accroit quand on la partage" (Socrate)
    CEV UR - ESIROI
    QTH :21°19'18"S - 055°25'32"E
    Inutile de me contacter par MP
    Si l'une des réponses est pertinente, n'oubliez pas alors de clôturer le sujet en cliquant sur

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    7 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 7 027
    Points : 16 205
    Points
    16 205
    Billets dans le blog
    28
    Par défaut
    Citation Envoyé par hyperion13 Voir le message
    Salut
    En complément de la réponse de User
    En affichage feuille de données il y a bien la propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Me.objet_id.ColumnOrder = 1
    Me.objet_nomcourt.ColumnOrder = 2
    Et avec TableDefs, il y a bien la propriété
    OrdinalPosition

    Concernant la propriété ColumnOrder de l'objet field d'un tableDef, j'ai trouvé ce code pour la mettre à jour :

    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
    Public Function SetColumnOrder()
     
        Dim dbs As DAO.Database
        Dim tdf As DAO.TableDef
     
        Set dbs = CurrentDb
        Set tdf = dbs.TableDefs("tObjets")
     
        ' Call the procedure to set the ColumnOrder property.
        SetFieldProperty tdf.Fields("Objets_Id"), "ColumnOrder", dbLong, 1
        SetFieldProperty tdf.Fields("Objets_NomCourt"), "ColumnOrder", dbLong, 2
        SetFieldProperty tdf.Fields("Objets_Complements"), "ColumnOrder", dbLong, 3
     
        Set tdf = Nothing
        Set dbs = Nothing
     
    End Function
     
    Private Sub SetFieldProperty(ByRef fld As DAO.Field, _
                                 ByVal strPropertyName As String, _
                                 ByVal intPropertyType As Integer, _
                                 ByVal varPropertyValue As Variant)
        ' Set field property without producing nonrecoverable run-time error.
     
        Const conErrPropertyNotFound = 3270
        Dim prp As Property
     
        ' Turn off error handling.
        'On Error Resume Next
     
        fld.Properties(strPropertyName) = varPropertyValue
     
        ' Check for errors in setting the property.
        If Err <> 0 Then
            If Err <> conErrPropertyNotFound Then
                On Error GoTo 0
                MsgBox "Couldn't set property '" & strPropertyName & _
                       "' on field '" & fld.Name & "'", vbCritical
            Else
                On Error GoTo 0
                Set prp = fld.CreateProperty(strPropertyName, intPropertyType, _
                          varPropertyValue)
                fld.Properties.Append prp
            End If
        End If
     
        Set prp = Nothing
     
    End Sub
    Concernant ma proposition de SQL avec Alter tu peux aussi faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cpt1 = Nz(DMax("Objets_Id", "tObjets"), 0) + 1 ' compteur maxi actuellement + 1
     
    strSQL = "ALTER TABLE tObjets ALTER COLUMN Objets_Id AUTOINCREMENT(" & cpt1 & ",1);" ' exécution du code
    DoCmd.RunSQL (strSQL)
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON


    Portez-vous bien

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    août 2005
    Messages
    912
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 912
    Points : 1 785
    Points
    1 785
    Par défaut
    Bonjour,
    Merci User et hyperion13, je regarde demain et je reviens.
    Cordialement

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    août 2005
    Messages
    912
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 912
    Points : 1 785
    Points
    1 785
    Par défaut
    Bonjour
    Apres avoir vidé la table, et exécuté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strSQL = "ALTER TABLE tObjets ALTER COLUMN Objets_Id AUTOINCREMENT(1,1);"
    DoCmd.RunSQL (strSQL)
    la reinit des numérosAuto est ok (en fait il n’est pas nécessaire de supprimer le champ numeroAuto (qui est index primaire) et de tout recréer
    Donc problème résolu.

    Pour SetColumnorder + Private Sub SetFieldProperty(ByRef fld As DAO.Field, _, il y a une erreur à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fld.Properties(strPropertyName) = varPropertyValue '
    ->
    erreur 3270 propriété non trouvée (la property est columOrder).
    Je n’ai pas approfondi pour le moment.

    Merci pour les réponses .
    Cordialement

    PS1 : j’ai aussi constaté que quand je supprime et recrée le champ numeroAuto et son index en mode conception (rajouté à la fin) et que j’exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurrentDb.TableDefs("tobjets").Fields("Objets_Id").OrdinalPosition = 0
    le champ numeroAuto passe bien en première position en mode conception et en mode affichage. Pour le moment j’avance et si ultérieurement je trouve une explication je reviendrai.
    Il doit y avoir un truc dans la manière dont je recréai le champ et l'index primaire (ce qui n'est pas nécessaire).

    PS2 : il est aussi possible de sauvegarder la table, la vider, compacter la base et rajouter les données.

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    7 027
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 7 027
    Points : 16 205
    Points
    16 205
    Billets dans le blog
    28
    Par défaut
    Super !

    Citation Envoyé par gaby277 Voir le message

    Pour SetColumnorder + Private Sub SetFieldProperty(ByRef fld As DAO.Field, _
    il y a une erreur à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fld.Properties(strPropertyName) = varPropertyValue ' -> erreur 3270 propriété non trouvée (la property est columOrder). Je n’ai pas approfondi pour le moment.
    ...

    C'est bien columnOrder ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ' Call the procedure to set the ColumnOrder property.
        SetFieldProperty tdf.Fields("Objets_Id"), "ColumnOrder", dbLong, 1
        SetFieldProperty tdf.Fields("Objets_NomCourt"), "ColumnOrder", dbLong, 2
        SetFieldProperty tdf.Fields("Objets_Complements"), "ColumnOrder", dbLong, 3
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON


    Portez-vous bien

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    août 2005
    Messages
    912
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2005
    Messages : 912
    Points : 1 785
    Points
    1 785
    Par défaut
    Bsr
    @user
    Oui erreur avec la property ColumnOder mais ok avec la property "OrdinalPosition"
    Affichage ok en mode création table et affichage table.

    J'ai trouvé une sub bien pratique (je n'ai pas noté la source c'est mal merci à l'auteur)
    Pour savoir ou en est et mieux comprendre comment fonctionne 'ordinalposition' :

    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
    Sub OrdinalPositionX(nomtable As String)
        Dim dbBd As Database
        Dim tdfTobjets As TableDef
        Dim aintPosition() As Integer
        Dim astrFieldName() As String
        Dim intTemp As Integer
        Dim fldTemp As Field
        Dim rstTobjets As Recordset
        Set dbBd = CurrentDb
        Set tdfTobjets = dbBd.TableDefs(nomtable)
        With tdfTobjets
            ' Display and store original OrdinalPosition data.
            Debug.Print _
                    "Original OrdinalPosition data in TableDef."
            ReDim aintPosition(0 To .Fields.Count - 1) As Integer
            ReDim astrFieldName(0 To .Fields.Count - 1) As String
            For intTemp = 0 To .Fields.Count - 1
                aintPosition(intTemp) = _
                .Fields(intTemp).OrdinalPosition
                astrFieldName(intTemp) = .Fields(intTemp).Name
                Debug.Print , aintPosition(intTemp), _
                            astrFieldName(intTemp)
            Next intTemp
        End With
        dbBd.Close
    End Sub

  9. #9
    Membre averti Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 950
    Points : 433
    Points
    433
    Par défaut
    Citation Envoyé par User Voir le message
    Concernant la propriété ColumnOrder de l'objet field d'un tableDef, j'ai trouvé ce code pour la mettre à jour :
    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
    Public Function SetColumnOrder()
     
        Dim dbs As DAO.Database
        Dim tdf As DAO.TableDef
     
        Set dbs = CurrentDb
        Set tdf = dbs.TableDefs("tObjets")
     
        ' Call the procedure to set the ColumnOrder property.
        SetFieldProperty tdf.Fields("Objets_Id"), "ColumnOrder", dbLong, 1
        SetFieldProperty tdf.Fields("Objets_NomCourt"), "ColumnOrder", dbLong, 2
        SetFieldProperty tdf.Fields("Objets_Complements"), "ColumnOrder", dbLong, 3
     
        Set tdf = Nothing
        Set dbs = Nothing
     
    End Function
     
    Private Sub SetFieldProperty(ByRef fld As DAO.Field, _
                                 ByVal strPropertyName As String, _
                                 ByVal intPropertyType As Integer, _
                                 ByVal varPropertyValue As Variant)
        ' Set field property without producing nonrecoverable run-time error.
     
        Const conErrPropertyNotFound = 3270
        Dim prp As Property
     
        ' Turn off error handling.
        'On Error Resume Next
     
        fld.Properties(strPropertyName) = varPropertyValue
     
        ' Check for errors in setting the property.
        If Err <> 0 Then
            If Err <> conErrPropertyNotFound Then
                On Error GoTo 0
                MsgBox "Couldn't set property '" & strPropertyName & _
                       "' on field '" & fld.Name & "'", vbCritical
            Else
                On Error GoTo 0
                Set prp = fld.CreateProperty(strPropertyName, intPropertyType, _
                          varPropertyValue)
                fld.Properties.Append prp
            End If
        End If
     
        Set prp = Nothing
     
    End Sub
    Bonsoir User,

    j'aimerais savoir si l'on peut adapter votre code à mon cas dans la discussion (post#1) ouverte ici https://www.developpez.net/forums/d2...at-temporaire/ ?

    Cordialement.
    Je ne Suis Pas un Expert en Programmation
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

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

Discussions similaires

  1. Problème sauvegarde ftp commandée par code VBA
    Par tdiscus dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/03/2013, 10h13
  2. problème ajout d'éléments par le code
    Par xav2303 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/04/2009, 22h28
  3. Incrémenter un champ NuméroAuto par code
    Par sakia dans le forum Modélisation
    Réponses: 1
    Dernier message: 30/05/2008, 02h13
  4. Champ de table renseigné par code
    Par jacquesprogram dans le forum VB.NET
    Réponses: 11
    Dernier message: 11/03/2008, 14h12
  5. [WD9]champ auto-incrémente par code
    Par loic20h28 dans le forum WinDev
    Réponses: 4
    Dernier message: 25/02/2008, 21h53

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