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

发表日期: 2021-12-07

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

一、发现需求:


按此在新窗口浏览图片

二、实现需求:
新建2个内部函数,即可完成这种类型的数据一键转Json
1.fxTable2Json

'用于给fxDataSource这种合并表转Json用的
'fxDataSource底层是Data.DataTable
Dim dt As Data.DataTable = args(0)
Dim jo As New JObject
Dim ja As New JArray
jo("list") =ja
For i As Integer =0 To (dt.Rows.Count - 1)
    Dim jo2 As new JObject
    ja.Add(jo2)
    Dim dr As Data.DataRow = dt.Rows(i)
    
    Functions.Execute("fxRow2JObject",dr,jo2)
Next
Return jo
2.fxRow2JObject

'用于给fxDataSource这种合并表转Json用的
Dim dr As Data.DataRow = args(0)
Dim jo As JObject = args(1)
Static dCols As new List(of String)
dCols.Add("_Identify")
dCols.Add("_Locked")
dCols.Add("_SortKey")
dCols.Add("System_Sort_Temporary")
dCols.Add("System_Filter_Temporary")
dCols.Add("System_Filter_Unique")
Dim dcType As String
Dim dcName As String
For Each dc As Data.DataColumn In dr.Table.Columns
    dcType = dc.DataType.Name
    dcName  = dc.ColumnName
    
    '把底层表没用的几列排除掉
    If dCols.Contains(dcName) Then
        Continue For
    End If
    
    If dcType ="String" Then
        If dr.IsNull(dcName) Then
            jo(dcName) = ""
        Else
            jo(dcName) = CStr(dr(dcName))
        End If
    Else If dcType ="Boolean" Then
        jo(dcName) = CBool(dr(dcName))
    Else If dcType ="Int16" OrElse dcType ="Int32" OrElse dcType ="Byte" OrElse dcType ="Single" OrElse dcType ="Double"  OrElse dcType ="Decimal" Then
        If dr.IsNull(dcName) Then
            jo(dcName) = 0
        Else
            jo(dcName) = Val(dr(dcName))
        End If
    Else If dcType ="DateTime" Then
        If dr.Isnull(dcName) =False Then
            jo(dcName) = CStr(dr(dcName))
        Else
            jo(dcName) = ""
        End If
    End If
Next

三、使用效果:

按此在新窗口浏览图片


按此在新窗口浏览图片
四、有意思的扩展尝试:

按此在新窗口浏览图片


此主题相关图片如下:4.png
按此在新窗口浏览图片
五、进一步修饰结果:

此主题相关图片如下:1.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
按此在新窗口浏览图片

5.2.添加数据列
If dt1.Columns.Contains("新列") =False Then
    dt1.Columns.Add("新列",Gettype(String))
End If
可以添加的类型有以下
 名称   .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

Copyright 2016-2023 江门蓬江区华越科技公司 版权所有 | 承接软件定制开发,欢迎联系
粤ICP备19148806号-5