[Access VBA] Problème Type Field

artamys Messages postés 122 Date d'inscription   Statut Membre Dernière intervention   -  
blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
je dois créer des tables sur mesure en fonction des choix utilisateurs.

je recontre deux plantages sur le numérique et le décimal.
Le reste fonctionne
Mon code est :

...
If format1=1 then Set fld = tdf.createField("" & Champs1 & "", dbtext)
If format1=2 then Set fld = tdf.createField("" & Champs1 & "", dbNumeric)
If format1=3 then Set fld = tdf.createField("" & Champs1 & "", dbMemo)
If format1=4 then Set fld = tdf.createField("" & Champs1 & "", dbDate)
If format1=5 then Set fld = tdf.createField("" & Champs1 & "", dbDecimal)
If format1=6 then Set fld = tdf.createField("" & Champs1 & "", dbCurrency)

je ne sais pas pourquoi la ligne avec dbNumeric et la ligne avec dbDecimal plante ?

quelqu'un a t'il la listes des valeurs possibles pour les types de fields, j'ai récupéré tous les types, et je ne comprends pas pourquoi ces deux plantent et arrêtent la macro ?
Problème de longueur ?
Est il possible que ce soit un problème de nombre par exemple : au lien de mettre un entier il faut mettre un décimal et donc convertir Champs1 en Champ1 avec des virgules et 00
Configuration: Windows XP
Internet Explorer 6.0

