建立一个临时表(临时存放表)~~~~ 而你应该有个表是存放计算的资料吧~~~~假设是数值表 用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 最后把所有基本运算项目的计算数值也写进临时表中,那么就可以通过临时表来计算所有的公式了。
忘了说明了,(select top 1 " & strupdate & " from 数值存放表)这一句可以从你存放的数值表中拿出根据你的公式来查询数据如strupdate="基本工资+岗位工资" 那么(select top 1 " & strupdate & " from 数值存放表)在sql里转化就会变成 select top 1 基本工资+岗位工资 from 数值存放表那么就能够把 基本工资+岗位工资 的数值写道临时表中的 应发工资 里~~~ 如此类推~~~当把所有需要参加运算的项目都写进临时表中就可以开始做运算了,换句话说,临时表也就是转换表。起过渡的作用
你可以做个过程,然后用递归的方法实现。 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实现思想:如果公式表中有计算项目,则按计算公式分析,如果发现计算公式中不全部属于基本项目,则递归调用过程,先完成计算公式中需要计算的计算项目。
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 现在运行结果: (+)(/ 怎么会这样?高手帮忙看看
刚才的有点错误,下面是改动后的,可是还不对,我看不出什么地方不对了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 现在运行结果: (病假天数+(/
我想让用户自己增减字段,但是用户不用考虑先后次序问题,由系统给出先后次序
一个设想:
update前先遍历右等式,是不是最基本的项目(用户输入的项目),如果不是,就查找此项目的公式,找到后替代此项目参加计算,如果找到公式中还存在不是基本项目的问题,继续查找,以次类推,直到右等式全部都是基本项目为止,但实现太麻烦。
有没有好主意?
分不够结贴后另开贴加分!
谢谢!
ID 字段名 参加计算 计算公式
1 应发工资 是 基本工资+岗位工资
2 实发工资 是 应发工资-扣款
3 扣款 是 个人所得税+其它扣款
4 其它扣款 是
5 个人所得税 是
6 基本工资 是
7 岗位工资 是
...................
比如4、5、6、7就是基本项目,用户输入的,而1、2、3是计算项目,不需要用户输入
将来计算工资表的时候,根据此表中的公式动态生成UPDATE语句来填充计算项目的数值,关键是UPDATE的先后次序
而你应该有个表是存放计算的资料吧~~~~假设是数值表
用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
最后把所有基本运算项目的计算数值也写进临时表中,那么就可以通过临时表来计算所有的公式了。
那么(select top 1 " & strupdate & " from 数值存放表)在sql里转化就会变成
select top 1 基本工资+岗位工资 from 数值存放表那么就能够把 基本工资+岗位工资 的数值写道临时表中的 应发工资 里~~~
如此类推~~~当把所有需要参加运算的项目都写进临时表中就可以开始做运算了,换句话说,临时表也就是转换表。起过渡的作用
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实现思想:如果公式表中有计算项目,则按计算公式分析,如果发现计算公式中不全部属于基本项目,则递归调用过程,先完成计算公式中需要计算的计算项目。
谢谢,递归是个办法,但是你给的程序有问题,这样就循环查找自己。to:zyxisme(小马哥)
标准公式我也想过,就不知道什么时候该怎么生成,最好是在填写完公式的时候。(我设想在每写入一个公式项就计算出此项的标准公式),但还是在算法上有问题:
查找出了“计算公式”,怎么把它展开?不展开就无法进行子项的进一步查询,展开的问题是:怎么提取出每一项,比如:
项目1+项目2-项目3
怎么单独提取出项目1、项目2、项目3
问题解决一定结分!说话绝对算数,分对我没什么意义,只是用来送人的。
谢谢,思考并期盼中````
俺是学生,俺不会,俺能不能问点问题阿:是关于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
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
现在运行结果:
(+)(/
怎么会这样?高手帮忙看看
ID 字段名 加减(0-结果项 1-加项 -1 减项)
1 应发工资 0
2 实发工资 0
3 扣款 0
4 其它扣款 -1
5 个人所得税 -1
6 基本工资 1
7 岗位工资 1
写一过程记录原始公式: 读取所有字段,应发工资=所有加减项目为1的和
扣款= 所有加减项目为-1 的和;
实发工资= 应发工资-扣款
update 时先计算扣款和应发工资,最后计算实发工资
希望对你有帮助
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
现在运行结果:
(病假天数+(/
http://www.csdn.net/Expert/TopicView1.asp?id=831333
欢迎赐教,继续给分,谢谢