以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]目录树中不能直接使用 SQLCommand 生产的表  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=154055)

--  作者:绿火柴
--  发布时间:2020/9/2 13:41:00
--  [求助]目录树中不能直接使用 SQLCommand 生产的表
目录树里的事件代码,
为什么 dt 表生成以后。不能按 dt 条件过滤。
年,月 不能直接使用 dt 中的 别名 年,月。而必须使用原表中的字段。目录树事件中 必须把A15是否入库 = \'Y\' 加入,不然没有Y的也过滤出来了。


Dim tab As Table = Tables("绩效统计_table4")
\'1查询缴库成本表中数据,2并设置目录树的筛选条件,3查询表附加给窗口控件表,4按筛选条件调用查询内容------↓
Dim dt As DataTable
Dim cmd As New SQLCommand
Dim cbh As WinForm.CheckBox = e.Form.Controls("CheckBox2")
cmd.ConnectionName = con_name
cmd.CommandText = "Se lect A04部门代号,A05部门 车间, A15是否入库,YEAR(A03生产日期) as 年,MONTH(A03生产日期) as 月,A58简称 简称, A07品号,A08品名,A09货品规格, " & _
"SUM(isnull(A49不良,0)) 不良,SUM(isnull(A48产量,0)) 产量,SUM(isnull(A50良品,0)) 良品  from 生产日报 " & _
"where A15是否入库 = \'Y\' " & _
"group by A04部门代号,A05部门,A15是否入库,YEAR(A03生产日期),MONTH(A03生产日期),A58简称,A07品号,A08品名,A09货品规格 "
dt = cmd.ExecuteReader()
Dim Filter As String
If e.node.Name = "所有数据" Then
    Filter = ""
Else
    Dim dr As DataRow = e.Node.DataRow \'获取生成此节点的DataRow
    Select Case e.Node.Level
        Case 0
            Filter ="YEAR(A03生产日期)  = \'" & dr("年") & "\' AND A15是否入库 = \'Y\'"
        Case 1
            Filter ="YEAR(A03生产日期)  = \'" & dr("年") & "\' And MONTH(A03生产日期) = \'" & dr("月") & "\' AND A15是否入库 = \'Y\'"
    End Select
End If
tab.DataSource = dt
dt.loadFilter = Filter
dt.Load

--  作者:有点蓝
--  发布时间:2020/9/2 13:56:00
--  
SQL的语法就这样的,如果要使用表名,外层再套一个select

cmd.CommandText = "select * from (原来的sql语句) as a"

另外SQL语句里已经有【where A15是否入库 = \'Y\'】这个添加,不可能还会查询出没有Y的数据

--  作者:绿火柴
--  发布时间:2020/9/2 14:09:00
--  
之前已经测试了,外层我套了一个。还是和没套一样的效果
where A15是否入库 = \'Y\'  确实没有在dt 中生效

--  作者:有点蓝
--  发布时间:2020/9/2 14:15:00
--  
表格导部分数据出来测试一下
--  作者:绿火柴
--  发布时间:2020/9/2 14:21:00
--  
SQL 外套后,列名无效。

图片点击可在新窗口打开查看此主题相关图片如下:无标题.png
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2020/9/2 14:37:00
--  
这个是点击目录树的代码吧。生成目录树的代码发上来看看
--  作者:有点蓝
--  发布时间:2020/9/2 14:50:00
--  
调换一下顺序
End If

dt.loadFilter = Filter
dt.Load
tab.DataSource = dt

另外套一层我测试没有问题

此主题相关图片如下:1.png
按此在新窗口浏览图片


--  作者:绿火柴
--  发布时间:2020/9/2 15:02:00
--  
看  日报不良  那个页签下的。多谢。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:目录树sqlcommand.rar


--  作者:有点蓝
--  发布时间:2020/9/2 15:29:00
--  
换种方式,没有必要加载2次

Dim tab As Table = Tables("绩效统计_table4")
\'1查询缴库成本表中数据,2并设置目录树的筛选条件,3查询表附加给窗口控件表,4按筛选条件调用查询内容------↓
Dim dt As DataTable
Dim cmd As New SQLCommand
Dim cbh As WinForm.CheckBox = e.Form.Controls("CheckBox2")
cmd.C
cmd.CommandText = "select * from ( Select A04部门代号,A05部门 as 车间, A15是否入库,YEAR(A03生产日期) as 年,MONTH(A03生产日期) as 月,A58简称 as 简称, A07品号,A08品名,A09货品规格, " & _
"SUM(iif(isnull(A49不良),0)) as 不良,SUM(iif(isnull(A48产量),0)) as 产量,SUM(iif(isnull(A50良品),0)) as 良品  from {生产日报} " & _
"where A15是否入库 = \'Y\' " & _
"group by A04部门代号,A05部门,A15是否入库,YEAR(A03生产日期),MONTH(A03生产日期),A58简称,A07品号,A08品名,A09货品规格) as xx "


Dim Filter As String
If e.node.Name = "所有数据" Then
    Filter = ""
Else
    Dim dr As DataRow = e.Node.DataRow \'获取生成此节点的DataRow
    Select Case e.Node.Level
        Case 0
            Filter =" where [年] = " & dr("年")    \' And A15是否入库 = \'Y\'"
        Case 1
            Filter =" where [年]=" & dr("年") & " and [月]=" & dr("月") 
    End Select
End If
cmd.CommandText = cmd.CommandText & Filter 
dt = cmd.ExecuteReader()
tab.DataSource = dt

--  作者:绿火柴
--  发布时间:2020/9/3 9:17:00
--  
蓝版这个方法好,图片点击可在新窗口打开查看图片点击可在新窗口打开查看
还有疑问。
1.这里问题的原理是什么:年,月 不能直接使用 dt 中的 别名 年,月。而必须使用原表中的字段。目录树事件中 必须把A15是否入库 = \'Y\' 加入,不然没有Y的也过滤出来了。
2.SUM(iif(isnull(A48产量),0)) as 产量  这样子写为什么是没有值。换成 sum(A48产量) as 产量。就有值了。。
3.在MS SQL中求和中不能有NULL 值的。在ACCESS 好像是可以有NULL的吗?