VBA数据库解决方案第19讲:如何在数据库中新建查询表,并在工作表中显示其内容

论坛 期权论坛 期权     
VBA语言专家   2019-6-29 21:09   4229   0
蓝字关注,加微信NZ9668获资料信息

《VBA代码解决方案》系列书作者
头条百家平台 VBA资深创作者
_______________________________
大家好,今日讲解VBA数据库解决方案第19讲:如何在数据库中新建一个查询表,并在工作表中显示出来。关于Recorsset集合的一些操作讲解,在前几讲中讲了很多,这里提醒大家一点:任何对象都不是孤立存在的,要结合实际来理解。有朋友向我咨询一些概念的问题,在写这套资料时,我也同样要参考很多的资料,有时要对照着英语去理解一些概念,这时往往发现很多的概念在英语中和之前人们翻译是有是对不上的,所以理解起来很难.特别是现在的数据库讲解阶段,涉及到ADO、 RDO、连接、打开、引用,单纯的从概念上真的很难理解,这时我建议大家不要纠结于纯概念,要从实际出发,比如:一段代码就是一个连接,一个代码就是一个创建,这样有实际内容参考的去理解就可以了;再者,无论是什么途径,我们的目的是应用,只要我们能达到应用,就达到了我们的目的。很多写VBA的人都是专业人士,而我仅仅是根据多年的经验来写东西,会紧扣以实用为目的,目的是实用,下一个目的还是实用。
今日我们讲解如何从Recorsset记录集中根据某特定的条件形成一个数据库中新表。在前几讲的讲解中是把这些记录直接显示在工作表中,即显示在EXCEL文件中,今日的内容和前面的内容有所不同,是要形成一个表,然后再显示。
实例:我们还是利用之前的数据库,如下资料,把职务为普通员工的职工要重新建立一个查询表,最后再在工作表中显示出来.


随着讲解的深入,实际工作中经常会遇到的问题会逐渐的体现,大家要跟紧我,我们一起学习,这套教程和《VBA代码解决方案》不同,有些内容是连续的,需要读者慢慢的连续的去领会。
下面看看我们今日课题的代码:
Sub mynzCreateView()
   Dim cnADO, rsADO As Object
   Dim strPath, strSQL, strViewName As String
   Set cnADO = CreateObject("ADODB.Connection")
   strPath = ThisWorkbook.Path & "\mydata2.accdb"
   strViewName = "普通员工表"
   cnADO.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="& strPath
   Set rsADO = cnADO.OpenSchema(20, Array(Empty, Empty, strViewName,Empty))
   If Not rsADO.EOF Then
       MsgBox ("请注意:原有表将删除!")
       strSQL = "DROP TABLE " & strViewName
       cnADO.Execute strSQL
   End If
   strSQL = "CREATE VIEW " & strViewName _
       & " AS SELECT * FROM 员工信息 " _
       & "Where 职务= '员工'"
   cnADO.Execute strSQL
   MsgBox "查询表创建成功!", , "创建视图"
   rsADO.Close
   strSQL = "SELECT * FROM 普通员工表"
   rsADO.Open strSQL, cnADO, 1, 3
   For i = 0 To rsADO.Fields.Count - 1
       Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name
   Next i
   For i = 1 To rsADO.RecordCount
   For j = 0 To rsADO.Fields.Count - 1
     Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)
   Next j
   rsADO.MoveNext
   Next i
   rsADO.Close
   cnADO.Close
   Set rsADO = Nothing
   Set cnADO = Nothing
End Sub
代码的讲解:
1  IfNot rsADO.EOF Then
       MsgBox ("请注意:原有表将删除!")
       strSQL = "DROP TABLE " & strViewName
       cnADO.Execute strSQL
   End If
以上代码判断是否存在这个表,如果存在,那么删除。
2   strSQL = "CREATE VIEW " &strViewName _
       & " AS SELECT * FROM 员工信息 " _
       & "Where 职务= '员工'"
   cnADO.Execute strSQL
   MsgBox "查询表创建成功!", , "创建视图"
rsADO.Close
上述代码创建了查询表,并弹出对话框通知用户。
这里用的CREATEVIEW 就是创建视图的意思:在SQL 中,视图是基于 SQL 语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
3  rsADO.Close
   strSQL = "SELECT * FROM 普通员工表"
   rsADO.Open strSQL, cnADO, 1, 3
   For i = 0 To rsADO.Fields.Count - 1
       Sheets("Sheet1").Cells(1, i + 1) = rsADO.Fields(i).Name
   Next i
   For i = 1 To rsADO.RecordCount
   For j = 0 To rsADO.Fields.Count - 1
     Sheets("Sheet1").Cells(i + 1, j + 1) = rsADO.Fields(j)
   Next j
   rsADO.MoveNext
Next i
上述代码先关闭之前的rsADO,然后新建立一个查询的SQL,用于向工作表输出数据
4 rsADO.Close
   cnADO.Close
   Set rsADO = Nothing
Set cnADO =Nothing
最后关闭连接和释放内存。
特别注意点:在上述代码中要注意的是在新的记录集建立之前一定要关闭原先的记录集,但这个时候的数据库连接不用关闭,因为还是用的同一个数据库。
好了,我们看看我们的运行结果:


看看数据库的表:


今日内容回向:
1  如何建立一些查询表?
2  查询表建立后输出的时候要注意什么?

_____________________________

觉得有启发,点个“在看”,转给朋友们
欢迎你“留言”,和作者直接交流

更多关联阅读








  





分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:200
帖子:40
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP