回 帖 发 新 帖 刷新版面

主题:如何写个函数给自变量学号就可得到该学号的语文成绩

有一成绩表,如何写个函数给自变量学号就可得到该学号的语文成绩
先谢

回复列表 (共3个回复)

沙发

在自定义函数中用LOCATE for 命令查找学号,如果能找到,返回当前记录的语文成绩字段值。

板凳

好像有个函数叫做lookup(,)

3 楼

[quote]好像有个函数叫做lookup(,)[/quote]

这个最好!!
LOOKUP() 函数

在当前表的指定字段中查找信息。

有点类似 LOCATE 命令。

语法

LOOKUP(返回值所在的字段,被查找的内容,查找的字段[,索引名称])

比如:LOOKUP(部门,'庄稼',姓名)

如果表中有“庄稼”这个人,所在记录的部门字段为“电脑部”,那么该函数就会返回“电脑部”。

返值类型

可以是任何类型

参数描述

返回值所在的字段:当查到所需要的记录后该函数返回指定字段中的内容。如果查找不成功,即没找到,那么将返回与该字段长度相等的空数据,比如字符型就返回空格,空格数与字段长度相等。

被查找的内容:不用说了吧。

查找的字段:也不用说了吧。如果该字段有同名索引是打开的,系统将自动使用索引。使用索引会使查找快很多(废话)。

索引名称:如果索引的名称与字段名不同,可用这个参数指定,一般可以省略。必须是复合索引。

说明

该函数不能由 RUSHMORE 优化。不过您只要为查找的字段建立了索引,实际上也就相当于优化了。

另有一个函数:

SEEK(被查找的字符表达式 [, 工作区 | 别名 [, 索引序号 | 索引文件名 | 索引标识名]])

用法与此类似。

示例

我们在编软件的时候常常会有这种情况,在一个文本框中输入一个产品的代码,输入完后一回车,在另一个文本框中会显示出其产品名称,用这个函数来实现就可以实现这样的功能,当然这首先必须有一个代码、名称的对照表。

比如我们想在 text1 输入代码,在文本框 text2 中显示名称,那么我们可以在 text1 的 lostfocus 事件中写入:

select dmb &&选择代码、名称对照表
*下一句将查到的名称所对应的代码赋给text2
thisform.text2.value=lookup(名称,alltrim(this.value),代码)
thisform.text2.refresh 


当然您也可以用如下程序:

select dmb &&选择代码、名称对照表
locate for 代码=alltrim(this.value)
if found()
  thisform.text2.value=名称
endif
thisform.text2.refresh 


很显然,用 lookup() 的程序简洁一些。

但是,如果是下面这种情况就不能完全照搬第一种形式:

select dmb &&选择代码、名称对照表
locate for 代码=alltrim(this.value)
if found()
thisform.text2.value=名称
thisform.text3.value=型号
endif
thisform.text2.refresh
thisform.text3.refresh 


为什么呢?因为如果照搬,程序就要写成如下这样:

select dmb &&选择代码、名称对照表
thisform.text2.value=lookup(名称,alltrim(this.value),代码)
thisform.text3.value=lookup(型号,alltrim(this.value),代码)
thisform.text2.refresh
thisform.text3.refresh 


这样电脑就将执行两次查询,很不经济,如果是一个有很多记录的表,这会使程序运行变慢,要是再增加几个项目,比如颜色、规格等,就更不堪设想了。

折衷的办法:

select dmb &&选择代码、名称对照表
thisform.text2.value=lookup(名称,alltrim(this.value),代码)
thisform.text3.value=型号
thisform.text2.refresh
thisform.text3.refresh 


为什么这样可以呢?因为 lookup() 找到记录后同样会把记录指针定位到找到的记录上,这一点同 locate 是一样的,找不到也会定位在表结尾。

 

我来回复

您尚未登录,请登录后再回复。点此登录或注册