以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  为什么流水账的AfterMoveRow表事件不起效  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=8875)

--  作者:yankunhao
--  发布时间:2010/12/18 16:00:00
--  为什么流水账的AfterMoveRow表事件不起效

我做了个流水账,用外部数据源做的,在测试的时候AfterMoveRow表事件的代码不执行

然后想将其发到论坛来求助,谁知在定向到内部表后AfterMoveRow表事件的代码却执行了(难道内部表和外部表有什么不同的地方?)!

真怪,想不出是什么原因。外部数据源是用SQL Server

密码都是123

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:订单生产按排供需流水账1.rar

 


此主题相关图片如下:03.jpg
按此在新窗口浏览图片

"订单生产安排供需流水账"表里的

DataColChanged 事件代码:

 

Select Case e.DataCol.Name
    Case "日期"
        e.DataRow("会计期间")=e.DataRow("日期").Year & Format(e.DataRow("日期").Month,"00")
       
       
    Case "料品编码","会计期间","订单需求量","生产供给量","摘要"
        Dim dr As DataRow
        dr = DataTables("料品基础数据表").Find("料品编码 = \'" & e.DataRow("料品编码") & "\'" )
        If dr IsNot Nothing \'如果找到, 则设置各列内容
            e.DataRow("每一打的公斤数")= dr("库存打数换算")
            e.DataRow("最低安全库存量")= dr("最低安全库存量")
            e.DataRow("通用范围")= dr("通用范围")
            e.DataRow("料品归类")= dr("料品归类")
            e.DataRow("料品名称")= dr("料品名称")
            e.DataRow("料品规格")= dr("料品规格")
            e.DataRow("库存单位")= dr("库存单位")
           
        Else
            \'否则清除部门和姓名两列的内容
            e.DataRow("每一打的公斤数") =Nothing
            e.DataRow("最低安全库存量") =Nothing
            e.DataRow("通用范围")= Nothing
            e.DataRow("料品归类")= Nothing
            e.DataRow("料品名称")= Nothing
            e.DataRow("料品规格")= Nothing
            e.DataRow("库存单位")= Nothing
           
        End If
       
        Dim dr1 As DataRow
       
        Dim mr As DataRow = e.DataRow
        Dim drs As List(of DataRow)
                      
        dr1 = e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [会计期间] = \'" & mr("会计期间") & "\'and [料品编码] = \'" & mr("料品编码") & "\'", "[_SortKey] Desc")
        If dr1 Is Nothing Then \'如果没有上一行,说明本行就是同产品的第一行
            If mr("摘要")="期初结存" Then \'这里的用意是本流水账是按每个会计期间来结账的,就是每个会计期间都有一个“期初结存”,这样用户从数

 

                                                       据库里加载数据的时候只要加载一个会计期间的数据就能正常计算了。当然如果到了要处理下一个会计期间

 

                                                       时就要做个结账处理:将当期的每个产品的结存结转到下一个会计期间的期初结存里。
            Return
            Else
            mr("结存量") = mr("生产供给量") - mr("订单需求量")
                dr1 = mr
              End If
           
           
        End If
        drs = e.DataTable.Select("[_SortKey] >= " & dr1("_SortKey") & " And [会计期间] = \'" & dr1("会计期间") & "\'and [料品编码] = \'" & dr1("料品编码") & "\'")
        For i As Integer = 1 To drs.Count - 1 \'重算余下行的余额
            drs(i)("结存量") = drs(i-1)("结存量") + drs(i)("生产供给量") - drs(i)("订单需求量")
        Next  
\'当然这里的代码还未能想到同一个会计期间里的日期比较,如:这个会计期间里如果同一天里同一款产品都有数据的时候。
                
        
    Case "结存量","库存单位","每一打的公斤数"
        Select Case e.DataRow("库存单位")
            Case "公斤","千克"
                e.DataRow("公斤数")= e.DataRow("结存量")
            Case Else
                e.DataRow("公斤数")= e.DataRow("结存量")*e.DataRow("每一打的公斤数")
        End Select
       
End Select

 

 

"订单生产安排供需流水账"表里的

AfterMoveRow 事件代码:

 

 

 

 

Dim Key As Decimal
Dim Index As Integer
Dim Filter As String
Dim r As Row
Index = Math.Min(e.OldIndex, e.NewIndex)
Key = e.Table.Rows(Index)("_SortKey")
r = e.Table.Rows(e.NewIndex)
Filter = "[_SortKey] >= " & Key & " And [会计期间] = \'" & r("会计期间") & "\'and [料品编码] = \'" & r("料品编码") & "\'"
e.Table.DataTable.DataCols("料品编码").RaiseDataColChanged(Filter)

[此贴子已经被作者于2010-12-20 8:24:34编辑过]

--  作者:yankunhao
--  发布时间:2010/12/18 18:03:00
--  
有谁知道原因吗?我想是否是软件本身的原因呢?
[此贴子已经被作者于2010-12-18 18:07:22编辑过]

--  作者:kylin
--  发布时间:2010/12/19 10:45:00
--  

看不到代码呀!


--  作者:yankunhao
--  发布时间:2010/12/19 11:48:00
--  
这个是开发版的,要用开发版才能打开,你有开发版吗?
[此贴子已经被作者于2010-12-19 11:49:39编辑过]

