摩托车修理管理系统设计案例 本节说明了怎样通过ⅥFP应用系统设计开发一个“摩托车修理管理系统”。某摩托车修 理厂根据业务发展的需要,决定建立一个“摩托车修理管理系统”,以取代人工管理。包含 以下目的:(1)能对摩托车修理有关的各类数据进行输入、修改与查询。(2)编制季度零件 订货计划。(3)打印摩托车修理发票和工资月报表 、系统设计需求 (一)数据需求 在调研的过程中,用户提供了该系统所需的输入和输出单据。输入单据包括修车登记单、 摩托车修理单、零件入库单和零件出库单等4种;输出单据包括季度零件订货计划、摩托车 修理发票和工资月报表等3种。各种单据如下列图所示。 修车登记单 编号:5001 期:9901/12 理项目火线圈 摩托车牌号A2020203型号F5130 生产厂南方摩托车厂 车主名个符 地址天福路六号 电话8787878 摩托车修理单 登记单编号:5005 摩托车牌号:A23123 修理项目修 送修山期p9/06/28 國零件号|00010004100050 数量 修理小时98.0 完工山期:9907/27 修理工:李平 零件入库单 期 F件号件名成本|数量 最低库存订货量
验收人 零件出库单 编号 山期 零件号 修理工 第1季度零件订货计划 F件号件名库存量{最低库存货量 10003离合器 (二)功能需求 功能分析的任务,是弄清用户对目标系统数据处理功能所提出的需求。根据系统目标和 数据需求并与用户充分讨论后,本例的功能需求可归纳为以下5个方面 数据登记 登记功能用于把各种手填单据中的数据及时登记到系统将要定义的表中,还要求能进 行修改。这些单据包括修车登记单、摩托车修理单、零件入库单和零件出库单。 摩托车修理发票 凵期:99/07/7 顾客姓名|志秋 地址 东方一路1005号 摩托车牌引A2312318 修理项目大修 送修山期p9/0628 尽件费 修理费235200
总金额24600 工资月报表 号姓名1理小时小时工资月工资 李平 800 800 0005陵意扬阝2 a00 240 2.査询。能査询登记单、修理单、摩托车、车主、修理工、零件库存的有关数据 3.编制并显示季度零件订货计划。编制零件订货计划需要找出要订货的零件,订货条 件为:零件库存量<最低库存量。订货量可山用户输入或修改 4.打印发票。发票中除包含顾客、摩托车及修理项目等数据外,还要计算出修车费, 修车费包括修理费和零件费,按下列各式计算: 零件费=∑(零件价格×耗用数量) 修理费=小时工资×修理工时×3 总计=零件费+修理费 不难看出,发票包含的信息来自修车登记单、摩托车修理单和零件出库单等各种单据 这是一项涉及面很广的功能。 5.打印修理工工资月报表。某修理工的月工资=∑修理小时×小时工资 (三)该摩托车修理管理系统的系统流程图如图A-31所示 图A-31摩托车修理管理系统流程图 二、数据库设计 数据厍设计的任务是确定系统所需的数据厍。数据库是表的集合,通常一个系统只需
个数据厍。数据库设计可分为逻辑设计与物理设计两个步骤。第一步确定数据厍所包含的表 及其宁段。第二步确定表的具体结构,即确定字段的名称、类型及宽度;此外还要确定索引, 为建立表的关联准备条件 (一)逻辑设计 设计从分析输入数据着手,输入数据中的某类相关数据可以归纳为一个表。对需要同时 调用的若干表,应使它们符合关联要求。数据库设计好后,可通过分析输出数据来验证其可 用性,若发现有的输出数据不能从输入数据导出,须继续向用户征集数据 根据季度零件订货计划、摩托车修理发票和工资月报表等输出单据的数据需求,从修车 登记单、摩托车修理单、零件入库单和零件出庳单等输入单据中归纳出包含6个表的数据厍。 现将这些表列出如下: (1)修理单:ⅫD(编号,牌号,工昱,修理项目,修理小时,送修凵期,完工凵期) (2)摩托车:QC(即昱,型号,生产厂,车主名) (3)车主:CZ(车主名,地址,电话) (4)修理工:ⅪLG(工号,姓名,地址,电话,出生凵期,进厂期,小时工资) (5)零件用量:LJY(编昱,零件号,数量) (6)零件库存:LJKC(零件号,零件名,成本,价格,库存量,最低库存,订货量 以上括号外的字符串是表名,括号内为字段名表,有下划线的字段为关联关键字。根 据系统数据处理的需要,这些表的关联情况如A-32所示。图中用矩形框表示表,需要关联 的两个表用线段连接,连线的一端标出了关联关键字,表明必须在这一端的表中建立索引。 车主名 摩托车 车主 牌号 修理单」工号修理工 编号 零件用量 零件号「零件库行 图A-32表间关系关的设定 (二)物理设计 下面列出摩托车修理管理系统所有表的结构与必须的索引,同时列出表的部分记录 修理单(C:\ QCXL XLD.DBF) 结构:xld(编号c(4),牌号ε(8),修理项目c(12),送修凵期d,完工山期d,工 号c(4)普通索引,修理小时n(4·1) 录号编号牌号修理项目送修山期完工山期工号修理小时 15001A2020203点火线圈 0l/12990l15/99 2.0 25002R1212T23 刹车 02/059902/10/99 0005 3500H210-100喷漆 02069902/13/99 0001 6.0 45004K333667换转动轴050899O5599 18.0 55005A2312318 大修 06289907799 0001980 2.摩托车(C: LQCXLIQC. DBF) 结构:QC(牌号c(8)普通索引,型号c(6),生产厂c(20),车主名c(8))
记录: 记录号 种号 型号 生产厂 车主名 A2020203 南方摩托车厂 李符 1212123 东环摩托车制造厂马一鼎 H210-100 C12-5 国光轿车厂 孔力 K333-66 FG3Z3 福铃货车总厂 贾嘉丁 NA122 全球摩托车厂 施志秋 3.车主(C: AQCXL CZ DBF 结构:CZ(车主名c(8)普通索引,地址c(16),电活c(7)) 记录 记录号 车主名 地址 电话 李符 岭分路18号 8787878 马一鼎 鸿飞路10号 孔力 虎山路15弄15号 3456789 贾嘉丁 法平路213号 3344556 施志秋 东方一路1005号 6665578 4.修理工(C: \QCXLXLGDBF) 结构:xlg(工号c(4)普通索引,姓名c(8),地址c(16),电话c(7),出生 凵期d,进厂凵期d,小时工资n(5.2)) 记录 记录号工号姓名 地址 电话出生凵期迸厂口期小时工资 10002赵小红虹桥路202号15室1234567060560050283 20003韩将荣光路71弄1号 222233311/08/7203/0292 30004宋若雪高峰路21号 434343d0803/5606/02/80 40005凌意扬扬高路12号2401 70707070404/6903/2090 7.00 50001李平南京路1617弄53号 876543212/12/5308Ol/73 5.零件用量(C: QCXLILJYL. DBF) 结构:liyl(编号c(4)普通索引,零件号c。(6),数量n(2) 记录 记录号 零件号 数量 5005 100001 5005 100004 5005 100005 6.零件库存(C: QCXLYLJKC. DBF) 结构:lke(零件号c(6)普通索引,零件名c(10),成本n(8.2),价格n(8.2) 厍存量n(3),最低厍存n(3),订货量n(3)) 记录 记录号零件号零件名成本价格厍存量最低库存 订货量 1100001前灯 2100002方向盘 3100003离合器 59800650.003 4100004活塞环 143.00156.00 5100005反光镜 15.0017.00
除上述6个表外,零件入厍、出库时还需有暂存表。零件入库表为 LURK DBF,其结 构与 LJKC. DBF相同。零件出库表(C: QCXLILJCK. DBF)的结构为:lick(零件号c(6), 数量n(2)) 三、应用程序设计 (一)总体设计 按照功能分类是总体设计中常用的方法,系统的总体结构可用层次图( Hierarchy Chart,简称比C图)来表示。这种图自上而下进行分层:第一层为系统层,通常对应主程序 第二层为子系统层,一般起分类控制作用,但是当该层没有下一层次时也可直接用来表达功 能(例如图中的查询功能):第二层为功能层:第四层为操作层。 图A-33所示的摩托车修理管理系统有3个层次,系统功能分类如下:修车登记单、摩 托车修理单和修理工数据管理等数据的输人与修改归人登记一类,零件订货计划、零件入库 和出库归入零件管理一类,查询与打印各成一类。图中未画出操作层,该层次的程序模块将 在模块设计时列出 图A-33总体结构图 (二)初始用户界面设计 从总体结构图很容易列出应用程序的菜单,山总体结构图转换到菜单时,其对应情况如 下:系统层对应菜单文件,子系统层对应菜单标题;功能层则对应子菜单项。 (三)模块设计与编码 1.主文件(QCXL.PRG) 菜单文件名定为 QCXLCD(摩托车修理菜单),并设置一个主文件来调用它 主文件代码编写如下 SET TALK OFF SET DEFA T0c:qcx&&设置文件默认路径,本例所有文件都应装在该目录中 CLEA ALL SET VIEW TO s jhj.vue&统一设置数据环境,自动关闭所有的工作区后打开视图文件 PUBLIC ldh, zIji &x1dh用于存储输入的修理单号:zljf存储总零件费,打印 发票时用 xld=SPACE(4) DO FORM fm &&显示封面(参阅例7-1,并事先将fm表单复制到C:\qcx1) KEYB’{CTRL+F4 &关闭 Command窗 MODI WIND SCREEN TITL’摩托车修理管理系统’&&打开VFP主窗口并设置窗口标题 CLEA
以上为例始化环境代码 Do qcxlcd mpr &菜单文件名定为 QCXLCD(摩托车修理菜单) READ EVENT &建立事件循环 退出VFP *恢复环境代码设置在"退出"菜单项中 程厅中用到的SJHJ(数据环境).VE文件,须事先打开数据工作期来建立。该视图文 件为应用程序设置了如图A-34所示的数据环境 图A-34摩托车修理管理系统的数据环境 菜单程序( QCXLCD.MPR) 往命令窗口键人命令 MODI MENU QCXLCD,就会出现菜单设计窗口,此时可按图A·1 建立菜单。 (1)“退出”菜单项的命令 CLEAR EVENTS&停止事件循环,转去执行 READ EVENT后的命令 2)从菜单文件 QCXLCD.MNX生成菜单程序 QCXLCD.MPR。 3.“修车登记”表单(XCDJ.SCX) 修车登记表单用于输入、修改或添加修车登记单,它只有以下特点:①将多个表的输入 修改、添加等多种维护功能集于一体,并使屏幕显示与修车登记单格式一致,方便用户操作。 这种风格在本系统中将始终俫持。②能提供翻页和寻页两种方式来査找修车登记单。寻页按 钮供用户直接键入ⅫLD.编号来査找记录。③增页按钮用于增加新的修车登记单,登记单编 号自动加1,并可增加新的摩托车与车主。④若输入的摩托车牌号在QC.DBF中已有,则摩 托车与车主的数据会自动填入表格。这不仪可减少输入击键,而且减少了输入出错机会。自 动填入的数据还允许立即修改,此时系统会史新有关的表,即具有实时维护摩托车与车主数 据的能力。⑤设有专用按钮,可当场临时维护摩托车与车主数据。 (1)创建表单。往命令窗口键入命令 MODIFY FORM cdj,使出现标题为xcdj.scx 的表单设计器窗口(见图A-35)
图A-35“修理登记”表单窗口 (2)Form1的属性设置。 Caption属性设置为“修车登记”: AutoCenter属性设置为.T. 使表单在VFP主窗口内居中显示(本例其它表单均须设置为居中显示,下文不再一一列出) (3)按图A-35在表单上创建各标签和文本框。在数据环境中添加ⅪD,QC和CZ等3 个表(不必关联),然后将下列9个字段分别拖到表单窗口中规定的位置,产生各相应的标 签和文本框:ⅫLD表的编号、送修山期、修理项目和烨号等字段,QC表的型号、生产厂和车 主名等字段,CZ表的地址和电话字段 从数据环境来产生标签和文本框,不仪速度快,而且标签的 Caption和№ame属性、文 本框的Name属性都会自动设定与源字段有关的名字,文本框也会自动与源表中的源字段绑 定。例如图中显示txt牌号的文本框系拖动XLD表的牌号字段产生,其Name属性值为txt牌 号,且 Controlsource属性值为xld.牌号。上述控件中仪牌号和车主名两个文本框需设置 事件代码 ①txt牌号文本框(已与xld.牌号绑定)的 Valid事件代码如下 若在该文本框中输入新牌号,q表中就会自动增加该牌号 seLe qo LOCA FOR牌号=x1d.牌号 IF NOT FOUND ( INSERT INTO gc(肿号) VaLUES(xld.牌号) &在qc表木尾添加一个记录,并将x1d.号存入新记录的牌号字段 ENDIF ②txt车主名文本框(已与qc.车主名绑定)的 Valid事件代码如下 若在该文本框中输入新车主名,cz表中就会自动增加该车主名 SELE LOCA FOR车主名=x1d.车主名 IF NOT FOUND () INSERT INT0cz(车主名) VALUES(qc.车主名) &在Cz表木尾添加一个记录,并将qc.车主名存入新记录的车主名字段 ENDIF (4)添加表格线条:利用表单控件工具栏的线条按钮画出表格的所有横线和竖线。 (5)创建命令按钮组。在表单底部居中创建一个包含下页、上页到确定等10个命令按 钮的命令按钮组,其对象名为 Commandgroup1。其事件代码如下 SELE xId
DO CASE CASE This Value=1 &&下页 IF RECN( 1 SKIP -1 END I CASE This Value=3 &&首页 GO TOP CaSe This value=4 &&木 CASE This, value=5 &&寻页 D0 FORM srxldh&&调用表单,以输入修理单号;返回后寻页按钮获得焦点 Case This Value=6 &&增页 zy= MESSAGEBOX(’是要增页吗?,1+48+256,’确认增加修理单’) &&对话框含确定和取消按钮,惊叹号图标:第2个按钮(取消按钮)是默认 按钮 IF Zy=1 &&确定按钮 GO BOTT &为得到当前最大编号 INSERT INTO Xld(编号) VALUES(STR(VAL(编号)+1,4) &&在xld表木尾添加一个记录,并将编号加1后的值存入新记录的编号字段 ENDIE CASE This Value=7 &&删页 sy= MESSAGEBOXC是要删页吗?’,1+48+256,’确认删除修理单’) IF sy=l &&确定按钮 DELETE ENDIF BROW TITL’摩托车修改’+SPAC(20)+’单击行首可打删除标记,退出就删去 CASE This Value=9 SELE C: BROW TITI’车主修改+SPAC(20)+单击行首可打删除标记,退出就删去 PACK CASE This Value=10 Thisform. Release Thisform. Refresh ②寻页按钮的 Got Focus事件代码 SELE XId
JIh=RECN ( &&保存当前记录号 LOCA FOR编号=TRIM(x1dh)&&若查到,记录指针就指向指定的记录 IF NOT FOUND WAIT WINDOW“无此编号! Go jIh &&恢复记录指针指向 ENDIF THISFORM. Refresh 执行“修车登记”表单(XCDJ.SCX)时,只要单击寻页按钮,VFP就会执行 Do FORM srxldh 命令来打开一个供输入修理单号的表单(见图A-36),等输入结束关闭 SRXLDH表单后,再 执行本段的 GotFocus事件代码。关于 SRXLDH表单的设计请看下文 图A-36“输入修理单号”表单窗口 4.“输入修理单号”表单( SRXLDH (1)创建表单:往命令窗口键入命令 MODIFY FORM SrX ldh,使出现表单设计器窗口(参 阅图A-36) (2)属性设置:Form1的 Caption属性为“输入”; Label1的 Caption属性为“请输入 修理单号:”; Command1的 Caption属性为“确定”。 (3)Text1文本框的 Lostfocus事件代码编写如下:Xdh= THISFORM.Text1 VALUE (4) COmmand1命令按钮的 Click事件代码编写如下: THIS FOR M. Release 5.“摩托车修理”表单(QCXL.SCX) 摩托车修理表单的功能是输入或修改修理小时、完工山期和修理工工号,并且能同时显 示修车登记单的主要信息及零件用量。本例假定修车耗用的零件已在零件出库时登记,故这 甲仪要求显示零件用量,而不是登记 (1)创建表单 往命令窗口键入命令 MODIFY FORM gcx1,使出现表单设计器窗口(参阅图A-37)