1、2019/6/28,1,1,主讲:王学军 电话:13773990898(移动校园网) 电邮: 办公地点:系部办公楼(原学生1号宿舍楼)507,Visual FoxPro教程,2019/6/28,2,第2章 VFP数据库管理系统概述,在数据库方面:严格区分了数据库与表概念、引入复合索引技术、引入SQL命令 在数据操作方面:多种数据交换手段、支持众多与其他应用程序进行数据交换的文件格式 在程序设计方面:可视化、支持面向对象 在操作使用方面:功能完善的集成环境,VFP是基于Windows平台上的可视化数据库管理系统,具有功能强大、操作简便、可视化强、面向对象等许多特点。,2019/6/28,3,本章
2、要点,Visual FoxPro的操作环境 Visual FoxPro文件类型 Visual FoxPro的项目管理及其操作 Visual FoxPro语言基础,2019/6/28,4,2.1 VFP操作环境,2.1.1 Visual FoxPro操作界面,2019/6/28,5,2.1 VFP操作环境,标题栏 菜单栏 工具栏 主窗口 命令窗口 状态栏,2.1.1 Visual FoxPro操作界面,2019/6/28,6,2.1 Visual FoxPro的操作环境,斜体字:通常指命令的操作对象或参数 方括号:可选项,若使用则可使命令具有某一功能 省略号:前一语法成份可重复多次 竖线:前后语
3、法成份选择其一 如:DELETE FILE FileName|?RECYCLE,2.1.2 命令说明,1. 命令的语法格式说明,注:较长命令可在命令窗口中按Ctrl+Enter键以换行输入,在程序中可用英文标点分号(;)换行输入绝大多数命令中的关键字(包括函数名)可用其前4个字符代替命令后面可用“&”引导命令的注解,2019/6/28,7,*和& ?和? CLEAR DIR MD/RD/CD COPY FILE|RENAME|DELETE FILE TO RUN QUIT,2. 几个常用命令,2019/6/28,8,2.1 Visual FoxPro的操作环境,2.1.3 配置Visual F
4、oxPro操作环境,2019/6/28,9,2.1 Visual FoxPro的操作环境,2.1.3 配置Visual FoxPro操作环境,2019/6/28,10,2.2 Visual FoxPro文件类型,2019/6/28,11,2.3 VFP的项目管理及其操作,在命令窗口中使用CREATE PROJECT命令CREATE PROJECT FileName|? 使用“文件”菜单中“新建”菜单项 使用“常用”工具栏上的“新建”按钮,软件开发是一个系统工程,一个应用系统就是一个工程项目,而一个项目就是一个系统中文件、数据、文档等对象的集合。在VFP中,系统提供一个“项目管理器”的图形化界面
5、来管理项目。项目管理器是VFP的管理中心。用户可通过以下任一种方法来创建项目:,2019/6/28,12,2.3 VFP的项目管理及其操作,“折叠/展开”按钮,页面,列表项,命令按钮,2019/6/28,13,2.3 VFP的项目管理及其操作,全部:后5个页面中的项全部列在一起 数据:包含项目中所有的数据文件项,如数据库、自由表、查询和视图等 文档:包含处理数据时全部文档,如表单、报表和标签等。 类:包含表单和程序中所有的类库和类 代码:包含了程序、API库和二进制应用程序 其他:包含了菜单文件、文本文件和其他文件,2.3.1 页面,2019/6/28,14,2.3 VFP的项目管理及其操作,
6、2.3.2 定制项目管理器,2019/6/28,15,2.3 VFP的项目管理及其操作,2.3.3 项目管理器的操作,1. 命令按钮,新建 添加 修改 移去 连编,运行 浏览 关闭 打开 预览,2019/6/28,16,2.3 VFP的项目管理及其操作,2.3.3 项目管理器的操作,2. 快捷菜单命令,包含/排除 设置主文件 重命名 编辑说明 项目信息,3. 项目间共享文件,通过与其他项目共享文件,可以重用在其他项目开发上的工作成果。但要注意,被共享的文件并未被复制,项目只是存储了对该文件的引用。一个文件可以同时属于不同的项目。,2019/6/28,17,2.4 Visual FoxPro语言
7、基础,2.4.1 数据类型,数据类型是数据的基本属性,对数据进行操作的时候,只有同类型的数据才能进行操作,若数据类型不同,系统判为语法错误。,数据类型是指数据对象的取值集合,以及对之可施行的运算集合。在VFP中,创建表时需要用户指明表中每个字段的数据类型,变量或数组的数据类型则由保存在其中的值来决定。,2019/6/28,18,字符型(Character)由任意字符(字母、数字、空格、符号等)组成 【注】在使用时需加上英文半角的单引号或双引号,另外,对于数字组成的编码(如学号、身份证号、电话号码、邮政编码等)应视为字符型处理。 数值型(Numeric)由09、(+)、(-)、(.) 组成。 【
8、注】小数点和小数位数是字段总长的一部分。,2.4 Visual FoxPro语言基础,2.4.1 数据类型,2019/6/28,19,货币型(Currency)使用其类型,需在数字前加上美元符号($) 日期型(Date)用于存储日期类数据。日期型变量以“yymmdd”字符格式保存(8字节)。 【注】 日期默认格式为mm/dd/yy,具体格式取决于环境设置。 日期时间型(DateTime)格式: yyyy / mm / dd hh:mm:ss am/pm 逻辑型(Logical)“真”(.T.)或 “假”(.F.) 浮点型(Float)与数值型等价,只是为了提供兼容性。,2019/6/28,20
9、,双精度型(Double)只能用于数据表中的字段定义,位数固定, 小数点的位置由输入的数值决定。 整型(Integer)用于数据表中的字段定义。 备注型(Memo)用于表中存储数据块。 【注】表中记录的备注字段数据保存在单独的文件中,与表名同名,扩展名为(.FPT) 通用型(General)用于存储OLE对象。 【注】OLE是Object Linking and Embedding的缩写,直译为对象连接与嵌入 。通用字段包含一个4字节的引用,它指向该字段真正的内容。,2019/6/28,21,名称中只能包含字母、下划线(_)和数字符号和汉字符号 名称的开头只能是字母、汉字或下划线,不能是数字
10、除了自由表的字段名、索引标识的长度最多10字符,其余的名称长度可为1128个字符 应避免使用VFP系统的保留字 例:2x、2_x、num-of-xs、nSum&Score、_aver#gz、use是不合法的。,2.4 Visual FoxPro语言基础,2.4.2 常量与变量,1. 名称命令规则,2019/6/28,22,定义:在数据处理过程中其值不发生变化的量 分类:(根据其数据类型) 数值型:即常数,由数字、小数点和正负号构成 字符型:即字符串,需“定界符”括起来。 【注】 在VFP中,定界符有 、“ ”、 三种 单、双引号必是英文半角下的 定界符必成对匹配 如定界符本身也是字符串内容则用
11、另一定界符表示 空串(“”)和空格字符串(“ ”)是不同的 字符串中字母的大小写不等价。,2. 常量,2019/6/28,23,货币型:以 $ 符号开头,无俘点表示法,占8个字节 逻辑型: .T. 、.t.、.Y.、.y. 或 .F.、.f.、.N.、.n.(”.”是定界符,不能省) 日期型和日期时间型:用 括起来传统格式:mm/dd/yy hh:mm:ss a/p严格格式:yyyy/mm/dd hh:mm:ss a/p 【注】 VFP6.0及以上版本的默认格式为严格的日期格式。 VFP3.0不支持严格的格式, VFP5.0支持空日期值用 表示,空日期时间值用:表示,2019/6/28,24,
12、(1)变量的创建内存变量不需要声明。它的创建是通过赋值来完成,并且同时确定了该变量的数据类型。赋值方法: STORE TO 可为多个 = 只为一个 (2)控制变量访问变量的作用域:即变量使用的有效范围 局部变量(Local)只能在创建它们的程序中被访问,其他程序不能访问此变量的数据。当其所属程序停止时,局部变量将被释放。,3. 内存变量,2019/6/28,25, 私有变量(Private):定义当前过程的变量,并将以前过程定义的同名变量保存起来,在当前过程中使用私有变量而不影响这些同名变量的原始值。 全局(公有)变量(Public):任何运行的程序都能访问全局变量和全局数组。在命令窗口创建的
13、任何 变量自动具有全局属性。 (3)变量访问当变量和字段名同名时,字段有优先被访问权。要在变量名前加m. 以示区别。举例说明 (4)内存变量的保存与恢复SAVE TO FileNameALL LIKE Skeleton|ALL EXCEPT SkeletonRESTORE FROM FileName ADDITIVE,2019/6/28,26,数组是由一系列被称为元素的有序数据值构成,可以用序号引用这些元素。在VFP中,一个数组中的数据不必是同一种数据类型。常用的有一维数组、二维数组。 (1)数组的声明(方式)DECLEAR, DIMENSION (私有)PUBLIC (全局)LOCAL (局
14、部) 例如:Dimension x(3) x(1),x(2), x(3)Dimension a(2,2) a(1,1), a(1,2), a(2,1), a(2,2) Public xy(4),xz(5,2) 定义一个一维数组xy和一个二维数组xz,4. 数组,2019/6/28,27,(2)为数组元素赋值数组同变量一样可以拥有任意数据类型。 数组在声明以后,每个数组元素的默认值为逻辑值.F.。例1:DIMENSION Arr(6,3)Arr(1,2)=123Arr=456例2:设有打开表kc(kcdm,kcmc,kss,lx,xf,yxzydm),当前记录为4012 现代汉语 选修课程 3
15、110302 4012DIMENSION xy(2,4)SCATTER TO xy则数组元素xy(1)xy(6)的值分别是以上当前记录的值,而xy(7)和xy(8)的值为.F.,2019/6/28,28,【注】Scatter To命令和Copy To Array命令均是用于将当前打开表中记录的值传递到数组元素中,但用法有区别: Scatter To 命令是将当前打开表的当前记录的值分别赋予数组中各元素;而 Copy To Array命令是将当前打开表中的记录按物理顺序将第1条记录的值赋给数组中第1行各元素,第2条记录的值赋给数组中第2行各元素,以此类推。Gather From命令和Append
16、 From Array命令是用于将数组元素的值传递到当前打开的表中。用法可参照以上两个命令。,2019/6/28,29,字段变量是数据库管理系统中的一个重要概念。它与记录一纵一横构成了数据表的基本结构。字段变量就是指数据表中已定义的任意一个字段。字段变量的数据类型与该字段定义的类型一致。,5. 字段变量,6. 对象,对象是类的实例,类是对象的抽象。VFP对象可以是表单、表单集或控件,每个对象都有其属性和方法,并能响应特定的事件。可以通过对象的事件、属性和方法来处理对象。若要创建对象,可以通过表单设计器创建,或使用CREATEOBJIECT( )函数创建。,2019/6/28,30,7. 不同数
17、据存储容器的作用域,数据的作用域(即数据的作用范围)取决于在程序中声明的方式和位置。,2019/6/28,31,2.4 Visual FoxPro语言基础,2.4.3 Visual FoxPro系统函数,所谓函数,就是针对一些常见问题预先编好的一系列子程序,当应用时遇到此类问题就可以调用相应的函数,也就是执行相应的函数子程序。由于一个函数接受一个或多个参数而返回单个值,因此函数可嵌入到一个表达式中。参数:是供函数或过程操作的一个值。函数作为VFP语言的组成部分,要想正确地使用它们,必须从函数的功能、语法及返回值等方面去掌握。,2019/6/28,32,ABS(表达式) MAX(表达式1,表达式
18、2,) MIN(表达式1,表达式2,) INT(表达式) MOD(表达式1,表达式2) 【注】求表达式1除以表达式2的余数,表达式1(被除数)中的小数位数决定了返回值的小数位数;表达式2(除数)决定了返回值的正负号。 例: ? MOD(36,10)? MOD(4*9),(90/9)? MOD(25.250,5.0)? MOD(23,-5)? MOD(-23,-5),1. 数值函数,2019/6/28,33,ROUND(表达式1,表达式2)将表达式1四舍五入取值,表达式2为正数,表示小数点右边四舍五入的位置,如果表达式2是负数,则表示小数点左边零的个数。 例: SET DECIMALS TO 4
19、SET FIXED ONCLEAR?ROUND(1234.1962 , 3) &1234.1960?ROUND(1234.1962 , 2) &1234.2000?ROUND(1234.1962 , 0) &1234.0000?ROUND(1234.1962 , -1) &1230.0000?ROUND(1234.1962 , -2) &1200.0000 SQRT(表达式) RAND() 返回一个01之间的随机数,2019/6/28,34,ALLTRIM(表达式)例: ?ALLTRIM( AD B G )TRIM(表达式)例: ?TRIM( AD B G ) LEN(表达式)例: ?LEN(
20、abcdef) AT(表达式1,表达式2 ,n) 例: ?AT(b,abcde) ?AT(a,abcdae) ?AT(a,abcdae,2) 【注】注意AT()和ATC()区别,2. 字符函数,2019/6/28,35,SUBSTR(表达式,n,m)例:?SUBSTR(ABCDEF,2,4) LEFT(表达式,n)例:?LEFT(abcdef,2) RIGHT(表达式,n)例:?RIGHT(abcdef,3) SPACE(n) 返回指定个数(n)的空格,3. 日期与时间函数,DATE()、TIME()、DATETIME() YEAR()、MONTH()、DAY() DOW(),2019/6/2
21、8,36,ASC(表达式) CHR(表达式) VAL(表达式)例: ?VAL(“31.15”) 31.15 【注】若字符表达式的第一个不是数字,也不是“+”、“-”,则返回0。 STR(表达式,n,m)例: ?STR(314.15) 314,默认宽度10?STR(314.15,5) 314,前导2个空格?STR(314.15,5,2) 314.2?STR(314.15,2) * 数值溢出?STR(1234567890123) 1.234E+12,4. 数据类型转换函数,2019/6/28,37,CTOD( )、CTOT( ) 例: ?CTOD(01/02/98 ) 01/02/98 ?CTOD
22、(01/02/98) 01/02/98 ?CTOT(01/02/98 10:10:30)01/02/98 10:10:30Am DTOC(表达式 ,1 )和TTOC (表达式 ,1/2) 【注】“1” 表示结果中无分隔符“/”,“2”表示只返回时间部分。例: ?DTOC(1998/01/02) 01/02/1998?DTOC(1998/01/02,1) 19980102 ?TTOC(1998/01/02 10:12:20,2) 10:12:20 AM ?TTOC (1998/01/02 10:12:20,1) 19980102101220,2019/6/28,38,BETWEEN(表达式1,表
23、达式2,表达式3) 【注】如果上界或下界为NULL,则为NULL 例:?BETWEEN(3,14,15) .F.?BETWEEN(a,A,b) .F.?BETWEEN (A,a,b) .T. INKEY(秒数) 例:?INKEY(20)?INKEY(0) TYPE(表达式) 【注】表达式必须用引号。,5. 其他常用函数,2019/6/28,39,例:?TYPE(123) N?TYPE(DATE() D?TYPE (.T.) L?TYPE(abc) U不确定?TYPE(“x“) C IIF(表达式1,表达式2,表达式3) 例:?IIF(DOW(DATE()=1 OR DOW(DATE()=7,今
24、天休息,今天上班) DISKSPACE() FILE(文件名) 例:?FILE(a:datajs.dbf),2019/6/28,40,MESSAGEBOX(显示文本,对话框类型,标题) 【注】对话框类型=按钮值+图标值+默认按钮值, 标题在默认情况下显示“Microsoft Visual FoxPro” 例: ?MESSAGEBOX(是否重试?,4+32+256,提示) 【注】该函数缩写为MESSAGEB(),具体用法示例。 GETFILE(文件的扩展名,文本) 【注】如果包含单一扩展名,只显示具有此扩展名的文件;可以包含由分号“;”分隔的文件扩展名列表如只包含分号“;”同,则显示所有不带扩展
25、名的文件可包含通配符(* 和?),2019/6/28,41,例:?GetFile(DBF,表文件名),2019/6/28,42,在 VFP中,运算符可分为数值运算符、 字符运算符、日期/时间运算符、关系运算符和逻辑运算符,相应的表达式也就称为数值表达式、 字符表达式、日期表达式、关系表达式和逻辑表达式此外,还有一种特殊表达式名称表达式。,2.4 Visual FoxPro语言基础,2.4.4 运算符与表达式,运算符是用于同类型数据间的运算(如若类型不同,一般要先转换类型);表达式是通过运算符将数据组合起来可以运算的式子,其运行结果为单个值。,2019/6/28,43,按优先级由高到低排列( )
26、、*或、*、/、%、+、-,1. 数值运算符与表达式,“+” 连接 如: ?”Visual”+”FoxPro”?”姓名:”+xs.xm ?xs.ximing+xs.xm“-” 连接,同时删除左侧字符串尾部空格?xs.ximing xs.xm“$”运算,查看一个串是否包含在一个串中,结果是一个逻辑值。,2. 字符运算符与表达式,2019/6/28,44,3.日期和日期时间运算符(“+”、“-”),日期-日期 结果是天数(数值型)?1999/12/19 1999/11/16 日期+天数 结果是日期型数据?1999/11/16+33 日期-天数 结果是日期型数据?1999/12/19 33,4.关系
27、运算符与表达式,、=、或#或!=、=或=、=比较字符串时,系统对两个字符串中的字符从左向右逐个进行比较,一旦发现两个对应字符不同,就根据这两个字符的排序序列决定两个字符串的大小。,2019/6/28,45,【注】设置字符的排序序列 字符序列的设置分为三种情况: Machine(机器)序列:按机器内码顺序排列,由小到大是:空格、大写字母、小写字母。 PinYin(拼音)序列:汉字按拼音顺序,对于西文,由小到大是:空格、小写字母、大写字母。 Stroke(笔画)序列:汉字按书写笔画的多少,对于西文,由小到大是;空格、小写字母、大写字母。,2019/6/28,46,系统默认的字符序列为“PinYin
28、”,可在“选项”对话框中“数据”选项卡中设置,也可用SET COLLATE TO命令更改。 例: SET COLLATE TO “Machine“ ?AB,aA, A .T. .F. .T.SET COLLATE TO “PinYin“ ?AB,aA,A .T. .T. .T. 字符串精确比较使用“=”进行字符串比较时,受SET EXACT命令的影响。当SET EXACT OFF(默认值)时,如果“=”右边的字符串长度比左边的短,则左边取右边长度比较;当SET EXACT ON时,首先将字符串短的一边尾部加上空格,使两边相等后比较。,2019/6/28,47,例:,2019/6/28,48,N
29、OT或! 逻辑“非”,用于取反一个逻辑值 AND 逻辑“与”,用于对两个逻辑值“与”操作 OR 逻辑“或”,用于对两个逻辑值“或”操作,5.逻辑运算符与表达式,【注】VFP的逻辑表达式是自左向右进行运算的。运算过程中,当运算出某个中间结果后,若已经能够确定最终结果,将终止本逻辑表达式中后面部分的运算。如: ?3*510 AND ab .F.,2019/6/28,49,6.名称表达式,名称表达式是由圆括号括起来的一个字符表达式,用来替换命令函数中的名称,从而为VFP命令和函数提供了灵活性。下面是使用名称表达式的一些示例。,替换文件名dbf_name=“js”USE (dbf_name) &等价于
30、use js 替换变量名例:nvar=100var_name=“nvar“STORE 123.4 TO (var_name)?nvar &结果123.4,2019/6/28,50,作为函数参数str=“Visual FoxPro“str_var=“str“?SUBSTR(str_var),1,6) &结果为Visual 用字符表达式来构成一个名称表达式db_name=“jxsj“dbf_name=“js“USE(db_name+“!“+dbf_name) &等价于USE jxsj!js,【注】在使用名称表达式时,名称表达式不能出现在赋值语句的左边。如下面命令在过程执行时报错:var_name=
31、“nVar”(var_name)=100,2019/6/28,51,7.宏替换,宏替换与名称表达式具有相似的作用,可使用宏替换的方法用内存变量替换名称。使用宏替换时,将连字符(&)放在变量前,告诉VFP将此变量值当作名称使用,并使用一个句号(.)来结束这个宏替换表达式。如:nVar=100var_name=“nVar”STORE 123.4 TO &var_name,【注】宏替换与名称表达式都可以用变量或数组中的值来替换名称,但宏替换的使用范围更广些,有些地方只能用宏替换而不能用名称表达式,它们的主要区别示例如下:,2019/6/28,52,宏替换可以用以构成表达式,而名称表达式不能作为其他表
32、达式的组成部分。如:field_name=“js.xm”LOCATE FOR &field_name=“程东萍” LOCATE FOR (field_name)=“程东萍” 在某些命令和函数中不能使用名称表达式。如:var_name=“cVar3”&var_name=“test2” (var_name)=“test2” STORE “test1” TO (var_name) ?&var_name &结果为test1(变量cVar3的值)?(var_name) &结果为cVar3,2019/6/28,53,等价于没有任何值 与0、空字符串(“)及空格不同 排序优先于其他数据 在计算过程中或大多数
33、函数中都可以用到NULL值 NULL值会影响命令、函数、逻辑表达式和参数的行为。 在VFP中,可通过程序设计中的.NULL.标记,或在字段中以交互方式键入Ctrl+0来赋NULL值。 可使用ISNULL()函数判断字段或变量是否为NULL值,或一个逻辑表达式计算结果是否为NULL值。,2.4 Visual FoxPro语言基础,2.4.5 空值处理,2019/6/28,54,2.4.5 空值处理,1.作为值使用空值,NULL值是一个特殊的值,它不同于空字符串、空格字符或0,这一点可通过EMPTY()、ISBLANK()、ISNULL()三个函数的不同返回值来理解。NULL值不是一种数据类型,当
34、给字段或变量赋NULL值时,该字段或变量的数据类型不变,只是值变为NULL。如:STORE 5 TO nXnX=.NULL.?TYPE(“nX”) &返回值为N(数值型),2019/6/28,55,2. 空值在命令和函数中的行为,2.4.5 空值处理,例如: ?NOT NULL 结果为NULL?8+NULL 结果为NULL?DATE()-NULL 结果为NULL,2019/6/28,56,【注】在表达式中遇到NULL值时,因空值不等于真(.T.),因而会将其解释为条件失败。,3. 在逻辑表达式中NULL的行为,2.4.5 空值处理,在大多数情况下,NULL值在逻辑表达式中维持不变。,2019/6/28,57,以命令传递NULL值将产生错误。 将NULL作为有效值的函数,将向结果传递NULL值。 向应该接收数值型参数的函数传递,NULL值,将产生错误。 向下列函数传递NULL值时反返回假(.F.):EMPTY()、 INBLANK()、ISLOWER()、ISUPPER()、ISALPHA()、ISDIGIT(),但ISNULL()返回真(.T.),4. 使用NULL作为参数,2.4.5 空值处理,2019/6/28,58,Thank You !,