VFP触发技术:
Visual Foxpro与它的前期版本重大差别之一是使用了数据库(Database)这一强大功能,使之成为一个真正的DataBase。VFP的Database Container包含了表(Table)及表的各种属性定义,也包含了属于后端的SQL中的触发技术(Trigger)。
Trigger的使用为Database中的Table提供了一个记录级规则(即检测程序)。Trigger分为Insert Trigger、Update Trigger和Delete Trigger三种操作。Insert Trigger用于Table新增记录时所触发的检测程序,Update Trigger用于Table修改记录回存时所触发的检测程序,Delete Trigger用于Table中记录被删时所触发的检测程序。VFP允许对任一种操作设定不同的规则,该规则可以是表达式或用户自定义函数(UFD),若响应为真值时,表示触发成功,若响应为假值时,表示触发失败。用户自定义函数(UFD)存储在Database Container中。
创建触发器有两种方式:
1) 打开表属性”对话框,在 INSERT、UPDATE 或 DELETE 触发器框中,输入触发器表达式或用户自定义函数(UFD);
2) 使用 CREATE TRIGGER 命令。
创建、修改或移去存储过程有三种方式:
1) 在项目管理器中,选择并展开一个数据库,选定“存储过程”,然后选择“新建”、“修改”或“移去”按钮;
2) 在数据库设计器中,从“数据库”菜单中选择“编辑存储过程”按钮;
3) 在COMMAND命令窗口中,使用 MODIFY PROCEDURE 命令。
表跟踪设计:
利用Insert Trigger、Update Trigger和Delete Trigger三种操作原理,我们可以构造备份被操纵记录的用户自定义函数,并将其加入需要进行表跟踪的数据文件Trigger中,以实现表跟踪。这样,不论用户使用程序进行对此表的操纵或直接打开此表进行增删和修改记录,都能激发Trigger将被操纵记录进行日志记载。
本人构造了四个通用的自定义函数,Inslog()、Dellog()、Modlog()和addlog(),存放于Database Container的存储过程中。在需要进行表跟踪的数据文件的Insert Trigger、Delete Trigger和Update Trigger中分别加入Inslog()函数、Dellog()函数和Modlog()函数,以使对数据文件中记录的增、删和修改均激发Trigger进行日志记载。addlog()用于建立被跟踪表的日志表结构,日志表的结构设计包含了被跟踪表的所有字段信息,并且增加了用户标志opid、操作日期时间optime和操作标志opmak字段。日志表的命名规则为被跟踪表的表名前加‘L',以示区分,另外本人在存放数据文件目录下另设子目录LOGDBFS,专用于存放日志表以便管理。这四个函数程序设计如下:
*Insert Trigger:
FUNCTION inslog()
m.path=substr(dbf(),1,rat('\',dbf()))
m. logname=m.path+'LOGDBFS\L'+SUBSTR(DBF(),LEN(m.path)+1)
IF NOT FILE(m.logname)
=addlog() &&建立日志表结构
ENDI
SCATTER MEMVAR
m.opmak='增' &&增加记录标志
m.opid=SYS(0) &&取网络用户标志
m.optime=datetime() &&增加记录时间
INSERT INTO (m.logname) ;
FROM MEMVAR &&记载所增记录
RETURN .T.
*Delete Trigger:
FUNCTION dellog()
m.path=substr(dbf(),1,rat('\',dbf()))
m. logname=m.path+'LOGDBFS\L'+SUBSTR(DBF(),LEN(m.path)+1)
IF NOT FILE(m.logname)
=addlog()
ENDI
SCATTER MEMVAR
m.opmak='删' &&删除记录标志
m.opid=SYS(0)
m.optime=datetime()
INSERT INTO (m.logname) ;
FROM MEMVAR &&记载所删记录
RETURN .T.
*Update Trigger:
FUNCTION modlog()
m.path=substr(dbf(),1,rat('\',dbf()))
m. logname=m.path+'LOGDBFS\L'+SUBSTR(DBF(),LEN(m.path)+1)
IF NOT FILE(m.logname)
=addlog()
ENDI
DIME alog[FCOUNT()+3]
alog[FCOUNT()+2]=SYS(0)
alog[FCOUNT()+3]=datetime()
alog[FCOUNT()+1]='修(原)'
FOR i=1 TO FCOUNT()
alog[I]=oldval(field[I])
ENDFOR
INSERT INTO (m.logname) ;
FROM ARRAY alog &&记载更改前信息
alog[FCOUNT()+1]='修(现)'
FOR i=1 TO FCOUNT()
alog[I]=EVALUATE(field[I])
ENDFOR
INSERT INTO (m.logname) ;
FROM ARRAY alog &&记载更改后信息
RETURN .T.
*建立日志表结构:
FUNCTION addlog()
*取被跟踪表字段
COPY STRU TO tmp EXTEND
*建立用户标志、操作时间和操作标志字段信息
INSERT INTO tmp.dbf ;
(field_name,field_type,field_len);
VALUES ('OPMAK','C',6)
INSERT INTO tmp.dbf ;
(field_name,field_type,field_len);
VALUES ('OPID','C',10)
INSERT INTO tmp.dbf ;
(field_name,field_type,field_len);
VALUES ('OPTIME','T',8)
USE IN tmp
oldselect=SELECT() &&生成日志表结构
SELE 0
CREATE (m.logname) FROM tmp
DELETE FILE tmp.dbf
SELECT (oldselect)
RETURN
【VFP表跟踪实现方法】相关文章:
2012宁夏高考报名方式05-09
中国大地保险公司实习报告05-09
法院上半年工作总结05-09
盐阜大众报报业集团(盐城)公开招聘《东方生活报》编辑记者的公告 2月25日到3月3日报名05-09
at(the)least和not(in)the least用法区别 相似词语辨析(17)05-09
2020年高级会计师《高级会计实务》知识点:社会融资方式05-09
初中学校德育课程整合实施探究05-09
家长速览!2023年广西崇左凭祥市中小学招生方案出台05-09
分式的乘方和乘方法则05-09
分式的乘方和乘方法则05-09
拨动心弦的果实高三作文05-09
分式的乘方和乘方法则05-09
