在这一刻,我正在学习在MS Access中工作的目的。我对该程序的基础知识有了一些了解,例如创建表格或制作简单的表格(尽管还没有理想地工作),到现在为止我一直在解决以下任务。
我有一个数据库BooksDatabase,它由三个表:书籍,作者和AuthorsInfo。第一个包含关于书籍(姓名,流派,国家,发行年份等)的信息,第三个关于作者(名,姓等),第二个将有史以来的书与其作者联系起来。任务是将数据从文本文件导入到这些表中,以便它几乎是自动的。我知道如何将文件导入到MS Access(至少是* .txt扩展名),我在表BooksToImport中这样做,但我在插入导入的数据时遇到了一些困难。这里是我的功能ImportBooks(),这是我从同一个名字的宏执行的代码:
' Procedure which imports data about books from the table BooksToImport
Function ImportBooks()
Dim dbBooks As Database
Dim rstImBooks, rstBooks, rstAuthors, rstBALink As DAO.Recordset
Dim codeI, codeB, codeA, codeL As Variant
'initializing database
Set dbBooks = CurrentDb
Set rstImBooks = dbBooks.OpenRecordset("Query_BooksToImport",dbOpenDynaset) 'receiving data from query
'checking if the query has any records
If rstImBooks.RecordCount = 0 Then
MsgBox "There are no records for importing!", vbInformation, "Attention!"
rstImBooks.Close
Set dbBooks = Nothing
Exit Function
End If
'if it's OK, we're making a loop on query's records
rstBooks = dbBooks.OpenRecordset("Books",dbOpenDynaset)
rstAuthors = dbBooks.OpenRecordset("AuthorsInfo",dbOpenDynaset)
rstBALink = dbBoks.OpenRecordset("Authors",dbOpenDynaset)
rstImBooks.MoveLast
rstImBooks.MoveFirst
Do While rstImBooks.EOF = False
'checking if there is a book in out database with the same name as in imported data
codeB = DLookup("[ID]","[Books]","[BookName] = '" & rstImBooks![BookName] & "'")
If IsNull(codeB) Then
'inserting new record
With rstBooks
.AddNew
![BookName] = rstImBooks![BookName]
.Update
.Bookmark = .LastModified
codeB = ![ID]
End With
End If
'in much the same way we're treating the data about authors and making the links
rstImBooks.MoveNext
Loop
rstImBooks.Close
rstBooks.Close
rstAuthors.Close
rstBALink.Close
Set dbBooks = Nothing
End Function
我有两个问题,使用此功能:
- 方法.AddNew为rstBooks不工作 - MS Access显示错误438(“对象不支持此属性或方法”)的消息;
- 此外,我不能将变量rstBALink分配给记录集,因为编译器显示“无效的属性使用”。
所以我的问题是这样的:我该如何解决这两个问题?我做错了,我的功能不能正常工作?
非常感谢您!现在我已经完成了任务,所以我可以走得更远。 :-)要说“set”命令,错过它是我的错误,但我很惊讶VBA不喜欢当一次声明所有相同类型的变量时。 – PiggyInTheMirror
VBA仍然会将变量创建为变体,如果使用Set,它可以转换为记录集对象(因为您没有使用Set关键字,所以这不起作用)。然而,显式声明阻止编译器在中途转换类型的额外步骤,并且在排除有问题的代码时很方便。出于这些原因明确使用它们也是很好的做法。你仍然可以在同一行输入它们,但它不会使用最终的'As Type'并将其应用于该行上的所有声明变量。真高兴你做到了! – MoondogsMaDawg