--  作者:yankunhao
--  发布时间:2010/12/20 8:28:00
--  
大家看看个问题到底是何原因呢?
--  作者:狐狸爸爸
--  发布时间:2010/12/20 8:38:00
--  
你得有个不生效的例子才能看啊,你上传的例子是生效的吧?
--  作者:yankunhao
--  发布时间:2010/12/20 8:41:00
--  
是的,我上传的这个例子是内部表的,因为外部表还要上传数据库所以就没上传了。
[此贴子已经被作者于2010-12-20 8:42:24编辑过]

--  作者:yankunhao
--  发布时间:2010/12/20 16:37:00
--  

    现在经过我的修正如下,好像可以了,请问大家我这样写是否可行?或者有其他更好更高效的写法呢?

 

   说明一下:经过我这样写,当同一会计期间同一天入同一款产品的时候都可以正常计算了。但如果删除某行的时候还不能重算,我想只要加入代码就应该可以了。

   但还是想不明白当初的代码出现问题的原因,希望有那位高人指点一下。

 

 现在发现,这样的代码在输入数据的时候,日期一定要按顺序输入,否则计算还是有问题,不知如何解决才好呢?

 

"订单生产安排供需流水账"表里的

DataColChanged 事件代码:

 

Select Case e.DataCol.Name
    Case "结存量"
        If e.DataRow("摘要")="期初结存" Then
            Dim Filter As String
            Filter = "[会计期间] = \'" & e.DataRow("会计期间") & "\'and [料品编码] = \'" & e.DataRow("料品编码") & "\'"
            e.DataTable.DataCols("料品编码").RaiseDataColChanged(Filter)
        Else
            Return
        End If
    Case "日期","料品编码","订单需求量","生产供给量","摘要"
        e.DataRow("会计期间")=e.DataRow("日期").Year & Format(e.DataRow("日期").Month,"00")
        Dim dr As DataRow
        dr = DataTables("料品基础数据表").Find("料品编码 = \'" & e.DataRow("料品编码") & "\'" )
        If dr IsNot Nothing \'如果找到, 则设置各列内容
            e.DataRow("每一打的公斤数")= dr("库存打数换算")
            e.DataRow("最低安全库存量")= dr("最低安全库存量")
            e.DataRow("通用范围")= dr("通用范围")
            e.DataRow("料品归类")= dr("料品归类")
            e.DataRow("料品名称")= dr("料品名称")
            e.DataRow("料品规格")= dr("料品规格")
            e.DataRow("库存单位")= dr("库存单位")
           
        Else
            \'否则清除部门和姓名两列的内容
            e.DataRow("每一打的公斤数") =Nothing
            e.DataRow("最低安全库存量") =Nothing
            e.DataRow("通用范围")= Nothing
            e.DataRow("料品归类")= Nothing
            e.DataRow("料品名称")= Nothing
            e.DataRow("料品规格")= Nothing
            e.DataRow("库存单位")= Nothing
           
        End If
       
        Dim dr1 As DataRow
        Dim dr2 As DataRow
        Dim mr As DataRow = e.DataRow
        Dim drs As List(of DataRow)
       
        If mr.IsNull("料品编码") = False Then
        dr1 = e.DataTable.Find("[会计期间] = \'" & mr("会计期间") & "\'and [料品编码] = \'" & mr("料品编码") & "\'and [_sortkey] < " & mr("_sortkey") ,"[_SortKey] Desc")
            If dr1 Is Nothing Then \'如果没有上一行,说明本行就是同产品的第一行
                If mr("摘要")="期初结存" Then
                    Return
                Else
                   
                    mr("结存量") = mr("生产供给量") - mr("订单需求量")
                   
                End If
                dr1 = mr
            End If
            drs = e.DataTable.Select("[会计期间] = \'" & dr1("会计期间") & "\'and [料品编码] = \'" & dr1("料品编码") & "\'And [日期] >= #" & dr1("日期") & "#" ,"[_SortKey]")

            For i As Integer = 1 To drs.Count - 1 \'重算余下行的余额
                drs(i)("结存量") = drs(i-1)("结存量") + drs(i)("生产供给量") - drs(i)("订单需求量")
            Next
        End If
       
   
Case "结存量","库存单位","每一打的公斤数"
        Select Case e.DataRow("库存单位")
            Case "公斤","千克"
                e.DataRow("公斤数")= e.DataRow("结存量")
            Case Else
                e.DataRow("公斤数")= e.DataRow("结存量")*e.DataRow("每一打的公斤数")
        End Select
       
End Select

 

 

 

"订单生产安排供需流水账"表里的

AfterMoveRow 事件代码:

 

Dim Filter As String
Dim r As Row
r = e.Table.Rows(e.NewIndex)
Filter = "[会计期间] = \'" & r("会计期间") & "\'and [料品编码] = \'" & r("料品编码") & "\'"
e.Table.DataTable.DataCols("料品编码").RaiseDataColChanged(Filter)

 

 

 

[此贴子已经被作者于2010-12-20 16:46:52编辑过]

--  作者:狐狸爸爸
--  发布时间:2010/12/20 16:50:00
--  
关于删除行不行的问题,可以在DataRowDeleting事件中设置代码,将其参与流水账计算的值设置为False或分类设置为空白,然后重算此行之后的所有行。
--  作者:狐狸爸爸
--  发布时间:2010/12/20 16:56:00
--  
我改一下帮助中的流水账的例子,加上针对删除行这种情况的处理。