用数据库管理AutoCAD的图块和实现查询插入操作 主题词: 上海港口机械厂 刘启卫 本文介绍一个用数据库管理和实现查询插入 问题的提出 众所周知,一个 AutoCAD 解决问题的途径 上述功能可以在 在 本文介绍的方法 本文介绍的方法是利用一个 具体实现时需要预先准备好数据库: 第一步。 设计和建立管理所有图块文件的数据库。对于没有采用 Field Field Name Type Width Dec 1 DRAWING_ID Character 16 2 DESIGNER Character 6 3 DESIGNDATE Date 8 4 DRAW_SIZE Character 2 5 SCALE Character 5 6 WEIGHT Numeric 8 2 7 SIZE Character 20 8 PATH Character 32 9 PICTURE General 10 这个结构是针对 利用 第二步。 针对每个图块系列,建立对应结构的属性数据库。例如:弹性圆柱销联轴器( Structure for database: JB108-60.DBF Field Field Name Type Width Dec 1 2 3 4 5 B Numeric 3 6 D Numeric 3 7 D1 Numeric 3 8 A Numeric 3 9 B1 Numeric 3 10 C Numeric 3 11 L1 Numeric 3 12 L2 Numeric 3 13 D3 Numeric 3 14 D4 Numeric 3 15 A1 Numeric 3 16 17 18 19 Drawing_id Character 16 其中第 第三步。 建立管理所有图块系列的目录数据库。数据库结构建议如下: Structure for database: BLOCKS.DBF Field Field Name Type Width Dec 1 DATABASE Character 16 2 STANDARD Character 32 3 NAME Character 32 4 SLIDE_FILE Character 32 5 PICTURE General 10 6 PATH Character 32 其中 使用时, 使用 ; ( ;调用 ;查找满足条件准则的记录——也就是: ; ; (SETQ REC_ID (LOCATE DB_ID " ) ) ;找到满足上述条件的记录号在变量 ;就是找到了。 (IF (> REC_ID 0) ;然后就可以调用 (SETQ REC (GETREC DB_ID )) ) 具体程序省略。感兴趣的读者可来信联系索取。对于比较大的单位,需要使用 数据库和 主题词: 上海港口机械厂 刘启卫 本文介绍一个使 问题的提出 众所周知,一个 解决对图形进行编辑后自动存入数据库问题的方法 本文介绍的方法是利用一个 1 2 注意数据库中应该设计一个存放 解决对数据库修改以后自动更新 1 2 上述方法对标题栏,和明细表同样适用。而保持图纸和管理数据库内容的一致是图档管理系统中极为重要的必不可少的功能。 具体程序省略。感兴趣的读者可来信联系索取。对于比较大的单位,需要使用 在AutoCAD环境中快速翻阅工程设计图表 主题词: 上海港口机械厂 刘启卫 设计工作的一个重要内容就是翻阅查找存放在工程设计手册和各种标准中的五花八门的数据表和图表。这些数据图表记录了设计工作必须参照引用的数据和遵守的规范。如何正确和快速地查找引用需要的数据,对提高设计工作的质量,标准化程度和工作效率十分重要。本文介绍一个在AutoCAD环境下实现的快速翻阅工程设计图表的通用方法。 各行各业的工程设计手册和各种标准中的五花八门的数据表和图表有一个共同特点,就是它们数量很多,格式纷杂,数据表往往附带有插图。在AutoCAD显示屏幕上翻阅这类图表需要显示插图和可以滚动的数据表格。数据表可以选择几种存放形式:1。ASCII码文件-采用LISP语言读取文件数据。2。直接存放于LISP语言的表中。3。数据库文件。其中第3种形式只要有了通用的数据库操纵手段,就有利于数据共享和维护数据的一致性;采用通用的数据库接口简化读取数据的过程;有利于利用数据库特有的索引功能提高从大量数据中进行查找的速度;利用数据库实现指定搜索条件的查找;维护管理庞杂的数据图表。因此第3种形式最为理想。在AutoCAD环境内显示工程设计手册的图形一般采用SLD图形文件方式。SLD图形文件有两种存放方式:1。单独的SLD文件。2。多个SLD文件装人SLB库中。SLB库形式节省存储空间且管理容易,但建库稍有不便。这两种形式图形的具体实现方法在AutoCAD的各种手册教材中都有,本文不再介绍。 在AutoCAD屏幕上显示工程手册的数据表和图形一般采用对话框来实现。在AutoCAD环境内显示对话框要用对话框控制语言编制一个DCL文件和一段填写显示对话框数据的LISP语言程序。如果针对工程手册的每一个图表编制一个DCL对话框文件,一个填写显示对话框数据的LISP语言程序,则工作量很大,占用磁盘空间很大,不便于管理。因为工程设计手册上的图表虽然格式各异,但也有它们的共同特点。可以利用它们的共同特点简化程序的编制。笔者编写了一个通用的用于翻阅工程设计图表的LISP语言程序--HANDBOOK。实现的要点是:1。数据存放在DBASE/FOXBASE/FOXPRO格式的数据库中。2。建立一个管理所有数据库的目录数据库。3。每次启动翻阅数据库的程序时,首先翻阅图表目录数据库,选定某个图表后,动态地产生针对不同表格的DCL对话框语言文件以控制对话框的显示外观。4。利用我们自己开发的LISPBASE数据库接口操纵所有数据库。5。图形存放在SLB库中并用目录数据库进行管理。HANDBOOK源程序如下: ;;;;;;;;;;;;;;;;;;;;; HANDBOOK ;;;;;;;;;;;;;;;;;;;;;; (defun handbook( / dcl_id templist rlist tempstr name) (setq dcl_id (load_dialog "handbook")) (if (not(new_dialog "handbook" dcl_id)) (exit)) (if (null use) (xload"lispbase")) (setq hbook (use 0 "handbook.dbf")) (if (/= hbook 0) (exit)) (setq templist (list)) (while (/= (eof hbook) 1) (setq rlist (getrec hbook)) (setq tempstr (strcat (nth 1 rlist) (nth 2 rlist))) (setq templist (append templist (list tempstr))) (skip hbook 1) ) (start_list "tablelist") (mapcar 'add_list templist) (end_list) (action_tile "accept" "(setq name (select_row))(done_dialog)(princ)") (action_tile "cancel" "(done_dialog)(unload_dialog dcl_id)(princ)") (action_tile "tablelist" "(setq name (select_row))(done_dialog)(princ)") (start_dialog) (shut hbook) (unload_dialog dcl_id) (if (> (length name) 0) (display name)) ) ;;;display table;;;; (defun display( name / tablename filename s l i title str f r rlist templist tempstr dcl_id sld_name) (setq tablename (packname (car name)) filename (packname (cadr name))) (setq fileid (use 0 Filename)) (if (/= fileid 0) (progn (alert "Can't open data table...")(exit))) (setq s (stru fileid)) (setq l (length s) i 0) (setq title "" str "------------------------------------") (while (< i l) (progn (setq m (atoi (substr (nth i s) 14 2))) (if (> m 10) (setq title (strcat title (substr (nth i s) 1 10) (substr str 1 (- m 10)) " ")) (setq title (strcat title (substr (nth i s) 1 m ) " ")) ) (setq i (1+ i)) ) ) (setq f(open "table.dcl" "w")) (write-line "table:dialog{" f) (write-line (strcat " label=\"" tablename "\";") f) (if (/= (findfile (packname(nth 2 name))) nil) (progn (write-line " :boxed_row {" f) (write-line " :image {" f) (write-line " key=\"picture1\";" f) (write-line " color=0;" f) (write-line " height=10;" f) (write-line " width=12;" f) (write-line " }" f) (if (/= (findfile (packname(nth 3 name))) nil) (progn (write-line " :image {" f) (write-line " key=\"picture2\";" f) (write-line " color=0;" f) (write-line " height=10;" f) (write-line " width=12;" f) (write-line " }" f) (if (/= (findfile (packname(nth 4 name))) nil) (progn (write-line " :image {" f) (write-line " key=\"picture3\";" f) (write-line " color=0;" f) (write-line " height=10;" f) (write-line " width=12;" f) (write-line " }" f) ) ) ) ) (write-line " }" f) ) ) (write-line " :list_box{" f) (write-line (strcat " label=\"" (substr title 1 74) "\";") f) (write-line " key=\"table\";" f) (setq m (+ (strlen title) 2)) (if (< m 30) (setq m 30)) (setq testname name) (if (or (> m 74) (/= (findfile (packname(nth 4 name))) nil)) (setq m 74)) (write-line (strcat " width=" (itoa m) ";") f) (write-line " }" f) (write-line " ok_cancel;" f) (write-line "}" f) (close f) (setq dcl_id (load_dialog "table")) (if (not(new_dialog "table" dcl_id)) (exit)) (setq templist (list) str " ") (while (= (eof fileid) 0) (setq tempstr "") (setq rlist (getrec fileid) i 0) (while (< i l) (cond ((= (substr (nth i s) 12 1) "C") (setq tempstr (strcat tempstr (nth (1+ i) rlist) " "))) ((= (substr (nth i s) 12 1) "N") (progn (setq r (rtos (nth (1+ i) rlist) 2 (atoi (substr (nth i s) 17 1)))) (setq sl (strlen r)) (setq tempstr (strcat tempstr (substr str 1 (- (atoi (substr (nth i s) 14 2)) sl)) r " ")) ) ) ) (setq i (1+ i)) ) (setq templist (append templist (list tempstr))) (skip fileid 1) ) (start_list "table") (mapcar 'add_list templist) (end_list) (setq sldname (nth 2 name)) (if (/= (findfile sldname) nil) (set_image sldname "1") ) (setq sldname (nth 3 name)) (if (/= (findfile sldname) nil) (set_image sldname "2") ) (setq sldname (nth 4 name)) (if (/= (findfile sldname) nil) (set_image sldname "3") ) (action_tile "accept" "(setq r(get_row))(done_dialog)") (action_tile "cancel" "(done_dialog)(princ)") (action_tile "tablelist" "(setq r(get_row))(done_dialog)") (start_dialog) (unload_dialog dcl_id) (shut fileid) (if (listp r) (setq r (cdr r)) ) ) ;;;;select_row;;;; (DEFUN select_row(/ recid record ) (setq recid (1+ (atoi (get_tile "tablelist")))) (goto hbook recid) (setq record (getrec hbook)) (list (nth 1 record) (nth 3 record) (nth 4 record) (nth 5 record) (nth 6 record)) ) (defun get_row(/ recid ) (setq recid (1+ (atoi (get_tile "table")))) (goto fileid recid) (getrec fileid) ) (defun packname(fn / i j) (if (/= fn nil) (progn (setq i 1 j (strlen fn)) (while (and (/= (substr fn i 1) " ") (<= i j)) (setq i(1+ i))) (if (<= i j) (progn (setq i(1- i)) (setq fn (substr fn 1 i)) ) (setq fn fn) ) ) ) ) ;;;;;;set_image;;;;;;;;; (defun set_image(sldname id / x y ) (setq x (dimx_tile (strcat "picture" id)) y (dimy_tile (strcat "picture" id))) (start_image (strcat "picture" id)) (slide_image 0 0 x y sldname) (end_image) ) 上述程序中使用了若干LISPBASE数据库接口的函数。 可以把HANDBOOK程序挂在任何AutoCAD的菜单下,以方便用户使用。激活HANDBOOK程序后,首先显示所有数据表的目录选择对话框。下图是一个例子:
在对话框的数据表目录滚动列表框内选择所要翻阅的表格,按OK键,HANDBOOK程序就自动产生控制该表格的DCL对话框控制语言文件,然后就可以在屏幕上用对话框的形式显示该表格的内容,例子见下图:
对话框可以包括一至多个插图和滚动数据列表框。插图的多少和列表框的宽度取决于使用显示器的分辨率,常用的640X480分辨率VGA显示器一般可以显示三幅插图,70列数据字符。如使用较高分辨率的显示器。也可以对HANDBOOK程序稍加修改,显示更多的图形和数据。数据列表框的顶部自动根据数据库字段名和字段宽度显示字段名,列表框的行数不限。如果用户使用中文AutoCAD环境,可以显示中文内容。对HANDBOOK程序稍加修改可以用尽量大的面积显示图形,也可以实现完全类似于人工在工程设计图表中的诺模图类型的图表上直接选择制定参数的功能。
本文介绍的程序和方法支持网络上多用户使用,支持DOS和Windows两种版本的AutoCAD v12.
对于比较大的单位,需要使用
ORACLE,SYBASE,INGRESS,SQL-SERVER,等数据库的情况,可以使用另外一个AutoCAD Lisp 语言环境下的ODBC数据库接口--LISPODBC。由于现在几乎所有的数据库都支持ODBC,因此利用LISPODBC可以不受数据库的限制。
适用 AUTOCAD 环境的 LISPBASE 数据库接口介绍
LISPBASE v2.0
是一个在 AUTOCAD V12 环境下访问DBASE/ Foxbase / Foxpro 等Xbase 系列数据库程序。使用 AUTOCAD 内嵌语言 AUTOLISP 的语法。使AUTOLISP 扩充了访问数据库的功能。LISPBASE 提供了常用的21个函数。最多可同时打开操作10个数据库文件。索引文件使用扩展名为IDX的Fox系列数据库索引文件,对每个数据库文件所打开的索引文件打开数不限。并且允许多个用户在网络工作站上以共享方式访问在网络服务器上的数据库。LISPBASE 有DOS 和 WINDOWS 两种版本,分别运行于DOS 或WINDOWS 版AUTOCAD V12 环境。 LISPBASE的典型应用是编在AUTOLISP语言程序中实现的。各种设计任务中的查表,数据记录,明细表生成等均可利用LISPBASE访问数据库。我们还可向需要开发参数设计软件的用户提供按用户需要定制的表达式求值函数和通用数据库查表函数--EVALEXPRS 和 SEEKTABLE。
LISPBASE 的运行
启动了
AUTOCAD 后,用(XLOAD "LISPBASE")命令可以把LISPBASE调入内存并和AUTOCAD建立联系。然后就可以使用LISPBASE 提供的LISP语法的函数对用户建立的 FOXBASE数据库进行操纵了。注意:
LISPBASE.EXE 可执行文件应该在AUTOCAD的搜索路径中,即在 DOS 批处理命令中的环境变量设置命令 SET ACAD= ... 的路径中。例如有:
SET ACAD=C:\\ACAD;C:\\ACAD\\SUPPORT;C:\\ACAD\\FONTS则
LISPBASE.EXE 可执行文件应该在上述路径中。关于 LISPBASE 的数据类型的说明
1
。LISPBASE 的与数据库记录编号有关的函数受LISP数据类型限制,记录编号在两字节有符号整数能表示的范围内。2
。LISPBASE 读取 DBASE/FOX 系列数据库的方法:对数值型字段:字段宽度
>= 4 或有小数点,作为浮点数处理,否则作为整数处理。日期型字段:作为
8 字符宽度的字符串处理。逻辑型字段:作为
1 字符宽度的字符串处理。字符型字段:作为字符串处理。
通用型字段:
FOXPRO 2.5 版有通用型字段,读写时作为 10 字符宽度的字符串处理。对于插入记录操作应以空格字符串写出。对于替换记录操作不应改动原来字段的内容,否则会出现数据库内容的不一致现象。备注型字段:读写时作为
10 字符宽度的字符串处理。对于插入记录操作应以空格字符串写出。对于替换记录操作不应改动原来字段的内容,否则会出现数据库内容的不一致现象。3
。对于 Locate,Sum,Count 等可对数据库记录内容和 AutoLisp 变量内容进行逻辑运算操作的函数,不可对通用型字段和备注型字段进行逻辑运算操作。LISPBASE 的 21个函数的清单:
(use DBFFileID Filename)
(index DBFFileID IndexFilename IndexFilename ...)
(getrec DBFFileID)
(skip DBFFileID Skip_Num)
(bof DBFFileID)
(eof DBFFileID)
(shut DBFFileID)
(replace DBFFileID RecordList)
(erase DBFFileID)
(insert DBFFileID RecordList)
(seek DBFFileID SeekString)
(goto DBFFileID Record_Id)
(recno DBFFileID)
(gotop DBFFileID)
(gobott DBFFileID)
(locate DBFFileID ConditionExpress)
(sum DBFFileID [FieldsList] [ConditionExpress])
(count DBFFileID [ConditionExpress])
(dbname DBFFileID)
(stru DBFFileID)
(reccnt DBFFileID)
LISPBASE 函数参考
1
。(use DBFFileID Filename)use
函数用于以共享方式打开数据库,并使该数据库和一个0…9的整数联系起来。(use DBFFileID Filename)
函数如果成功地打开了数据库,返回 DBFFileID。Filename
是数据库文件名字符串。必须是一个合法的DOS文件名。在路径中表示子目录的反斜线必须用两个。use 函数可以访问网络服务器上的文件。打开数据库后应尽快关闭。用户编制访问数据库的程序时,应检测是否打开数据库,如果不能打开,则经过适当的延时再试一试打开的操作。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9之间的一个整数。如果成功地打开了数据库,函数返回
DBFFileID,否则返回 -1。例子:
(setq FieID (use 1 "f:\\design\\object1\\partlist.dbf" ) )(if (/= FieID 1) (print "DBF File can't open"))
注解:
Filename ,DBFFileID 都可以是 LISP 变量。以下的12个函数同样。以下不再重复。
2
。(index DBFFileID IndexFilename IndexFilename ...)index
函数用于打开数据库的索引文件。(index DBFFileID IndexFilename IndexFilename ...) 函数如果成功地打开了索引文件,返回 DBFFileID。否则返回 -1。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9之间的一个整数。IndexFilename
是索引文件名字符串。必须是一个合法的DOS文件名。索引文件可以同时打开多个,数量不限。但受内存限制。对打开索引文件的数据库使用
seek 函数进行查找时,LISPBASE 使用第一个索引文件。对打开多个索引文件的数据库进行插入操作时,同时对多个索引文件更新。注意索引关键字不能包括FOXBASE能够执行的字符串或数据转换函数和表达式,如STR(),CHR(),SUBSTR()等。例子:
(index 0 "d:\\prod\\part01.idx" "d:\\prod\\part02.idx" "d:\\prod\\part03.idx")3
。(getrec DBFFileID)getrec
函数用于取得打开的数据库的当前记录,getrec 如果执行成功,则返回由数据库各字段数据构成的一个表。否则返回 nil 。表的第0个原子是表示该记录是否删除的字符。如已删除,为 *;如未删除,为空格。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例子:
(setq f 0)(use f "d:\\product\\part.dbf")
(setq reclst(getrec f))
(print reclst)
函数返回:
(" " "MQ25014401 " "A" 4 65.82 "GB3811 " "一金工 " )4
。(skip DBFFileID Skip_Num)skip
用于从当前数据库记录指针的位置移动数据库的记录指针。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。Skip_Num
是要移动的记录条数。可以是正整数。也可以是负整数。如果执行成功,函数返回记录编号。如果正向移动记录指针超出了数据库的最后一个记录,函数返回数据库记录数加
1的数字。如果负向移动记录指针超出了数据库的第一个记录,函数返回0。对打开了索引文件的数据库同样如此。例子:
(skip 0 30)5
。(bof DBFFileID)bof
用于测试记录指针是否指向文件头。如果是,返回1,否则返回0。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例子:
(if (= (bof 0) 1) (print "File Begen."))
6
。(eof DBFFileID)eof
用于测试记录指针是否指向文件尾。如果是,返回1,否则返回0。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例子:
(if (= (eof 0) 1)(print "File End"))
7
。(shut DBFFileID)shut
函数用于关闭打开的数据库。如果关闭成功,返回 DBFFileID,否则返回-1。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例子:
(setq f 1)(use f "personal.dbf")
......
(shut f)
8
。(replace DBFFileID RecordList)replace
用于替换打开数据库的当前记录。操作如果执行成功,函数返回记录编号,否则返回0。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。RecordList
是由一个删除标记字符和数据库各字段数据构成的一个表。删除标记字符必须是表的第一个原子。其他各原子的数据类型必须与数据库的各对应字段保持一致。如果有索引文件打开,所有索引关键字字段不允许修改。否则容易造成索引文件的破坏。
例子:
(setq reclst (list " " "Q021234 " 5 20.4 ))(use 0 "part.dbf")
(replace 0 reclst)
(shut 0)
9
。(erase DBFFileID)erase
用于删除打开数据库的当前记录。如果该记录已经删除,则恢复之。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。删除操作成功,函数返回 DBFFileID,否则返回-1。例子:
(use 5 "part.dbf")(skip 5 10)
(erase 5)
(shut 5)
10
。(insert DBFFileID RecordList)insert
用于向打开的数据库插入一条记录。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。操作如果执行成功,函数返回记录编号,否则返回-1。RecordList
是由一个删除标记字符和数据库各字段数据构成的一个表。删除标记字符必须是表的第一个原子。其他各原子的数据类型必须与数据库的各对应字段一致。对打开多个索引文件的数据库进行插入操作时,同时对多个索引文件更新。
例子:
(setq reclst (list " " "Q021234 " 5 20.4 ))(use 0 "part.dbf")
(index 0 "part.idx")
(insert 0 reclst)
(shut 0)
11
。(seek DBFFileID SeekString)seek
用于在打开了索引文件的数据库中进行查找。如果找到。函数返回该记录的记录号。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。使用
函数之前必须打开数据库和索引文件。SeekString
是要查找的字符串。例子:
(setq s "Q03")(use 0 "part.dbf")
(index 0 "part05.idx")
(setq rcd(seek 0 s))
(if (/= rcd 0)(print rcd)(print "\nNot Found"))
(shut 0)
12
。(goto DBFFileID Record_Id)goto
用于操纵打开数据库的当前记录号。使之指向 Record_Id,如果 Record 超出了数据库的最大记录号或执行不成功,返回 0。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。Record_Id
是要指向的记录号。对打开索引文件的数据库使用此函数后,索引文件的索引指针会指向 Record_id。例子:
(use 0 "part.dbf")
(setq rcd(goto 0 5))
(setq rcd(getrec 0))
(print rcd)
(shut 0)
13
。(recno DBFFileID)recno
用于返回打开数据库的当前记录号。如果BOF或EOF为真,返回0。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例子:
(use 0 "part.dbf")
(index 0 "part05.idx")
(setq rcd(seek 0 s))
(setq rcd1(recno 0))
(print rcd)
(print rcd1)
(shut 0)
14
。(gotop DBFFileID)gotop
用于把打开数据库的当前记录号指向为数据库的第一条记录。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。对于打开了索引文件的数据库文件,当前记录号指向索引顺序的第一条记录。例子:
(use 0 "part.dbf")
(index 0 "part05.idx")
(setq rcd(gotop 0))
(setq rcd1(recno 0))
(print rcd)
(print rcd1)
(shut 0)
15
。(gobott DBFFileID)gobott
用于把打开数据库的当前记录号指向为数据库的最后一条记录。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。对于打开了索引文件的数据库文件,当前记录号指向索引顺序的最后一条记录。例子:
(use 0 "part.dbf")
(index 0 "part05.idx")
(setq rcd(gotop 0))
(setq rcd1(recno 0))
(print rcd)
(print rcd1)
(shut 0)
16
。(locate DBFFileID ConditionExpress)locate
用于把打开数据库的当前记录号指针向后推向满足条件表达式的第一条记录,或者说是条件表达式为真的记录。locate 返回记录号。locate 函数是从当前记录开始操作的。如果要从文件头开始操作,应在 locate 函数执行前执行 gotop。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。ConditionExpress
是由 AutoLisp 变量,数据库字段,数字,字符串,逻辑运算符,算术运算符,圆括号等组成的逻辑运算表达式。该表达式与 FoxBase 的相应表达式兼容。圆括号 :
(,)。AutoLisp
变量 :AutoLisp 内部的用户建立的变量,可以是整数,浮点数, 字符串类型。数据库字段 :
Dbase/FoxBase/Foxpro 数据库的字段名。字段数据类型 可以是数字,字符串,逻辑,日期。但不能是备注 (mem) 类型和通用(general)类型的。算术运算符 :包括
+,-,*,/,取余数%,幂^。数字 :可以是整数,浮点数,科学计数法数值等。
字符串 :由单引号‘
引导和结束的任何字符,包括汉字。逻辑运算符 :
与: .AND.或: .OR.相等: =大于: >小于: <大于等于: >=小于等于: <=不等于: <>各算术运算和逻辑运算符的优先级别遵从一般程序设计语言的规则,可参阅
BASIC、C、PASCAL、FORTRAN等参考书。比较逻辑运算可以用于字符串。注:逻辑运算表达式的说明适用于
SUM 和 COUNT 函数。以下不再重复。例子:
(use 0 "part.dbf")
(locate 0 "Weight>200.0 .and.Quantity>40.or.Name<>N.and.Type='GB76'")
(getrec 0)
本例中,
Weight,Quantity,Name,Type 为数据库字段名,N 是 LISP 变量名。17
。(sum DBFFileID [FieldsList] [ConditionExpress])sum
用于累加数据库的数值字段的数值。当使用了可选的[ConditionExpress] 参数时。累加数据库的数值字段的数值的条件是满足条件表达式记录,或者说是条件表达式为真的记录。当使用了可选的 [FieldList] 参数,对 [FieldList]表中的数据库字段进行累加。[FieldList] 参数没有提供时,对所有数值字段累加。函数返回一个表,表的各项是按照数据库中数值字段排列的各字段累加数据和。sum
函数是从当前记录开始操作的。如果要从文件头开始操作,应在 sum 函数执行前执行 gotop。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。ConditionExpress
是由 AutoLisp 变量,数据库字段,数字,字符串,逻辑运算符,算术运算符,圆括号等组成的逻辑运算表达式。该表达式与 FoxBase 的相应表达式类似。详细说明见 locate 参考。18
。(count DBFFileID [ConditionExpress])count
用于计算数据库的记录条数。当使用了可选的[ConditionExpress] 参数时。计算数据库的记录条数的条件是满足条件表达式的记录,或者说是条件表达式为真的记录。函数返回一个满足条件表达式的记录条数的整数。
count
函数是从当前记录开始操作的。如果要从文件头开始操作,应在 count 函数执行前执行 gotop。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。ConditionExpress
是由 AutoLisp 变量,数据库字段,数字,字符串,逻辑运算符,算术运算符,圆括号等组成的逻辑运算表达式。该表达式与 FoxBase 的相应表达式类似。详细说明见 locate 参考。例:
(use 0 "GB3811.dbf")(setq n (count 0 "A>=1.2"))
(print n)
19
。(dbname DBFFileID)dbname
用于返回数据库文件名。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例:(use 0 "GB3811.dbf")(setq dbn (dbname 0))
20
。(stru DBFFileID)stru
用于返回数据库结构。函数返回一个表,表的各项是 17 个字符的字符串。字符1…10 是数据库字段名,字符 12 是字段数据类型,字符14…15是字段宽,字符 17 是数值型字段的小数点位置。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例:
(use 0 "GB3811.dbf")(setq struct (stru 0))
(print struct)
21
。(reccnt DBFFileID)reccnt
用于返回数据库记录数。DBFFileID
是数据库文件编号。类似于FOXBASE的工作区编号。必须是0…9
之间的一个整数。例:
(use 0 "GB3811.dbf")(setq n (reccnt 0))
(print n)
联系客服