以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  DataSource用于内部表或外部表table怎么用?  (http://foxtable.com/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等代码移过来?

图片点击可在新窗口打开查看此主题相关图片如下:uc截图20171011131640.png
图片点击可在新窗口打开查看


--  作者: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
--  
我现在,把,表事件,写到:项目全局事件了。感觉好了是行了.   老师有没有其它 的思路或建议?


全局表事件:

 

if  "表名" ="某一表名"

 代码

Else if  "表名" ="另一表名"

代码

End If

[此贴子已经被作者于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 "科目名称","借方金额","贷方金额"