(皱健)进,超难的存储过程问题

gengxl 2004-08-03 02:44:40
以下为ASP计算程序,数据库内关联表为 award,user1 其中award与user1表中的dm对应。USER1为用户数据库,PID字段对应DM字段,为下级。这里会有几百级。CENG说明他为多少层会员。AWARD为奖金数据库,每次计算后CI加1,计算奖金的方法有七种,七种奖金计算累计为一期的奖金。
以下为七种奖金计算的程序,但因为数据量大,并且要对两个表进行多次递归及循环,所以常造成超时。想改为用存储过程计算,却不知如何改。请各位大侠帮忙!
<%
set rs1=server.CreateObject("adodb.recordset")
sql1="select * from award where sdate=(select max(sdate) from award)" '取出奖金数据库中日期最大的一条记录
rs1.open sql1,conn,1,1
if rs1.eof and rs1.bof then
qdate=date() '如果没有记录则取当前日期
ci=0
else
if rs1("sdate")=>date then
response.Write "<SCRIPT language=JavaScript>alert('今天刚计算过奖励金额!!');"
response.write"javascript:history.go(-1)</SCRIPT>"
response.end '如果最大日期大于当前日期,则提示。
else
qdate=dateadd("d",1,rs1("sdate")) '如果最大日期小于当前日期,则取最大日期后一天。
end if
ci=cint(rs1("ci"))
end if
rs1.close()
set rs1=nothing

set rs=server.CreateObject("adodb.recordset")
sql="select * from user1"
rs.open sql,conn,1,1 '打开用户表,以便计算用户各奖金额项
if rs.eof and rs.bof then
rs.close()
set rs=nothing '如果用户表没有数据,则关闭RS对象
else
while not rs.eof '用户表徇环进入计算
'龙脉第一项奖金值提取开始
if rs("zrs")>=10 and rs("yrs")>=10 then
i=cint(len(rs("zrs"))-1)
y=cint(len(rs("yrs"))-1)
ii=cint(left(rs("zrs"),i)&"0")
yy=cint(left(rs("yrs"),y)&"0")
if rs("zrs")>rs("yrs") then
jiang1=yy*20
zrs=rs("zrs")-yy
yrs=rs("yrs")-yy
elseif rs("zrs")<=rs("yrs") then
jiang1=ii*20
zrs=cint(rs("zrs"))-ii
yrs=cint(rs("yrs"))-ii
end if
elseif rs("zrs")<10 and rs("yrs")<10 then
jiang1=0
zrs=rs("zrs")
yrs=rs("yrs")
end if
'龙脉第一项奖金值提取结束,第二项奖金值提取开始
jiang2=cint(rs("ztj"))
'龙脉第二项奖金值提取结束,第三项奖金值提取开始
if rs("lei")=2 then
if rs("zjf")>=400 and rs("yjf")>=400 then
zjf=rs("zjf")/400
yjf=rs("yjf")/400
if zjf<yjf then
jfjj=zjf
elseif zjf>yjf then
jfjj=yjf
elseif zjf=yjf then
jfjj=zjf
end if
jiang3=jfjj*60
zyjf=jfjj*400
if jiang3>5000 then
jiang3=5000
end if
else
jfjj=0
jiang3=0
zyjf=0
end if
elseif rs("lei")=3 then
if rs("zjf")>=800 and rs("yjf")>=800 then
zjf=rs("zjf")/800
yjf=rs("yjf")/800
if zjf<yjf then
jfjj=zjf
elseif zjf>yjf then
jfjj=yjf
elseif zjf=yjf then
jfjj=zjf
end if
jiang3=jfjj*120
zyjf=jfjj*800
if jiang3>30000 then
jiang3=30000
end if
else
jfjj=0
jiang3=0
zyjf=0
end if
else
jfjj=0
jiang3=0
zyjf=0
end if
'龙脉第三项奖金值提取结束,第四项奖金在二次计算中完成,进入第六项奖金值提取。
jinag6=rs("jiang6")

if rs("lei")<=1 then '如果会员为第一档,则只计算第一项奖金额
sqltuser="update user1 set zrs='"&zrs&"',yrs='"&yrs&"' where dm="&rs("dm")
conn.execute sqltuser
sqltext="insert into award (qdate,sdate,dm,zmdm,jiang1,ci) values('"&qdate&"','"&date&"','"&rs("dm")&"','"&rs("zm")&"','"&jiang1&"','"&ci+1&"')"
conn.execute sqltext
else
sqltuser="update user1 set zrs='"&zrs&"',yrs='"&yrs&"',ztj=0,zjf=zjf-"&zyjf&",yjf=yjf-"&zyjf&",jiang6=0 where dm="&rs("dm")
conn.execute sqltuser
sqltext="insert into award (qdate,sdate,dm,zmdm,jiang1,jiang2,jiang3,jiang6,ci,ceng) values('"&qdate&"','"&date&"','"&rs("dm")&"','"&rs("zm")&"','"&jiang1&"','"&jiang2&"','"&jiang3&"','"&jiang6&"','"&ci+1&"','"&rs("ceng")&"')"
conn.execute sqltext
end if

