以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]关于跨表后台数据统计,按动态日期计算需求的求助 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=196550) |
||||
-- 作者:myjht -- 发布时间: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() \' 刷新表格显示 |
||||
-- 作者:有点蓝 -- 发布时间:2025/5/12 14:38:00 -- 请上传实例测试 |
||||
-- 作者:myjht -- 发布时间:2025/5/12 15:02:00 -- 兰爸、各位老师辛苦啦! 这个是示例,
v_corder_no_debt_amt的合成SQL语句再给添加个合成条件,生产标志=0 and 未销量>0
|
||||
-- 作者:myjht -- 发布时间:2025/5/12 15:38:00 -- 蓝爸,同样的难题,后面需要生成合并表的动态日期列名12个,每个动态列名后面插入一个“剩余”列,配套供应商商品资料,的“可用库存”列的数量-第一列动态日期数量=第一列剩余、再用刚得出的第一列剩余-第二列动态日期数量=第二列剩余、以此类推,例如下图: |
||||
-- 作者:有点蓝 -- 发布时间:2025/5/12 15:41:00 -- \' 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 -- 发布时间:2025/5/12 15:47:00 -- zcgcdb的v_corder_no_debt_amt表交货日期格式是这样的:"2025-05-18 00:00:00.000" |
||||
-- 作者:myjht -- 发布时间:2025/5/12 15:49:00 -- ![]() ![]() ![]() |
||||
-- 作者:有点蓝 -- 发布时间:2025/5/12 16:14:00 -- 升级。不然看5楼代码改 |
||||
-- 作者:myjht -- 发布时间:2025/5/12 16:56:00 -- 收到,谢谢蓝版, |