两个小问题

yuanzhang 2004-09-23 10:13:09
1.我建立了两个表,一个是表里是学生(考号,姓名,性别),另外一个表是录取情况(考号,录取院校),这两个表之间是一对一的关系,我在建立这两个表的永久关联时,显示却是一对多的关系,请问这是为什么?
2.VFP中的三个触发器怎么用,能否给个例子说明?
谢谢各位大侠,在线等待!
...全文
72 3 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2004-09-23
  • 打赏
  • 举报
回复
在两个打开的表之间建立关系。

SET RELATION TO [eExpression1 INTO nWorkArea1 | cTableAlias1
[, eExpression2 INTO nWorkArea2 | cTableAlias2 ...]
[IN nWorkArea | cTableAlias] [ADDITIVE]]
参数
eExpression1
指定用来在父表和子表之间建立关系的关系表达式。关系表达式通常是子表主控索引的索引表达式。
子表的索引可以是单项索引 (.IDX)、多项结构复合索引 (.CDX) 或独立复合索引。如果是复合索引,应指定适当的索引标识来排序子表。SET ORDER 可用来指定排序子表的索引标识。

例如,考虑“说明”部分描述的 customer 和 orders 两表。假定子表 orders 已经建立索引,并且使用如下命令用顾客编号进行排序:

SET ORDER TO TAG cust_id
要在 customer 和 orders 两表的顾客编号上建立关系,应选择包含父表 customer 的工作区或使用 IN 子句来指定父表的工作区或别名。然后,发出 SET RELATION 命令,用如下关系表达式指定索引表达式:

SET RELATION TO cust_id INTO orders
除非关系表达式是数值型的,否则子表必须建立索引。如果发出包含非数值关系表达式的 SET RELATION 命令时,子表没有使用索引进行排序, Visual FoxPro 显示错误信息。

如果 eExpression1 是数值型表达式,那么当记录指针在父表中移动时,将计算此表达式。然后,子表的记录指针移到记录编号为 eExpression1 的记录上。

INTO nWorkArea1 | cTableAlias1
指定子表的工作区编号 (nWorkArea1) 或子表的表别名 (cTableAlias1)。
eExpression2 INTO nWorkArea2 | cTableAlias2 ...
指定其他关系表达式 (eExpression2) 和子表,建立另一个父表和子表之间的关系。在一条 SET RELATION 命令中可以创建单个父表与多个子表之间的关系,但是各个关系之间要用逗号隔开。
nWorkArea2 指定工作区编号,cTableAlias2 指定子表的别名。

IN nWorkArea
指定父表的工作区。
IN cTableAlias
指定父表的别名。
IN 子句允许创建关系时不必首先选择父表工作区。如果 SET RELATION 命令中省略了 nWorkArea 和 cTableAlias,父表必须在当前选定的工作区中打开。

ADDITIVE
保留当前工作区中所有已存在的关系并创建指定的新关系。如果命令中不包括 ADDITIVE 子句,将断开当前工作区中的所有关系,然后再创建指定的关系。
备注
在建立关系之前,必须打开一个表(父表),而且还必须在另一个工作区内打开其他表(子表)。

相关的各表通常有一个相同的字段。例如,假定表 customer 包含顾客信息,有顾客姓名、地址和唯一的顾客编号等字段。表 orders 包含订货信息,也有顾客编号字段,同时还有日期和发货信息等字段。

SET RELATION 通过相同的字段,即顾客编号字段来联系两个表。要建立这种关系,子表必须在公共字段上建立索引。建立关系后,不论何时在父表 customer 中移动记录指针到指定顾客编号的记录上时,子表 orders 中的记录指针也将同时移到相同顾客编号的记录上。如果子表中找不到相匹配的记录,子表中的记录指针将停在表尾。

不带任何参数的 SET RELATION TO 命令将移去当前选定工作区中的所有关系。可用 SET RELATION OFF 移去指定的父子关系。
十豆三 2004-09-23
  • 打赏
  • 举报
回复
从当前数据库的表中删除“删除”、“插入”或“更新”触发器。
DELETE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE
参数
TableName
指定要删除触发器的表名。
FOR DELETE | INSERT | UPDATE
指定要删除的触发器。包含 FOR DELETE 删除“删除”触发器,包含 FOR INSERT 删除“插入”触发器,包含 FOR UPDATE 删除“更新”触发器。
备注
使用 CREATE TRIGGER 为表创建“删除”、“插入”或“更新”触发器。
示例
下面的示例创建一个“更新”触发器,该触发器禁止大于 50 的数放入 customer 表的 maxordamt 字段中。display trigger 显示“更新”触发器,DELETE TRIGGER 删除“更新”触发器,重新执行 display database 来检验“更新”触发器是否被删除。
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\testdata') && 打开 testdata 数据库
USE CUSTOMER && 打开 customer 表

