前面演示了如何从金蝶K3系统中提取核算项目资料, 从这些示例中我们可以看出程序包括两部分组成,一部分是工作表的设置,如清空工作表、设置标题、设置自动筛选等,另一部分是连接指定数据库,并从数据库表中提取数据。

我们现在的主要目的是从数据库中提取数据,暂时不演示如何设置工作表,重点是从数据库中如何计算并提取符合需求的数据,实际上也就是如何编写具体的sql查询语句,从而达到快速生成报表的目的。前面三节都是从一个表中提取数据,这节我们会从多个相关的表中提取数据。

本节需求,从数据库中提取指定期间的销售数据(销售发票)明细。

销售发票在数据库中存放在两个表中,ICSale存放表头,ICSaleEntry存放表体,先看一下这两个表的具体内容:

上部分是表头,下部分是表体,表头中的FCustID是客户字段,表体中的FItemID是物料字段,这两个字段存放的都是核算项目的内码,需要比对核算项目表才能显示其名称。

本节目的是提取销售明细,需要提取的字段是单据编号、单据日期、客户、摘要、物料名称、规格、单位、数量、单价、金额、税额、价税合计。

因为数据量较大,我们需要有选择的提取数据,如按年度、月度、周、日,或指定期间提取数据,这里我们按月份来提取,就需要指定提取数据的年度和月份,可以仿照上节的方法,将工作表分为上下两个部分,上部分是条件筛选区,下部分是数据显示区。

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

点击按钮看结果:

我们可以尝试改变年度和月份,看看不同的查询结果是否与金蝶系统数据相符。

以上就是从金蝶数据库中提取销售明细的方法,各位有什么想法和疑问可以在评论区中留言,共同探讨。如果您觉得对工作有帮助,请关注、点赞、留言,让更多的同学交流学习。

附源代码:

Option Explicit Private Sub CommandButton1_Click() Dim ado As Object Dim rst As Object Dim str As String Dim sql As String Dim dbIP As String Dim dbsa As String Dim dbpwd As String Dim 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 rst rst.Close Set rst = Nothing Set ado = Nothing '提取数据后加上自动筛选 Range("A3").Resize(1, Range("A3").End(xlToRight).Column).AutoFilter End Sub