Developpez.com

Une très vaste base de connaissances en informatique avec
plus de 100 FAQ et 10 000 réponses à vos questions

FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireTables et ChampsChamps
 
Sélectionnez
ALTER TABLE MaTable ADD COLUMN MonChampID COUNTER
Créé le 29 décembre 2003  par Maxence HUBICHE

Lien : Comment créer un champ NuméroAuto en SQL ?

Il 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.

Mis à jour le 15 mai 2011  par Team Access

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.

Créé le 12 mai 2004  par xp
 
Sélectionnez
CREATE TABLE MaTable ( MonChampID COUNTER, MonAutreChamp Text(10))
Créé le 29 décembre 2003  par Maxence HUBICHE

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 :

 
Sélectionnez
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 Function
Mis à jour le 29 août 2006  par Maxence HUBICHE

Lien : 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.

Créé le 25 octobre 2004  par FRED.G
 
Sélectionnez
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 Function 
Créé le 10 mai 2005  par Drosera

Il vous faut utiliser ALTER en SQL.

 
Sélectionnez
Alter Table [TABLE] Alter Column [NOMCHAMP] [Type];
Créé le 1er janvier 2005  par Team Access

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 :

 
Sélectionnez
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 Function

Puis pour connaître le nombre de champs de la table "essai" :

 
Sélectionnez
MsgBox NbDeChamps("essai")
Créé le 10 mai 2005  par Tofalu

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.

 
Sélectionnez
Sub addDefault () 
    Dim fldDate As Field
    Set fldDate = CurrentDb.TableDefs!Clients.CreateField("DateSignature",dbDate) 
    fldDate.DefaultValue= "Now()" 
    CurrentDb.TableDefs("Clients").Fields.Append fldDate 
End Sub

Méthode SQL Par exemple pour un champ booléen :

 
Sélectionnez
ALTER TABLE Clients ADD COLUMN chkSigne YESNO; 
Créé le 1er avril 2003  par Team Access

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 :

 
Sélectionnez
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 Function

Utilisation :

 
Sélectionnez
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.

Créé le 10 mai 2005  par Tofalu

Lien : Tutoriel de JM Rabilloud sur ADOX

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 :

 
Sélectionnez
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 Sub

Voici comment renommer le champ test de la table MaTable en essai

 
Sélectionnez
RenommerChamp "MaTable","test","essai"
Créé le 10 mai 2005  par Tofalu

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).

Créé le 10 mai 2005  par Tofalu

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 :

 
Sélectionnez
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 Function

Utilisation :

 
Sélectionnez
MsgBox SupprimerChamp("Produit", "C1")

Ceci affiche true si le champ C1 a été correctement supprimé de la table Produit.

Créé le 10 mai 2005  par Tofalu

Lien : Tutoriel de JM Rabilloud sur ADOX

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.

Créé le 1er avril 2004  par Lucifer

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.

 
Sélectionnez
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 Function

Utilisation :

 
Sélectionnez
Debug.print ExisteChamp("Produit", "stock")

Affiche dans la fenêtre de débogage True si le champ existe dans la table Produit , false sinon.

Créé le 10 mai 2005  par Tofalu

Lien : Tutoriel de JM Rabilloud sur ADOX

Il faut utiliser la propriété InputMask du champ, exemple :

 
Sélectionnez
Forms!MonFormulaire!Téléphone.InputMask = "##-##-##-##-##"
Créé le 3 septembre 2004  par Drosera

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).

Créé le 25 octobre 2004  par Maxence HUBICHE

Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.

 
Sélectionnez

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 Select
Créé le 20 novembre 2005  par FRED.G

Lien : 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 :

 
Sélectionnez

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 :

 
Sélectionnez

Msgbox NomClePrimaire("MaTable")


Dans le cas d'une clé primaire composée, cela retourne le nom des champs séparés par des virgules.

Créé le 20 novembre 2005  par Tofalu

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.

Créé le 20 novembre 2005  par fdraven
 
Sélectionnez

ALTER TABLE <table1> ALTER COLUMN <champ1> <typeChamp1> DEFAULT <valeurParDéfaut>
Créé le 20 novembre 2005  par cakeke

Il faut ajouter la référence Microsoft ADO Ext. For DDL and Security à votre projet puis travailler avec les objets ADOX.Key.

Exemple :

 
Sélectionnez

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 Sub
Créé le 29 novembre 2006  par Tofalu

Pour 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 :

 
Sélectionnez

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 Sub
Créé le 29 novembre 2006  par Tofalu

Lien : 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()

Créé le 14 mai 2006  par Tofalu


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.

 
Sélectionnez
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 = 3
Créé le 29 novembre 2006  par Tofalu

Lien : 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.

Créé le 14 octobre 2007  par loufab

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 :

 
Sélectionnez
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.

Créé le 14 octobre 2007  par cafeine

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.

 
Sélectionnez
CurrentProject.Connection.Execute "ALTER TABLE TABLE1 ADD COLUMN ESSAI3 DECIMAL(18,0)"
Créé le 14 octobre 2007  par Tofalu

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.

 
Sélectionnez
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 Sub
Créé le 14 octobre 2007  par Meduse

Quand 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.

 
Sélectionnez
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 Sub

En 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 :

 
Sélectionnez
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 Function
Créé le 14 octobre 2007  par Tofalu

Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.