Foxtable(狐表)用户栏目专家坐堂 → [求助]关于跨表后台数据统计,按动态日期计算需求的求助


  共有63人关注过本帖树形打印复制链接

主题:[求助]关于跨表后台数据统计,按动态日期计算需求的求助

帅哥哟,离线,有人找我吗?
myjht
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:264 积分:1689 威望:0 精华:0 注册:2017/4/14 15:58:00
[求助]关于跨表后台数据统计,按动态日期计算需求的求助  发帖心情 Post By:2025/5/12 14:25:00 [只看该作者]

求助,求助

需求:我有一个数据库“zcgcdb”,视图表v_corder_no_debt_amt,列名包括:ccode as 产品编码, dqty as 数量, dsaleqty as 已销量, v_corder_no_debt_amt.dqty - v_corder_no_debt_amt.dsaleqty as 未销量, DDEDT as 交货日期, 交货日期在数据库中格式为:2025-05-21 00:00:00.000,,,
同数据库还有一个表:配套供应商商品资料,列名包含:ccode as 产品编码,两表通过ccode关联,其中配套供应商商品资料的ccode是唯一的行,v_corder_no_debt_amt的ccode是多个交货日期的行,
现需要在foxtable绑定的窗口表配套供应商商品资料的AfterLoad事件中加入后台数据库统计的v_corder_no_debt_amt数据,将v_corder_no_debt_amt交货日期进行分组,统计一段交货日期内的“未销量”合计,显示到列,
列名规则以每个“月日”为动态命名,规则为:当前日期以前的交期汇总未销量命名为“今日以前”,从今日(5月12日)以后3天交期汇总的未销量命名为“5月14日”,再往后3天的交期汇总未销量命名为“5月17日”,在往后3天的交期汇总未销量命名为“5月20日”,“5月23日”,“5月26日”,“5月29日”,“6月1日”,“6月4日”,“6月7日”,“6月10日”,前面从今日以前汇总未销量命名第一个列名,然后向后每3天交期汇总未销量命名“年月”的列名一共有10个列,第12个列名“6月10以后”,即统计汇总前面第11个列名交期以后所有未销量,
这里的今日都是Date.Today,以后3天交期,都是已Date.Today为基础计算,也就是今天的Date.Today是5月12日,明天在打开这个程序Date.Today就是5月13日,然后5月13日往后3天交期就是5月15日,中间10个动态日期列,最后一个明天就变成了6月11日后,,,,

以下是错误不完整代码,搞了好几天实在搞不出来,求完善,谢谢。

' 窗口AfterLoad事件代码
Dim currentDate As Date = Date.Today
Dim dateConditions As New List(Of String)
Dim columnNames As New List(Of String)

'-------------------------------------------
' 步骤1:生成动态日期区间及列名
'-------------------------------------------
' 1. 今日以前
columnNames.Add("今日以前")
' 修正字符串拼接,使用 & 替代 $"" 插值
dateConditions.Add("CAST(DDEDT AS DATE) < '" & currentDate.ToString("yyyy-MM-dd") & "'")

' 2. 生成10个3天区间(从今日开始)
Dim startDate As Date = currentDate
For i As Integer = 0 To 9
    Dim endDate As Date = startDate.AddDays(3)
    columnNames.Add(endDate.ToString("M月d日"))
    ' 修正字符串拼接
    dateConditions.Add("CAST(DDEDT AS DATE) BETWEEN '" & startDate.ToString("yyyy-MM-dd") & "' AND '" & endDate.AddDays( - 1).ToString("yyyy-MM-dd") & "'")
    startDate = endDate
Next

' 3. 最后一个区间(最后一个3天区间的次日及以后)
Dim lastDate As Date = startDate
columnNames.Add(lastDate.ToString("M月d日") & "以后")
' 修正字符串拼接
dateConditions.Add("CAST(DDEDT AS DATE) >= '" & lastDate.ToString("yyyy-MM-dd") & "'")

'-------------------------------------------
' 步骤2:构建SQL统计
'-------------------------------------------
Dim bd As New SQLGroupTableBuilder("动态统计", "v_corder_no_debt_amt")
bd.C ' 指定数据库连接名
bd.Groups.AddDef("ccode")

For i As Integer = 0 To columnNames.Count - 1
    Dim sqlExp As String = "SUM(CASE WHEN " & dateConditions(i) & " THEN (dqty - dsaleqty) ELSE 0 END)"
    bd.Totals.AddExp(columnNames(i), sqlExp)
Next

'-------------------------------------------
' 步骤3:获取窗口中的表格并合并数据
'-------------------------------------------
Dim dtResult As fxDataSource = bd.BuildDataSource()

