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→Trucs et Astuces- La création d'un champ dans une table liée m'est refusée.
- Comment créer un formulaire instantané par rapport à une table X en VBA ?
- [VBA] Comment masquer une table ?
- Comment faire pour trouver le plus grand nombre contenu dans une table ?
- Rétablir les liaisons des tables liées après déplacement d'une base fractionnée
- Comment savoir quelle valeur vient de prendre un champ NuméroAuto après l'ajout d'un enregistrement ?
- Comment créer son propre NuméroAuto ?
- Est-il possible de changer le nom d'une table, champ ou requête et que chaque partie de code basé sur un de ces éléments soit automatiquement mise à jour ?
- Comment récupérer la valeur du dernier NuméroAuto inséré dans une table ?
- Comment réinitialiser un champ de type NuméroAuto ?
- Comment supprimer les tables d'erreurs ?
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.
_ Première possibilité :
DoCmd.SelectObject acTable, "VotreTable", True
DoCmd.RunCommand acCmdNewObjectAutoForm_ Seconde possibilité :
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 SubApplication.SetHiddenAttribute acTable, NomdeTaTable, True
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.
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.CloseLien : 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
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 SubSub 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 SubLien : 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.
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.UpdatePar 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.
rst.AddNew
rst("Nom Ville") = "TEST"
rst("Code postal") = "57000"
rst.Update
Debug.Print rst("Code ville")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 :
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 Subet pour réinitialiser les valeurs NuméroAuto :
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 FunctionATTENTION : Ces fonctions sont valables pour des applications monopostes. Attention en réseau aux accès concurrents et simultanés.
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.
Première solution, on cherche tout simplement le NuméroAuto le plus élevé :
Select Max(monchampAuto) From matable;Cette seconde solution ne fonctionnera qu'à partir d'Access 2000.
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.
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.
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
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 FunctionLien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?



