以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  eval出错啦  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=31447)

--  作者:ywlin521
--  发布时间:2013/4/15 16:24:00
--  eval出错啦

.NET Framework 版本:2.0.50727.4984
Foxtable 版本:2012.11.29.1
错误所在事件:Eval函数计算错误,表达式为:a0+200
详细错误信息:
System.Runtime.InteropServices.COMException (0x800A000D): 类型不匹配: \'a0\'
   在 MSScriptControl.ScriptControlClass.Eval(String Expression)
   在 Foxtable.GlobalProperties.Eval(String O111, DataRow O0, Boolean OOOO1OO0l0, Boolean Oll11, Boolean OOO00lOO11)

 

怎么解决呀?

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.foxdb

[此贴子已经被作者于2013-4-15 18:01:46编辑过]

--  作者:程兴刚
--  发布时间:2013/4/15 16:27:00
--  
您的代码不完善,表达式不合法所致!
--  作者:ywlin521
--  发布时间:2013/4/15 17:15:00
--  
文件已经上传,老程 狐爸等高人帮忙调试下
--  作者:ywlin521
--  发布时间:2013/4/15 17:16:00
--  

问题1:第2行是正常的,第4行就出错,按代码原理,不应该出错,差别:row(4)(第一列)的内容是=1000,而row(2)(第一列)的内容是1000,就差一个等号

 

问题2:第3行是正常的,第5行就出错,按代码原理,不应该出错,差别:row(5)(第二列)的内容是=200,而row(3)(第二列)的内容是200,也就差一个等号

 

问题3:ROW(3)(第三列):执行加法,最后变成了字符串连接操作,其他运算是正常的

 

先解决上述问题吧,已经调试2天了,是仿EXCEL的功能来编程的

[此贴子已经被作者于2013-4-15 17:24:04编辑过]

--  作者:ywlin521
--  发布时间:2013/4/15 17:56:00
--  

已成功了

自定义eval3函数,可以成功仿EXCEL功能

调用:在DRAWCELL中调用

具体:

Dim s As String = e.Row(e.col.Name)
If s.StartsWith("=") Then
    e.Text = Functions.Execute("Eval3",s,e.Row)
End If

 

Dim s As String = args(0)
Dim r As Row = args(1)
\'判断是否是表达式,不是表达式,转换为数值返回
If s.StartsWith("=") = False Then
    Return s
Else
    s = s.TrimStart("=")
   
    If IsNumeric(s) Then \'如果是单个数字,直接返回
        Return Val(s)
    End If
    \'扫描表达式里的 [列名]
    Dim strCols As String = Nothing
    For Each c As Col In r.Table.Cols
        If s.Contains("[" & c.Name & "]") Then
            strCols &= "[" & c.Name & "]|"
        End If
    Next
   
    If strCols Is Nothing Then  \'不存在[列名],但是个表达式,返回
        Return eval2(s,r)
    Else  \'存在[列名]
        strCols = strCols.TrimEnd("|")
        Dim saCols() As String = strCols.Split("|")
       
        Dim sCol As String = Nothing
        Dim sValue As String = Nothing
        For j As Integer = 0 To saCols.Length - 1
            sCol = saCols(j)
            sCol = sCol.TrimStart("[")
            sCol = sCol.TrimEnd("]")
           
            sValue = Functions.Execute("Eval3",r(sCol),r)
            s = s.Replace(saCols(j),sValue)

        Next
       
        Return eval2(s,r)
    End If
End If

[此贴子已经被作者于2013-4-15 18:00:43编辑过]

--  作者:ywlin521
--  发布时间:2013/4/15 17:57:00
--  
请狐爸给个 精 吧