Rss & SiteMap

Foxtable(狐表) http://www.foxtable.com

新一代数据库软件,完美融合Access、Foxpro、Excel、vb.net之优势,人人都能掌握的快速软件开发工具!
共80 条记录, 每页显示 10 条, 页签: [1] [2][3][4][5][6][7][8]
[浏览完整版]

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

1楼
chen37280600 发表于:2020/7/20 10:31:00

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


(在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编辑过]
2楼
有点蓝 发表于:2020/7/20 10:47:00
多谢分享!
3楼
happy2010 发表于:2020/7/20 10:47:00
学习了
4楼
liufucan 发表于:2020/7/20 11:48:00
杰哥真是好人哪
5楼
有点蓝 发表于: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

6楼
WELOVEFOX 发表于:2020/7/20 12:04:00
学习一下,谢谢
7楼
aix 发表于:2020/7/20 12:40:00
 学习
8楼
laipiwen 发表于:2020/7/22 9:10:00
学习了
9楼
linyunu1 发表于:2020/7/22 10:29:00
学习了
10楼
cool314156 发表于:2020/7/23 13:02:00
学习下
共80 条记录, 每页显示 10 条, 页签: [1] [2][3][4][5][6][7][8]

Copyright © 2000 - 2018 foxtable.com Tel: 4000-810-820 粤ICP备11091905号

Powered By Dvbbs Version 8.3.0
Processed in .03906 s, 3 queries.