例如公式:(A+B)/C
我想把公式存储在数据库里面,并不是某一个字段为:(A+B)/C,而是这个公式是可以根据需要进行修改的,
也就是说需要吧(、)、+、-、*、/这些符号存储在数据库里,运算的时候形成公式。
如果这些符号按照字符的形式存储在数据库里面,形成的公式也是字符串,得不到最后的结果,请问如何解决这个问题。
我写的程序:
Dim Str_sql, F1, F2, F3, F4 As StringF1 = Asc("(")
F2 = Asc(")")
F3 = Asc("+")
F4 = Asc("/")
Str_sql = Chr(F1) & Val(Me.Text1.Text) & Chr(F3) & Val(Me.Text2.Text) & Chr(F2) & Chr(F4) & 10
Me.Text4.Text = Str_sql如果text1=10,text2=20,则得到字符串:(10+20)/10,得不到最后的结果3

解决方案 »

  1.   

    记得用vba可以干的,谁来讲讲吧。要不写成一个过程,ABC传参也行呀。
      

  2.   

    如何让用户自行输入方程式,并计算其结果?     
      假设我们要让使用者在“方程式”栏位中自由输入方程式,然后利用方程式进行计算,则引用ScriptControl控件可以很方便地做到。   
      (   ScriptControl   控件附属于VB   6.0,如果安装后没有看到此一控件,可在光盘的   \Common\Tools\VB\Script   目录底下找此一控件,   其.文件名为Msscript.ocx。)     
      没有这个Msscript.ocx,可以到   微软网站下载   
      假设放在窗体上的ScriptControl控件名称为ScriptControl1,则在“计算”按钮的Click事件中编写如下代码:   
      Dim   Statement   As   String     
      Statement   =   "X="   +   Text1.Text   +   vbCrLf   +   "Y="   +   Text2.Text   +   vbCrLf   +   ""   
      MsgBox   "计算结果="   &   ScriptControl1.ExecuteStatement(   Statement   ) 
      

  3.   

    我只会access数据库,例如select (6+7)*某个字段,可以得到正确结果,同样只要把公式使用select语句查询一下应该行。
    F1 = Asc("(") 
    F2 = Asc(")") 
    F3 = Asc("+") 
    F4 = Asc("/") 
    Str_sql = Chr(F1) & Val(Me.Text1.Text) & Chr(F3) & Val(Me.Text2.Text) & Chr(F2) & Chr(F4) & 10 Me.Text4.Text = "select " & Str_sql 
      

  4.   

    窗体模块: Option Explicit
    '一个Label1标签,一个命令按钮command1,一个文本框textbox
    '比如:在文本框中输入(5+(1+2)*3)/4,结果为3.5
    Private Sub Command1_Click()
            Label1.Caption = MathCalculator(Text1.Text)
    End SubPrivate Sub Form_Load()
            Text1.Text = ""
    End Sub标准模块: 
    '数学计算器函数。
    Public Function MathCalculator(GS As String) As String
            Dim i, n As Integer
            Dim TempGs, Temp As String
            Dim Vl() As String '操作数
            Dim Vls As Integer '操作数的数目
            Dim Si As Integer '上一操作符的位置
            Dim Ads, Sus, Mus, Bys, Lks, Rks As Integer     '操作符的数目
            Dim Adp(), Mup(), Byp(), Lkp(), Rkp() As Integer '操作符的位置
            Dim Adn(), Mun(), Byn() As Integer '操作符的排列次序
            Dim Sig() As Integer '每一个操作符的位置
        
            On Error GoTo Err
            Do While True
                ReDim Adp(Len(GS)), Mup(Len(GS)), Byp(Len(GS)) _
                    , Lkp(Len(GS)), Rkp(Len(GS)) As Integer
                ReDim Adn(Len(GS)), Mun(Len(GS)), Byn(Len(GS)) _
                    , Lkn(Len(GS)), Rkn(Len(GS)), Sig(Len(GS)) As Integer
                
                ReDim Vl(Len(GS))
                
                If Len(GS) = 0 Then GoTo Err
                If Mid(GS, Len(GS), 1) <> "#" Then
                
                    TempGs = GS
                    For i = 1 To Len(GS) '将减化加
                        
                        If Mid(GS, i, 1) = "-" And i <> 1 Then
                            If Mid(GS, i - 1, 1) <> "+" And Mid(GS, i - 1, 1) <> "-" _
                                And Mid(GS, i - 1, 1) <> "*" And Mid(GS, i - 1, 1) <> "/" Then
                                TempGs = Mid(TempGs, 1, i - 1 + n) + "+" + Mid(GS, i)
                                n = n + 1
                            End If
                            
                        End If
                    Next i
                    GS = TempGs
                    
                    n = 0
                    For i = 1 To Len(GS) '处理负负得正
                        If Mid(GS, i, 1) = "-" Then
                            If Mid(GS, i + 1, 1) = "-" Then
                                TempGs = Mid(TempGs, 1, i - 1 - n) + Mid(GS, i + 2)
                                n = n + 2
                            End If
                        End If
                    Next i
                    GS = TempGs
                    GS = GS + "#"
                End If
                
                Vls = 1
                Ads = 0: Sus = 0: Mus = 0: Bys = 0: Lks = 0: Rks = 0
                
                For i = 1 To Len(GS)
                    
                    Select Case Mid(GS, i, 1)
                        Case "+"
                            Ads = Ads + 1
                            Adp(Ads) = i
                            Adn(Ads) = Vls
                        Case "*"
                            Mus = Mus + 1
                            Mup(Mus) = i
                            Mun(Mus) = Vls
                        Case "/"
                            Bys = Bys + 1
                            Byp(Bys) = i
                            Byn(Bys) = Vls
                        Case "("
                            Lks = Lks + 1
                            Lkp(Lks) = i
                           
                        Case ")"
                            Rks = Rks + 1
                            Rkp(Rks) = i
                            
                    End Select
                    
                    If Mid(GS, i, 1) = "+" Or Mid(GS, i, 1) = "*" Or _
                        Mid(GS, i, 1) = "/" Or Mid(GS, i, 1) = "#" Then
                        
                        If Si + 1 = i And Mid(GS, i + 1, 1) <> "#" _
                             Then '操作符非法连续或以操作符开头
                            GoTo Err
                        Else
                            Si = i
                        End If
                        
                        If Not IsNumeric(Vl(Vls)) And Mid(GS, i + 1, 1) <> "#" _
                             Then '操作数不是数字
                            GoTo Err
                        End If
                        Sig(Vls) = i
                        Vls = Vls + 1
                        
                    Else
                        If Mid(GS, i, 1) <> "(" And Mid(GS, i, 1) <> ")" Then
                            Vl(Vls) = Vl(Vls) + Mid(GS, i, 1) '制作操作数
                        Else
                          If i <> 1 Then
                            If ((Mid(GS, i - 1, 1) = "(" And Mid(GS, i, 1) = ")") Or _
                               (Mid(GS, i - 1, 1) = ")" And Mid(GS, i, 1) = "(")) _
                                  Then '判定括号前后符号的合法性
                                GoTo Err
                            End If
                          End If
                        End If
                    End If
                    
                Next i
                
                If Lks <> Rks Then
                    GoTo Err '左右括号数是否匹配
                End If
                
                For i = 1 To Lks
                    If Lkp(i) > Rkp(i) Then GoTo Err '左右括号出现顺序错误
                Next i
                
                If Lks <> 0 Then '括号处理
                  Do While True
                    For i = Lks To 1 Step -1
                        For n = Rks To 1 Step -1
                            Temp = MathCalculator(Mid(GS, Lkp(i) + 1, Rkp(n) - Lkp(i) - 1))
                            If Temp <> "公式有错误" Then
                                GS = Mid(GS, 1, Lkp(i) - 1) + Temp + Mid(GS, Rkp(n) + 1)
                                Exit Do
                            End If
                        Next n
                    Next i
                    If Temp = "公式有错误" Then GoTo Err
                        '括号中有错误退出
                  Loop
                Else
                    If Mus <> 0 Then '乘法处理
                        GS = Mid(GS, 1, Sig(Mun(1) - 1)) + Trim(Str(Val(Vl(Mun(1))) _
                            * Val(Vl(Mun(1) + 1)))) + Mid(GS, Val(Mup(1)) + Len(Vl(Mun(1) _
                            + 1)) + 1)
                    Else
                        If Bys <> 0 Then '除法处理
                            GS = Mid(GS, 1, Sig(Byn(1) - 1)) + Trim(Str(Val(Vl(Byn(1))) _
                                / Val(Vl(Byn(1) + 1)))) + Mid(GS, Val(Byp(1)) + Len(Vl(Byn(1) _
                                + 1)) + 1)
                        Else
                            If Ads <> 0 Then '加法处理
                                GS = Trim(Str(Val(Vl(1)) + Val(Vl(2)))) + Mid(GS, Val(Adp(1)) _
                                    + Len(Vl(2)) + 1)
                            Else
                                MathCalculator = Mid(GS, 1, Len(GS) - 1)
                                Exit Function
                            End If
                        End If
                    End If
                End If
            Loop
                
                
    Err:
            MathCalculator = "表达式错误!"
                
    End Function
    输入表达式:(1314*89+99-456)/1234,计算结果为:94.4805510534846
      

  5.   

    哇哈,直接出来一个VBA表达式解析器~~关注.
      

  6.   

    组件中添加 Microsoft Script Control 1.0,然后在窗体上放一个 ScriptControl。
    Option ExplicitPrivate Sub Command1_Click()
        Dim strSql As String
        strSql = "(" & Val(Text1) & "+" & Val(Text2) & ")/10"
        MsgBox ScriptControl1.Eval(strSql)
    End Sub