以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- DataSource用于内部表或外部表table怎么用? (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=107840) |
|
-- 作者:yancheng -- 发布时间:2017/10/11 11:19:00 -- DataSource用于内部表或外部表table怎么用? 1.原来 我是用窗口的SQLQuery表,用(窗口,的AfterLoad代码);然后,SQLQuery表里面也有;DataColChanged等代码;最后,再通过一个;保存,按钮;保存到:总分类账,表; 2.现在的想法是:想通过一个按钮:凭证过账,,来实现 1.里面的功能;(请教,老师,怎么实现 好些?) 3.目前是:把SQLQuery表改成:Tables("过渡表") ,但是,在msgbox(0) 时,弹说,没有:科目名称,列; 窗口,的AfterLoad代码如下: Tables("过渡表").DataTable.datarows.clear \'生成查询表 Dim dtb As New SQLJoinTableBuilder("应收工程款明细表1","凭证明细") dtb.C \'dtb.AddTable("施工合同","合同编号","凭证明细","合同编号") dtb.AddExp("年","Year(日期)",False) dtb.AddExp("月","日期") dtb.AddExp("科目代码","Case When len(科目代码) =4 Then 科目代码 Else SubString(科目代码,1,4) End") dtb.AddExp("科目名称","会计科目_一级科目") dtb.AddCols("借方金额","贷方金额") \'生成统计表 Dim b As New GroupTableBuilder("统计表1",dtb.BuildSql,"服务器" ) b.Groups.AddDef("科目代码") \'根据产品分组 b.Groups.AddDef("科目名称") \'根据产品分组 b.Groups.AddDef("年") b.Groups.AddDef("月") \'对数量进行统计 b.Totals.AddDef("借方金额") \'对数量进行统计 b.Totals.AddDef("贷方金额") \'对数量进行统计 b.Subtotal = True \'生成汇总模式 b.SubtotalLevel = 0 Tables("过渡表").DataSource = b.BuildDataSource() \'打开生成的统计表 If Tables("过渡表").DataTable.DataCols.Contains("凭证ID")=False Then Tables("过渡表").DataTable.DataCols.Add("凭证ID", Gettype(String)) Tables("过渡表").DataTable.DataCols.Add("摘要", Gettype(String)) Tables("过渡表").DataTable.DataCols.Add("借或贷", Gettype(String)) Tables("过渡表").DataTable.DataCols.Add("余额", Gettype(Double)) Tables("过渡表").DataTable.DataCols.Add("日", Gettype(Integer)) Tables("过渡表").DataTable.DataCols.Add("会计期间", Gettype(Integer)) End If msgbox(0) Dim drs As New List(of DataRow) For Each nm As String In Tables("过渡表").DataTable.GetValues("科目名称") \'找出每个科目名称的第一行数据, 添加到集合drs中 drs.Add(Tables("过渡表").DataTable.Find("科目名称 = \'" & nm & "\'")) Next For Each r As DataRow In drs Tables("过渡表").DataTable.DataCols("借方金额").RaiseDataColChanged(r) Next 保存,按钮,代码如下: Tables("总分类账").DataTable.DataRows.Clear For i As Integer = 0 To Tables(e.form.Name & "_Table1").Rows.Count-1 Dim r As Row = Tables("总分类账").AddNew() Dim strs As String() = {"科目代码","科目名称","年","月","日","凭证ID","摘要","借方金额","贷方金额","借或贷","余额","会计期间"} For Each str As String In strs \'以上是同一发包人的合计用的标记 r(str) = Tables(e.form.Name & "_Table1").Rows(i)(str) Next Next \'msgbox(0) Tables("总分类账").save Dim Cols1() As String = {"年","科目名称","科目代码","借或贷","余额"} Dim Cols2() As String = {"年","科目名称","科目代码","借或贷","余额"} \'For Each dr1 As DataRow In DataTables("总分类账").Select("[金额] > 100") For Each dr1 As DataRow In DataTables("总分类账").DataRows If dr1.RowState <> DataRowState.Added Then Dim dr2 As DataRow = DataTables("总分类账").AddNew() For i As Integer = 0 To Cols1.Length -1 dr2(Cols2(i)) = dr1(Cols1(i)) dr2("月") = CInt(dr1("月"))+1 dr2("日") = 01 dr2("会计期间") = dr2("年") & Format(dr2("月"),"00") dr2("摘要") = " 期 初 余 额" Next End If Next Dim Cols5() As String = {"年","月","日","科目名称","科目代码","借或贷","余额"} Dim Cols6() As String = {"年","月","日","科目名称","科目代码","借或贷","余额"} \'For Each dr1 As DataRow In DataTables("总分类账").Select("[金额] > 100") For Each dr1 As DataRow In DataTables("总分类账").DataRows If dr1.RowState <> DataRowState.Added Then Dim dr2 As DataRow = DataTables("总分类账").AddNew() For i As Integer = 0 To Cols5.Length -1 dr2(Cols6(i)) = dr1(Cols5(i)) dr2("摘要") = " 本 年 累 计" dr2("会计期间") = dr2("年") & Format(dr2("月"),"00") dr2("借方金额") = DataTables("总分类账").Compute("Sum(借方金额)","[年] = \'" & dr2("年") & "\' and 月 <= \'" & dr2("月") & "\' and 科目代码 = \'" & dr2("科目代码") & "\' and 凭证ID is not null ") dr2("贷方金额") = DataTables("总分类账").Compute("Sum(贷方金额)","[年] = \'" & dr2("年") & "\' and 月 <= \'" & dr2("月") & "\' and 科目代码 = \'" & dr2("科目代码") & "\' and 凭证ID is not null ") \'dr2("余额") = DataTables("总分类账").Compute("Sum(余额)","[年] = \'" & dr2("年") & "\' and 月 <= \'" & dr2("月") & "\' and 科目代码 = \'" & dr2("科目代码") & "\' and 凭证ID is not null ") Next End If Next Tables("总分类账").Sort = "科目代码,年,月,摘要 desc" Tables("总分类账").save |
|
-- 作者:有点甜 -- 发布时间:2017/10/11 11:27:00 -- 1、你可以直接用窗口表,如
Dim t As Table = e.Form.Controls("Table1").Table t.DataSource = b.BuildDataSource()
2、执行上面代码后,能否正常生成表格? |
|
-- 作者:yancheng -- 发布时间:2017/10/11 11:35:00 -- 表格能生成的,总分类账,table数据有了。只是,我要得到这个数据 。需要进行:打开:窗口--保存;(就是执行窗口的 ,的AfterLoad代码);然后,SQLQuery表里面也有;DataColChanged等代码;最后,再通过一个;保存,按钮;最后,就生成:总分类账的,数据 了。 但是,我现在想,直接通过一个:按钮,生成,总分类账,的数据 。要怎么实现 呢?(不打开上面的窗口) 注: 窗口,的AfterLoad代码如下: Tables("过渡表"). 原来是:Tables(e.form.Name & "_Table1").;上面写错了。 如果 我直接用Tables(e.form.Name & "_Table1"). ;这个写,会因为没有打开窗口,会弹错说:不存在,窗口***的table1 [此贴子已经被作者于2017/10/11 11:44:01编辑过]
|
|
-- 作者:有点甜 -- 发布时间:2017/10/11 12:11:00 -- 没看懂你的问题。如果要直接生成一个表,你可以写直接代码 b.Build,这样就会动态生成一个表。 |
|
-- 作者:yancheng -- 发布时间:2017/10/11 13:19:00 -- 嗯。按老师说的,我用B.BUILD生成了表。了 现在问题是。我如何在,临时到中,将原来窗口表。的DataColChanged等代码移过来?
|
|
-- 作者:yancheng -- 发布时间:2017/10/11 13:23:00 -- datacolchanged代码: Select Case e.DataCol.Name Case "科目名称","借方金额","贷方金额" Dim dr As DataRow Dim mr As DataRow = e.DataRow Dim drs As List(of DataRow) Dim jk As Integer Dim ck As Integer dr = e.DataTable.Find("[月] < " & mr("月") & " And [科目名称] = \'" & mr("科目名称") & "\'", "[月] Desc") If dr Is Nothing Then \'如果是第一行,计算结存 jk = Tables(e.form.Name & "_Table1").DataTable.Compute("Sum(借方金额)","[月] < " & mr("月") & " And 科目名称 = \'" & mr("科目名称") & "\'") ck = Tables(e.form.Name & "_Table1").DataTable.Compute("Sum(贷方金额)","[月] < " & mr("月") & " And 科目名称 = \'" & mr("科目名称") & "\'") mr("余额") = e.DataRow("借方金额") - e.DataRow("贷方金额") + jk - ck dr = mr End If drs = e.DataTable.Select("[月] >= " & dr("月") & " And [科目名称] = \'" & dr("科目名称") & "\'", "[月]") For i As Integer = 1 To drs.Count - 1 drs(i)("余额") = drs(i-1)("余额") + drs(i)("借方金额") - drs(i)("贷方金额") Next If e.DataCol.Name = "科目名称" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then \'如果修改的是科目名称列 dr = e.DataTable.Find("[月] < " & mr("月") & " And [科目名称] = \'" & e.OldValue & "\'", "[月] Desc") \'找出旧科目名称的上一行 If dr Is Nothing Then \'如果不存在上一行,那么本行就是旧科目名称的第一行,由于已经被修改为新科目名称,需要找出旧科目名称现在的第一行 dr = e.DataTable.Find("[科目名称] = \'" & e.OldValue & "\'", "[月]") \'找出旧科目名称现在的第一行 If dr IsNot Nothing Then \'如果找到,计算余额 jk = Tables(e.form.Name & "_Table1").DataTable.Compute("Sum(借方金额)","[月] < " & mr("月") & " And 科目名称 = \'" & e.OldValue & "\'") ck = Tables(e.form.Name & "_Table1").DataTable.Compute("Sum(贷方金额)","[月] < " & mr("月") & " And 科目名称 = \'" & e.OldValue & "\'") dr("余额") = dr("借方金额") - dr("贷方金额") + jk - ck End If End If If dr IsNot Nothing Then drs = e.DataTable.Select("[月] >= " & dr("月") & " And [科目名称] = \'" & dr("科目名称") & "\'", "[月]") For i As Integer = 1 To drs.Count - 1 drs(i)("余额") = drs(i-1)("余额") + drs(i)("借方金额") - drs(i)("贷方金额") Next End If End If Case "余额" If e.DataRow("余额") >= 0 Then e.DataRow("借或贷") = "借" Else e.DataRow("借或贷") = "贷" End If e.DataRow("凭证ID") = "汇 -" & " " & e.DataRow("月") & " " If e.DataRow("摘要") <> "本年合计" Then \' e.DataRow("摘要") = "据" & " " & e.DataRow("月") & " " & "月记账凭证汇总" e.DataRow("摘要") = " 本 期 合 计" End If Dim Days As Integer Days = Date.DaysInMonth(e.DataRow("年") ,e.DataRow("月")) e.DataRow("日") = Days e.DataRow("会计期间") = e.DataRow("年") & Format(e.DataRow("月"),"00") End Select |
|
-- 作者:yancheng -- 发布时间:2017/10/11 13:24:00 -- DataRowAdding代码 If 1 <= e.DataRow("月") <= 12 And e.DataRow("摘要") = " 本 年 累 计" Then Dim Days As Integer Days = Date.DaysInMonth(e.DataRow("年") ,e.DataRow("月")) e.DataRow("日") = Days End If |
|
-- 作者:yancheng -- 发布时间:2017/10/11 13:49:00 -- 我现在,把,表事件,写到:项目全局事件了。感觉好了是行了. 老师有没有其它 的思路或建议?
[此贴子已经被作者于2017/10/11 13:49:14编辑过]
|
|
-- 作者:有点甜 -- 发布时间:2017/10/11 14:16:00 -- 回复8楼,临时表的表事件,要写到全局表事件去。你生成临时表以后,要开启事件。
------------------
至于别的方法,没看懂你的问题,你做个例子发上来说明你要做什么。 |
|
-- 作者:yancheng -- 发布时间:2017/10/11 20:22:00 -- 现在有个问题。我想用:全局表事件对,临时表,起作用;实现 不了呢? 项目事件:Initialize DataTables("总分类账临时表").GlobalHandler.DataColChanged = True DataTables("总分类账临时表").GlobalHandler.DataRowAdding = True DataTables("总分类账临时表").GlobalHandler.DataRowDeleting = True 但是,在打开软件时,DataTables("总分类账临时表"),未生成,无法执行,上面的代码;出错; 项目表事件: DataColChanged如下 If e.DataTable.Name ="总分类账临时表" Then msgbox(111) Select Case e.DataCol.Name Case "科目名称","借方金额","贷方金额" |