1、目录实验一软件分析3一、功能说明3二、E-R图3三、逻辑表格5四、任务6实验二创建项目及数据库6一、创建项目6二、创建数据库6三、创建表并设定索引6四、建立表之间的关系8五、任务9实验三数据可视化操作9一、添加记录9二、修改记录12三、删除记录12四、任务12实验四使用命令操作数据库12一、数据库及表操作12二、任务15实验五表单设计15一、表单分析15二、使用向导创建表单16三、使用表单设计器修改表单19四、完成其他表单23实验六编写代码28一、创建系统主程序28二、编写登录表单的代码29三、编写主表单程序代码30四、编写管理员管理代码34五、提示信息添加代码36六、编写管理信息代码37七、
2、今日提醒代码编写39八、编写部门管理代码41九、员工管理代码编写45十、使菜单和工具栏与表单关联45十一、任务46实验七设计报表46一、为报表准备数据46二、设计报表47三、操作注意51四、运行表单51五、任务51实验八编译发布52一、软件的编译52二、制作安装盘52三、任务56实验九分析及优化56实验一 软件分析请从网站下载示例程序,分析软件的功能并列出,并从中抽象出实体,画出软件的ER图并进行数据库逻辑设计,画出数据库逻辑设计表格.参考如下:一、 功能说明1) 系统登录控制:要求填写用户名及密码,并进行了3次连续错误后系统退出功能.2) 部门编码设置:主要是用来设置部门的层级关系.3) 部
3、门信息设置:部分的基本信息,如地址、电话等。4) 员工信息管理:管理企业内部员工的信息,还可以设置生日提醒.5) 提醒设置功能:可以通过设置信息及接收用户及时间,当被设置的用户登录时显示给用户。6) 今日提醒功能:根据提醒设置,显示相应信息。7) 系统设置:修改使用软件的单位信息.8) 密码修改功能:修改用户的密码。二、 ER图首先是进行实体的抽象,通过系统登录功能及用户密码修改功能,我们可以抽象出“用户”实体,通过部门编码及部门信息管理功能,可以抽象出“部门”实体,通过员工信息管理可得到“员工”实体,通过提醒功能及今日提醒功能可以抽象出“提醒实体,最后就是系统基本信息,可以得到“系统”实体。
4、部门信息员工信息提醒信息包含提醒1nn1实体之间关系有ER图提醒信息编码员工编号提醒类别提醒内容提醒日期提醒实体用户信息用户名密码姓名用户信息实体的E-R图部门信息编号上层编号单位名称单位地址。部门信息实体的ER图员工信息编号姓名生日电话。员工信息实体的ER图系统信息企业名称显示提醒系统信息实体的E-R图三、 逻辑表格通过上面的ER图,我们已经确立了实体,现在我们要进一步把实体及属性更完善,进行数据库的逻辑设计提醒信息字段名字段类型宽度可否为空默认值说明Warnid自动编号4主索引emplyid整型4否0普通索引当为0时代表发给所有用户Wtype整型4不同的数值代表不同类型showdate日期
5、型8显示日期msg字符型200显示的信息用户信息字段名字段类型宽度可否为空默认值说明uname字符型20否主索引,用户名upwd字符型20否0密码truename字符型8真实姓名部门信息字段名字段类型宽度可否为空默认值说明ID自动4主索引,编号TopID整型4上层编号DPName字符50单位名称DPAddr字符100单位地址DPPhone字符30单位电话DPPerson字符8单位联系人员工信息字段名字段类型宽度可否为空默认值说明ID自动4编号,主索引uname字符8姓名usex字符2性别birthday日期8生日DPID整型4所属部门ISMsg逻辑1是否生日提醒上面的字符可以进行相应的增加或删
6、减,关键在于想实现的功能.四、 任务仔细分析软件本身,并可以进行相应改进,完成软件分析任务。把个人设计的软件也进行上述的过程,完成数据库概念设计及逻辑设计。实验二 创建项目及数据库一、 创建项目1) 在硬盘的相应目录下建立自己的项目文件夹,并在文件夹下建立data和doc两个文件夹分别用来存放数据文件及开发文档。2) 打开VFP8。0,建立项目文件,命名为EPUser(可任意,为了后面方便表达).二、 创建数据库在项目管理器中新建一个数据库EPData,并保存在Data文件夹中。三、 创建表并设定索引1) 在EPData数据库下创建新表warning。表设计器如下:2) 在warnid上建立主
7、索引,在emplyid上建立普通索引。3) 依照上边的方法建立其他数据表.最终如下:四、 建立表之间的关系1) 选中Epdata数据库,单击修改打开数据库设计器2) 把主表的主索引拖至从表的普通索引上建立关系五、 任务a) 完成企业员工管理软件的项目创建及数据库、数据库表的创建,并建立相应关系。b) 完成自主设计的软件的数据库、数据库表的创建工作。实验三 数据可视化操作一、 添加记录a) 打开实验二创建的项目,并打开epdata数据库的设计器。b) 双击Depart和employ表之间的关系线,打开关系设定窗口。c) 选择“referential integrity”选项,并选择插入规则,选择
8、级连项,实现两表之间的“相对完整性”,确定退出窗体。d) 在项目管理器中选择depart表,并选择“浏览”,打开浏览窗口,在“显示”菜单中选择“追加模式”,在表中添加两条数据,如下图,在这里我们可以看到“聊城大学”这个部门的topid为0而“教育传播技术学院的topid为“聊城大学”的id,通过这种方式实现部门间的级别管理,这种方式在开发中经常使用。e) 关闭depart表,再打开employ表,使用上述方式添加数据,当我们在Dpid中添加了一个depart表中未出现的ID值时,会出现如下错误,而输入的值为正确的,则会被确认,从这里我们可以看到完整性检查的作用。f) 建立一个与employ结构
9、相同的表employ1,在表中添加一些数据。g) 在打开employ表,选择“表”菜单中的追加记录,如下图,点击来源后面的浏览按钮,找到employ1表,并设置选项,选中除自动编号以外的所有字段,确定后,查看employ表中是否添加了employ1中的数据。二、 修改记录打开一个添加了数据的表格,然后使用“显示”菜单中的“编辑实现对数据的修改,不再演示,大家也可以设置表之间的关系,看一下更新规则的作用。三、 删除记录a) 打开一个有数据的表格,点击记录左侧的小矩形,这样记录便被逻辑删除b) 进行物理删除,打开“表”菜单,选择彻底删除,便可以实现“物理删除四、 任务在我们建立的表中添加适量数据,
10、以方便后续操作.实验四 使用命令操作数据库一、 数据库及表操作1) 创建数据库:Create DataBase stumanage2) 创建表:Create table classes(cid I AutoInc primarykey,classname c(20))Create Table student(stuid c(10) primary key,stuname c(10),sex c(2) check sex=男 or sex=女 error “此数据只能为男或女” default 男,classid I,foreign key classid tag classid referen
11、ces classes)3) 修改表结构:ALTER TABLE classes add teacher c(6)ALTER TABLE classes alter teacher c(8)ALTER TABLE classes rename teacher to managerALTER TABLE classes drop manager4) 在当前工作期中打开要使用的表:USE classes或select classes5) 插入数据:insert into classes(classname)values(2004级1班)insert into classes(classname)v
12、alues(2004级2班)insert into classes(classname)values(2004级3班)6) 浏览数据:browse或display或list,会发现使用display时只显示第一条记录,这时需要使用范围语句 display all,大家可以使用条件语句看一下结果。7) 查看当前记录各信息:? recno() 显示当前记录号? Bof()&查看记录指针是否在最前?Eof()&查看记录指针是否在最后skip 1使记录指针向前滚动一条? recno()?Bof()?Eof()goto top&使记录指针移到顶端? recno()?Bof()?Eof()8) 条件定位:
13、locate for cid=2? recno()9) 在学生表中插入数据:INSERT into student(stuid,stuname,sex,classid)values(20040101,zhang,男,1)INSERT into student(stuid,stuname,sex,classid)values(20040102,wang,女,2)10) 修改学生数据:update student set classid=3 where stuid=2004010111) 删除学生记录:DELETE FROM student where stuid=20040101LIST12)
14、恢复被逻辑删除的记录:RECALL all13) 再执行上面的删除命令后使用Pack命令,把记录从磁盘彻底删除。14) 执行查询:a) select * from studentb) select stuid,stuname from studentc) 向学生表中多插入几条记录d) select distinct sex from studente) select sex as 性别 from studentf) select * from student where stuid=20040101g) select * from student where stuid in(20040101
15、,20040102)h) SELECT from student where stuname like w%i) SELECT * from student where stuname like w_j) SELECT from student where stuname like _ak) select count() as 学生总数 from studentl) SELECT A.,B。classname from student A,classes B where A。classid=B。cidm) SELECT A。*,B。classname from student A inner
16、join classes B on A。classid=B。cidn) SELECT A。*,B.classname from student A right outer join classes B on A。classid=B。cido) SELECT * from student order by stuid descp) SELECT top 1 * from student order by stuid descq) Select count(*) as stucount,classid from student group by classidr) Select * from st
17、udent into cursor test15) 删除表:drop table studentdrop table classes16) 删除数据库:CLOSE ALLDELETE DATABASE stumanage二、 任务使用上面的命令在员工管理数据库表的添加一些记录实验五 表单设计一、 表单分析根据实验一中的项目功能分析,我们需要创建以下几个表单。1) 部分信息管理表单:实现对部分信息的添加、修改、删除等管理2) 员工信息管理表单:实现对员工信息的添加、修改、删除等管理3) 管理员管理表单:实现对管理员的添加、删除等管理4) 当前用户密码修改表单:修改当前用户的密码和真实姓名5) 信
18、息提示表单:当启动软件时显示提示信息6) 提示信息设置表单:设置提示信息7) 登录表单8) 系统设置表单9) 关于表单二、 使用向导创建表单1) 打开员工管理项目,这里需要注意的是,VFP软件有可能对中文目录支持不太好,如果出现类似问题,请把项目放在一个英文目录中。2) 在项目管理器中选择文档(documents),选择表单,并新建.3) 选择使用向导,这里有两项,一项是表单向导,另一个是一对多表单向导,可以看出我们也可以使用向导产生基于两个表的表单。4) 选择使用到的表字段,这里实现管理员管理的表单,所以选择Manager表中的所有字段.5) 选择表单样式,使用默认即可。6) 选择排序字段,
19、这里也可以不选择。7) 最后一步,设置表单标题并设置保存,在项目文件夹下建立forms文件夹,并把表单保存在内。8) 最终效果如下:9) 在我们的创建的数据库中,部门表与员工表之间存在一对多关系,使用向导自己建立一个一对多的表单。三、 使用表单设计器修改表单使用向导生成的表单有时不能满足我们的需要,这时,我们需要使用表单设计器来完善表单的设计。下面我们来修改一下上面的表单。1) 选择我们刚才创建的表单,进行修改2) 下面是表单设计器,同时会打开表单控件面板和属性面板3) 选择表格控件,并在表单中单击,把控件添加到表单中。4) 使用表格生成器来使表格与数据表之间绑定.5) 选择显示的字段.6)
20、设置显示样式7) 修改表格字段显示的标题。8) 点击OK完成修改,关闭设计器并保存修改,使用项目管理器运行表单查看最终效果。9) 对于由向导生成的控件,可以通过属性面板进行修改,如改变标题显示(caption)。10) 通过上述方式,多加测试,掌握表单设计的基本方法。四、 完成其他表单1) 部门信息管理:这里要用到一个Activex控件,方法是,打开“工具菜单,选项中选择控件面板,找到如下图的控件:后从控件面板中选择如下:就可以看到我们选择的组件,拖放到表单中就可以了。2) 员工信息管理3) 登录表单4) 管理员管理表单5) 用户密码修改表单6) 提示信息管理表单7) 提示信息添加表单,这里用
21、了一个时间控件,如TreeView控件一样,自行添加进来即可。8) 提示信息显示表单实验六 编写代码本实验分三次完成,主要实现程序的所有代码,了解程序开发过程及代码开发技巧.一、 创建系统主程序主程序是所编写程序的入口,主要设置运行环境、定义变量、常量,然后调用其他表单,本程序文件保存为main。prg。CLEARCLEAR ALL把系统菜单隐藏掉SET SYSMENU off程序运行时不允许使用ESC键退出SET ESCAPE OFF关闭命令显示SET TALK OFF*覆盖时不要确认SET SAFETY OFF*设置时间格式,使用四位显示年代SET CENTURY onSET DATE Y
22、MD*定义一个公共变量,保存当前用户信息PUBLIC curuser调用登录表单DO FORM formslogin进入事务处理,当执行clean events时结束READ events当结束循环时执行退出quit二、 编写登录表单的代码打开实验五中已经制作的Login表单,修改控件相应属性.控件属性值组合框NameunameRowsourcemanager。unameRowsourcetype6-fieldsStyle2-dropdown list文本框NameUpwdPasswordchar*表单AutocenterTrueBorderstyle2-固定对话框ClosbleFCaptio
23、n用户登录controlboxFMaxButtonFMinButtonFNameFrmloginShowwindow作为顶层表单Windowtyp模式选中表单,从属性面板中找到init事件,添加如下代码:*定义一个公共变量来保存登录次数PUBLIC logincountlogincount=0双击登录按钮,打开按钮的click事件:IF ALLTRIM(thisform。uname。Value)=” thenMESSAGEBOX(”没有选择用户名!)ELSELOCATE FOR uname=ALLTRIM(thisform.uname.value)IF ALLTRIM(thisform.upw
24、d.Value)=ALLTRIM(upwd) thencuruser=thisform.uname。valuethisform.ReleaseDO FORM formsmainreturnELSElogincount=logincount+1IF logincount3 thenthisform。upwd。Value=”thisform。upwd。SetFocusMESSAGEBOX(”您的密码输入错误,请重新输入!!”,16,”错误)ELSEMESSAGEBOX(对不起,错误次数已达3次,不能进入系统!!,16,”报歉”)thisform.ReleaseCLEAR EVENTSCLOSE A
25、LLquitendifendifENDIF为退出添加click事件:thisform。ReleaseCLEAR EVENTSquit三、 编写主表单程序代码主表单主要是起到调用其他表单的作用,在这里我们添加一个菜单和一个工具栏,从而了解如何创建表单与工具栏,以及如何在程序中使用它们。创建主表单,保存为main,设置属性如下:控件属性值表单AutocenterTrueCaption企业员工管理系统Height600Width600MDIformTNameFrmmainShowwindow作为顶层表单Windowtyp模式创建菜单,在项目管理器中选择“其他选项卡,选中菜单,新建:选择Menu,先制
26、作如图的菜单然后选择菜单“显示-常规选项”选中“顶层表单”,设计表单时要注意的问题是,需要生成,而且每一次改动后都需要生成,否则使用的菜单是未生成前的菜单。“菜单生成菜单”:好了,下面我们把菜单加入到主表单中去.打开主表单,添加“init”事件:DO menumain.mpr WITH this*这里的菜单地址,请根据自己的保存位置确定。这里保存到menu文件件下了。可以运行主表单看一下效果了。下面制作工具栏,选择“类”选项卡,新建类:从ToolBar类继承制作自己的工具栏,添加按钮,图片资源可以从FTP得到。设置Showwindow属性值为“在顶层表单中”.因为工具栏是与表单一级的对象,所以
27、表单中不能容纳工具栏,所以需要建立一个表单集来放置表单与工具栏,打开主表单,使用“表单”菜单中的“新建表单集”建立表单集对象,这时我们使用代码的方式把工具栏加入到主表单中去,设置表单集的init事件。PUBLIC isCreateToolbarisCreateToolbar=0再在Activate事件中添加如下代码:IF isCreateToolbar=0isCreateToolbar=1*加载类SET CLASSLIB TO libmyclass使用类创建对象this。AddObject(”tool1,”mytoolbar”)this.tool1.show把工具栏停放在表单的上部this.t
28、ool1。dock(0)endif这时运行主表单,效果如下:四、 编写管理员管理代码控件属性值表格NamegmanagerEnabledFalseRecordsourceManager表单BufferMode1Caption操作员管理NamefrmmanagerShowwindow在顶层表单中打开表单的数据环境,选择manager表。设置其属性.buffermodeOveride:2,Exlusive:True添加按钮的click事件:thisform。gManager。Enabled= 。T。APPEND BLANKGO bottomthisform.gManager。coLUMN1。tex
29、t1。SetFocusthisform。Refresh修改按钮的click事件:thisform。gManager。Enabled=。t.保存按钮的click事件:YN=MESSAGEBOX(确定保存,4+32,企业员工管理系统)IF YN=6 thenIF TABLEUPDATE(。f。)=.f. thenMESSAGEBOX(”保存出错”)ELSEthisform。RefreshENDIFENDIFthisform。gmanager。Enabled=。f.取消按钮的click事件:IF MESSAGEBOX(”确认取消,4+32,企业员工管理系统”)=6 thenTABLEREVERT(。
30、f.)ENDIFthisform.gmanager。Enabled=。f。thisform。Refresh删除按钮的click事件:IF MESSAGEBOX(”确定删除”,32+4,”企业员工管理系统”)=6 thenSELECT managerDELETEthisform。gmanager。RecordSource=nullPACKthisform.gmanager。RecordSource=manager”IF EOF()SKIP 1ELSEIF BOF()SKIPENDIFENDIFthisform。Refreshendif五、 提示信息添加代码控件属性值Date and timer
31、pickerNamemsgdate文本域namemsgcontent保存按钮click事件:SET DATE YMDSET CENTURY onmdate=TTOD(thisform。msgdate。_value)mcontent=ALLTRIM(thisform.msgcontent.Value)IF EMPTY(mdate) 。and。 EMPTY(mcontent) thenMESSAGEBOX(时间和内容都不能为空)returnENDIFIF MESSAGEBOX(”确定保存,4+32,企业员工管理系统”)=6INSERT INTO warning(emplyid,wtype,show
32、date,msg)values(0,0,mdate,mcontent)MESSAGEBOX(”提示信息已经添加到数据库中,64,企业员工管理系统”)thisform。Releaseendif取消按钮click事件:thisform。Release六、 编写管理信息代码此窗体的代码与管理员管理代码类似,所以可以很容易实现。控件属性值表格NamegmsgEnabledFalseRecordsourceManagerMousePointer1Arrow表单BufferMode1Caption操作员管理NameFrmmsgShowwindow在顶层表单中打开表单的数据环境,选择waring表。设置其属
33、性。buffermodeOveride:2,Exlusive:True添加按钮onclick事件:DO FORM forms/setmsgThisform。refresh修改按钮的onclick事件:IF MESSAGEBOX(确定保存修改信息”,4+32,”企业员工管理系统”)=6 thenIF TABLEUPDATE(.f.)=。f。 thenMESSAGEBOX(”保存出错,请检查”)ELSEthisform。RefreshENDifENDIFthisform.gmsg。Enabled=。f.取消按钮的onclick事件:IF MESSAGEBOX(确认取消,4+32,企业员工管理系统)
34、=6 thenTABLEREVERT(.f。)ENDIFthisform。gmanager。Enabled=.f.thisform.Refresh删除按钮的click事件:IF MESSAGEBOX(确定删除”,32+4,”企业员工管理系统)=6 thenSELECT waringDELETEthisform。gmanager。RecordSource=nullPACKthisform.gmanager.RecordSource=”waring”IF EOF()SKIP -1ELSEIF BOF()SKIPENDIFENDIFthisform。Refreshendif七、 今日提醒代码编写控件
35、属性值文本框Namemsgreadonlytrue多选框Nameisstart表单BufferMode1Caption今日提醒NameFrmtodayShowwindow在顶层表单中Windowtype1模式标签Namelmsg表单init事件:PUBLIC i,inumi=0inum=0SELECT warningCOUNT FOR showdate=DATE() to inumIF inum1 thenthisform。msg。Value=没有本日提醒”thisform。lmsg.caption=”没有提醒ELSESELECT warningSET FILTER TO showdate=D
36、ATE()go topi=1thisform。msg。ControlSource=”warning.msg”thisform。lmsg。caption=共有”+ALLTRIM(STR(inum)+”条提醒,第”+ALLTRIM(STR(i)+”条提醒thisform。Refreshendif下一条按钮单击事件:SELECT warningIF .not. EOF()SKIPi=i+1thisform。lmsg。Caption=”共有”+ALLTRIM(STR(inum))+条提醒,第+ALLTRIM(STR(i))+”条提醒”ENDIFthisform。Refresh确定按钮onclick事件
37、:IF thisform。isstart。Value=1UPDATE sys SET isstart=。f.ENDIFthisform。release八、 编写部门管理代码部门管理表单使用了一个ActiveX控件,如果想非常细致的了解此控件的使用方法,请参考FTP上给出的资料。控件属性值树型NamedepartTreeStyle7名称文本框NameEnamecontrolSourcedpname地址文本框NameEaddrcontrolSourcedpaddr电话文本框NameEphonecontrolSourcedpphone联系人文本框NameEpersoncontrolSourceDpp
38、erson表单BufferMode1Caption部门信息管理NameFrmdepartShowwindow在顶层表单中Windowtype1-模式同样要设置表单对应的depart表格的属性:buffermodeOveride:2,Exlusive:True首先我们给表单添加init事件:PUBLIC isedit定义一个变量来标识当前操作是添加还是修改PUBLIC dpid保存当前部门编码SELECT departGO topthisform。ename。Value=dpnamethisform。eaddr.Value=dpaddrthisform。ephone.Value=dpphonet
39、hisform.eperson。Value=dppersonthisform.eaddr。Enabled=。f.thisform。ename。Enabled=。f。thisform。eperson。Enabled=.f.thisform.ephone。Enabled=.f.thisform。Refresh给树形控件添加init事件this。Nodes.ClearSCAN IF topid = 0 Node = this.nodes。add(,1,”D+ALLTRIM(STR(id),ALLTRIM(dpname),) *加入根节点 ELSE Node =this。nodes。add(”D”+A
40、LLTRIM(STR(topid),4,”D”+ALLTRIM(STR(id),ALLTRIM(dpname),) ENDIF ENDSCAN树形控件的onclick事件:SELECT departLOCATE FOR id=VAL(SUBSTR(this。selectedItem。Key,2))dpid=idthisform.ename.Value=dpnamethisform.eaddr。Value=dpaddrthisform.ephone。Value=dpphonethisform.eperson.Value=dpperson添加按钮onclick事件:thisform.ename。V
41、alue=”thisform。eaddr。Value=thisform。ephone。Value=”thisform。eperson。Value=”thisform.eaddr。Enabled=。t.thisform.ename。Enabled=。t。thisform。eperson.Enabled=.t。thisform。ephone。Enabled=。t.isedit=”addthisform.Refresh删除按钮onclick事件:IF MESSAGEBOX(”确认要删除所选部门信息,4+32,企业员工管理系统)=6 thenDELETE FROM depart WHERE id=dp
42、idPACKthisform。departtree。Initthisform。RefreshENDif修改按钮onclick事件:thisform。eaddr.Enabled=。t。thisform.ename。Enabled=。t.thisform.eperson。Enabled=。t.thisform.ephone.Enabled=.t。isedit=mod”取消按钮onclick事件:thisform。ename。Value=dpnamethisform.eaddr.Value=dpaddrthisform.ephone。Value=dpphonethisform。eperson。Val
43、ue=dppersonthisform。eaddr。Enabled=。f.thisform。ename.Enabled=.f。thisform。eperson.Enabled=。f。thisform.ephone。Enabled=。f。保存按钮onclick事件:IF MESSAGEBOX(”确认要保存修改后的信息吗?”,4+32,企业员工管理系统)=6 thenIF isedit=”mod” thenename=ALLTRIM(thisform。ename.value)eaddr=ALLTRIM(thisform.eaddr。value)ephone=ALLTRIM(thisform.ephone.value)eperson=ALLTRIM(thisform。eperson.value)UPDATE depart SET dpname=ename,dpaddr=eaddr,dpph