以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  统计问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=151333)

--  作者:BG小白
--  发布时间:2020/6/20 20:55:00
--  统计问题
假如表有4列,第一列单号,第二列门店名称,第三列数量,第四列金额,我想相同把门店名称的金额合计和数量合计还有单子的数量合计,按照金额排名,取前十显示在一个临时表,该怎么操作呢?我现在做了一个统计表,但是统计表不能排序,我又增加了一个新临时表,然后可以排序,但是无法控制行数,而且加载速度很慢。
Dim g As New GroupTableBuilder("QTXPDHJ", DataTables("SG_Gathering"))
g.Groups.AddDef("vShop")
g.Totals.AddDef("fQuantity")
g.Totals.AddDef("fRealMoney")
g.Totals.AddDef("vMBillID", AggregateEnum.Count)
g.FromServer = False
g.Build()

Dim dt As DataTable = DataTables("DPXSPHB")
dt.DataRows.Clear

Dim Cols1() As String = {"vShop","fQuantity","fRealMoney","vMBillID"}
Dim Cols2() As String = {"MDDM","XSSL","XSJE","XSDS"}
For Each dr1 As DataRow In DataTables("QTXPDHJ").Select("fRealMoney > 1","fRealMoney desc")
    Dim dr2 As DataRow = DataTables("DPXSPHB").AddNew()
    For i As Integer = 0 To Cols1.Length -1
        dr2(Cols2(i)) = dr1(Cols1(i))
    Next
Next
[此贴子已经被作者于2020/6/21 5:47:08编辑过]

--  作者:BG小白
--  发布时间:2020/6/21 6:06:00
--  
加载速度慢是因为我在表属性加了跨表引用和计算,如果不加就快很多
If e.DataCol.Name = "MDDM" Then \'如果内容发生变动的是品名列
    If e.NewValue Is Nothing Then \'如果新值是空白,也就是品名列的内容为空
        e.DataRow("MDMC") = Nothing \'那么清空此行单价列的内容
    Else
        Dim dr As DataRow
        \'否则在产品表查找同名的产品行,将找到的行赋值给变量dr
        dr = DataTables("kehu").Find("[KHDM] = \'" & e.NewValue & "\'")
        If dr IsNot Nothing Then \'如果找到了同名的产品行,也就是dr不是Nothing
            e.DataRow("MDMC") = dr("KHMC")
        End If
    End If
End If

Dim exp As String = "[XSSL] / [XSDS]"
Dim drs As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs
    dr("LDL") = Eval(exp,dr)
Next

Dim exp1 As String = "[XSJE] / [XSDS]"
Dim drs1 As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs1
    dr("KDJ") = Eval(exp1,dr)
Next
[此贴子已经被作者于2020/6/21 6:11:09编辑过]

--  作者:有点蓝
--  发布时间:2020/6/21 21:05:00
--  
这2段也是datacolchanged事件里的代码?

Dim exp As String = "[XSSL] / [XSDS]"
Dim drs As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs
    dr("LDL") = Eval(exp,dr)
Next

Dim exp1 As String = "[XSJE] / [XSDS]"
Dim drs1 As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs1
    dr("KDJ") = Eval(exp1,dr)
Next

--  作者:BG小白
--  发布时间:2020/6/22 8:55:00
--  
1楼的代码是按钮,2楼的代码是在表datacolchanged事件里的
Dim exp As String = "[XSSL] / [XSDS]"
Dim drs As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs
    dr("LDL") = Eval(exp,dr)
Next

Dim exp1 As String = "[XSJE] / [XSDS]"
Dim drs1 As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs1
    dr("KDJ") = Eval(exp1,dr)
Next

datacolchanged事件里的代码

--  作者:有点蓝
--  发布时间:2020/6/22 9:21:00
--  
如果是在表datacolchanged事件里,有2个问题,
1、看看:http://www.foxtable.com/webhelp/topics/1522.htm,给任何一个单元格赋值都会触发这段代码
2、没有必要循环

select case e.datacol.name
case "XSSL","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("LDL") = e.datarow("XSSL") /  e.datarow("XSDS")
end if
end select

select case e.datacol.name
case "XSJE","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("KDJ") = e.datarow("XSJE") /  e.datarow("XSDS")
end if
end select

--  作者:BG小白
--  发布时间:2020/6/22 16:01:00
--  
谢谢蓝老师,我一楼还有个问题,麻烦你再帮我看下
假如表有4列,第一列单号,第二列门店名称,第三列数量,第四列金额,我想把相同门店名称的金额合计和数量合计还有单子的数量合计,按照金额排名,取前十显示在一个临时表,该怎么操作呢?我现在做了一个统计表,但是统计表不能排序,我又增加了一个新临时表,然后可以排序,但是无法控制行数
[此贴子已经被作者于2020/6/22 16:01:22编辑过]

--  作者:有点蓝
--  发布时间:2020/6/22 16:16:00
--  
请上传实例说明
--  作者:BG小白
--  发布时间:2020/6/22 16:35:00
--  
以下是引用有点蓝在2020/6/22 9:21:00的发言:
如果是在表datacolchanged事件里,有2个问题,
1、看看:http://www.foxtable.com/webhelp/topics/1522.htm,给任何一个单元格赋值都会触发这段代码
2、没有必要循环

select case e.datacol.name
case "XSSL","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("LDL") = e.datarow("XSSL") /  e.datarow("XSDS")
end if
end select

select case e.datacol.name
case "XSJE","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("KDJ") = e.datarow("XSJE") /  e.datarow("XSDS")
end if
end select


用了这个代码后,提示.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2020.5.29.8
错误所在事件:表,DPXSPHB,DataColChanged
详细错误信息:
调用的目标发生了异常。
从字符串“”到类型“Double”的转换无效。
输入字符串的格式不正确。
KDJ和LDL,我是用的高精度小数,因为只是想显示两位,显示都没有问题,就是报错


--  作者:有点蓝
--  发布时间:2020/6/22 16:36:00
--  
"XSSL","XSDS""XSJE"这些是字符列?
--  作者:BG小白
--  发布时间:2020/6/22 16:38:00
--  
是的