' 通过窗口中的控件名称获取表格(请根据实际控件名修改)
Dim recordGrid As WinForm.RecordGrid = e.Form.Controls("RecordGrid1")
If recordGrid Is Nothing Then
    MessageBox.Show("未找到RecordGrid控件,请检查控件名称!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Return
End If

Dim mainTable As DataTable = recordGrid.Table.DataTable ' 获取Table控件关联的DataTable
If mainTable Is Nothing Then
    MessageBox.Show("RecordGrid未绑定表格!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
    Return
End If

' 合并并自动添加缺失列
mainTable.Combine("ccode", dtResult, "ccode", True)

'-------------------------------------------
' 步骤4:列格式设置
'-------------------------------------------
For Each colName As String In columnNames
    If mainTable.Columns.Contains(colName) Then
        mainTable.Columns(colName).DataType = GetType(Decimal)
        mainTable.Columns(colName).Caption = colName
    End If
Next

' 自动调整列宽
mainTable.AutoSizeCols()

' 刷新表格显示
recordGrid.Refresh()
此主题相关图片如下:示例.png
按此在新窗口浏览图片


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113802 积分:579589 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/5/12 14:38:00 [只看该作者]

请上传实例测试

 回到顶部
帅哥哟,离线,有人找我吗?
myjht
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:264 积分:1689 威望:0 精华:0 注册:2017/4/14 15:58:00
  发帖心情 Post By:2025/5/12 15:02:00 [只看该作者]

兰爸、各位老师辛苦啦!
这个是示例,
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:示例.zip
v_corder_no_debt_amt的合成SQL语句再给添加个合成条件,生产标志=0 and 未销量>0

 回到顶部
帅哥哟,离线,有人找我吗?
myjht
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:264 积分:1689 威望:0 精华:0 注册:2017/4/14 15:58:00
  发帖心情 Post By:2025/5/12 15:38:00 [只看该作者]

蓝爸,同样的难题,后面需要生成合并表的动态日期列名12个,每个动态列名后面插入一个“剩余”列,配套供应商商品资料,的“可用库存”列的数量-第一列动态日期数量=第一列剩余、再用刚得出的第一列剩余-第二列动态日期数量=第二列剩余、以此类推,例如下图:

此主题相关图片如下:库存递归结余.png
按此在新窗口浏览图片

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113802 积分:579589 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/5/12 15:41:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:管理项目1.zip



' 1. 今日以前
columnNames.Add("今日以前")
' 修正字符串拼接,使用 & 替代 $"" 插值
dateConditions.Add("DDEDT  < '" & currentDate & "'")

' 2. 生成10个3天区间(从今日开始)
Dim startDate As Date = currentDate
For i As Integer = 0 To 9
    Dim endDate As Date = startDate.AddDays(3)
    columnNames.Add(endDate.ToString("M月d日"))
    ' 修正字符串拼接
    dateConditions.Add("DDEDT  BETWEEN '" & startDate & "' AND '" & endDate.AddDays( - 1) & "'")
    startDate = endDate
Next

' 3. 最后一个区间(最后一个3天区间的次日及以后)
Dim lastDate As Date = startDate
columnNames.Add(lastDate.ToString("M月d日") & "以后")
' 修正字符串拼接
dateConditions.Add("DDEDT >= '" & lastDate & "'")

'-------------------------------------------
' 步骤2:构建SQL统计
'-------------------------------------------
Dim bd As New SQLGroupTableBuilder("动态统计", "v_corder_no_debt_amt")
bd.C ' 指定数据库连接名
bd.Groups.AddDef("ccode")

For i As Integer = 0 To columnNames.Count - 1
    Dim sqlExp As String = "CASE WHEN " & dateConditions(i) & " THEN (dqty - dsaleqty) ELSE 0 END"
    bd.Totals.AddExp(columnNames(i), sqlExp)
Next
……

 回到顶部
帅哥哟,离线,有人找我吗?
myjht
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:264 积分:1689 威望:0 精华:0 注册:2017/4/14 15:58:00
  发帖心情 Post By:2025/5/12 15:47:00 [只看该作者]

zcgcdb的v_corder_no_debt_amt表交货日期格式是这样的:"2025-05-18 00:00:00.000"

 回到顶部
帅哥哟,离线,有人找我吗?
myjht
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:264 积分:1689 威望:0 精华:0 注册:2017/4/14 15:58:00
  发帖心情 Post By:2025/5/12 15:49:00 [只看该作者]

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:113802 积分:579589 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2025/5/12 16:14:00 [只看该作者]

升级。不然看5楼代码改

 回到顶部
帅哥哟,离线,有人找我吗?
myjht
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:264 积分:1689 威望:0 精华:0 注册:2017/4/14 15:58:00
  发帖心情 Post By:2025/5/12 16:56:00 [只看该作者]

收到,谢谢蓝版,

 回到顶部