标题:关于对人员得分情况进行排序并按照比例进行评比赋值的问题!
只看楼主
kqgsww
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2015-1-22
结帖率:66.67%
已结贴  问题点数:20 回复次数:6 
关于对人员得分情况进行排序并按照比例进行评比赋值的问题!
    各位大神,有个问题,做了好几次都会有漏项。

    一张表,字段xm,bydf,sydf,dc,分别对应姓名,本月得分,上月得分,档次。分数已经有了,现在想做的就是按照总人数的30%为优秀,dc='优秀';总人数的40%为良好,dc='良好',剩下的30%为合格,dc=‘合格’。
     因为涉及人数而且此人数要在表单中显示,所以不能有小数位,但是用round()函数四舍五入后算出的人数相加和总人数又不一致,在赋值过程中总是会出现问题,请大神们指教应该如何实现。
test.rar (583 Bytes)
搜索更多相关主题的帖子: 四舍五入 排序 函数 相加 赋值 
2020-02-11 14:09
kqgsww
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2015-1-22
得分:0 

use test
count to a
a_yx=round(a*30/100,0)
a_lh=round(a*40/100,0)
a_hg=round(a*30/100,0)

b=a-a_yx-a_lh-a_hg

IF b<0
a_hg=a_hg-1
ELSE
IF b>0
a_hg=g_hg+1
ENDIF
ENDIF



GO TOP
FOR a1=1 TO a_yx
GO a1
c=xm
UPDATE test SET dc='优秀' WHERE xm=c
endfor

FOR a2=1 TO a_lh
a1=a1+1
GO a1
c=xm
UPDATE test SET dc='良好' WHERE xm=c
ENDFOR

FOR a2=1 TO a_hg
a1=a1+1
GO a1
c=xm
UPDATE test SET dc='合格' WHERE xm=c
ENDFOR

我这么写总是提示记录超出范围。。。而且中间总会有漏项的。。。
2020-02-11 14:26
kqgsww
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2015-1-22
得分:0 
忘排序了。。貌似。。。
use test
SELECT * FROM test ORDER BY bydf  DESC INTO TABLE tmp.dbf
SELECT tmp
count to a
a_yx=round(a*30/100,0)
a_lh=round(a*40/100,0)
a_hg=round(a*30/100,0)

b=a-a_yx-a_lh-a_hg

IF b<0
a_hg=a_hg-1
ELSE
IF b>0
a_hg=g_hg+1
ENDIF
ENDIF



GO TOP
FOR a1=1 TO a_yx
GO a1
c=xm
UPDATE test SET dc='优秀' WHERE xm=c
endfor

FOR a2=1 TO a_lh
a1=a1+1
GO a1
c=xm
UPDATE test SET dc='良好' WHERE xm=c
ENDFOR

FOR a2=1 TO a_hg
a1=a1+1
GO a1
c=xm
UPDATE test SET dc='合格' WHERE xm=c
ENDFOR

我这么写总是提示记录超出范围。。。而且中间总会有漏项的。。。

[此贴子已经被作者于2020-2-11 15:48编辑过]

2020-02-11 15:43
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:20 
不用这么麻烦,你直接需要对比的“分数”字段,作索引,然后,直接更新就可以了。
但你优秀 30%,良好 40%,合格 30%的比例,会有问题的,大概是这样
1.当在临界点时,有相同的分数,就会出现档次不同。比如;
第29,30,31名,分数相同,档次就不同了,29,30是优秀,31是良好。
2.30%,40%,30%的值不是整数。
2020-02-11 15:50
kqgsww
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2015-1-22
得分:0 
回复 3楼 kqgsww
是啊,就是因为四舍五入的问题,把这个东西搞的麻烦死了,我又重新弄了一段代码,应该可以实现了。。。


CLOSE DATABASES all
use test
SELECT * FROM test ORDER BY bydf  DESC INTO TABLE tmp
SELECT tmp
count to a
a_yx=round(a*30/100,0)
a_lh=round(a*40/100,0)
a_hg=round(a*30/100,0)

b=a-a_yx-a_lh-a_hg

IF b<0
a_hg=a_hg-1
ELSE
IF b>0
a_hg=g_hg+1
ENDIF
ENDIF

FOR a1=1 TO a
GO a1
c=xm
IF a1<=a_yx
UPDATE test SET dc='优秀' WHERE xm=c
ELSE
IF a1>a_yx AND a1<=a_yx+a_lh
UPDATE test SET dc='良好' WHERE xm=c
ELSE
UPDATE test SET dc='合格' WHERE xm=c
ENDIF
ENDIF
ENDFOR


是啊,当时是想如果两个人分数相同,按照上月分数进行排的,写代码可能要把两个分数加一起排序然后再赋值。。。

[此贴子已经被作者于2020-2-11 16:00编辑过]

2020-02-11 15:58
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
*你看看下面简单的东西
CREATE CURSOR 排名(xm C(10),bydf N(10,2),sydf N(10,2),dc C(4))
INSERT INTO 排名(xm,bydf,sydf,dc) VALUES ("张三",95,90,"")
INSERT INTO 排名(xm,bydf,sydf,dc) VALUES ("李四",95,92,"")
INSERT INTO 排名(xm,bydf,sydf,dc) VALUES ("王五",95,89,"")
INSERT INTO 排名(xm,bydf,sydf,dc) VALUES ("赵六",90,92,"")
INSERT INTO 排名(xm,bydf,sydf,dc) VALUES ("陈七",95,93,"")
*这样排名就出来了
SELECT * FROM 排名 ORDER BY bydf DESC,sydf DESC INTO CURSOR 排名TMP
BROWSE
2020-02-11 16:06
kqgsww
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2015-1-22
得分:0 
啊哈!!!帅!!谢谢!!学习了!!!
2020-02-11 16:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499187-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.210633 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved