The Design and Implimentation of General Query Form in Visual FoxPro 胡 明(佛山科学技术学院计算机系,广东佛山 528000) HU Ming(Foshan University,Foshan Guangdong 528000,China) 摘 要:本文介绍了在Visual FoxPro中实现通用查询表单的一种方法,并给出了源程序。 关键词:通用查询,组合查询,表单,Visual FoxPro ABSTRACT:This paper introduces a method to design and Impliment general query form in Visual Foxpro,and gives out source code. KEYWORDS:General Query;Combined Query;Form;Visual Foxpro 1 引言 在数据库应用系统设计中查询占有很重要的地位,因为数据库应用系统主要包括数据维护、查询、报表、统计等功能。对用户而言,需要有查询功能,便于管理。Visual Foxpro中可以用查询设计器以及SQL语言实现查询,但这些方法在做查询设计时要用到表文件的字段名,编写出的查询程序通用性差,使用者必须掌握Visual FoxPro中的查询设计器或SQL语言,而且当查询不同的表文件或按不同的字段查询时需重新设计查询程序。为此,笔者设计了一个通用的查询表单,只需改变使用的表文件名即可。 2 设计思想 通用查询表单设计界面如图1所示。表单中使用了两个组合框Combo1、Combo2和一个文本框Text1。Combo1用于显示表文件的字段名,Combo2用于显示符号,Text1用于输入查询条件值。表格控件Grid1用于显示查询到的记录。 本例中使用的表文件为:rsxx.dbf,表文件中有六种类型的字段:C(字符型)、N(数值型)、L(逻辑型)、D(日期型)、M(备注型)、G(通用型)。备注型及通用型字段通常不做查询,为了仅将C、N、L、D四种类型的字段的字段名自动显示在Combo1中,需要先生成rsxx.dbf表文件的结构文件jgwj.dbf,结构文件中的第二个字段保存的就是原表文件字段的字段类型,由此可判断出原表文件各字段的类型,用additem方法可将字段名显示在Combo1控件中。在“查询”按钮的click事件代码中,先要根据所选择的字段名、符号及输入的值生成条件表达式bds,然后应用set filter to &bds语句来过滤Grid1中显示的数据即可;不同数据类型的字段,条件表达式的写法是不同的,详细描述见源程序。 设计中为了判断字段的类型用到了表文件rsxx.dbf的结构文件jgwj.dbf。结构文件是一种特殊的表文件,它是针对某个表文件的,用于保存该表文件的结构内容,当前选定表内每个字段的信息被复制到新表(结构文件)的一条记录中。新表的结构在格式上固定,由16个字段组成,前四个字段为:FIELD_NAME、FIELD_TYPE、FIELD_LEN和FIELD_DEC,分别对应于字段描述项的字段名、类型、宽度和小数位数。结构文件的记录是所对应的那个表文件的字段描述内容。不同表文件的结构文件之间其差别只在于数据记录的不同。生成结构文件的命令格式为:copy to <结构文件名> structure extended 3 具体实现 3.1 表单设计界面 图1 通用查询表单设计界面 3.2 表单数据环境 在表单数据环境中添加表:rsxx.dbf。 3.3 属性设置 表1 通用查询表单属性设置 表1 通用查询表单属性设置
3.4 事件代码 (1)表单Form1的Load事件代码 set century on &&年份用四位表示 set date to ymd &&日期格式为年、月、日 set mark to "-" &&指定显示日期表达式时所使用的分隔符 set safety off &&在删除结构文件时不显示对话框 erase jgwj.dbf &&删除表结构文件 (2)表单Form1的Unload事件代码 *在表单释放时关闭结构文件 select jgwj use (3)Combo1的Init事件代码 *在组合框中列出表文件中的C、N、L、D四种类型的字段 select rsxx a=fcount() &&计算表文件的字段个数 public dimension zu[a,2] copy to jgwj structure extended &&生成结构文件 select 0 use jgwj i=1 do while i<=a zdm=fields(1) &&得到字段名 zu[i,1]=&zdm &&将字段名赋值给数组 zdlx=fields(2) &&得到字段类型 zu[i,2]=&zdlx &&将字段类型赋值给数组 *将C、N、L、D四种类型的字段的字段名列出在组合框中 if &zdlx="C" or &zdlx="N" or &zdlx="L" or &zdlx="D" thisform.combo1.additem(alltrim(&zdm)) endif i=i+1 skip enddo (4)Combo2的Init事件代码 *组合框中增加各种符号 this.additem("=") this.additem("<") this.additem("<=") this.additem(">") this.additem(">=") this.additem("<>") (5)“查询”按钮的click事件代码 select rsxx jls=fcount() &&计算字段个数 s1=alltrim(thisform.combo1.value) &&字段名 s2=alltrim(thisform.combo2.value) &&符号 s3=alltrim(thisform.text1.value) &&查询值 *对选定的字段名判断字段类型 i=1 do while i<=jls if s1=alltrim(zu(i,1)) zdlx=zu(i,2) &&字段类型 endif i=i+1 enddo *判断输入数据的合法性,并组成条件表达式 do case case zdlx="C" &&字符型字段 bds=s1+s2+(" '&s3' ") &&查询条件表达式 case zdlx="N" &&数值型字段 if type(s3)="N" bds=s1+s2+s3 else messagebox("基本工资应为数值型!","提示") cancel endif case zdlx="L" &&逻辑型字段 if s3="t" or s3="T" or s3="y" or s3="Y" s3="t" else if s3="f" or s3="F" or s3="n" or s3="N" a3="f" else messagebox("输入错误!"+chr(13)+"逻辑真:T、t、Y或y"; +chr(13)+"逻辑假:F、f、N或n","提示") cancel endif endif bds=s1+s2+"."+("&s3")+"." case zdlx="D" &&日期型字段 s3y=substr(s3,1,4) &&年份 s3m=substr(s3,6,2) &&月份 s3d=substr(s3,9,2) &&日 s35=substr(s3,5,1) &&间隔符号 s38=substr(s3,8,1) &&间隔符号 if s35<>"-" or s38<>"-" or (not between(s3y,"1900","2100")) ; or (not between(s3m,"01","12")) or (not between(s3d,"01","31")) messagebox("日期输入错误!" +chr(13) +"示例: 2004-08-01","提示") cancel endif bds=s1+s2+"{^"+("&s3")+"}" endcase *显示满足条件的记录 set filter to &bds thisform.refresh 3.5 运行结果 查询1977年9月以前出生的记录后,结果如图2所示。 图2 通用查询表单运行结果 4 结束语 本程序在Visual FoxPro 6.0中调试通过,如果表文件发生了改变,只需改变以下地方即可:改变表单数据环境中的表文件;在表格的RecordSource属性中重新设置新的表文件作为数据源;在Combo1的init事件代码中将select rsxx的表文件名rsxx改为新的表文件名;在查询按钮的click事件代码中将select rsxx的表文件名rsxx改为新的表文件名。读者稍加修改就可以设计出符合自己要求的任意查询、通用查询、组合查询表单,并方便地应用到自己的应用系统中去。它具有通用性,能快速设计出查询表单。 |
|
来自: happyngkmw > 《foxpro编程》