汽车修理管理系统的设计与开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“汽车修理管理系统”的开发
描述一个“汽车修理管理系统”的全过程。
10.2.1 需求分析
某汽车修理厂根据业务发展的需求,决定建立一个“汽车修理管理系统”,以取代人工操作管理。
开发项目如下:
(1)能对汽车修理有关数据进行输入、修改和查询。
(2)编制季度零件定货计划。
(3)打印汽车修理发票和工资月报表。
用户提出开发应用系统要求后,软件开发者应通过调查研究归纳目标系统的数据需求和功能需求。
一、数据需求
在调研的过程中,用户提供了该系所需的输出、输入单据(参阅图10.2~10.3)。
输入单据包括修车登记单,汽车修理单,零件入库单和零件出库单等4种;输出单据包括零件定货计划,汽车修理发票和月工资报表等3种。
不少单据都填写过数据,但却正合开发人员的需要,因为这为数据库设计提供了样例。
修车登记单
编号:5001 日期:99/01/12
修理项目点火线圈
汽车牌号A2020203 型号S130 生产厂南方汽车厂
车主名李符地址岭分路18号电话8787878
图10.3汽车修理单
汽车修理单
登记单号:5005 汽车牌号;a2312318
修理项目大修送修日期99/06/28
零件号10001 10004 10005
数量2 5 2
修理小时98.0
完工日期:99/07/27 修理工:李平
图10.4 零件入库单
零件入库单
零件号零件名成本数量价格最低库存量定货量
验收人:
图10.5 零件出库单
零件出库单
编号:日期:
零件号
数量
修理工:
图10.6 零件定货计划
第1季度零件定货计划
零件号零件名库存量最低库存定货量
10003 离合器3 4 2
二、功能需求
功能分析的任务,是弄清用户对目标系统数据处理功能所提出的需求。
根据系统目标和数据需求并与用户充分讨论后,本例的功能需求可分为以下几个方面。
1.数据登记
登记功能用于把各种单据的数据即时登记到系统奖要定义的表中,还要求能进行修改,这些单据还包括修车登记单、汽车修理单、零件入库单和零件入库单。
图10.7 汽车修理发票
顾客姓名施志秋地址东方路1005号
汽车牌号A2312318 修理项目大修
送修日期99/06/28 备注
零件费894.0
修理费2352.0
总金额3246.0
月工资报表
工号姓名修理小时小时工资月工资
0001
0005
2.查询
能查询登记单,修理单,汽车,车主,修理工,零件库存的有关数据。
3.编制并显示季度零件定货计划
编制零件定货计划需要找出要定货的零件,定货条件为<最低库存量。
定货量可由用户输入和修改。
4.打印发票
发票中除包含顾客、汽车及修理项目等数据外,还要计算出修车费,修车费包括修理费和零件费,按下式计算:
零件费=∑(零件价格*耗用数量)
修理费=小时工资*修理工时*3
总计=零件费+修理费
不难看出,发票包含的信息来自修车登记单和汽车修理单和零件出库单的各种单据,这是一向涉及面很广的功能。
5.打印修理工工资月报表
某修理工的月工资=∑修理小时*小时工资
10.2.2数据库设计
数据库设计的任务是确定系统所需的数据库。
数据库是表的集合,通常一个系统只需要一个数据库。
前以谈到,数据库设计可分为逻辑设计和物理设计两个步骤。
第一步确定数据库所包含的表极其字段。
第二步确定表的具体结构,及确定字段的名称,类型及宽度;此外还要确定索引,为建立表的关联准备条件。
一、逻辑设计
设计从输入数据着手,输入数据中的某类相关数据可以归纳唯一个表。
对需要同时调用的若干表,应使它们符合关联要求。
数据库设计好后,可通过输入数据类印证其可用性,若发现有的输出数据不能从输入数据导出,需继续向用户征集数据。
本例根据季度零件定货计划、汽车修理发票和月工资报表等输出单据的数据需求,从修车登记单,汽车修理单,零件入库单和零件出库单等输入单据中归纳出包含6个表的数据库现将这些表例如下:
a 修理单:xld(编号牌号工号修理项目修理小时送修日期完工日期)
b 汽车:q
c (牌号型号生产家车主名)
c 车主:cz(车主名地址电话)
d 修理工:xlg(工号姓名地址电话出身日期进厂日期小时工资)
f 零件用量:ljyl(编号零件号数量)
g 零件库存:ljkc (零件号零件名成本库存量最地库存量定货量)
以上括号外的字符是表名,括号内为字段名表,第一个字段为关联关键字。
根据系统数据处理的需求,这些表的关联情况如图10.9所视。
图中用矩行框表示表,需要关联的两个表用线段联接,连线的一端标出关键字,表明必须在一端的表中建立索引。
下面对以上设计说明两点:
1为同时调用表中的数据,需将其关联起来,故有时应该在表中添加字段。
例如仅从修理的
角度而言,qc.dbf包含牌号,型号和生产厂3个字段以很完整,单打印发票时要用到车主名和地址,为了qc.dbf与cz.dbf能以车主名关联,在qc.dbf中需增加车主名字段。
2.数据库设计必须注意合理性。
如将不同的数据放进同一表中,可能回产生数据冗余。
例如将qc.dbf与cz.dbf 的字段合并为一个表,由于一个车主可以拥有多辆车,在登记这些汽车的牌号、型号和生产厂的同时也要登记车主的车主名,地址和电话,那么这些记录中车主信息将重复记载。
数据冗余会多站存贮容量,更糟的是还会破坏数据的一致性。
如果车主易名,只要一处忘记修改,将来查询或打印是可能会输出不一样的数据。
表的分拆往往能减少数据冗余,单表个数的增多又会增加程序的复杂性,因为须在不同的工作区打开这些表,而且为了实现数据连用还要对表进行关联。
二、物理设计
下面列出汽车修理管理系统所有的表结构和索引,为读者理解本例系统,顺便一列出表部分记录。
1.修理单(c:\qcxl\xld.dbf)
结构:
xld(c(4),c(12),d,d,c(4)n(4,1))
记录:
记录号编号牌号修理项目送修日期完工日期工号修理小时
1 5001 A2020203 点火线圈01/12/99 01/15/99 0003 2.0
2 5002 R121212
3 刹车02/05/99 02/10/99 0005 3.2
3 5003 H210-100 喷漆02/06/99 02/13/99 0001 6.0
4 5004 K333-667 换转动轴05/08/99 05/15/99 0003 18.0
5 5005 A2312318 大修06/28/99 07/27/99 0001 98.0
2.汽车(C:\QCXL\QC.DBF)
结构
qc (牌号c(8)普通索引,型号c(6),生产厂c(20),车主名c(8))
记录
记录号牌号型号生产厂车主名
1 A2020203 S130 南方汽车厂李符
2 R121212
3 760 东环汽车制造厂马一鼎
3 H210-210 C12-5 国光轿车厂孔力
4 K333-667 FG323 V 福铃货车总厂贾嘉丁
5 A2312318 NA122 全球汽车厂施志秋
3.车主(C:\QCXL\CZ.DBF)
结构
cz(车主名c(8)普通索引,地址c (16),电话c(7))
记录:
记录号车主名地址电话
1 李符岭分路18号8787878
2 马一鼎鸿飞路10号5656555
3 孔力虎山路15弄15号3456789
4 贾嘉丁法平路213号3344556
5 施志秋东方一路1005号6665578
4.修理工(C:\QCXL\XLG.DBF)
结构:
xlg(工号c(4)普通索引,姓名c(8),地址c(16),电话c(7),出生日期d,进厂日期d,小时工资n(5.2)) 记录:
记录号工号姓名地址电话出生日期进厂日期小时工资
1 000
2 赵小红虹桥路202号15室1234567 06/05/60 05/02/8
3 7.50
2 000
3 韩将容光路71弄1号5室2222333 11/08/72 03/02/92 6.50
3 000
4 荣若雪高峰路21号4343434 08/03/56 06/02/80 9.00
4 000
5 凌意扬杨高路12号2401 7070707 04/24/69 03/20/90 7.00
5 0001 李平南京路1617弄53号8765432 12/12/53 08/01/73 8.00
5.零件用量(C:\QCXL\LJYL.DBG)
结构:
ljyl(编号c(4)普通索引,零件号(6),数量n(2))
记录:
记录号编号零件号数量
1 500
2 10000
3 1
2 5005 100001 2
3 5005 10000
4 5
4 500
5 100005 2
6.零件库存(C:\QCXL\LJKC.DBG)
结构:
ljkc(零件号c(6)普通索引,零件名c(10),成本n(8.2),价格n(8.2),库存量n(3),量底库存n(3),定货量n(3))
记录:
记录号零件号零件名成本价格库存量最低库存定货量
1 100001 前灯35.00 40.00 4
2 20 12
2 100002 方向盘77.70 80.00 15 5 2
3 100003 离合器598.00 650.00 3
4 2
4 100004 活塞环143.00 156.00 60 2
5 4
5 100005 反光镜15.00 17.00 100 30 14
除了上述6个表外,零件入库、出库时还须有暂存表。
10.2.3应用程序设计
一、总体设计
按照功能分类时总体设计中常用的方法,系统中总体结构可用层次图来表示(参阅图10.10)。
这种图自上而下进行分层:第一层为系统层,通常对应主程序;第二层围子系统层,一般分来控制作用,但是单该层没有下一层的时候,可以直接表达功能,第三层为功能层,第四层为操作层。
图10.10所视的汽车修理管理系统有3个层次,系统功能分类如下:修车登记单,汽车修理单和修工数据管理等的输入和修改归入登记一项,零件定货计划,零件定货和出货归入零件
管理一类,查询和打印各成类图中未画出操作层,该程序的模块将在模块设计时列出。
二、初始用户界面设计
从总体结构图很容易列出应用程序的菜单,由总体结构图转化到菜单时,其对应的情况如下:系统层对菜单文件;子系统对应菜单标题;功能层对应子菜单项。
图10.11是汽车修理管理系统下拉菜单的示意图,说明如下;(1)本例使用菜单作为初始界面,并设置一个主文件来调用菜单程序。
(2)若该用表单作为初始界面可以在表单上设置若干按钮来表示各子系统的功能。
对于图中附加的菜单项,下文将进行设计与编码。
三、模块设计与编码
本小节将对“汽车修理管理系统”主要模块的设计与编码作简要说明。
1.主文件(qcxl.prg)
菜单文件名定为qcxlcd(汽车修理菜单),并设置一个文件来调用它。
主文件代码如下:
SET TALK OFF
其实物理设计就系统表结构的建立
SET DEFA TO c:\qcxl &&设置文件默认路径,本例所有文件都应装在该目录中
CLEA ALL &&统一设置数据环境,自动关闭所有的工作区后打开视图文件
SET VIEW TO sjhj.vue &&xldh用于存储输入的修理单号;zljf存储总零件费,打印发票时用PUBLIC xldh,zljf
xldh=SPACE(4)
DO FORM fm &&显示封面(参阅例7—1,并事先将fm表单复制到C:\qcxl)
KEYB`{CTRL+F4}` &&关闭command窗口
MODI WIND SCREEN TITL`汽车管理系统` &&打开VEP主窗口并设置窗口标题CLEA
*以上为初始化环境代码
DO qxlcd.mpr &&菜单文件名定为QCXLCD(汽车修理菜单)
READ EVENT &&建立事件循环
QUIT &&退出VEP
*恢复环境代码设置在“退出”菜单项中。
程序中用到的SJHJ (数据环境).VUE文件,须事先打开数据工作期来建立。
该视图文件为应用程序设置了如图10.12所示的数据环境,它满足图10.9中表间关联的要求,另外还打开了LJRK表和LJCK表。
顺便说明,为简单计,本例所用的表都是自由表。
2.菜单程序(QCXLCD.MPR)
往命令窗口键入命令MODIMENU QCXLCD,就会出现菜单设计窗口,此时可按图10.11建立菜单。
(1)“退出”菜单项命令
CLEAR EVENTS &&停止事件循环,转去执行READ EVENT后的命令
(2)按图10.11设置调用各表单命令,例如对“修车登记”菜单项可键入DO FORM xcdj。
(3)从菜单文件QCXLCD.MNX生成菜单程序QCXLCD.MPR。
3.“修车登记”表单(XCDJ.SCX)
修车登记表单用于输入、修改或添加修车登记单,它具有以下特点:
a.将多个表的输入、修改、添加等多种维护功能集于一体,并使屏幕显示与修车登记单格式
一致,方便用户操作。
这种风格在本系统中将始终保持。
b.能提供翻页和寻页两种方式来查找修车登记表单。
寻页按钮供用户直接键入XLD.编号来查找记录。
c.增页按钮用于增加新的修车登记单,登记单编号自动加1,并可增加新的汽车与车主。
d.若输入的汽车牌号QC.DBF中已有,则汽车与车主的数据会自动填入表格。
这不仅可减少输入击键,而且减少了输入出错机会。
自动填入的数据还允许立即修改,此时系统会更新有关的表,即具有实时维护汽车与车主数据的能力。
e.设有专用按钮,可当场临时维护汽车与车主数据。
现将设计XCDJ.SCX表单的主要操作步骤列表如下:
(1)创建表单
往命令窗口键入命令MODIFY FORM xcdj,使出现标题为xcdj.scx的表单设计器窗口。
(2)FORM1的属性设置
Caption属性设置为“修车登记”;AutoCenter属性设置为.T.,使表单在VFP主窗口内居中显示(本例其它表单均须设置为居中显示,下文不再一一列出)。
(3)按图10.13在表单上创建个标签和文本框
在数据环境中XLD,QC和CZ等3个表(不必关联),然后将下列9个字段分别拖到表单窗口中规定的位置,产生个相应的标签和文本框:XLD表的编号、送修日期、修理项目和牌号等字段,QC表的型号、生产厂和车主名等字段,CZ表的地址和电话字段。
从数据环境来产生标签和文本框,不仅速度快,而且标签的Caption和Name属性、文本框Name的属性都会自动设定与源字段有关的名字,文本框也会自动与源表中的源字段绑定。
例如图中显示txt牌号,且Controlsource属性值为xld.牌号。
上述控件中仅牌号和车主名两个文本框需设置事件代码。
a.txt牌号文本框(已与xld.牌号绑定)的Valid事件代码如下:
*若在该文本框中输入新牌号,qc表中就会自动增加该牌号
SELE qc
LOCA FOR牌号=xld.牌号
IF NOT FOUND()
INSERT INTO qc(牌号)V ALUES(xld.牌号)
&&在qc表末尾添加一个记录,并将xld.牌号存入新记录的牌号字段
ENDIF
b.txt车主名文本框(已与q
c.车主名绑定)的Vaild事件代码如下:
SELE cz
LOCA FOR 车主名=xld.车主名
IF NOT FOUND()
INSERT INTO cz(车主名)V ALUES(qc.车主名)
&&在cz表末尾添加一个记录,并将qc.车主名存入新记录的车主名字段
ENDIF
(4)添加表格线条:利用表单控件工具栏的线条按钮画出表格的所有横线和竖线。
(5)创建命令按钮组
在表单底部居中创建一个包含下页、上页到确定等10个命令按钮的命令按钮组,其对象名为Commandgroup1。
下面列出为它编写的事件代码。
mandgroup1的Click事件代码:
SELE xld
DO CASE
CASE This.Value=1 &&下页
IF RECN()〈RECC()
SKIP
ENDI
CASE This.Value=2 &&上页
IF RECN()〉1
SKIP-1
ENDI
CASE This.Value=3 &&首页
GO TOP
CASE This.Value=4 &&末页
GO BOTT
CASE This.Value=5 &&寻页
DO FORM srxldh &&调用表单,以输入修理单号;返回寻页按钮获得焦点
CASE This.Value=6 &&增页
zy=MESSAGEBPX(`是要增页吗?`,1+48+256,`确认增加修理单`)&&对话框含确定和取消按钮,惊叹号图标;第二个按钮(取消按钮)是默认按钮
IF zy=1 &&确定按钮
GO BOTT &&为得到当前最大编号
INSERT INTO xld(编号)V ALUES(STR(V AL(编号)+1,4))&&在xld标末尾添加一个记录,并将编号加1后的值存入新记录的编号字段
ENDIF
CASE This.Value=7 && 删页
sy=MESSAGEBOX(`是要删页吗?`,1+48+256,`确认删除修理单`)
IF sy=1 &&确定按钮
DELETE
PACK
ENDIF
CASE This.Value=8
SELE qc
BROW TITL‘汽车修改’+SPAC(20)+‘单击行首可打删除标记,退出就删去’
PACK
CASE This.Value=9
SELE cz
BROW TITL`车主修改`+SPAC(20)+`单击行首可打删除标记,退出就删去`
PACK
CASE This.Value=10
Thisform.Release
ENDC
Thisform.Refresh
b.寻页按钮的GotFocus事件代码:
SELE xld
jlh=RECN()&&保存当前记录号
LOCA FOR 编号=TRIM(xldh)&&若查到,记录指针就指向指定的记录
IF NOT FOUND()
WAIT WINDOW “无此编号!”
GO jih &&恢复记录指针指向
ENDIF
THISFORM.Refresh
执行“修车登记”表单(XCDJ.SCX)时,只要单击寻页按钮,VFP就会执行DO FORM srxdh命令来打开一个供输入修理单号的表单,等输入结束关闭SRXLDH表单后,再执行本段的GotFocus事件代码。
关于SRXLDH表单的设计请看下文。
4.输入修理单号表单(srxldh.sc)
(1)创建表单:往命令窗口键入命令modify form srxldh,使出现表单设计器窗口(参阅10.14)。
(2)属性设置:form1的caption属性为输入;lable1的caption的属性为请输入修理单号:command1的caption 属性为确定。
(3)text1文本框的lostfocus事件代码编写如下:
xld=thisform.text1.value
(4)command1的命令窗口按钮的click事件代码编写如下:
thisform.release
5。
汽车修理表单(qcxl.scx)
汽车修理表单的功能使输入或修改修理小时,完工日期和修理工工号,并且同时显示修车登记单的主要信息及零件用量。
本例假定修车耗用的零件已在零件出库时登记,故这里紧要显示零件用量,而不是登记。
(1)创建表单
往命令窗口中键入命令modify form qclx,使出现表单设计器窗口(参阅图10.15)。
(2)form1的属性设置
将caption属性设置为汽车修理.修理情况。
(3)按图10.15在表单上创建各标签和文本框。
在数据环境中添加xld,xlg和ljyl 等3个表(不必关联),然后分别将xld比哦啊的编号,送修日期,修理项目,牌号,修理小时和完工日期等6个字段拖到表单窗口中规定的位置,从而产生相应的标签和文本框。
创建text1~text8等8个文本框,其中text1~text4分别用于存取ljyl的零件号,text5~text8分别用于存取这些记录的数量。
下文为form1的fresh事件编写的过程代码,侧用来实现将从ljyl表查到的零件号和数量逐项存取到文本框中。
将关于xld表编号,送修日期,修理项目和牌号字段的文本框,text1~text8等文本框的readonly 属性都设置为.t.已就是说,仅xld报表的修理小时和完工日期字段允许编辑字段。
(4)在xlg 表选取修理工的工号,并存入xld.工号
在表单上创建combol组合框,并设置以下属性:
rowsourcetype:6 (字段)
rowsoure:xlg. (显示xlg.工号,xlg.姓名2个字段)
columncount:2 (显示2列)
controlsource ;xld.工号(数据与xld。
工号绑定)
boundcolumn:1 (绑定第1列)
(5)form1的refrsh事件代码编写如下:
thisfrom.text1.value=""
thisfrom.text2.value=""
thisfrom.text3.value=""
thisfrom.text4.value=""
thisfrom.text5.value=0
thisfrom.text6.value=0
thisfrom.text7.value=0
thisfrom.text8.value=0
*以上八个命令将文本框值初始化,以免翻页后保持显示旧值。
sele ljyl
loca for =xld.编号零件用量表的编号是否相同
if foun()
thisfrom.text1.vaule =零件号ljyl表当前记录的零件号字段值赋值给text1
thisform.text5.value= 数量ljyl表当前记录的数量字段值赋给text5
endi
cont
if not eof()
thisform.text2.value=零件号
thisform.text6.value=数量
endi
cont
if not eof()
thisform.text3.value=零件号
thisform.text7.value=数量
endi
if not eof()
thisform.text4.value=零件号
thisform.text8.value=数量
endi
(6)创建命令按钮
在表单底部居中创建一个包含下页、上页到确定等6个命令按钮的命令按钮,其对象名为Commandgroup1。
Commandgroup1的Click事件代码编写如下:
SELE xld
DO CASE
CASE This.Value=1 &&下页
IF RECN()SKIP
ENDI
CASE This.Value=2 &&上页
IF RECN()>1
SKIP-1
ENDI
CASE This.Value=3 &&首页
GO TOP
CASE This.Value=4 && 末页
GO BOTT
CASE This.Value=5 &&寻页
DO FORM srxldh &&调用表单,以输入修理单号;返回后寻页按钮获得焦点
CASE This.Value=6
Thisform.Release
ENDC
Thisform.Refresh
图10.15中画表格线,以及某些标签的设置和标签标题的修改不再细述。
6.“零件定货计划”表单(LJDH.SCX)
在表单上设置一个列表框供选定季度,确定季度后能显示LJKC表中库存量小于最低库存的零件信息及其定货量。
定货量也可以当场修改。
为简单计,确定的季度并不作为筛选记录的条件,仅用于在表单窗口标题栏中显示。
(1)创建表单:往命令窗口键入命令MODIFY FORMlidh,使出现表单设计器窗口。
(2)按图10.16在表单上创建label1标签和list1列表框各一个。
(3)创建变量属性jd(表示“季度”):用表单菜单的新建属性命令创建一个变量属性jd,然后在属性窗口将该变量属性的初值设置为“1”。
(4)属性设置:见表10.2。
(5)List的Init 事件代码编写如下:
*在列表框中增入季度号选项
THIS.Additem(“1”)
THIS.Additem(“2”)
THIS.Additem(“3”)
THIS.Additem(“4”)
(6)List的DblClick事件代码编写如下:
SELE ljkc
COUNT FOR库存量<最低库TO jls &&jls意为记录数
IF jls=0
MESSAGEBOX(‘库存量均小于最低库存,第‘+jd+’季度不需订货’)
ELSE
SET FILT TO 库存量<最低库存
BROW FIEL零件号:R,零件名:R,库存量:R,最低库存:R,定货量;
TITLE‘第’+jd+’季度零件订货计划’&&仅订货量可修改,其余字段为只读
SET FILT TO
ENDI
7.“打印发票”表单(DYFP.SCX)
(1)创建表单:往命令窗口键入命令MODIFY FORM dyfp,使出现表单设计器窗口(2)按图10.17在表单上创建Label1标签Text1文本框和Command1命令按钮各一个。
(3)属性设置:将Form1的Caption属性设置为“打印发票”;将Command1命令按钮的Caption属性设置为“确定”。
(4)Text1的LostFocus事件代码编写如下:
xldh=THISFORM.Text1.V ALUE
(5)Command1的Click事件代码编写如下:
SELE xld
LOCA FOR编号==TRIM(xldh)&&若查到,记录指针就指向指定的记录
IF NOT FOUND()
WAIT WINDOW“无此编号!”
ELSE
SELE liyl
SUM数量*likc.价格FOR编号=TRIM(xldh)AND 零件号=ljkc.零件号TO zlif
*liyl与ljkc.表已用零件号关联;zljf为总零件费
*初始时SET TALK 已置OFF,否则执行SUM命令dyfp表单上将会显示求和结果
REPO FORM fp PREV &&调用报表文件fp.frx来预览发票,zljf将赋值给报表变量lif THISFORM.Release &&释放dyfp.scx
ENDIF
8.“发票”报表(FP.FRX)
“打印发票”表单(DYFP.SCX)中须调用报表文件FP.FRX,其设计步骤简述如下:
(1)创建报表:在命令窗口键入命令MODIFY REPORT fp,使出现fp.frx报表设计器窗口。
(2)创建报表变量ljf(零件费)和xlf(修理费):选定报表菜单的变量选项-->在“要存储的值”与“初始值”文本框中均键入zljf。
可用类似的方法来创建xlf报表变量,但在“要存储的值”与“初始值”两框中均键入:xld.修理小时*xlg.小时工资*3(参阅上文10.2.1功能需求中关于发票的计算公式)。
(3)在报表设计器窗口中创建表达式控件:用报表控件工具栏中的域控件按钮创建如图10.18所示的9个表达式控件,它们分别是xld.完工日期,qc.车主名,cz.地址,xld.
牌号,xld.修理项目,xld.送修日期,lif,xlf和ljf+xlf。
ljf和ljf+xlf两个表达式控件创建时,在报表表达式对话框中的格式文本框均设置9999.99。