Como posso obter uma lista de campos E respectivas tabelas usadas em um banco de dados do MS Access 2010?

2

Eu sei que é assim que você obtém uma lista de todas as tabelas no banco de dados (e mais, se você modificar as críticas:

SELECT *
FROM MSysObjects
WHERE (((MSysObjects.Type)=1) AND ((MSysObjects.Flags)=0));

Mas existe uma maneira semelhante de obter uma lista de campos e quais tabelas eles pertencem? Estou pensando que isso seria muito útil para solucionar problemas e fazer uma auditoria rápida (ou seja, responder "em que outras tabelas esse campo ou grupo de campos está sendo usado"). Mas, por qualquer motivo, não foi possível encontrar uma resposta na Web.

Se alguém tiver uma maneira relativamente simples de fazer isso por meio do VBA, isso também pode ser uma opção. Obrigado.

    
por daniellopez46 14.06.2012 / 18:30

2 respostas

3

Infelizmente, os nomes dos campos não estão disponíveis por meio de uma Consulta SQL agradável e compacta. Este código irá imprimir o nome da tabela e cada campo em uma linha separada na janela de depuração.

Private Sub ShowTableFields()

Dim db As Database
Dim tdf As TableDef
Dim x As Integer

Set db = CurrentDb

For Each tdf In db.TableDefs
   If Left(tdf.Name, 4) <> "MSys" Then ' Don't enumerate the system tables
      For x = 0 To tdf.Fields.Count - 1
      Debug.Print tdf.Name & "','" & tdf.Fields(x).Name
      Next x
   End If
Next tdf
End Sub
    
por 18.06.2012 / 19:42
1

Neste caso particular, você pode encontrar esquemas ADO úteis.

Isto irá listar campos e algumas propriedades para uma tabela específica. Tenha cuidado com os tipos de dados, você não pode obter uma correspondência exata para os tipos DAO. Você precisará de uma referência a Microsoft ActiveX Data Objects x.x Library , a menos que você use ligação tardia.

Dim cn As New ADODB.Connection, cn2 As New ADODB.Connection
Dim rs As ADODB.Recordset, rs2 As ADODB.Recordset

   Set cn = CurrentProject.Connection

   Set rs = cn.OpenSchema(adSchemaTables, _
       Array(Empty, Empty, Empty, "tablenamehere"))

   While Not rs.EOF
       Debug.Print rs!table_name; "   desc=  "; rs!Description
       Set rs2 = cn.OpenSchema(adSchemaColumns, _
           Array(Empty, Empty, "" & rs!table_name & ""))
       While Not rs2.EOF
           Debug.Print "     " & rs2!Column_Name
           Debug.Print "     " & rs2!Data_Type
           Debug.Print "     " & rs2!Description
           Debug.Print "     " & rs2!Is_Nullable
           rs2.MoveNext
       Wend
   rs.MoveNext
   Wend
   rs.Close
   Set cn = Nothing

Você também pode ver as coisas ao contrário e obter uma lista de tabelas que contêm um campo específico.

Dim cn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim strTempList As String

   On Error GoTo Error_Trap

   Set cn = CurrentProject.Connection

   'Get names of all tables that have a column called <SelectFieldName>
   Set rs = cn.OpenSchema(adSchemaColumns, _
   Array(Empty, Empty, Empty, SelectFieldName))

   'List the tables that have been selected
   While Not rs.EOF
       'Exclude MS system tables
       If Left(rs!Table_Name, 4) <> "MSys" Then
           strTempList = strTempList & "," & rs!Table_Name
       End If
       rs.MoveNext
   Wend

   ListTablesContainingField = Mid(strTempList, 2)

De: link

O Stackoverflow tem um pouco sobre o assunto: link

    
por 20.06.2012 / 11:47