ListView 的说明 4:用函数返回 Biblio.mdb 数据库中的作者姓名

该主题中的代码示例来源于示例应用程序 DataTree.vbp,该示例应用程序列在 Samples目录中。

在说明“ListView 控件的说明 1:与 TreeView 控件一起使用 ListView 控件”中,ListView 控件和 TreeView 控件是协同工作的。在那个说明中用 TreeView 控件的 NodeClick 事件调用名为“GetTitles”的过程充填 ListView 控件。那个过程查询“标题”表以创建记录集,然后为找到的每条记录创建 ListItem 对象。

在“标题”表中没有包含书作者姓名的信息。不过在“标题”表中有名为“ISBN”的字段,该字段保存了该书的 ISBN 编号。在另外一个名为“作者标题”的表中也有这个字段的值,在那张表中与 ISBN 值相关联的 Au_ID 字段标识了该书的作者。

要获取作者的姓名,该函数必须执行如下步骤

  1. 在“作者标题”记录集中查找 ISBN 值。

  2. 在 Authors 记录集中查找 AuthorID 值。

  3. 返回作者的姓名。

设置

本说明中用到了下面的对象:

在“作者标题”记录集中查找 ISBN 值

GetAuthor 函数用 ISBN 字段的值查找“作者标题”记录集。和其它数据库操作一样,先声明了一个 RecordSet 类型的对象变量,然后打开“作者标题”表,并将对该表的引用赋予对象变量。既然代码中使用了两个记录集,那么就一起声明对象变量,然后打开记录集,如下所示。

Dim rsTitleAuthor As Recordset
Dim rsAuthors As Recordset

Set rsTitleAuthor = mDbBiblio. _
OpenRecordset("Title Author", dbOpenDynaset)
Set rsAuthors = mDbBiblio. _
OpenRecordset("Authors", dbOpenDynaset)

用 rsAuthors 对象变量和 ISBN 字段中的值查找“作者标题”表:

Dim strQuery As String
strQuery = "ISBN = " & "'" & ISBN & "'"
rsTitleAuthor.FindFirst strQuery

在 Authors 记录集中查找 AuthorID 值

FindFirst 方法返回在查询中符合条件的第一条记录。在“作者标题”表中的另一个字段是“Au_ID”,它包含了“作者”表中作者的 ID。这样,就能够用查询中的“Au_ID”字段的值搜索“作者”表了,如下所示:

'重新设置查询字符串。
strQuery = "Au_ID = " & rsTitleAuthor!AU_ID
' FindFirst 方法继续搜索。
rsAuthors.FindFirst strQuery 

返回作者的姓名

最后,进入“作者”表后,“Au_ID”字段也找到了。假定没有发生任何错误,那么当前记录应返回作者的姓名。下面的代码使函数将作者的姓名返回给调用该函数的代码:

GetAuthors = rsAuthors!Author

完整的 GetAuthor 函数

完整的函数如下所示:

Private Function GetAuthor(ISBN)
   '声明 DAO 对象变量。
   Dim rsTitleAuthor As Recordset
   Dim rsAuthors As Recordset    
   '将对象变量设置为记录集。
   Set rsTitleAuthor = mDbBiblio. _
   OpenRecordset("Title Author", dbOpenDynaset)
   Set rsAuthors = mDbBiblio. _
   OpenRecordset("Authors", dbOpenDynaset)
   '创建查询字符串。
   Dim strQuery As String
   strQuery = "ISBN = " & "'" & ISBN & "'"
   rsTitleAuthor.FindFirst strQuery
   '如果没有作者,则返回 "n/a"'否则,返回作者的姓名。

   If rsTitleAuthor.NoMatch Then
      GetAuthor = "n/a"
      Exit Function
   Else
      '假定找到了正确的记录集。
      '然后用 Au_ID 字段值重新设置查询字符串,
      '并搜索“作者”表。
      strQuery = "Au_ID = " & rsTitleAuthor!AU_ID
      rsAuthors.FindFirst strQuery
      ' 返回 Author 字段中的作者姓名。
      GetAuthor = rsAuthors!Author
   End If
End Function