Pouvez-vous s'il vous plaît laissez-moi savoir s'il est possible de lister tous les noms de champs dans une table MS Access?
Merci
Je travaille beaucoup trop dans MS Access.
Le seul moyen que je connaisse pour ce faire serait d'utiliser vba et de définir, par exemple, un jeu d'enregistrements et de parcourir en boucle les champs.
Par exemple:
dim rst as new adodb.recordset
rst.open "SELECT * FROM SomeTable", CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
' Note: adOpenForwardOnly and adLockReadOnly are the default values '
' for the CursorType and LockType arguments, so they are optional here '
' and are shown only for completeness '
dim ii as integer
dim ss as string
for ii = 0 to rst.fields.count - 1
ss = ss & "," & rst.fields(ii).name
next ii
La variable chaîne ss
contiendra une liste délimitée par des virgules de tous les noms de colonnes de la table nommée "SomeTable".
Avec un peu de reformatage de la logique, vous devriez pouvoir insérer ces données dans une autre table si vous le souhaitez, puis les interroger.
Est-ce que cela aide?
Cette version est facile à exécuter et va coller directement dans Access. Ajoutez cette fonction à un module, exécutez-la avec F5 et copiez le résultat depuis la boîte de saisie:
Public Function FieldNames() As String
Dim sTable As String
Dim rs As DAO.Recordset
Dim n As Long
Dim sResult As String
sTable = InputBox("Name of table?")
If sTable = "" Then
Exit Function
End If
Set rs = CurrentDb.OpenRecordset(sTable)
With rs
For n = 0 To .Fields.Count - 1
sResult = sResult & .Fields(n).Name & vbCrLf
Next 'n
.Close
End With
Set rs = Nothing
InputBox "Result:" & vbCrLf & vbCrLf _
& "Copy this text (it looks jumbled, but it has one field on each line)", _
"FieldNames()", sResult
End Function
Sortie alternative:
L'utilisateur user1003916 a fourni une alternative à la InputBox pour dépasser la limite de 1024 caractères (je ne l'ai pas encore testé):
Sub CopyText(Text As String)
'VBA Macro using late binding to copy text to clipboard.
'By Justin Kay, 8/15/2014
Dim MSForms_DataObject As Object
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
MSForms_DataObject.SetText Text
MSForms_DataObject.PutInClipboard
Set MSForms_DataObject = Nothing
End Sub
MISE À JOUR: POUR UTILISER CETTE DEMANDE SQL, VOUS DEVEZ UTILISER UN OUTIL TEL QUE DBEAVER . CLIENT D'ACCÈS NE VOUS PERMET PAS D'INTERROULER LES STRUCTURES CACHÉES
YIKES! IMO: Je ne peux pas imaginer vouloir plonger dans le ventre sombre de VBA
SELECT * FROM information_schema.columns
WHERE TABLE_NAME="YOUR_TABLE_NAME"
AND
TABLE_SCHEMA="PUBLIC"
PS j'ai remarqué Access appelé mon schéma "PUBLIC"
Above a utilisé un Access 2016 et a été testé sur ODBC et jdbc: ucanaccess et fonctionne à merveille.
Exemple de sortie
Vous pouvez simplement utiliser l'outil Documenter. Allez à Database Tools > Database Documenter
, sélectionnez le tableau et appuyez sur OK.
Construire la requête:
SELECT Table_Name.*
FROM Table_Name
WHERE False;
Exporter vers ExcelVous aurez chaque nom de champ dans une ligne sans aucune donnée. Si vous sélectionnez la ligne et la copie, vous pouvez coller spécial> transposer et les placer tous dans une seule colonne.
Une méthode rapide et sale implique Excel. Faites ce qui suit:
Les champs seront collés dans une seule colonne. Pour connaître leur numéro d'index de champ, entrez "0" dans la cellule B1, puis remplissez la série jusqu'à la dernière ligne du numéro de champ.
En outre, vous pouvez trier la colonne par ordre alphabétique, en particulier pour les fichiers plats hérités contenant des dizaines de champs. Cela économise vraiment beaucoup de temps lorsque j'essaie de convertir un fichier à plat en un modèle relationnel.
Laisse ça aller ...
private void Button_OldDDLDump_Click(object sender, EventArgs e)
{
string _cnstr = "connectionstringhere";
OleDbConnection _cn = new OleDbConnection(_cnstr);
try
{
_cn.Open();
System.Data.DataTable _dt = null;
try
{
_dt = _cn.GetSchema("tables");
m_msghelper.AppendArray( DataTableHelper.DataTableToString(_dt) );
}
catch (Exception _ex)
{
System.Diagnostics.Debug.WriteLine(_ex.ToString());
}
finally
{
_dt.Dispose();
}
}
catch (Exception _ex)
{
System.Diagnostics.Debug.WriteLine(_ex.ToString());
}
finally
{
_cn.Close();
}
}
Méthode d'assistance pour vider la structure de la base de données dans un tableau de chaînes ici.
public static class DataTableHelper
{
public static string[] DataTableToString( System.Data.DataTable dt )
{
List<string> _retval = new List<string>();
foreach (System.Data.DataRow row in dt.Rows)
{
foreach (System.Data.DataColumn col in dt.Columns)
{
_retval.Add( string.Format("{0} = {1}", col.ColumnName, row[col]) );
}
_retval.Add( "============================");
}
return _retval.ToArray();
}
}
On dirait que cette tâche était plus facile dans les vieux jours. Il est probable que cette réponse dépend fortement de la version. Cela fonctionne pour moi dans un test rapide avec une base de données Access 2007:
select
Specs.SpecName AS TableName,
Columns.FieldName
from
MSysIMEXColumns Columns
inner join MSysIMEXSpecs Specs on Specs.SpecID = Columns.SpecID
order by
Specs.SpecName,
Columns.FieldName
Ce n'est pas du SQL, mais cette question est le premier résultat de Google pour quelqu'un comme moi qui n'a besoin que de répertorier les noms de champs nécessaires à la sélection d'une requête, car Access ne prend pas en charge "* sauf foo, bar" pour obtenir 99% des réponses. table.
Réponse adaptée d'une réponse social.msdn.com de Patrick Wood, MVP Access https://social.msdn.Microsoft.com/Forums/office/en-US/1fe5546b-db3f-4e17-9bf8-04f4dee233b7/comment-lister-tous-les-noms-de-champs-dans-une-table-spécifiée? forum = accessdev
Changez le nom de table en votre nom dans le module. Cette fonction devrait être au niveau global:
Function ListTdfFields()
' NOT doing DIMs, since then you must enable/attach ADODB or DAO
' Dim db As ADO.Database
Set db = CurrentDb
tablename = "tblProductLicense" ' <=== YOUR TABLE NAME HERE
Set tdf = db.TableDefs(tablename)
For Each fld In tdf.Fields
Debug.Print tablename; ".["; fld.Name; "]," ;
' remove ending ; for 1 line per field
Next
Debug.Print ""
Set tdf = Nothing
Set db = Nothing
End Function
Ajoutez ensuite une macro RunCode ListTdfFields () et exécutez-la. La sortie sera envoyée à la fenêtre Immediate de la vue de conception VBA du module.
J'aimerais partager cette solution VBA, que je n'ai pas écrite, mais légèrement modifiée (le nom de la table a été remplacé par "SourceTable"). Une fois qu'il est exécuté, vous pouvez interroger la table créée. Il tire parti des tables système cachées.
Sub GetField2Description()
'************************************************* *********
'Purpose: 1) Deletes and recreates a table (tblFields)
' 2) Queries table MSysObjects to return names of
' all tables in the database
' 3) Populates tblFields
'Coded by: raskew
'Inputs: From debug window:
' Call GetField2Description
'Output: See tblFields
'************************************************* *********
Dim db As DAO.Database, td As TableDef
Dim rs As Recordset, rs2 As Recordset
Dim Test As String, NameHold As String
Dim typehold As String, SizeHold As String
Dim fielddescription As String, tName As String
Dim n As Long, i As Long
Dim fld As Field, strSQL As String
n = 0
Set db = CurrentDb
' Trap for any errors.
On Error Resume Next
tName = "tblFields"
'Does table "tblFields" exist? If true, delete it;
DoCmd.SetWarnings False
DoCmd.DeleteObject acTable, "tblFields"
DoCmd.SetWarnings True
'End If
'Create new tblTable
db.Execute "CREATE TABLE tblFields(Object TEXT (55), FieldName TEXT (55), FieldType TEXT (20), FieldSize Long, FieldAttributes Long, FldDescription TEXT (20));"
strSQL = "SELECT MSysObjects.Name, MSysObjects.Type From MsysObjects WHERE"
strSQL = strSQL + "((MSysObjects.Type)=1)"
strSQL = strSQL + "ORDER BY MSysObjects.Name;"
Set rs = db.OpenRecordset(strSQL)
If Not rs.BOF Then
' Get number of records in recordset
rs.MoveLast
n = rs.RecordCount
rs.MoveFirst
End If
Set rs2 = db.OpenRecordset("tblFields")
For i = 0 To n - 1
fielddescription = " "
Set td = db.TableDefs(i)
'Skip over any MSys objects
If Left(rs!Name, 4) <> "MSys" And Left(rs!Name, 1) <> "~" Then
NameHold = rs!Name
On Error Resume Next
For Each fld In td.Fields
tableName = fld.SourceTable
fielddescription = fld.Name
typehold = FieldType(fld.Type)
SizeHold = fld.Size
rs2.AddNew
rs2!Object = tableName
rs2!FieldName = fielddescription
rs2!FieldType = typehold
rs2!FieldSize = SizeHold
rs2!FieldAttributes = fld.Attributes
rs2!FldDescription = fld.Properties("description")
rs2.Update
Next fld
Resume Next
End If
rs.MoveNext
Next i
rs.Close
rs2.Close
db.Close
End Sub
Function FieldType(intType As Integer) As String
Select Case intType
Case dbBoolean
FieldType = "dbBoolean" '1
Case dbByte
FieldType = "dbByte" '2
Case dbInteger
FieldType = "dbInteger" '3
Case dbLong
FieldType = "dbLong" '4
Case dbCurrency
FieldType = "dbCurrency" '5
Case dbSingle
FieldType = "dbSingle" '6
Case dbDouble
FieldType = "dbDouble" '7
Case dbDate
FieldType = "dbDate" '8
Case dbBinary
FieldType = "dbBinary" '9
Case dbText
FieldType = "dbText" '10
Case dbLongBinary
FieldType = "dbLongBinary" '11
Case dbMemo
FieldType = "dbMemo" '12
Case dbGUID
FieldType = "dbGUID" '15
End Select
End Function