以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [分享]把组合统计结果的fxDataSource(既是原生System.Data.DataTable)转json输出给前端,解决BS开发模式下此强大的多表联查工具只能用在C/S领域table组件的局限性  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=152726)

--  作者:chen37280600
--  发布时间:2020/7/20 10:31:00
--  [分享]把组合统计结果的fxDataSource(既是原生System.Data.DataTable)转json输出给前端,解决BS开发模式下此强大的多表联查工具只能用在C/S领域table组件的局限性

(快速浏览杰哥分享过的所有经验汇总,点击跳转


(在2021.4.29版本后,官方已经增加组合查询直转DataTable的方法,新版本用户不需要学习本帖子)

一、发现需求:

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



二、实现需求:

新建2个内部函数,即可完成这种类型的数据一键转Json

1.fxTable2Json

以下内容只有回复后才可以浏览


2.fxRow2JObject


以下内容只有回复后才可以浏览

三、使用效果:


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


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


四、有意思的扩展尝试:


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


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

五、进一步修饰结果:

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

基于这个统计效果,我们讲解各种修饰方法

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

5.1修改内容

For Each dr As Data.DataRow In dt1.Rows
    dr("型号") = "aaa"
Next

做二次运算注意的坑

1. 当统计出来的列是空值时,例如这里的第1行的dr("退货数量")是空值,它是不能直接参与预算的,因为它是原生的DBNull.Value,不支持任何运算。
2. 狐表平时的DataRow能运算,是因为官方帮我们做了一层封装,空值自动转0

For Each dr As Data.DataRow In dt1.Rows
//错误写法,会如下图报错,什么DBNull不支持运算符之类的
dr("退货总金额") = dr("退货数量") * dr("退货金额") 
//正确写法
dr("退货总金额") = Val(dr("退货数量").ToString) * Val(dr("退货金额").ToString)
Next


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


5.2.添加数据列
If dt1.Columns.Contains("新列") =False Then
    dt1.Columns.Add("新列",Gettype(String))
End If

可以添加的类型有以下
(参考官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.data.datacolumncollection.add?view=netframework-4.0 )
 名称     .net类型     对应狐表类型 
 字符串(常用)   System.String    String
 日期时间(常用)    System.DateTime    Date
 逻辑值(常用)     System.Boolean     Boolean
 微整数     System.Byte     Byte
 短整数     System.Int16     Short
 整数(常用)     System.Int32      Integer
 长整数     System.Int64    Long
 单精度小数     System.Single     Single
 双精度小数     System.Double     Double
 高精度小数(常用)     System.Decimal     Decimal


5.3添加表达式列
注意可以配合公式使用,例如IIF()、IsNull()

If dt1.Columns.Contains("利润") =False Then
    dt1.Columns.Add("利润",Gettype(Decimal),"IsNull(销售_金额,0) - IsNull(进货_金额)")
End If


5.4添加行
注意一下,是先创建该表的1个行对象,然后再把对象添加到行集合,2步走,跟狐表平时的用法有不同

Dim dr As Data.DataRow = dt.NewRow //第一步创建独立 行对象
dr("型号") = "aaa"
dt.Rows.Add(dr) //第二步把 行对象 添加到 行集合
Output.show(dt.Rows.Count) //得到结果是1


===============================================================
顺便总结以前分享过的帖子,方便大家学习

联系QQ:2385350359

















[此贴子已经被作者于2024/6/5 18:09:04编辑过]

--  作者:有点蓝
--  发布时间:2020/7/20 10:47:00
--  
多谢分享!
--  作者:happy2010
--  发布时间:2020/7/20 10:47:00
--  
学习了
--  作者:liufucan
--  发布时间:2020/7/20 11:48:00
--  
杰哥真是好人哪
--  作者:有点蓝
--  发布时间:2020/7/20 12:03:00
--  
可以把fxDataSource 当做是.net的System.Data.datatable来使用的

Dim g As New GroupTableBuilder("统计表1", DataTables("订单"))
g.Groups.AddDef("日期", DateGroupEnum.Quarter, "季度")
g.Totals.AddDef("数量", "本季度_销量")
g.Totals.AddDef("数量", "截止本季度_销量",True)
Dim dt As fxDataSource = g.BuildDataSource
For Each r As Data.DataRow In dt.Rows
    output.show(r("本季度_销量"))
Next
For Each c As Data.DataColumn In dt.Columns
    output.show(c.ColumnName)
Next


--  作者:WELOVEFOX
--  发布时间:2020/7/20 12:04:00
--  
学习一下,谢谢
--  作者:aix
--  发布时间:2020/7/20 12:40:00
--  
 学习
--  作者:laipiwen
--  发布时间:2020/7/22 9:10:00
--  
学习了
--  作者:linyunu1
--  发布时间:2020/7/22 10:29:00
--  
学习了
--  作者:cool314156
--  发布时间:2020/7/23 13:02:00
--  
学习下