2013-06-13 2 views
2

Я создал следующий код, который я хочу использовать в будущем, чтобы получить список всех полей в таблице:возвращающие полей объекта - Access 2007 VBA

Private Sub btnGetFields_Click() 


    Dim myDBS As Database 
    Dim fldLoop As Fields 
    Dim fld As Field 
    Dim relLoop As Relation 
    Dim tdfloop As TableDef 

    Set myDBS = CurrentDb 

    With myDBS 

    ' Display the attributes of a TableDef object's 
    ' fields. 
    Debug.Print "Attributes of fields in " & _ 
    .TableDefs("ALT_IDENTIFIER").Name & " table:" 

    'Error occurs in line below 
    Set fldLoop = .TableDefs("ALT_IDENTIFIER").Fields 

    For Each fld In fldLoop 
    Debug.Print " " & fld.Name & " = " & _ 
     fld.Attributes 
    Next fld 

.Close 
    End With 

End Sub 

Но я получаю a Type Mistmatch - Runtime Error 13 назад, когда я запускаю код.

Почему? fldloop - объект Fields - т. Е. Набор объектов поля справа? это то, что возвращает процедура TableDefs.Fields, так почему я получаю эту ошибку?

Благодаря

+0

'Поля' - это не объект, это коллекция. –

+0

Я сказал, что коллекция - это в основном 1 или более объектов, размещенных под другим – Katana24

+0

. Ваши коды работают для меня, включая связанные таблицы. –

ответ

0

Нашел проблему: причина, по которой я получал ошибку, состояла в том, что я не имел в виду точное поле. Хотя я до сих пор не уверен, почему была ошибка при создании объекта Fields, которому было присвоено значение Fields.

Вот код:

Dim f As Field 
    Dim fldTableDef As Field 
    Dim Rst As DAO.Recordset 
    Dim numField As Integer 

    Dim linkedTable As String 
    linkedTable = "ALT_IDENTIFIER" 

    Set Rst = CurrentDb.OpenRecordset(linkedTable) 
    numField = Rst.Fields.Count 

    'Loop through 
    Dim index As Integer 

    For index = 0 To numField - 1 
     If Rst.Fields(index).Type = dbDate Then 
      Debug.Print "Field: " & Rst.Fields(index).Name; " = Date/Time" & Rst.Fields(index).Value 
     End If 
    Next 
0

Иногда проходя значения их типы литералов в Access вызывает эти виды ошибок, не знаю, почему, быстрое решение, как правило, к размеру переменную как тип открытых данных вместо например:

Dim fldloop as object 

в противном случае вы можете переписать эту строку:

For Each fld In fldLoop 

к

For Each fld In .TableDefs("ALT_IDENTIFIER").Fields 

и забыть размеры отдельных переменной вместе


UPDATE:

Возможно, это было бы более полезным для SQL Server, если у вас есть доступ только через MS Access, то вы должны быть в состоянии использовать этот пример с помощью цикла через ваши связанные таблицы и динамически повторно здание аа Сквозной Query

What is the equivalent of 'describe table' in SQL Server?

+0

не сделает это довольно большим, как объявление переменной как вариант вместо обычного типа? – Katana24

+0

также - я попробовал то, что вы предложили (переписывая строку), и получил ту же ошибку. Также попытался сменить его на объект, но получил ту же ошибку:/ – Katana24

+0

Я считаю, что эта ошибка, которую я получаю, вполне может иметь отношение к таблице, являющейся связанной таблицей. Я портировал код в другую базу данных и смотрел на локальную таблицу, и он работал нормально. Еще нужно найти решение для связанных таблиц. – Katana24

1

У меня была такая же проблема, и я решил, изменив «Поле» в «DAO.Field»:

Dim fld As DAO.Field 

Может быть, это помогает еще один.

С уважением

Смежные вопросы