以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  审核按钮报错  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=121429)

--  作者:whx007
--  发布时间:2018/7/6 4:06:00
--  审核按钮报错

窗口有一个审核按钮,当“待审核订单_Table1”表中只剩下一行,点审核按钮后报错:

.NET Framework 版本:2.0.50727.8762
Foxtable 版本:2017.12.18.1
错误所在事件:窗口,待审核订单,Button5,Click
详细错误信息:
未将对象引用设置到对象的实例.

 

 

审核按钮代码如下:

If User.Group = "经理" Then
    If Tables("待审核订单_Table1").Current IsNot Nothing Then
        Tables("待审核订单_Table1").Current("状态") = "已审核"
        Tables("待审核订单_Table1").Current("审核人") = UserName
        Tables("待审核订单_Table1").Current("审核日期") = Date.Today()
        Tables("待审核订单_Table1").Current.Save()
     End If
Else
    MessageBox.show("你无审核权限!")
End If

 

请问问题出在哪里,谢谢!

 


--  作者:有点甜
--  发布时间:2018/7/6 9:06:00
--  

1、这段代码没问题。

 

2、看看你datacolchanged事件、currentChanged事件,应该有问题。加上msgbox调试一下。


--  作者:whx007
--  发布时间:2018/7/7 4:24:00
--  

“待审核订单_Table1”绑定的是销售订单,在窗口中“待审核订单_Table1”的currentChanged事件加了msgbox显示正常,在销售订单表中的datacolchanged事件和currentChanged事件没有触发。

 

“待审核订单_Table1”窗口currentChanged事件代码:

If Tables("待审核订单_Table1").Rows.Count > 0 Then
    Tables("待审核订单_Table2").Filter = "订单号 = \'" &  Tables("待审核订单_Table1").Current("订单号") & "\'"
End If

 

 

销售订单datacolchanged事件代码:

Select Case e.DataCol.Name
    Case "总金额","折扣","已付款"
        Dim pr As DataRow
        pr = DataTables("订单付款明细表").Find("订单号 = \'" & e.DataRow("订单号") & "\'")
        If pr IsNot Nothing Then
            DataTables("订单付款明细表").DataCols("订单号").RaiseDataColChanged(pr)
        End If
End Select

 

 

销售订单currentChanged事件代码:

If e.Table.Current IsNot Nothing Then
    Dim Filter As String = "订单号 = \'" & e.Table.Current("订单号") & "\'"
    If  DataTables("销售明细表").Find(Filter) Is Nothing Then \'如果对应的订单明细没有加载过
        DataTables("销售明细表").AppendLoad(Filter) \'则追载此订单的订单明细
    End If
End If


--  作者:有点蓝
--  发布时间:2018/7/7 9:01:00
--  
1、如果窗口表是副本,主表要做联动:http://www.foxtable.com/webhelp/scr/2631.htm

2、窗口表是什么类型?SqlTable?
"总金额","折扣","已付款" -- 这些有没有表达式列

--  作者:whx007
--  发布时间:2018/7/7 15:08:00
--  
窗口表是Normal类型,总金额和已付款是表达式列
--  作者:有点蓝
--  发布时间:2018/7/7 15:37:00
--  
是不是副本?

表达式列不会触发事件的:http://www.foxtable.com/webhelp/scr/2381.htm

--  作者:whx007
--  发布时间:2018/7/7 20:26:00
--  

待审核订单_Table1,是副本表。

我在销售明细表中有针对”总金额“写触发代码:

 

If e.DataCol.Name = "数量" OrElse e.DataCol.Name = "销售单价" OrElse e.DataCol.Name = "产品型号" Then
    Dim pr As DataRow = e.DataRow.GetParentRow("销售订单") \'找出对应的父行
    If pr IsNot Nothing Then
        DataTables("销售订单").DataCols("总金额").RaiseDataColChanged(pr)  \'通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If
End If

 

在付款明细表有针对”已付款“写触发代码:

If e.DataCol.Name = "付款金额" Then
    Dim pr As DataRow = e.DataRow.GetParentRow("销售订单") \'找出对应的父行
    If pr IsNot Nothing Then
        DataTables("销售订单").DataCols("已付款").RaiseDataColChanged(pr)  \'通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If
End If

 

 


--  作者:有点蓝
--  发布时间:2018/7/9 9:07:00
--  
看4楼呀,表达式列无法触发的

DataTables("销售订单").DataCols("总金额 - 这里不能是表达式列").RaiseDataColChanged(pr)

--  作者:whx007
--  发布时间:2018/7/9 22:30:00
--  
通过子表触发父表事件

还有一个特殊情况,表达式列并非由本表的列计算得出,而是由子表数据计算得出。
例如假定订单表有个数量列,是表达式列,用于累计订单明细表的数量,其表达式为:
Sum(Child.数量)。
再假定订单表的DataColChanged事件设置了如下代码:

If e.DataCol.name = "数量" Then
  \'相关计算代码 
End If

当我们在订单明细表输入数量时,订单表的数量会自动更新,但是上面的代码永远不会执行,因为数量是一个表达式列,不会触发事件。
我们需要在订单明细表的
DataColChanged事件加上代码:

If e.DataCol.name = "数量" Then
    Dim
pr As DataRow = e.DataRow.GetParentRow("订单") \'找出对应的父行
    If
pr IsNot Nothing Then
        DataTables(
"订单").DataCols("数量").RaiseDataColChanged(pr\'通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If
End If

这样在订单明细表输入数量,就会在订单表针对该订单的数量列触发DataColChanged事件。

 

例子中订单表的数量列也是表达式列啊


--  作者:有点蓝
--  发布时间:2018/7/9 22:42:00
--  
嗯,这个看错了。

做个例子过来看看