FAQ MS-AccessConsultez toutes les FAQ

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

 
OuvrirSommaireTables et ChampsTrucs et Astuces

Vous ne pouvez pas modifier la structure d'une table liée. Il faut créer le champ directement dans la table source.

Si la table est une table Access (Jet), vous pouvez modifier la structure de la table en VBA, par exemple en DAO.

Mis à jour le 15 mai 2011  par Maxence HUBICHE, Pierre Fauconnier

_ Première possibilité :

 
Sélectionnez
DoCmd.SelectObject acTable, "VotreTable", True
DoCmd.RunCommand acCmdNewObjectAutoForm

_ Seconde possibilité :

 
Sélectionnez
Sub NouvForm(ByVal NomTable As String)

Dim frm As Form
Set frm = CreateForm
With frm
.RecordSource = NomTable
.RecordsetType = 0
.Caption = NomTable
.DefaultView = 2
.ViewsAllowed = 2
.ScrollBars = 0
.NavigationButtons = True
End With
AjouterTB frm, NomTable
DoCmd.Restore
DoCmd.Close acForm, frm.Name, acSaveYes
End Sub

Sub AjouterTB(f As Form, s As String)
    Dim rs As Recordset
    Dim fld As Field
    Dim c As Control
    Dim l As Control
    Dim i As Long
    Set rs = CurrentDb.OpenRecordset(s, dbOpenSnapshot)
    For Each fld In rs.Fields
        Set c = CreateControl(f.Name, acTextBox, acDetail, "", fld.Name, 1440, 360 * i, 1440, 360)
        Set l = CreateControl(f.Name, acLabel, , c.Name, fld.Name, 0, 360 * i)
        i = i + 1
    Next
End Sub
Créé le 25 octobre 2004  par cafeine
 
Sélectionnez
Application.SetHiddenAttribute acTable, NomdeTaTable, True
Créé le 25 octobre 2004  par Team Access


Si la table n'est pas trop grosse

on peut utiliser Dmax dans la propriété source contrôle du champ txt_1
Source contrôle.....=MaxDom("nombre";"[Chiffre]")

PS: Cette solution est moins rapide que la deuxième pour les tables contenant beaucoup d'enregistrements, car les fonctions domaine (Dmax, dlookup, dmin, etc. sont très lentes par rapport à un Recordset)


On crée un Recordset

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

 
Sélectionnez
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT MAX([Nombre])AS Maximum FROM [Chiffre]")
Me!txt_1 = rst!Maximum 'txt_1 est une zone de texte
rst.Close
Créé le 25 octobre 2004  par Gdal

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.


Comme leurs noms l'indiquent, la première fonction ne permet de lier qu'une seule table avec un nom donné, alors que la seconde liera toutes les tables.
Vous devrez bien évidemment modifier ces codes afin qu'ils répondent parfaitement à votre attente.


Voici les variables et valeurs que vous aurez besoin de mettre à jour :
strMotPasse, strCheminBd, strNomTable

 
Sélectionnez

Sub lier()
Dim strMotPasse As String
Dim strCheminBd As String
Dim strNomTable As String
Dim strConnect As String
Dim oDb As DAO.Database
Dim oTbl As DAO.TableDef

' Définit mot passe, nom table, chemin base de données
strMotPasse = "pass"
strCheminBd = "c:\test.mdb"
strNomTable = "Table1"
' Instancie l'objet Database
Set oDb = CurrentDb
' Définit la chaîne de connexion permettant la liaison
strConnect = "MS Access;pwd=" & strMotPasse & ";DATABASE=" & strCheminBd
' Crée la nouvelle table
Set oTbl = oDb.CreateTableDef(strNomTable)
With oTbl
    .Connect = strConnect
    .SourceTableName = strNomTable
End With
' Ajoute la table à la base de données
oDb.TableDefs.Append oTbl: oDb.TableDefs.Refresh
End Sub 
 
Sélectionnez

Sub lierToutes()
Dim strMotPasse As String
Dim strCheminBd As String
Dim strConnect As String
Dim strNomsTables() As String
Dim strTemp As String
Dim i As Integer
Dim oDb As DAO.Database
Dim oDbSource As DAO.Database
Dim oTbl As DAO.TableDef
Dim oTblSource As DAO.TableDef

' Définir mot passe et chemin base de données
strMotPasse = "pass"
strCheminBd = "c:\test.mdb"
' Définit la chaîne de connexion permettant la liaison des tables
strConnect = "MS Access;pwd=" & strMotPasse & ";DATABASE=" & strCheminBd
' Instancie l'objet Database de la base courante
Set oDb = CurrentDb
' Instancie l'objet Database de la base protégée
Set oDbSource = DBEngine.OpenDatabase(strCheminBd, True, True, strConnect)

' Parcourt l'ensemble des tables de la base de données protégée
' et stocke leur nom
For Each oTblSource In oDbSource.TableDefs
    ' Ignore les tables system
    If (oTblSource.Attributes And dbSystemObject) = 0 Then
        strTemp = strTemp & oTblSource.Name & "|"
    End If
