以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  自定义函数问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=68057)

--  作者:affixed
--  发布时间:2015/5/8 16:05:00
--  自定义函数问题
Dim oldV = args(0)
Dim newV = args(1)
Dim r As Row = CurrentTable.Current
Dim colIndex As Integer = CurrentTable.ColSel
Dim colName As String = CurrentTable.Cols(colIndex).Name
For Each dt As DataTable In DataTables
    For Each dCol As DataCol In dt.DataCols
        If dCol.Name = colName Then
            For Each dr As DataRow In dt.Select("[" & colName & "] = \'" & oldV & "\'")  
                dr(colName) = newV
            Next
        End If
    Next
    dt.Save
Next

这段代码,执行后会显示数据类型转换错误,具体状况如下,不知道如何修改。

---------------------------
错误
---------------------------
自定义函数"同步更新数据函数"执行出错,错误信息如下:



System.Data.EvaluateException: 无法在 System.Decimal 和 System.String 上执行“=”操作。

   在 System.Data.BinaryNode.SetTypeMismatchError(Int32 op, Type left, Type right)

   在 System.Data.BinaryNode.BinaryCompare(Object vLeft, Object vRight, StorageType resultType, Int32 op, CompareInfo comparer)

   在 System.Data.Select.Eval(BinaryNode expr, DataRow row, DataRowVersion version)

   在 System.Data.Select.Evaluate(Int32 record)

   在 System.Data.Select.FindFirstMatchingRecord()

   在 System.Data.Select.GetBinaryFilteredRecords()

   在 System.Data.Select.SelectRows()

   在 System.Data.DataTable.Select(String filterExpression, String sort, DataViewRowState recordStates)

   在 Foxtable.DataTable.Select(String filterExpression, String Sort, DataViewRowState RowState)

   在 Foxtable.DataTable.Select(String filterExpression)

   在 UserCode.A0mHatAwMtDcXrvv4(Object[] Args)
---------------------------
确定   
---------------------------


--  作者:Bin
--  发布时间:2015/5/8 16:08:00
--  
 dr(colName) = newV 

不能一股脑的这样赋值,你要确定你列类型和 你NewV的类型是否匹配

数值类型和字符串类型是不可以互相赋值的

--  作者:affixed
--  发布时间:2015/5/8 16:11:00
--  
那请问该如何判断列类型是否与NewV的类型是否匹配呢
--  作者:Bin
--  发布时间:2015/5/8 16:13:00
--  
For Each dCol As DataCol In dt.DataCols
        If dCol.Name = colName Then
            For Each dr As DataRow In dt.Select("[" & colName & "] = \'" & oldV & "\'")  
                dr(colName) = newV
            Next
        End If
    Next

像这个你不需要遍历所有列啊.你传入的时候就应该知道该列是否对应.
[此贴子已经被作者于2015/5/8 16:14:06编辑过]

--  作者:affixed
--  发布时间:2015/5/8 16:15:00
--  
我是想通过自定义函数来同步所有表中的内容。
不想在每个表的datacolchanged里写代码。

--  作者:Bin
--  发布时间:2015/5/8 16:16:00
--  
那个遍历是多余的,如果要判断列是否存在用

    
if dt.datacols.Contains(colName) then
For Each dr As DataRow In dt.Select("[" & colName & "] = \'" & oldV & "\'")  
                dr(colName) = newV
Next
end if

--  作者:Bin
--  发布时间:2015/5/8 16:16:00
--  
你传入值的时候,就应该传入对应的值.
--  作者:affixed
--  发布时间:2015/5/8 16:17:00
--  
我是在项目设置的datacolchanged里调用这个函数。
Functions.Execute("同步更新数据函数",e.OldValue,e.NewValue)

--  作者:affixed
--  发布时间:2015/5/8 16:18:00
--  
如果不遍历所有列的话,程序怎么判断当前表中内容已改变的列在其他表中的位置呢
--  作者:Bin
--  发布时间:2015/5/8 16:20:00
--  
不需要知道位置. 没看懂你想做什么,又遍历所有表,又遍历列的.  你直接说明你想实现什么