rs.movenext
wend '徇环结束,计算结束
rs.close()
set rs=nothing
end if

'进入第五项奖金计算
set rs3=server.CreateObject("adodb.recordset")
sql3="select * from user1" '查询所有用户
rs3.open sql3,conn,1,1
if rs3.eof and rs3.bof then
rs3.close()
set rs3=nothing'如没有用户则计算结束
else
while not rs3.eof '徇环所有用户
if rs3("lei")<3 then '如果用户档位不为第三档则跳过
else
set rs=server.CreateObject("adodb.recordset")
sql="select * from user1 where pid="&rs3("dm")&" order by id" '正排序,ID小在前
rs.open sql,conn,1,1
if rs.eof and rs.bof then
rs.close()
set rs=nothing
else
if rs.recordcount<=1 then
jiangduan="jiang51" '如果记录只有一条,则为左线
call uuu(rs("dm"))
else
i=0 '设置变量I
while not rs.eof
i=i+1
jiangduan="jiang5"&i&"" '两条以上记录时,随时徇环而更改字段名以判断为左线还是右线。
call uuu(rs("dm"))
rs.movenext
wend
end if
end if
end if
rs3.movenext
wend
rs3.close()
set rs3=nothing
end if
...全文
167 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bbcbs 2004-08-03
能承受但不知道怎么做一样没用呀。还有两天就要交差了,如果客户老是超时,那就完了,哥哥帮我。。。。

想尽办法帮我。我也不知道你需要知道哪些东西,所以你让我发到你的电邮,我还真不知道应发些什么东西过去。。

七种计算方法我也短信给你了,数据库我现在就发给你。。
  • 打赏
  • 举报
回复
zjcxc 2004-08-03
三百级估计能承受
  • 打赏
  • 举报
回复
bbcbs 2004-08-03
有三百级左右。。

数据在三万条之内。。
七种计算方法,主要是要做四五次的徇环,而且在徇环里还有递归,ASP是写出来了,人少可以,但人多根本行不通。。你说还有其它的方法吗?比如组件???或。。。。能解决就行呀~~
  • 打赏
  • 举报
回复
zjcxc 2004-08-03
如果你的级数特别多的话,用存储过程也会超时.
  • 打赏
  • 举报
回复
bbcbs 2004-08-03
并不一定要用存储过程,数据库表USER1里有两万多会员的话,执行以上程序就会超时。。不是程序的原因,用几百条数据测试很正常的。。。

只要不让IIS超时并可以计算出数据就可以了。。。用什么方法都行。。各位,帮呀~
  • 打赏
  • 举报
回复
bbcbs 2004-08-03
表USER1 '用来存储会员常规信息,及每周计算奖金的参数
字段 类型 说明
id int 自动编号
dm int 会员编号
pid int 上级会员编号
tjid int 推荐人编号
renshu int 所有下级及下级的下级会员人数和
zm int 所属专卖店编号
lei int 会员级别
zrs int 会员本周新的左线下级人数和(用于第一项奖金计算)
yrs int 会员本周新的右线下级人数和(用于第一项奖金计算)
ztj int 会员本周推荐奖金合计(用于第二奖金计算)
zjf int 会员本周左线积分和(用于第三奖金计算)
yjf int 会员右线积分和(用于第三奖金计算)
ceng int 会员所属层数
jiang6 int 第六项奖金值
  • 打赏
  • 举报
回复
zjcxc 2004-08-03
这和另一帖的问题是一样的吧?
  • 打赏
  • 举报
回复
gengxl 2004-08-03
表AWARD '用来存储各周的奖金情况
字段 类型 说明
id int 自动编号
qdate datetime 本次计算开始日期
sdate datetime 本次计算结束日期
dm int 会员编号
zmdm int 会员所属专卖店编号
jiang1 float 第一项奖金额
jiang2 float 第二项奖金额
jiang3 float 第三项奖金额
jiang4 float 第四项奖金额
jiang51 float 第五项奖金额1
jiang52 float 第五项奖金额2
jiang6 float 第六项奖金额
jiang7 float 第七项奖金额
jiang77 int 强制性消费瓶数
ci int 本次为第几次奖金计算
ceng int 会员所属上下级层数
  • 打赏
  • 举报
回复
gengxl 2004-08-03
以上为计算奖金的ASP程序,如何用存储过程或更好的办法实现?用ASP在数据多的情况下会让IIS跑超时的。。
  • 打赏
  • 举报
回复
gengxl 2004-08-03
sub uuu(dm)
set rsee=server.CreateObject("adodb.recordset")
sqlee="select * from user1 where pid="&dm '查找会员
rsee.open sqlee,conn,1,1
if rsee.eof and rsee.bof then
rsee.close()
set rsee=nothing '如果没有下线则关闭对象集退出递归
else
ceng=0
while not rsee.eof
ceng=rsee("ceng")-rs("ceng")