Next
' Ferme la base de données source (impératif pour la liaison)
oDbSource.Close: Set oDbSource = Nothing
' Parcourt le tableau de noms de tables
strNomsTables = Split(Left(strTemp, Len(strTemp) - 1), "|")
For i = 0 To UBound(strNomsTables)
  ' Crée une nouvelle table dans la base de données courante
  Set oTbl = oDb.CreateTableDef(strNomsTables(i))
  ' Lie les deux tables
  oTbl.Connect = strConnect
  oTbl.SourceTableName = strNomsTables(i)
  ' Ajoute la table à la base de données
  oDb.TableDefs.Append oTbl
Next i

' Rafraichit la liste des tables
oDb.TableDefs.Refresh
End Sub 
Mis à jour le 20 mars 2006  par Tofalu

Lien : Comment avec l'API GetOpenFileNameA ouvrir plusieurs fichiers à la fois ?
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?
Lien : Comment utiliser une application en mode multi-utilisateur par Dolphy35

Vous venez d'ajouter un enregistrement et vous voulez avoir le NuméroAuto qui vient de s'incrémenter. L'obtention de ce numéro est différente selon qu'il s'agit de la méthode DAO ou ADO.
Sous DAO le numéro est disponible immédiatement après l'appel de AddNew.exemple (pour obtenir le code de la ville) :

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

 
Sélectionnez
rst.AddNew

Debug.print rst("Code Ville") ' <---' Vous obtenez le code qui est un NuméroAuto
' Ajout d'autres informations
rst("Nom Ville") = "TEST"
rst("Code postal") = "57000"
rst.Update

Par contre avec la méthode ADO le code est disponible après l'appel de Update. Exemple :

Pour exécuter ce code, il faut activer les références : Microsot ADO Ext 2.X for dll and security et Microsof ActiveX Data Object 2.X Library.

 
Sélectionnez
rst.AddNew
rst("Nom Ville") = "TEST"
rst("Code postal") = "57000"
rst.Update
Debug.Print rst("Code ville")
Créé le 10 mai 2005  par Petogaz

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.

Une table Table1 avec un champ num (clé primaire) de type Long Integer.

Un formulaire Form1 lié à la Table1 avec un contrôle Num (verrouillé) lié au champ Num de table1 :

Et sur l'événement BeforeInsert du formulaire :

 
Sélectionnez
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset(Me.RecordSource, dbOpenSnapshot)

   If rs.EOF Then
   Me!Num = 1
   Else
   rs.MoveLast
   Me!Num = rs!Num + 1
   End If

rs.Close
Set rs = Nothing

End Sub

et pour réinitialiser les valeurs NuméroAuto :

 
Sélectionnez
Public Function Init_numeroAuto()
Dim rs As DAO.Recordset
Dim i As Long

On Error Resume Next

Set rs = CurrentDb.OpenRecordset("Table1", dbOpenDynaset)

i = 1

   While Not (rs.EOF)
   rs.Edit
   rs!Num = i
   rs.Update
   
   rs.MoveNext
   i = i + 1
   Wend

rs.Close
Set rs = Nothing

End Function

ATTENTION : Ces fonctions sont valables pour des applications monopostes. Attention en réseau aux accès concurrents et simultanés.

Créé le 10 mai 2005  par User

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 cocher l'option : Outils > Options > onglet Général > Correction automatique de nom, Access fera la mise à jour dans la base en cours.
Ça veut dire hélas, que si vos tables sont dans une base séparée, seule cette base sera mise à jour, pas l'application. C'est un problème qu'on souhaite voir résolu dans une prochaine version d'Access.
Une autre option :
Dans le code, une recherche/remplacement globale permet de tout remplacer d'un coup, mais faut chercher dans chaque requête, formulaire, c'est un travail assez pénible.

Créé le 20 novembre 2005  par Papy Turbo

Première solution, on cherche tout simplement le NuméroAuto le plus élevé :

 
Sélectionnez

Select Max(monchampAuto) From matable;

Cette seconde solution ne fonctionnera qu'à partir d'Access 2000.

 
Sélectionnez

Select @@identity From maTable;

Info : La variable @@IDENTITY est une variable globale SQL qui permet de retrouver la dernière valeur utilisée pour un numéro automatique d'une table.

Créé le 20 novembre 2005  par Frank

Il vous suffit pour cela de vider la table en question et de compacter la base de données.
Mettez par exemple les enregistrements dans une table temporaire.

Créé le 20 novembre 2005  par Tofalu

Lien : Comment supprimer les trous des champs NuméroAuto ?

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

 
Sélectionnez
Function PurgeErreurs()
 
Dim tbl As TableDef
For Each tbl In CurrentDb.TableDefs
 If InStr(tbl.Name, "importerrors") or Instr(tbl.Name, "PasteErrors") Then
    Debug.Print "Effacement de " & tbl.Name
    CurrentDb.TableDefs.Delete tbl.Name
 End If
Next tbl
 
Set tbl = Nothing
 
End Function
Créé le 29 novembre 2006  par cafeine

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.