11 réponses

  1. artamys Messages postés 122 Date d'inscription   Statut Membre Dernière intervention   7
     
    non le problème n'est pas les "" car le code marche dans tous les cas sauf 2 :

    il y a erreur (plus exactement arret du code) lorsque le type du champs est dbNumeric et dbDecimal.
    1
  2. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    tu peux me coller ton code, s'il n'est pas trop long ?
    0
  3. dhcp
     
    Voici un code qui fonctionne et créer tous les types ACCESS.
    PREREQUIS
    Avoir une base C:\Documents and Settings\XXXXX\Mes documents\XXXXXX.mdb
    Dans cette base avoir une table "T"
    Coller le code dans module nouvelle base
    Exécuter sub test()

    au stop vérifier les msg dans le debug et la table dans
    C:\Documents and Settings\XXXXX\Mes documents\XXXXXX.mdb

    Bonne chance :

    Sub test()
    Dim MyDB As Database
    Dim tdf As TableDef
    Dim fldLoop As Field

    Set MyDB = OpenDatabase("C:\Documents and Settings\XXXXX\Mes documents\XXXXXX.mdb")
    Set tdf = MyDB.TableDefs![T]

    On Error Resume Next
    AppendDeleteField tdf, "APPEND", "dbBigInt", dbBigInt
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbBinary", dbBinary
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbBoolean", dbBoolean
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbByte", dbByte
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbChar", dbChar
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbCurrency", dbCurrency
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbDate", dbDate
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbDecimal", dbDecimal
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbDouble", dbDouble
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbFloat", dbFloat
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbGUID", dbGUID
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbInteger", dbInteger
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbLong", dbLong
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbLongBinary", dbLongBinary
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbMemo", dbMemo
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbNumeric", dbNumeric
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbSingle", dbSingle
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbText", dbText
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbTime", dbTime
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbTimeStamp", dbTimeStamp
    Debug.Print Error(ErrorNumber)
    AppendDeleteField tdf, "APPEND", "dbVarBinary", dbVarBinary
    Debug.Print Error(ErrorNumber)

    Stop

    AppendDeleteField tdf, "DELETE", "dbBigInt", dbBigInt
    AppendDeleteField tdf, "DELETE", "dbBinary", dbBinary
    AppendDeleteField tdf, "DELETE", "dbBoolean", dbBoolean
    AppendDeleteField tdf, "DELETE", "dbByte", dbByte
    AppendDeleteField tdf, "DELETE", "dbChar", dbChar
    AppendDeleteField tdf, "DELETE", "dbCurrency", dbCurrency
    AppendDeleteField tdf, "DELETE", "dbDate", dbDate
    AppendDeleteField tdf, "DELETE", "dbDecimal", dbDecimal
    AppendDeleteField tdf, "DELETE", "dbDouble", dbDouble
    AppendDeleteField tdf, "DELETE", "dbFloat", dbFloat
    AppendDeleteField tdf, "DELETE", "dbGUID", dbGUID
    AppendDeleteField tdf, "DELETE", "dbInteger", dbInteger
    AppendDeleteField tdf, "DELETE", "dbLong", dbLong
    AppendDeleteField tdf, "DELETE", "dbLongBinary", dbLongBinary
    AppendDeleteField tdf, "DELETE", "dbMemo", dbMemo
    AppendDeleteField tdf, "DELETE", "dbNumeric", dbNumeric
    AppendDeleteField tdf, "DELETE", "dbSingle", dbSingle
    AppendDeleteField tdf, "DELETE", "dbText", dbText
    AppendDeleteField tdf, "DELETE", "dbTime", dbTime
    AppendDeleteField tdf, "DELETE", "dbTimeStamp", dbTimeStamp
    AppendDeleteField tdf, "DELETE", "dbVarBinary", dbVarBinary
    End Sub

    Sub AppendDeleteField(tdfTemp As TableDef, _
    strCommand As String, strName As String, _
    Optional varType, Optional varSize)

    'exemple de l'aide ACCESS

    With tdfTemp

    ' Check first to see if the TableDef object is updatable. If it isn't, control is passed back to
    ' the calling procedure.
    If .Updatable = False Then
    MsgBox "TableDef not Updatable! " & _
    "Unable to complete task."
    Exit Sub
    End If

    ' Depending on the passed data, append or delete a
    ' field to the Fields collection of the specified
    ' TableDef object.
    If strCommand = "APPEND" Then
    .Fields.Append .CreateField(strName, _
    varType, varSize)
    Else
    If strCommand = "DELETE" Then .Fields.Delete _
    strName
    End If

    End With

    End Sub
    0
  4. basshero816 Messages postés 115 Statut Membre 6
     
    Salut,
    Essaie de ne mettre que des simples guillemets pour tes champs numériques : (" & Champs1 & ", dbNumeric)

    @+
    -1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    c'est quoi le message d'erreur ?
    -1
  7. artamys Messages postés 122 Date d'inscription   Statut Membre Dernière intervention   7
     
    bonjour blux

    je prends comme message :

    Erreur d'execution 3259
    Type de champs de données non valide.

    donc en théorie access vba refuse le type dbdecimal et dbnumeric pour les fields.

    il me reste donc a trouver des types de substitution....
    mais pourquoi l'aide en ligne fournit la liste complète si des types sont rejetés...

    long integer single double bigint ?
    encore un autre... bon je vais rechercher et faire des tests...

    merci en tout cas.
    -1
  8. artamys Messages postés 122 Date d'inscription   Statut Membre Dernière intervention   7
     
    Bonjour, suite à ta demande ci joint le code.

    En fait ce n'est qu'un programme car le but du jeu est de créer un back up service, en chargant des fichiers de quelque nature que ce soit avec ou sans délimitateur de les transformer et de créer des fichiers de type "intraprod" pour que l'informatique le charge dans leur outil "intraprod" pour relancer les clients qui doivent de l'argent a l'entreprise qui nous a envoyé les fichiers et qui a fait faillite pour que la banque qui a escompté les traites récupère le plus d''argent possible ...

    dans le cas ci dessous tu as un fichier a entrer avec 2 champs et sans délimitatieur mais avec une longueur fixe (issu des macro systèmes)

    Tout marche sauf quand je selectionne statut1 ou statut2 dans le programme ci dessous les nombres qui correspondent à dbNumeric ou dbDecimal.

    Merci a toi en tout cas.

    Sub CreationTable2B()
    Dim NomFichTable As Variant
    Set db = CurrentDb()
    Set Base_Recherche = db.OpenRecordset("TB_Fichier")
    Base_Recherche.Index = "primarykey"
    Base_Recherche.Seek "=", Nom_Fichier_Entree

    Base_Recherche.Edit
    NomFichTable = Base_Recherche("NomFichier").Value
    Base_Recherche.Close

    Dim dbs As DAO.Database
    Dim tdf As DAO.TableDef
    Dim fld As DAO.Field
    Set dbs = CurrentDb()
    Set tdf = dbs.CreateTableDef("TB_" & NomFichTable & "")
    If Format1 = 1 Then Set fld = tdf.CreateField("" & Champs1 & "", dbText)
    If Format1 = 2 Then Set fld = tdf.CreateField("" & Champs1 & "", dbNumeric)
    If Format1 = 3 Then Set fld = tdf.CreateField("" & Champs1 & "", dbMemo)
    If Format1 = 4 Then Set fld = tdf.CreateField("" & Champs1 & "", dbDate)
    If Format1 = 5 Then Set fld = tdf.CreateField("" & Champs1 & "", dbDecimal)
    If Format1 = 6 Then Set fld = tdf.CreateField("" & Champs1 & "", dbCurrency)

    fld.OrdinalPosition = 1
    fld.Size = Longueur1.Value
    tdf.Fields.Append fld

    If Format2 = 1 Then Set fld = tdf.CreateField("" & Champs2 & "", dbText)
    If Format2 = 2 Then Set fld = tdf.CreateField("" & Champs2 & "", dbNumeric)
    If Format2 = 3 Then Set fld = tdf.CreateField("" & Champs2 & "", dbMemo)
    If Format2 = 4 Then Set fld = tdf.CreateField("" & Champs2 & "", dbDate)
    If Format2 = 5 Then Set fld = tdf.CreateField("" & Champs2 & "", dbDecimal)
    If Format2 = 6 Then Set fld = tdf.CreateField("" & Champs2 & "", dbCurrency)

    fld.OrdinalPosition = 2
    fld.Size = Longueur2.Value
    tdf.Fields.Append fld

    dbs.TableDefs.Append tdf
    RefreshDatabaseWindow

    MsgBox "La table " & tdf.Name & " a été créée"
    Set fld = Nothing
    Set tdf = Nothing
    Set dbs = Nothing

    End Sub
    -1
  9. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Je viens de reproduire chez moi (sous access 2002), je ne comprends pas...

    Tout ce que je vois, c'est que dans l'aide, les deux trucs qui merdent renvoient à la même description :

    Type de données stockant une valeur numérique exacte signée de précision p et d'échelle s (1 ≤ p ≤15 ; 0 ≤ s ≤ p).

    Donc, je penche pour un gros bug d'access.

    A part contourner avec des types particuliers : dbdouble, dbsingle..., je ne vois pas.
    -1
  10. artamys Messages postés 122 Date d'inscription   Statut Membre Dernière intervention   7
     
    En tout cas, merci beaucoup a toi de ton aide, je vais contourner.
    Bonne journée.
    -1
  11. artamys Messages postés 122 Date d'inscription   Statut Membre Dernière intervention   7
     
    BONJOUR,
    honnêtement j'ai pas tout compris.

    d'abord quel champs créer dans la table T ? moi j'en ai créé un et ensuite les champs de ton code se créé a la suite.
    Ensuite pour moi l'éxécution du code renvoit une erreur si je travaille sur la même table : admin utilisé.

    donc je lance le code d'une autre table et je regarde sur la base ou j'ai cré la table T, dans ce cas il y a les champs rajoutés dans la table T.
    Il n'y a cependant aucune valeur ou écriture dedans.
    je n'ai pas de rejet rien.

    si je continue la macro après le stop, cela efface les champs créés. Mais le lancement de l'execution du code plante toujours ensuite.

    je vais regarder en détail ton code et essayer de comprendre demain au travail.

    En tout cas merci à toi de cette aide.
    -1
    1. dhcp
       
      Salut,
      La seule chose à comprendre est le code suivant :
      tdf.Fields.Append .CreateField(strName, varType, varSize)
      ou tdf est un objet TableDef
      Fields est une collection de Field
      Append une méthode de Fields
      CreateField une méthode de TableDef
      strName, varType, varSize sont les attributs du Field à créer dans la table.




      Voici l'aide de VBA ACCESS :
      Pour ajouter un champ à une table :

      1. Vérifiez que tous les objets Recordset basés sur la table sont fermés.


      2. Utilisez la méthode CreateField pour créer une variable objet Field et définir ses propriétés.


      3. Utilisez la méthode Append pour ajouter l'objet Field à la collection Fields de l'objet TableDef.


      Bonne chance
      0
    2. dhcp
       
      Petite pécision,
      J'ai essayé le code exemple de Microsoft en mettant dbNumeric comme type de données et ça plante alors qu'apparemment le code est identique à celui que je t'ai donné.

      Je n'ai pas d'explication!
      0
      1. blux Messages postés 2046 Date d'inscription   Statut Modérateur Dernière intervention   3 455 > dhcp
         
        C'est bien là le problème, dans la doc il est indiqué que ce type de données existe, mais on ne peut pas l'utiliser...
        -1
  12. artamys Messages postés 122 Date d'inscription   Statut Membre Dernière intervention   7
     
    Merci en tout cas de votre aide.
    je vais tout ce qui plante en txt, pour le retraitement on verra plus tard...

    bonne journée !
    -1