if ceng>=5 and ceng<=11 then
set rs2=server.CreateObject("adodb.recordset")
sql2="select * from award where dm="&rsee("dm")&" and ci=(select max(ci) from award)" '查找会员
rs2.open sql2,conn,1,1
jiang5=round((rs2("jiang3")/100*2),2)
sqltt="update award set "&jiangduan&"="&jiangduan&"+"&jiang5&" where ci=(select max(ci) from award) and dm="&rs("pid")
conn.execute sqltt
rs2.close()
set rs2=nothing
end if
uuu rsee("dm")
rsee.movenext
wend
rsee.close()
set rsee=nothing
end if
end sub

'以下为计算第五奖的封顶,单区封顶500
set rs3=server.CreateObject("adodb.recordset")
sql3="select * from award where ci=(select max(ci) from award)" '查询所有用户
rs3.open sql3,conn,1,1
if rs3.eof and rs3.bof then
rs3.close()
set rs3=nothing'如没有用户则计算结束
else
while not rs3.eof '徇环所有用户
if rs3("jiang51")>500 then
sqlrs="update award set jiang51=500 where id="&rs3("id")
conn.execute sqlrs
end if
if rs3("jiang52")>500 then
sqlrs="update award set jiang52=500 where id="&rs3("id")
conn.execute sqlrs
end if
rs3.movenext
wend
end if
rs3.close()
set rs3=nothing

'以下为计算第四项奖,直接推荐人当周碰对奖10%。
set rs3=server.CreateObject("adodb.recordset")
sql3="select * from user1" '查询所有用户
rs3.open sql3,conn,1,1
if rs3.eof and rs3.bof then
rs3.close()
set rs3=nothing'如没有用户则计算结束
else
while not rs3.eof '徇环所有用户
set rs=server.CreateObject("adodb.recordset")
sql="select * from user1 where tjid="&rs3("dm")
rs.open sql,conn,1,1
jiang4=0
if rs.eof and rs.bof then
rs.close()
set rs=nothing
else
while not rs.eof
set rs4=server.CreateObject("adodb.recordset")
sql4="select * from award where ci=(select max(ci) from award) and dm="&rs("dm") '查询所有用户
rs4.open sql4,conn,1,1
if rs4.eof and rs4.bof then
rs4.close()
set rs4=nothing
else
jiang4=jiang4+(rs4("jiang3")/100*10)
rs4.close()
set rs4=nothing
end if
rs.movenext
wend
rs.close()
set rs=nothing
sqlrs="update award set jiang4=jiang4+"&jiang4&" where dm="&rs3("dm")&" and ci=(select max(ci) from award)"
conn.execute sqlrs
end if

rs3.movenext
wend
end if
rs3.close()
set rs3=nothing


'以下为计算第七项奖,重复消费奖,积分达四百强制性消费37元产品。下线6-15层重复消费一次,可得一元。
set rs3=server.CreateObject("adodb.recordset")
sql3="select * from award where ci=(select max(ci) from award)" '查询所有用户
rs3.open sql3,conn,1,1
if rs3.eof and rs3.bof then
rs3.close()
set rs3=nothing'如没有用户则计算结束
else
jiang7=0
while not rs3.eof '徇环所有用户
jiang7=rs3("jiang1")+rs3("jiang2")+rs3("jiang3")+rs3("jiang4")+rs3("jiang51")+rs3("jiang52")+rs3("jiang6")
jiji7=cint(jiang7/400)
sqlrs="update award set jiang77="&jiji7&" where dm="&rs3("dm")&" and ci=(select max(ci) from award)"
conn.execute sqlrs
rs3.movenext
wend
rs3.movefirst
while not rs3.eof
call jiang77(rs3("dm"))
rs3.movenext
wend
end if
rs3.close()
set rs3=nothing


sub jiang77(dm)
set rsee=server.CreateObject("adodb.recordset")
sqlee="select * from user1 where pid="&dm '查找会员
rsee.open sqlee,conn,1,1
if rsee.eof and rsee.bof then
rsee.close()
set rsee=nothing '如果没有下线则关闭对象集退出递归
else
ceng1=0
while not rsee.eof
ceng1=rsee("ceng")-rs3("ceng")

if ceng1>=6 and ceng<=15 then
set rs2=server.CreateObject("adodb.recordset")
sql2="select * from award where dm="&rsee("dm")&" and ci=(select max(ci) from award)" '查找会员
rs2.open sql2,conn,1,1
sqltq="update award set jiang7=jiang7+"&rs2("jiang77")&" where ci=(select max(ci) from award) and dm="&rs3("dm")
conn.execute sqltq
rs2.close()
set rs2=nothing
end if
jiang77 rsee("dm")
rsee.movenext
wend
rsee.close()
set rsee=nothing
end if
end sub
'当周奖金计算结束
%>
  • 打赏
  • 举报
回复
相关推荐
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2004-08-03 02:44
社区公告
暂无公告