[Access VBA] Problème Type Field

Fermé
artamys Messages postés 120 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 9 mars 2018 - 10 sept. 2008 à 12:05
blux Messages postés 26776 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 11 avril 2025 - 11 sept. 2008 à 13:52
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

11 réponses

artamys Messages postés 120 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 9 mars 2018 7
10 sept. 2008 à 12:26
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
blux Messages postés 26776 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 11 avril 2025 3 334
10 sept. 2008 à 14:03
tu peux me coller ton code, s'il n'est pas trop long ?
0
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
basshero816 Messages postés 115 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 5 août 2010 6
10 sept. 2008 à 12:20
Salut,
Essaie de ne mettre que des simples guillemets pour tes champs numériques : (" & Champs1 & ", dbNumeric)

@+
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blux Messages postés 26776 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 11 avril 2025 3 334
10 sept. 2008 à 13:45
Salut,

c'est quoi le message d'erreur ?
-1
artamys Messages postés 120 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 9 mars 2018 7
10 sept. 2008 à 13:52
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
artamys Messages postés 120 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 9 mars 2018 7
10 sept. 2008 à 15:03
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
blux Messages postés 26776 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 11 avril 2025 3 334
10 sept. 2008 à 15:30
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
artamys Messages postés 120 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 9 mars 2018 7
10 sept. 2008 à 16:09
En tout cas, merci beaucoup a toi de ton aide, je vais contourner.
Bonne journée.
-1
artamys Messages postés 120 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 9 mars 2018 7
10 sept. 2008 à 20:02
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
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
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
blux Messages postés 26776 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 11 avril 2025 3 334 > dhcp
11 sept. 2008 à 13:52
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
artamys Messages postés 120 Date d'inscription lundi 18 juin 2007 Statut Membre Dernière intervention 9 mars 2018 7
11 sept. 2008 à 13:51
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