在一个transaction中操作。
先执行:update tablename set 扣款=个人所得税+其它扣款
再执行:update tablename set 实发工资=应发工资-扣款

解决方案 »

  1.   

    那不是做死了?
    我想让用户自己增减字段,但是用户不用考虑先后次序问题,由系统给出先后次序
    一个设想:
    update前先遍历右等式,是不是最基本的项目(用户输入的项目),如果不是,就查找此项目的公式,找到后替代此项目参加计算,如果找到公式中还存在不是基本项目的问题,继续查找,以次类推,直到右等式全部都是基本项目为止,但实现太麻烦。
    有没有好主意?
    分不够结贴后另开贴加分!
    谢谢!
      

  2.   

    存放公式的表:
    ID  字段名    参加计算    计算公式
    1   应发工资     是       基本工资+岗位工资
    2   实发工资     是       应发工资-扣款
    3   扣款         是       个人所得税+其它扣款
    4   其它扣款     是
    5   个人所得税   是
    6   基本工资     是
    7   岗位工资     是
    ...................
    比如4、5、6、7就是基本项目,用户输入的,而1、2、3是计算项目,不需要用户输入
    将来计算工资表的时候,根据此表中的公式动态生成UPDATE语句来填充计算项目的数值,关键是UPDATE的先后次序
      

  3.   

    建立一个临时表(临时存放表)~~~~
    而你应该有个表是存放计算的资料吧~~~~假设是数值表
    用strUpdate存放公式
    用strFiles存放有公式的项目
    conn.Execute "delete from 临时存放表"
    rs.open "select * from 存放公式表 where 计算公式<>''",conn,3,1
    if not rs.eof then
        rs.movefirst
        while not rs.eof
            strupdate=trim(rs("计算公式"))
            strfiles=trim(rs("字段名"))
            conn.Execute "insert into 临时存放表(字段名,数值) values('" & strfiles & "',(select top 1 " & strupdate & " from 数值存放表))
            rs.movenext
         wend
    end if
    最后把所有基本运算项目的计算数值也写进临时表中,那么就可以通过临时表来计算所有的公式了。
      

  4.   

    忘了说明了,(select top 1 " & strupdate & " from 数值存放表)这一句可以从你存放的数值表中拿出根据你的公式来查询数据如strupdate="基本工资+岗位工资"
    那么(select top 1 " & strupdate & " from 数值存放表)在sql里转化就会变成
    select top 1 基本工资+岗位工资 from 数值存放表那么就能够把 基本工资+岗位工资 的数值写道临时表中的 应发工资 里~~~
    如此类推~~~当把所有需要参加运算的项目都写进临时表中就可以开始做运算了,换句话说,临时表也就是转换表。起过渡的作用
      

  5.   

    你可以做个过程,然后用递归的方法实现。
    Public Sub Gadd_Child(Str As String)
        Dim Cn As New ADODB.Connection
        Dim Rs As New ADODB.Recordset
        Dim i As Integer
        
        Cn.Open 连接字符串
        Rs.Open "select * from 公式表 where 计算公式 <> '' or 计算公式<>NULL and 字段名='" & Str & "'", Cn, adOpenStatic, adLockReadOnly
        If Rs.RecordCount > 0 Then Rs.MoveFirst
        For i = 1 To Rs.RecordCount
            完成计算工作
            Call Gadd_Child(Rs("字段名"))
            Rs.MoveNext
        Next i
    End Sub实现思想:如果公式表中有计算项目,则按计算公式分析,如果发现计算公式中不全部属于基本项目,则递归调用过程,先完成计算公式中需要计算的计算项目。
      

  6.   

    to:ouyangke(欧阳克) 
    谢谢,递归是个办法,但是你给的程序有问题,这样就循环查找自己。to:zyxisme(小马哥) 
    标准公式我也想过,就不知道什么时候该怎么生成,最好是在填写完公式的时候。(我设想在每写入一个公式项就计算出此项的标准公式),但还是在算法上有问题:
    查找出了“计算公式”,怎么把它展开?不展开就无法进行子项的进一步查询,展开的问题是:怎么提取出每一项,比如:
    项目1+项目2-项目3
    怎么单独提取出项目1、项目2、项目3
    问题解决一定结分!说话绝对算数,分对我没什么意义,只是用来送人的。
    谢谢,思考并期盼中````
      

  7.   


    俺是学生,俺不会,俺能不能问点问题阿:是关于SQL与VB的问题,我开始用的SQL SERVER7.0做的数据库,,用VB6做的应用程序,不是很难的那种拉,现在有两个问题,第一,把7。0,中的数据库导入另一台机器的sql2000里,并且让应程序还能调用它(我已经弄好了,把Data文件夹拖过来,设置好ODBC,以及程序中的登录设置,但是,不知道这样会不会有我现在还不知道的麻烦出现,请各位大侠指点)………………第二个问题,我不知道如何解决:把数据库倒过来后(笔记本),另一台机器也升级为sql2000了,而且,应用程序都是一样的,两台机器拥有相同的数据库和应用程序,可以联机工作,也可以单独工作,问题就是,两台机器的数据必须一致,比如笔记本出去工作,数据更新了,同时,台式机在家工作,数据也更新了,笔记本回来后,两边要互相更新,但又不能用简单的SQL2000里的方法,因为操作员是指懂得操作的,我们所提供的就是一个或几个按钮,这时,我就不会了~~~请大侠们支援~解决方法email:[email protected]
    VB-mscomm 我的问题:
               1、发出了读卡的命令inbuf = Chr$(&H1B) & Chr$(&H5D);MSComm1.Output = inbuf & vbCr,机器也有反应,但是刷卡后返回的数据应该如何接受并显示在text里哪(说明书上说:成功:<1B 73 磁道数据 3F 1C>失败:<1B 72 71>这些是16进制命令)?QQ121683833告诉我你是csdn的朋友哦~
    去这里回答~:给分
    http://www.csdn.net/expert/topic/795/795529.xml?temp=.664303
    http://www.csdn.net/expert/topic/795/795518.xml?temp=.7766077
      

  8.   

    Private Sub GetChild(Str As String)
    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    conn.ConnectionString = "DBQ=data\rsgz.mdb;DRIVER={Microsoft Access Driver (*.mdb)};"
    conn.Open
    sql = "select 计算公式 from SYSTABLEINFO where (计算公式 <> '' or 计算公式<>NULL) and 字段名称='" & Str & "'"
    MsgBox (sql)
    rs.Open sql, conn, adOpenStatic, adLockReadOnly
    If rs.RecordCount > 0 Then '如果找到计算公式
      rs.MoveFirst
      strtempjsgs = rs("计算公式") '存储计算公式到变量
      If strtempjsgs <> "" Then '如果公式有效
        strgsxm = "" '初始化计算公式的公式项目
        strgschar = "" '初始化存储计算公式的每个字符
        For i = 1 To Len(strtempjsgs) '循环取出计算公式的每个字符
          strgschar = Mid(strtempjsgs, i, 1) '取当前字符
          If InStr("+-*/()", strgschar) > 0 Then '如果当前字符是运算符
            strgetchild = strgetchild & strgschar '运算符存入整理后的标准公式
            Call GetChild(strgsxm) '递归查找此公式项的计算公式
            strgsxm = "" '重置公式项目变量
            strgschar = "" '重置公式字符变量
          Else
            strgsxm = strgsxm & strgschar '如果当前字符不是运算符则拼接成计算公式项目
          End If
        Next
      End If
    End If
    rs.close
    Set rs = Nothing
    conn.close
    Set conn = Nothing
    End Sub运行结果:只出运算符,而且不全,顺序也不对
    测试项目:str=岗位扣款
    背景:
    岗位扣款=(病假天数+旷工事假工资)*3
    旷工事假工资=(技能工资/20.92)*旷工事假天数
    标准公式应为(程序运行应得结果):
    (病假天数+(技能工资/20.92)*旷工事假天数)*3
    现在运行结果:
    (+)(/
    怎么会这样?高手帮忙看看
      

  9.   

    我做过人事工资软件,和你的差不多吧, 我的原始公式是在建立工资表时自动生成的,然后做一个公式编辑器可以对公式进行编辑,并保存这里说说如何生成原始公式的思路吧:
    ID 字段名  加减(0-结果项 1-加项  -1 减项)
    1  应发工资  0
    2  实发工资  0
    3  扣款    0
    4  其它扣款  -1
    5  个人所得税 -1
    6  基本工资  1
    7  岗位工资  1
    写一过程记录原始公式: 读取所有字段,应发工资=所有加减项目为1的和
    扣款= 所有加减项目为-1 的和;
    实发工资= 应发工资-扣款
    update 时先计算扣款和应发工资,最后计算实发工资
    希望对你有帮助
      

  10.   

    刚才的有点错误,下面是改动后的,可是还不对,我看不出什么地方不对了Private Sub GetChild(Str As String)
    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    conn.ConnectionString = "DBQ=data\rsgz.mdb;DRIVER={Microsoft Access Driver (*.mdb)};"
    conn.Open
    sql = "select 计算公式 from SYSTABLEINFO where (计算公式 <> '' or 计算公式<>NULL) and 字段名称='" & Str & "'"
    MsgBox (sql)
    rs.Open sql, conn, adOpenStatic, adLockReadOnly
    If rs.RecordCount > 0 Then '如果找到计算公式
      rs.MoveFirst
      strtempjsgs = rs("计算公式") '存储计算公式到变量
      If strtempjsgs <> "" Then '如果公式有效
        strgsxm = "" '初始化计算公式的公式项目
        strgschar = "" '初始化存储计算公式的每个字符
        For i = 1 To Len(strtempjsgs) '循环取出计算公式的每个字符
          strgschar = Mid(strtempjsgs, i, 1) '取当前字符
          If InStr("+-*/()", strgschar) > 0 Then '如果当前字符是运算符
            If strgsxm <> "" Then '如果公式项目有效则继续查找
              Call GetChild(strgsxm) '递归查找此公式项的计算公式
              strgsxm = "" '重置公式项目变量
            End If
            strgetchild = strgetchild & strgschar '运算符存入整理后的标准公式
          Else
            strgsxm = strgsxm & strgschar '如果当前字符不是运算符则拼接成计算公式项目
          End If
        Next
      End If
    Else
      strgetchild = strgetchild & Str '当前公式项目存入标准公式
    End If
    rs.close
    Set rs = Nothing
    conn.close
    Set conn = Nothing
    End Sub测试项目:str=岗位扣款
    背景:
    岗位扣款=(病假天数+旷工事假工资)*3
    旷工事假工资=(技能工资/20.92)*旷工事假天数
    标准公式应为(程序运行应得结果):
    (病假天数+(技能工资/20.92)*旷工事假天数)*3
    现在运行结果:
    (病假天数+(/
      

  11.   

    新贴地址:
    http://www.csdn.net/Expert/TopicView1.asp?id=831333
    欢迎赐教,继续给分,谢谢