Excel VBA应用-4:从金蝶数据库提取销售明细

前面演示了如何从金蝶K3系统中提取核算项目资料,从这些示例中我们可以看出程序包括两部分组成 , 一部分是工作表的设置 , 如清空工作表、设置标题、设置自动筛选等 , 另一部分是连接指定数据库,并从数据库表中提取数据 。
我们现在的主要目的是从数据库中提取数据,暂时不演示如何设置工作表 , 重点是从数据库中如何计算并提取符合需求的数据,实际上也就是如何编写具体的sql查询语句,从而达到快速生成报表的目的 。前面三节都是从一个表中提取数据,这节我们会从多个相关的表中提取数据 。
本节需求,从数据库中提取指定期间的销售数据(销售发票)明细 。
销售发票在数据库中存放在两个表中,ICSale存放表头,ICSaleEntry存放表体,先看一下这两个表的具体内容:

Excel VBA应用-4:从金蝶数据库提取销售明细

【Excel VBA应用-4:从金蝶数据库提取销售明细】上部分是表头,下部分是表体,表头中的FCustID是客户字段,表体中的FItemID是物料字段 , 这两个字段存放的都是核算项目的内码,需要比对核算项目表才能显示其名称 。
本节目的是提取销售明细,需要提取的字段是单据编号、单据日期、客户、摘要、物料名称、规格、单位、数量、单价、金额、税额、价税合计 。
因为数据量较大,我们需要有选择的提取数据,如按年度、月度、周、日 , 或指定期间提取数据,这里我们按月份来提取 , 就需要指定提取数据的年度和月份,可以仿照上节的方法,将工作表分为上下两个部分 , 上部分是条件筛选区,下部分是数据显示区 。
Excel VBA应用-4:从金蝶数据库提取销售明细

为了提高代码编辑效率,我们可以直接把前面的代码复制过来进行改造 , 其中工作表格式和连接数据库的代码都是一样的,我们只需要重新组合SQL语句就能得到想要的结果 。
Excel VBA应用-4:从金蝶数据库提取销售明细

点击按钮看结果:
Excel VBA应用-4:从金蝶数据库提取销售明细

我们可以尝试改变年度和月份,看看不同的查询结果是否与金蝶系统数据相符 。
以上就是从金蝶数据库中提取销售明细的方法,各位有什么想法和疑问可以在评论区中留言,共同探讨 。如果您觉得对工作有帮助 , 请关注、点赞、留言,让更多的同学交流学习 。
附源代码:
Option ExplicitPrivate Sub CommandButton1_Click()Dim ado As ObjectDim rst As ObjectDim str As StringDim sql As StringDim dbIP As StringDim dbsa As StringDim dbpwd As StringDim dbname As String'清屏Range("4:" & Rows.Count).Clear'如果没有录入查询年度和月份,退出If Val(Range("B1")) = 0 Or Val(Range("D1")) = 0 Then Exit Sub'如果有自动筛选 , 先取消自动筛选If ActiveSheet.AutoFilterMode Then Range("A3").AutoFilter'设置数据库连接字符串dbIP = "(local)"'安装数据库的电脑IP地址,(local)代表本机dbsa = "sa"'SQLServer数据库的登录用户名dbpwd = "123456"'SQLServer数据库的登录密码dbname = "AIS20210318095953"'需要提取数据的金蝶数据库名str = "Provider=SQLOLEDB.1;"str = str & "Data Source=" & dbIP & ";"str = str & "Persist Security Info=True;"str = str & "User ID=" & dbsa & ";"str = str & "Password=" & dbpwd & ";"str = str & "Initial Catalog=" & dbname & ";"'建立数据库连接Set ado = CreateObject("ADODB.Connection")ado.Open str'构造提取数据的SQL语句sql = "Select b.FBillno,b.FDate,d.FName,a.fnote,c.FName,c.FModel,"sql = sql & "e.FName , a.FQty, a.FPrice, a.FAmount, a.FTaxAmount, a.FAmountincludetax "sql = sql & "From ICSaleEntry a left join ICSale b on a.FInterID=b.FInterID "'关联商品表sql = sql & "left join t_icitem c on a.FItemID=c.FItemID "'关联客户表sql = sql & "left join t_Organization d on b.FCustID=d.FItemID "'关联计量单位表sql = sql & "left join t_MeasureUnit e on a.FUnitID=e.FItemID "'增加筛选条件,按指定的年度和月份sql = sql & "WHERE YEAR(b.fdate)=" & Range("B1") & " and MONTH(b.fdate)=" & Range("D1") & " "'按单据编号排序sql = sql & "Order By b.FBillno "Set rst = ado.Execute(sql)If Not rst.EOF Then Range("A4").CopyFromRecordset rstrst.CloseSet rst = NothingSet ado = Nothing'提取数据后加上自动筛选Range("A3").Resize(1, Range("A3").End(xlToRight).Column).AutoFilterEnd Sub

相关经验推荐