正逢2005年年末,国内各媒体都掀起了“2005年度XXXX投票评选”的热潮,就拿CCTV央视来说,各种命题的“投票评选”活动就不下十多项;对这样题目在编程中如何实现呢?我想主要从三个方面入手;第一,解决好参加评比候选人数据装入;第二,采集好投票人有效点击次数的相关信息;第三,确保参加评比候选人获票数与投票人的投出票数的一致性。掌握好这三点后,其它问题就会迎刃而解。使用Delphi、PB、VB等语言得到较理想编程设计与实施。
为了简便起见下面将以“2005CCTV中国经济年度人物评选人气榜”的信息为数据源,把用VB、SQL Server 2000数据库设计“投票评选”程序的简单方法介绍给大家。如图1所示,为“投票评选”窗体界面,下面分三个问题介绍:
图片1 |
一、用VB设计“投票评选”程序的流程及要点
1.2005年参加评比候选人数据的装入
<1>.在数据库中创建[候选代表获票表-(简称:表1)]和[投票参与表-(简称:表2)]
表1:A05_Start 数据结构 表2: A05_Piao 数据结构
表1字段有:[姓名、单位、职务、图片、长度、票数] 记录数:20条。
表2字段有:[身份、序号、姓名、票数、Flag] 记录数:若干。
<2>. 将“中国经济年度人物候选人20位”数据装入ListBox控件中在ADO的连接方式下进行SQL Server2000数据库连接;将已经编辑通过的数据源表中所有记录项(包括:姓名、单位、职务)信息,按姓氏笔画为序地读到FrmXP窗体的ListBox控件中,请见如图1所示。
2.采集好投票评比人有效点击次数的相关信息
【参与投票为有效】的充分必要条件是①.满10票才算有效投票;②.填入身份证号的位数合法。接收这样的数据信息才视为“有效”,才能记录“在案”。
<1>.数据采集需简捷明快
对公众参与操作的程序界面,要允许参与人使用鼠标“可反复地点击[选择],可打“√”可去掉“√”,以最终符合“满10票才算有效投票”为原则。
在ListBox控件中采集数据据的范围及算法:
范围:①总点击次数;②.有效点击次数;③.收集候选人姓名;④.收集候选人序
号;⑤.收集打“√”可去掉“√”状态。
算法:这里与算法相关项是【②.有效点击次数】如:在姓名前点击:(加上“√”= 真)设置为1;后来在点击过的姓名前:(去掉“√”=假)设置为-1。
即:【有效点击次数】------初值等于零;
如果,点击:(加上“√”=真)?有效点击数=有效点击数+1
如果,点击:(去掉“√”=假)?有效点击数=有效点击数-1
程序中要求此数据不允许小于10,这样就明确了对参与者出错的提示条件。
3.确保参加评选的候选人获票数与投票人的投票数的一致性
在正确数据采集的基础上,确保【获票数】与【投票数】一致性问题能用较简单地利用SQL语句进行处理,可随时显示获票【结果】。
<1>.审核参与者身份证号合法性,主要包括:旧证(15位)新证(18位)。
<2>.利用“视图”将每一次有效数据,按“候选人姓名”分组求和,计算出票数。
<3>.使用SQL语句的更新操作:Update A05_start set 票数=票数+视图.票数 条件:两个表的姓名相等。
二、用VB设计“投票评选”程序主要代码
1.将“候选人物20位”数据的装入ListBox控件代码
Sub p_abc() RS.Open " Select 姓名,职务,单位From A05_start Order By id", mConn, adOpenStatic Dim iSize, iNo As Long Dim Lname As String iNo = RS.RecordCount If iNo = 0 Then MsgBox "数据库中的数据项不能为空,请重新设置", vbOKOnly, "信息提示" Exit Sub End If Do While Not RS.EOF iSize = 0 iSize = Len(RS.Fields("姓名")) Lname = RS.Fields("姓名") lstFields.AddItem Lname + Space(2) + RS.Fields("单位") + RS.Fields("职务") RS.MoveNext Lname = "" Loop lstFields.ListIndex = -1 RS.Close End Sub |
2.采集数据ListBox控件下的程序代码
Private Sub lstFields_ItemCheck(Item As Integer) '现场采集的过程 P = P + 1 '获取总次数 A_name(P) = Mid(lstFields.List(lstFields.ListIndex), 1, 3) '获取姓名 A_No(P) = lstFields.ListIndex '获取序号 A_TF(P) = lstFields.Selected(lstFields.ListIndex) '获取逻辑值 If A_TF(P) = "True" Then '获取有效的点击次数 P1 = P1 + 1 Else P1 = P1 - 1 End If 'End Sub |
3.更新“候选人”获票数据的主要程序代码(【投票】按钮下)
Private Sub Command2_Click() Dim P_No, lNo As Integer Dim P_name As String …… '此处略掉部分代码,它们主要有: ①.判断身份证号(旧15)位或(新18)位 ②.判断[身份证号]的位数有误的提示 ③.判断[满10票为有效投票]的提示 RS.Open " Select * From A05_piao Where 身份='" & Text1.Text & "' Order By id", mConn, adOpenStatic lNo = 0 lNo = RS.RecordCount RS.Close If lNo > 0 Then MsgBox "对不起,您已经投过票,谢谢合作!!!", vbOKOnly, " > 操作信息提示 <" Text1.SetFocus Exit Sub End If For J = 1 To P '根据现场采集总次数,将数据插入表2 If A_No(J) >= 0 Then P_name = A_name(J) If A_TF(J) = "True" Then P_No = 1 '首此点击为 “勾”时为:1 Else P_No = -1 '原已点后去掉“勾”时为:-1 End If End If mConn.Execute "Insert Into A05_piao (身份,序号,姓名,票数) VALUES ('" & Text1.Text & "'," & A_No(J) & ",'" & A_name(J) & "'," & P_No & ")" Next J '--更新A05_start表1的内容 '--V_sum1为视图文件其格式:Select 姓名 Sum(票数) AS "票数" From A05_Piao Where flag is Null GROUP By 姓名 mConn.Execute " Update A05_start Set A05_start.票数 = A05_start.票数 + V_sum1.票数 From A05_start,v_sum1 Where A05_start.姓名 = V_sum1.姓名 " mConn.Execute " Update A05_piao Set flag=1" '参与过的标记 Call A_abc '记票后清除各个数组及变量供采集数据用 lstFields.Clear '记票后清空ListBox控件。 Call p_abc '记票后重新装入20位候选人物信息 Text1.Text = "" '记票后清空“身份证”输入框中信息 lstFields.SetFocus '记票后焦点移到ListBox中 End Sub |
4.界面的设置程序代码
<1>.投票窗体设置,窗体名:FrmXP
Option Explicit Dim mConn As ADODB.Connection Dim RS As New ADODB.Recordset DIM StrCnn As String '连接字符串 Dim A_name() As String '定义姓名数组 Dim A_No() As Integer '定义编号数组 Dim A_TF() As String '逻辑值判断(鼠标的点击过程) Dim I, J, P,P1 As Integer |
<2>.数据库的连接
Private Sub Form_Load() Set mConn = New Connection StrCnn="Provider=SQLoledb;DataSource=USER2;Userid=sa;pwd=;Initial atalog=My_data" mConn.CursorLocation = adUseClient '设置为客户端 mConn.Open StrCnn Call p_abc '此过程为装入“候选20位”数据 Call A_abc '此过程清空各个数组及变量采集数据用 End Sub |
<3>.使用控件清单
标签控件2个,命令按钮控件4个,文本框控件1个,列表框控件1个。
<4>.模块的主要"引用"
VB和SQL Server2000下模块引用[ADO]:Microsoft ActiveX Data Object 2.6 Library
三、对【结果】【重填】【看图片】按钮的说明
1.【结果】按钮下将调用“前八名结果”图形窗体
frm_GRP.show vbmodal |
此界面的代码比较简单,即:将获取票数前八名的候选人物姓名和票数装入到Mschart控件,以直方图形式体现,图形为动态(随票数而变化),图形窗体与程序代码略掉。
2.【重填】主要清空身份证文本框和重新将20位候选人数据装入。
3.【看图片】按钮下将调用“20位中国经济年度人物”图片窗体 如图2所示
frm_Pic.show vbmodal |
此窗体是将“中国经济年度人物”姓名和图片数据读到frm_Pic界面的控件中,以下三种:
图像Image(0...19);
图片框picture(0…19);
标签label2(0..,19)控件;
在数据库表1的循环中,将图片数据和姓名装入到符合其下标的控件中,请见如图2所示,此处代码较长,故略掉。
图片2 |
四、 编后语
用VB设计"投票评比"程序的简单方法中,关键要思路清楚、考虑周到、设计合理到位。首先,做到文中表1与表2数据关系准确(基于数据采集的准确上)。其次,让参与投票的人士在操作程序上感到方便,快捷。最后,在设计类似程序时一定要理论联系实际,结合你现场的具体环境,抓好整个流程的关键环节、以点代面、活学活用、让参与投票使用者都喜欢。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/
领测软件测试网最新更新
关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073