用数据库管理AutoCAD的图块和实现查询插入操作 主题词: AutoCAD, 图块,数据库,查询上海港口机械厂 刘启卫 本文介绍一个用数据库管理和实现查询插入 AutoCAD图块的方法。问题的提出 众所周知,一个 AutoCAD图形中的图块BLOCK,可以用WBLOCK命令写到磁盘上成为DWG文件。磁盘上的DWG文件可以用INSERT命令插人到图形中形成图块。管理图块,实际也就是管理DWG文件。AutoCAD 的INSERT插入图块功能十分有用,可以大大简化和加快绘图的工作。当某个具体的AutoCAD二次开发应用需要用大量的图块时,图块的命名和存放管理就需要费一些心思了。DOS文件名限制在8个字符,用来标识一个以图块描述的设计对象的标准代号往往不够用,当然更谈不上记录图块的属性性质的数据了。而设计时经常需要考虑和引用一个用图块描述的设计对象的属性数据和完整的标准代号,名称,安装和使用性能参数等等。一般来说,设计任务常常需要以某些参数为准则选择适当的以图块描述的设计对象插入图中。例如:给一个电动机配一个公称扭矩大于300N。m,许用转速大于2800转/分,轴孔直径=32毫米的联轴器。就是说要按一定条件经过查询搜索,找到一个满足要求的图形用INSERT命令插入当前编辑的图形形成图块BLOCK。最好设计者不必关心这个图块是存放在什么地方,只要按设计意图指定需要什么样的东西,就自动从数据库中把它选择出来插到图上。解决问题的途径 上述功能可以在 DOS或Windows环境下分别用几种方法实现。在DOS环境下,需要把图块的属性数据存入数据库,把图块的文件访问路径存入数据库。在Windows环境下还可以把AutoCAD图形文件作为OLE对象以链接或嵌入方式存入ODBC数据库。要在DOS版或者Windows版AutoCAD环境中实现用LISP语言访问数据库的功能。在 Windows版AutoCAD环境下可以利用AutoCAD提供的有关程序,利用Windows的DDE(动态数据交换)功能实现访问ODBC数据库。由于AutoCAD还不能直接从ODBC数据库中用INSERT命令插入图块,因此如果用ODBC数据库而且用了嵌入的存放方式,虽然可以把大量独立的文件集中存放在一个大的数据库中,但仍然要解决需要INSERT插人操作时,过滤掉OLE嵌入对象的图元表现数据,把DWG文件数据输出到一个临时DWG文件中,然后才能用INSERT命令插入。而在AutoCAD环境中通过DDE途径操纵ODBC数据库,把OLE嵌入对象输出到临时文件中是困难曲折而且耗费资源的。本文介绍的方法 本文介绍的方法是利用一个 LISP语言访问DBASE/Foxpro数据库的接口程序LISPBASE为支持手段实现的。在DOS环境下,图块以分立的DWG文件的形式存放,在数据库中存放访问路径。在Windows环境下,可以进一步用OLE功能以链接或嵌人方式存放DWG文件,LISPBASE for Windows 提供一个专用函数解决OLE嵌人对象输出到临时文件的问题。在数据库中以嵌人方式存放DWG图块时,要把图块插入到当前编辑的图形文件中还有一个途径。就是直接读取OLE对象数据,过滤掉OLE嵌入对象的图元表现数据,把DWG文件的ENTITY数据用LISP语言提供的函数构造成BLOCK表并插入图形文件中。这个方案的实现所需要的函数将在LISPBASE的新版本中提供。Windows环境方案的优点是可以进一步实现图文并茂的工程文档设计和管理集成系统。缺点是系统开销大,如果希望建立工程文档设计和管理集成系统,微机应配备16兆内存。用DOS环境的方案优点是速度快,开销小。唯一的缺点是无法利用Windows的OLE功能实现图文并茂的工程文档设计和管理集成系统。而这样一个集成系统对一个小组以上规模的设计或生产单位的效益是十分显著的。具体实现时需要预先准备好数据库: 第一步。 设计和建立管理所有图块文件的数据库。对于没有采用 OLE嵌入方式在数据库中存放AutoCAD图形的方案来说,必须仔细考虑建立有条理的DOS子目录结构准备存放AutoCAD图形。每个子目录下的图形文件在200以下为好。管理所有图块文件的数据库结构可以根据各单位的具体情况设计。例如可以设计成如下的结构: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 这个结构是针对 Foxpro for Windows 2.5 设计的。使用了通用字段以OLE链接或嵌人对象的方式存放AutoCAD图形的数据。如果不使用Windows版的Foxpro和AutoCAD,可以不建立这个通用字段。利用 LISPBASE数据库接口可以在每建立一个图块后向数据库填写必要的属性数据和文件访问路径。建立系列图块,可以充分利用市场上对AutoCAD二次开发编制的各种参数设计和尺寸驱动设计程序。第二步。 针对每个图块系列,建立对应结构的属性数据库。例如:弹性圆柱销联轴器( JB108-60),可以设计如下结构:Structure for database: JB108-60.DBF Field Field Name Type Width Dec 1 型号 Character 82 许用扭矩 Numeric 63 许用转速 Numeric 54 轴孔尺寸 Numeric 35 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 材料 Character 617 重量 Numeric 6 218 惯性矩 Numeric 6 319 Drawing_id Character 16 其中第 19个字段Drawing_id是和图形数据库连接的关键字。可以允许多个联轴器公用一个图块。然后输入数据。第三步。 建立管理所有图块系列的目录数据库。数据库结构建议如下: 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 其中 DATABASE 字段用于存放各图块系列数据库名的全路径名;STANDARD 和 NAME 字段用于存放标准和名称;SLIDE_FILE 字段用于存放AUTOCAD的SLIDE文件全路径或在SLB库中的名称。使用时, 1。首先打开目录数据库选择要插入的图块系列标准——也就是选择要打开的数据库;2。打开选择的数据库;3。读取数据库结构;4。用对话框交互式确定各子段的查找条件准则;5。用条件准则查找数据库;6。如果找到,则通过Drawing_ID字段在图块数据库中找到图块,并插入到当前的图形中。如果采用了OLE嵌入方式存放图块,则输出到一个临时文件中,然后执行插入操作。使用 LISPBASE数据库接口函数的部分LISP程序如下:; 调用 USE 函数,打开 JB108-60 属性数据库,DB_ID 是数据库编号。( USE DB_ID "F:\\STANDARD\\JB108-60.DBF");调用 LOCATE 函数;查找满足条件准则的记录——也就是: ; 公称扭矩大于300N.m,许用转速大于2800转/分,轴孔直径=32毫米的联;轴器。; REC_ID 是存放记录号的变量。(SETQ REC_ID (LOCATE DB_ID " 许用扭矩>300 .AND. 许用转速>2800 .AND. 轴孔直径=32") ) ;找到满足上述条件的记录号在变量 REC_ID 中,如 REC_ID 大于 0;就是找到了。 (IF (> REC_ID 0) ;然后就可以调用 GETREC 函数读取该记录,放在一个LISP表REC中,以;便继续处理。(SETQ REC (GETREC DB_ID )) ) 具体程序省略。感兴趣的读者可来信联系索取。对于比较大的单位,需要使用 ORACLE,SYBASE,INGRESS,SQL-SERVER,等数据库的情况,可以使用另外一个AutoCAD Lisp 语言环境下的ODBC数据库接口--LISPODBC。由于现在几乎所有的数据库都支持ODBC,因此利用LISPODBC可以不受数据库的限制。数据库和 AutoCAD图形属性标注与材料表的集成主题词: AutoCAD, 属性,材料表,数据库上海港口机械厂 刘启卫 本文介绍一个使 AutoCAD图形中的属性标注标注和材料表与数据库保持一致的方法。用AutoCAD环境下的LISPBASE数据库接口实现的。问题的提出 众所周知,一个 AutoCAD图形中往往会有许多具有属性性质的标注,如装图的零件号标注,外购件的型号数量,材料表,标题栏等等。这些数据往往需要同时存放在管理数据库中,因此出现一个问题:如何及时地,便捷地,可靠地使AutoCAD图形中的属性数据和数据库中的数据保持一致。这一问题解决得不好往往会因差错造成很大的经济损失。另外,最好还能完全自动地,对设计者透明地解决这一问题。 AutoCAD提供了两个方法解决这种问题。一个是把属性数据写入一个文本文件后再用数据库的Append 命令加入数据库;另外一个是用ASE功能解决。前一方法不方便,很难解决图形和管理数据库的双向更新问题。后一方法主要是交互式地操作的,不便用LISP编程。均有一定局限性。解决对图形进行编辑后自动存入数据库问题的方法 本文介绍的方法是利用一个 LISP语言访问DBASE/Foxpro数据库的接口程序LISPBASE为支持手段实现的。方法如下:1 。在AutoCAD环境下,对需要输入数据库并和数据库保持一致的属性数据,设计适当的结构,用Attribute图块的方式插入图形。如装配图上的零件号标注和外购件标注,不要用Text图形元素画到图上,而应该针对具体对象设计Attribute图形元素,然后插入图中。2 。编制一个提取所有属性图形元素的Lisp语言程序,在需要时(结束工作)扫描图形,把特定的Attribute图形元素收集到Lisp表中,然后利用LispBase数据库接口提供的函数,打开管理数据库,对数据库进行更新。注意数据库中应该设计一个存放 AutoCAD图形元素 Handle 的子段,把每个Attribute的Handle记录在数据库中,以便在数据库中修改数据,然后更新图形中的Attribute数据。解决对数据库修改以后自动更新 CAD图形问题的方法1 。在ACAD.LSP自动执行程序中编写查找数据库中图纸编号的程序。2 。打开一个已经存在的图形时,自动执行在数据库中查找图纸编号;如果找到,自动读出该图有关的属性数据和材料表,根据每个Attribute的Handle对图形中Attribute进行更新。上述方法对标题栏,和明细表同样适用。而保持图纸和管理数据库内容的一致是图档管理系统中极为重要的必不可少的功能。 具体程序省略。感兴趣的读者可来信联系索取。对于比较大的单位,需要使用 ORACLE,SYBASE,INGRESS,SQL-SERVER,等数据库的情况,可以使用另外一个AutoCAD Lisp 语言环境下的ODBC数据库接口--LISPODBC。由于现在几乎所有的数据库都支持ODBC,因此利用LISPODBC可以不受数据库的限制。
在AutoCAD环境中快速翻阅工程设计图表 主题词: 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) |
|