FAQ MS-Access

FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
Sommaire→Tables et Champs→Champs- Comment ajouter en SQL un champ NuméroAuto à une table existante ?
- Comment augmenter la taille d'un champ Texte au-delà de 255 caractères ?
- Comment changer le format d'un NuméroAuto ?
- Comment créer un champ NuméroAuto en SQL ?
- Comment supprimer les trous des champs NuméroAuto ?
- Comment interdire les doublons sur la combinaison de plusieurs champs ?
- Comment modifier la légende d'un champ d'une table via VB ?
- Comment modifier le type d'un champ de ma table ?
- Comment connaître le nombre de champs d'une table ?
- Comment ajouter un champ dans une table ?
- Comment renommer un champ avec ADO ?
- Comment renommer un champ avec DAO ?
- Comment renommer un champ en SQL ?
- Comment supprimer un champ avec ADO ?
- Quel type de champ choisir pour un code postal ?
- Comment vérifier l'existence d'un champ avec ADO ?
- Comment modifier les masques de saisie d'un champ ?
- Pourquoi éviter les champs calculés dans une table Access ?
- Comment récupérer la liste des champs des tables et leurs descriptions ?
- Comment connaître les noms des champs composant la clé primaire d'une table ?
- Comment faire pour afficher des 0 après le symbole décimal ?
- Comment modifier la valeur par défaut d'un champ d'une table en SQL ?
- Comment créer une clé primaire composée en VBA avec ADO ?
- Comment créer une clé primaire composée en VBA avec DAO
- Comment obtenir une valeur aléatoire unique dans un champ ?
- Comment modifier la position d'une colonne dans une table en VBA ?
- Comment mettre une valeur par défaut dans un champ d'une table ?
- Comment créer un lien hypertexte en dynamique ?
- Comment créer un champ de type décimal ?
- Comment connaître le nom du champ vide qui ne saurait être null ?
- Comment trier les champs par ordre alphabétique dans une table ?
ALTER TABLE MaTable ADD COLUMN MonChampID COUNTERIl faut utiliser un champ de type mémo, celui-ci accepte jusqu'à 65 535 caractères. Notez que vous ne pourrez pas indexer ce champ.
Vous voulez un numéro automatique de format 00001 par exemple ?
Dans la structure de la table, il faut taper dans la propriété format du NuméroAuto : 00000.
CREATE TABLE MaTable ( MonChampID COUNTER, MonAutreChamp Text(10))Lien : Comment ajouter en SQL un champ NuméroAuto à une table existante ?
Cette question est étrange en elle-même, car cela ne convient pas, dans une base de données.
lorsque l'on crée une clé primaire en NuméroAuto, c'est pour éviter d'avoir à créer des identifiants.
- Ces identifiants sont créés automatiquement ;
- Ils ne sont pas "porteurs d'information" ;
- Il ne s'agit pas d'un compteur.
"Combler les trous dans un NuméroAuto" est tout simplement une aberration.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Maintenant, si vous avez un champ numérique, vous pouvez combler les trous dans la numérotation en récupérant le premier numéro libre grâce à la fonction suivante :
Function NextID(LeChamp As String, LaTable As String) As Long
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' Fonction renvoyant le prochain Identifiant, en fonction des valeurs existantes dans une table.
' Arguments :
' LeChamp => Nom du champ Identifiant numérique Long concerné
' LaTable => Nom de la table contenant cet identifiant
' Retour :
' 1 s'il n'y a rien dans la table ;
' le Nombre maximum +1 s'il y a une suite ininterrompue de nombres ;
' la valeur du nombre manquant en cas de trou.
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Dim sSQL As String
Dim rs As DAO.Recordset
Dim n As Long
' Chaîne SQL en fonction de LeChamp et de LaTable, retournant NULL ou le numéro du trou
sSQL = "Select Min([" & LECHAMP & "]-1) As NextID From " & LATABLE & " As T1 "
sSQL = sSQL & "Where ((([" & LECHAMP & "]-1)>0) And (((Select [" & LECHAMP & "] "
sSQL = sSQL & "From " & LATABLE & " T2 "
sSQL = sSQL & "Where T2.[" & LECHAMP & "]=T1.[" & LECHAMP & "]-1)) Is Null));"
Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenSnapshot)
' Nbre d'enregistrements dans laTable
n = DCount("[" & LeChamp & "]", "[" & LaTable & "]")
If n = 0 Then 'S'il n'y a pas d'enregistrement, mettre 1
NextID = 1
ElseIf IsNull(rs(0)) Then 'Si la requête ne renvoie rien, incrémenter de 1 le maximum
NextID = DMax("[" & LeChamp & "]", "[" & LaTable & "]") + 1
Else
NextID = rs(0) 'Sinon, il y a un trou. Renvoyer la valeur du trou
End If
End FunctionLien : Comment réinitialiser un champ de type NuméroAuto ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Il faut créer dans la table un index multichamp et définir sa propriété unique à "oui".
Pour créer l'index :
1) Afficher la table en mode création ;
2) Menu Affichage >> Index ;
3) Sélectionner dans la colonne "Nom du champ", tous les champs concernés en laissant vides les champs de la colonne "Nom de l'index", sauf le premier champ, celui où commence la liste car il faut y inscrire le nom de l'index multichamp.
Function ModifTable()
'Gestion d'erreur pour garantir la mise à jour de l'écran
On Error GoTo GestionErreur
' Empêche la mise à jour de l'écran
DoCmd.Echo False
' Ouvre la table en mode création
DoCmd.OpenTable "maTable", acViewDesign
' Change la propriété caption du champ 'colonne2'
CurrentDb.TableDefs("maTable")("colonne2").Properties("caption").Value = "nouvelle légende"
' Ferme la table en sauvegardant
DoCmd.Close acTable, "maTable", acSaveYes
Exit_function:
DoCmd.Echo True
Exit Function
GestionErreur:
MsgBox Err.Description
Resume Exit_function
End FunctionIl vous faut utiliser ALTER en SQL.
Alter Table [TABLE] Alter Column [NOMCHAMP] [Type];En utilisant DAO.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Puis dans un module :
Function NbDeChamps(NomTable as string) As Integer
On error goto err
Dim Db As DAO.Database
Dim T As DAO.TableDef
Set Db=CurrentDb
Set T=Db.Tabledefs(NomTable)
NbDeChamps=T.fields.count
err:
End FunctionPuis pour connaître le nombre de champs de la table "essai" :
MsgBox NbDeChamps("essai")Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Méthode DAO
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Sub addDefault ()
Dim fldDate As Field
Set fldDate = CurrentDb.TableDefs!Clients.CreateField("DateSignature",dbDate)
fldDate.DefaultValue= "Now()"
CurrentDb.TableDefs("Clients").Fields.Append fldDate
End SubMéthode SQL Par exemple pour un champ booléen :
ALTER TABLE Clients ADD COLUMN chkSigne YESNO;Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Tout d'abord ajouter les références suivantes dans votre projet :
Microsot ADO Ext 2.X for dll and security
Microsof ActiveX Data Object 2.X Library.
Ensuite dans un module, écrire le code suivant :
Function RenommerChamp(NomTable As String, Ancien As String, Nouveau As String) As Boolean
On Error GoTo err:
Dim MCat As New ADOX.Catalog
Dim MTable As ADOX.Table
Dim MField As ADOX.Column
Set MCat.ActiveConnection = CurrentProject.Connection
Set MTable = MCat.Tables(NomTable)
Set MField = MTable.Columns(Ancien)
MField.Name = Nouveau
RenommerChamp = True
err:
Set MCat = Nothing
Set MTable = Nothing
Set MField = Nothing
End FunctionUtilisation :
MsgBox RenommerChamp("produit", "stock", "Stock1")Renomme le champ stock de la table produit en stock1 et affiche true si l'opération a réussi, false sinon.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dans un module placer le code suivant :
Public sub RenommerChamp(PTable as string,POld as string ,PNew as String)
On error goto err:
Dim VTable as DAO.Tabledef
Dim VField as DAO.Field
set VTable=currentDb.TableDefs(PTable)
set VField=VTable.Fields(POld)
VField.Name=PNew
set VField=Nothing
set VTable=Nothing
exit sub
err:
msgbox "L\'action renommer le champ a échoué"
End SubVoici comment renommer le champ test de la table MaTable en essai
RenommerChamp "MaTable","test","essai"Lien : Comment renommer un champ en SQL ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
C'est impossible en SQL sous Access. Il faut utiliser DAO ou ADO (voir liens ci-dessous).
Lien : Comment renommer un champ avec DAO ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Tout d'abord ajouter les références suivantes dans votre projet :
Microsot ADO Ext 2.X for dll and security ;
Microsof ActiveX Data Object 2.X Library.
Ensuite dans un module, écrire le code suivant :
Function SupprimerChamp(NomTable As String, NomChamp) As String
On Error GoTo err
Dim MCat As New ADOX.Catalog
Set MCat.ActiveConnection = CurrentProject.Connection
MCat.Tables(NomTable).Columns.Delete (NomChamp)
SupprimerChamp = True
err:
Set MCat = Nothing
End FunctionUtilisation :
MsgBox SupprimerChamp("Produit", "C1")Ceci affiche true si le champ C1 a été correctement supprimé de la table Produit.
En règle générale on utilise du numérique lorsque l'on a des calculs à faire dessus (quantité, prix, compteur...), sinon on utilise du texte. Donc ici, le code postal se mettra au format texte.
Tout d'abord ajouter les références suivantes dans votre projet :
Microsot ADO Ext 2.X for dll and security Microsof ActiveX Data Object 2.X Library.
Function ExisteChamp(NomTable As String, NomChamp As String) As Boolean
On Error GoTo err:
Dim MCat As New ADOX.Catalog
Dim MTable As ADOX.Table
Dim MField As ADOX.Column
Set MCat.ActiveConnection = CurrentProject.Connection
Set MTable = MCat.Tables(NomTable)
Set MField = MTable.Columns(NomChamp)
ExisteChamp = True
err:
Set MCat = Nothing
Set MTable = Nothing
Set MField = Nothing
End FunctionUtilisation :
Debug.print ExisteChamp("Produit", "stock")Affiche dans la fenêtre de débogage True si le champ existe dans la table Produit , false sinon.
Il faut utiliser la propriété InputMask du champ, exemple :
Forms!MonFormulaire!Téléphone.InputMask = "##-##-##-##-##"Vous ne devriez pas mettre de champ calculé dans une table Access.
La maintenance de ces derniers n'est pas toujours efficace.
Vous devez donc faire une requête.
Dans cette requête, prenez tous les champs de la table et faites un champ calculé (ex. : Select Champ1 + Champ2 From ...). Utilisez également la fonction vraifaux() si besoin est (afin de ne pas diviser par 0 par exemple).
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dim db As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field
Dim strDescription As String
Set db = CurrentDb
On Error GoTo GestionErreur
For Each tdf In db.TableDefs
For Each fld In tdf.Fields
strDescription = fld.Properties("Description")
If MsgBox("Nom : " & fld.Name & vbCrLf & vbCrLf & _
"Description : " & strDescription, _
vbOKCancel, _
"Champs de la table : " & tdf.Name) = vbCancel Then Exit Sub
Next fld
Next tdf
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
Exit Sub
GestionErreur:
Select Case Err.Number
Case 3270
strDescription = ""
Resume Next
Case Else
MsgBox "Erreur inconnue.", vbCritical
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
exit sub
End SelectLien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Le souci c'est qu'une clé primaire peut être composée.
Dans un module :
Public Function NomClePrimaire(NomTable As String) As String
On Error GoTo err
Dim oInd As DAO.Index
Dim oDb As DAO.database
Dim oTbl As DAO.tabledef
Dim oFld As DAO.Field
Set oDb = CurrentDb
Set oTbl = oDb.TableDefs(NomTable)
' Parcourt les index
For Each oInd In oTbl.Indexes
' S'il s'agit d'une clé primaire, alors traiter
If oInd.Primary Then
For Each oFld In oInd.Fields
NomClePrimaire = NomClePrimaire & oFld.Name & ","
Next oFld
Exit For
End If
Next oInd
' Enlève la dernière virgule
NomClePrimaire = Left(NomClePrimaire, Len(NomClePrimaire) - 1)
Exit Function
err:
End Function
Utilisation :
Msgbox NomClePrimaire("MaTable")
Dans le cas d'une clé primaire composée, cela retourne le nom des champs séparés par des virgules.
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Dans la table, quand vous sélectionnez le champ qui doit être numérique, vous devez avoir :
- Taille du champ : réel simple
- Format : standard
- Décimales : 3
Ainsi, si le nombre stocké est 16, il sera affiché : 16.000.
ALTER TABLE <table1> ALTER COLUMN <champ1> <typeChamp1> DEFAULT <valeurParDéfaut>Il faut ajouter la référence Microsoft ADO Ext. For DDL and Security à votre projet puis travailler avec les objets ADOX.Key.
Exemple :
Sub PrimaryKeyADO()
Dim oCat As ADOX.Catalog
Dim oTbl As ADOX.Table
Dim oKey As ADOX.Key
' Instancie un nouvel objet ADOX.Catalog
Set oCat = New ADOX.Catalog
' Lie le catalogue à la base de données
Set oCat.ActiveConnection = CurrentProject.Connection
' Accède à la table
Set oTbl = oCat.Tables("MaTable")
' Crée une nouvelle clé primaire
Set oKey = New ADOX.Key
' Affecte les différentes propriétés
With oKey
.Name = "PK_MaTable"
.Type = adKeyPrimary
'Ajoute les trois champs à la clé primaire
With .Columns
.Append "champ1"
.Append "champ2"
.Append "champ3"
End With
End With
' Ajoute la clé primaire à la table
oTbl.Keys.Append oKey
End SubPour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library puis travailler avec les objets DAO.Index.
Exemple :
Sub PrimaryKey()
Dim oDb As DAO.Database
Dim oTbl As DAO.TableDef
Dim oIdx As DAO.Index
' Instancie un objet Database courant
Set oDb = CurrentDb
' Accède à la table
Set oTbl = oDb.TableDefs("MaTable")
' Crée la clé primaire sur les champs :
' champ1, champ2, champ3
Set oIdx = oTbl.CreateIndex("PK_MaTable")
With oIdx
.Fields.Append .CreateField("Champ1")
.Fields.Append .CreateField("Champ2")
.Fields.Append .CreateField("Champ3")
.Primary = True
.Required = True
End With
oTbl.Indexes.Append oIdx
End SubLien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Si votre champ est de type numérique entier long, vous pouvez utiliser une méthode peu documentée du moteur Jet : la fonction GenUniqueId
Créer votre champ, définissez son type et fixer sa valeur par défaut à :
=GenUniqueId()
Sous DAO, il s'agit de la propriété OrdinalPosition de l'objet Field.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Dim db As DAO.Database
Dim fld As DAO.Field
Dim tbl As DAO.TableDef
Set db = CurrentDb
Set tbl = db.TableDefs("essai")
Set fld = tbl.Fields("c1")
fld.OrdinalPosition = 3Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
La propriété Valeur par défaut directement dans les propriétés du champ, dans la structure de la table.
Il n'est pas possible de créer un champ de type hypertexte via un SQL ALTER, puisqu'à ma connaissance les possibilités sont "réduites" à cela :
Texte : VARCHAR (255 caractères), CHAR(n) ou TEXT(n) (n caractères), LONGTEXT (mémo, 32K max.) ;
Fichier binaire : LONGBINARY (Objet OLE) ;
Compteur : COUNTER (NuméroAuto).Booléen : BIT ;
Nombre entier : SHORT (entier), SMALLINT (entier), LONG (entier long), INTEGER (entier long), BYTE (octet) ;
Nombre réel : SINGLE (réel simple), DOUBLE (réel double), NUMERIC (réel double) ;
Monétaire : CURRENCY, MONEY ;
Date/Heure : DATE, TIME, DATETIME ;Pour faire cela je vous renvoie vers le tuto DAO de Tofalu dans la partie 4 au paragraphe 4.4.2.
Lien : Définition et manipulation de données avec DAO par Tofalu
C'est une des impossibilités avec DAO.
Seul remède : ADO
Pour ce code, il est nécessaire de mettre les références : Microsot ADO Ext 2.X for dll and security et Microsoft ActiveX Data Object 2.X Library.
CurrentProject.Connection.Execute "ALTER TABLE TABLE1 ADD COLUMN ESSAI3 DECIMAL(18,0)"L'erreur 3314 nous indique qu'on essaie de remplir un enregistrement alors
qu'un des champs (voir plusieurs) de la table ne peut être null.
En VBA ça correspond à la propriété Required de l'objet Field :
si Required = True, le champ ne peut pas accepter de Null.
Sub NoNull()
Dim db As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field
Dim strDescription As String
Set db = CurrentDb
Set tdf = db.TableDefs("maTABLE")
For Each fld In tdf.Fields
If fld.Required = True Then
If IsNull(Me.Controls(fld.Name)) Then MsgBox "REMPLISSEZ LE CHAMP" & fld.Name
End If
Next fld
Set fld = Nothing
Set tdf = Nothing
Set db = Nothing
Exit SubQuand vous disposez d'une grande table, il est parfois nécessaire de trier les champs par ordre alphabétique pour s'y retrouver facilement.
Cela peut être fait en VBA avec DAO en attribuant la même propriété OrdinalPosition à tous les champs.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
Sub ranger()
Dim db As DAO.Database
Dim fld As DAO.Field
Dim tbl As DAO.TableDef
Set db = CurrentDb
Set tbl = db.TableDefs("essai")
For Each fld In tbl.Fields
fld.OrdinalPosition = 1
Next
End SubEn utilisant plusieurs valeurs de OrdinalPosition, il est possible de créer des groupes. Exemple pour afficher les clés primaires en haut de la liste des champs :
Sub ranger()
Dim db As DAO.Database
Dim fld As DAO.Field
Dim tbl As DAO.TableDef
Set db = CurrentDb
Set tbl = db.TableDefs("essai")
For Each fld In tbl.Fields
If IsPrimary(fld, tbl) Then
fld.OrdinalPosition = 1
Else
fld.OrdinalPosition = 2
End If
Next
End Sub
Function IsPrimary(fld As DAO.Field, tbl As DAO.TableDef) As Boolean
On Error GoTo err
Dim ind As DAO.Index
Dim tfld As DAO.Field
For Each ind In tbl.Indexes
If ind.Primary Then
Set tfld = ind.Fields(fld.Name)
IsPrimary = True
End If
Next ind
err:
End FunctionLien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?