CREATE TRIGGER ON customer FOR UPDATE AS maxordamt <= 50
CLEAR
DISPLAY DATABASE
DELETE 触发器 ON customer FOR UPDATE
DISPLAY DATABASE
十豆三 2004-09-23
  • 打赏
  • 举报
回复
创建表的删除、插入或更新触发器。

CREATE TRIGGER ON TableName FOR DELETE | INSERT |
UPDATE AS lExpression
参数
TableName
在当前数据库中指定要创建触发器的表。
FOR DELETE | INSERT | UPDATE
指定 Visual FoxPro 创建的触发器类型。
如果所指定类型的触发器已经存在并且 SET SAFETY 是 ON,Visual FoxPro 会提示您是否要改写已存在的触发器。如果 SET SAFETY 是 OFF,则已存在的触发器被自动改写。

AS lExpression
指定触发器激发时,要计算的逻辑表达式。lExpression 可以是返回逻辑值的用户自定义函数或存储过程。可用 MODIFY PROCEDURE 创建表的存储过程。
 
用户自定义函数或存储过程可通过 AERROR( ) 决定激发触发器的表的名称以及触发器的类型。

如果 lExpression 计算结果为“真”(.T.),则执行激发触发器的命令或事件。

如果 lExpression 的计算结果为“假”(.F.),不执行激发触发器的命令或事件。如果 ON ERROR 过程有效,则执行 ON ERROR 过程来代替激发触发器的命令或事件。如果 ON ERROR 过程无效,则不执行激发触发器的命令或事件,同时 Visual FoxPro 产生错误信息。

备注
利用 CREATE TRIGGER 来俘获引起表中记录被删除、添加或更改的事件。只有数据库表能创建删除、插入或更新触发器。可用 CREATE DATABASE 来创建数据库,用 ADD TABLE 把表添加到数据库中。

下面的列表描述了激发删除、插入或更新触发器的事件。

DELETE 触发器
发出 DELETE 命令
在浏览窗口或编辑窗口的“表”菜单中对记录作删除记号。
注意发出 ZAP 不会造致 DELETE 触发器发生。
INSERT 触发器
发出 APPEND FROM 命令。
发出 APPEND FROM ARRAY 命令。
发出 APPEND BLANK 命令。
从浏览窗口或编辑窗口的“表”菜单追加记录。
发出 IMPORT 命令。
发出 INSERT-SQL 命令。
发出 RECALL 命令。
从浏览窗口或编辑窗口的“表”菜单中清除记录的删除标记。
UPDATE 触发器
发出 GATHER 命令。
发出 REPLACE 命令。
发出 REPLACE FROM ARRAY命令。
发出 UPDATE – SQL命令。
其它造致记录修改的事件, 如一个表单修改字段的内容。
下面的规则适用于用 CREATE TRIGGER 创建的触发器:

不能对有触发器的表使用 INSERT,但可使用 INSERT-SQL。
发出 PACK 不会激发任何触发器。
发出 ZAP 不会激发删除触发器。
如更新具有删除标记的记录,不会激发触发器。
触发器可能不会立即被激发,这取决于当前缓冲模式:
如果表缓冲起作用,当发出 TABLEUPDATE( ) 时,激发更新触发器,表中的每个缓冲记录都被更新。

示例
下面的示例创建了更新触发器。防止大于 50 的值输入到 customer 表的 maxordamt 字段中。第一个 replace 命令执行时,产生错误信息,因为 maxordamt 字段的值大于 50。第二个 replace 命令没有产生错误,因为 maxordamt 的值小于或等于 50。

CLOSE DATABASES

OPEN DATABASE (HOME(2) + 'data\testdata')
USE customer && 打开 customer 表

* 设置 maxordamt 字段的触发器为值 <= 50 时失败
CREATE TRIGGER ON customer FOR UPDATE AS maxordamt <= 50

ON ERROR && 恢复系统错误处理程序

WAIT WINDOW "按一键用值 60 来测试触发器"+CHR(13);
+"当你得到错误信息时, 按忽略。"
REPLACE maxordamt WITH 60 && 显示一个错误信息
? maxordamt

WAIT WINDOW "按一键用值 50 测试。"
REPLACE maxordamt WITH 50 && 值是可接受的
? maxordamt
DELETE TRIGGER ON customer FOR UPDATE && 移去触发器
发帖
VFP

2577

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
帖子事件
创建了帖子
2004-09-23 10:13
社区公告
暂无公告