用數據庫管理AutoCAD的圖塊和實(shí)現查詢(xún)插入操作 主題詞: 上海港口機械廠(chǎng) 劉啟衛 本文介紹一個(gè)用數據庫管理和實(shí)現查詢(xún)插入 問(wèn)題的提出 眾所周知,一個(gè) AutoCAD 解決問(wèn)題的途徑 上述功能可以在 在 本文介紹的方法 本文介紹的方法是利用一個(gè) 具體實(shí)現時(shí)需要預先準備好數據庫: 第一步。 設計和建立管理所有圖塊文件的數據庫。對于沒(méi)有采用 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 這個(gè)結構是針對 利用 第二步。 針對每個(gè)圖塊系列,建立對應結構的屬性數據庫。例如:彈性圓柱銷(xiāo)聯(lián)軸器( 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 其中 使用時(shí), 使用 ; ( ;調用 ;查找滿(mǎn)足條件準則的記錄——也就是: ; ; (SETQ REC_ID (LOCATE DB_ID " ) ) ;找到滿(mǎn)足上述條件的記錄號在變量 ;就是找到了。 (IF (> REC_ID 0) ;然后就可以調用 (SETQ REC (GETREC DB_ID )) ) 具體程序省略。感興趣的讀者可來(lái)信聯(lián)系索取。對于比較大的單位,需要使用 數據庫和 主題詞: 上海港口機械廠(chǎng) 劉啟衛 本文介紹一個(gè)使 問(wèn)題的提出 眾所周知,一個(gè) 解決對圖形進(jìn)行編輯后自動(dòng)存入數據庫問(wèn)題的方法 本文介紹的方法是利用一個(gè) 1 2 注意數據庫中應該設計一個(gè)存放 解決對數據庫修改以后自動(dòng)更新 1 2 上述方法對標題欄,和明細表同樣適用。而保持圖紙和管理數據庫內容的一致是圖檔管理系統中極為重要的必不可少的功能。 具體程序省略。感興趣的讀者可來(lái)信聯(lián)系索取。對于比較大的單位,需要使用 在A(yíng)utoCAD環(huán)境中快速翻閱工程設計圖表 主題詞: 上海港口機械廠(chǎng) 劉啟衛 設計工作的一個(gè)重要內容就是翻閱查找存放在工程設計手冊和各種標準中的五花八門(mén)的數據表和圖表。這些數據圖表記錄了設計工作必須參照引用的數據和遵守的規范。如何正確和快速地查找引用需要的數據,對提高設計工作的質(zhì)量,標準化程度和工作效率十分重要。本文介紹一個(gè)在A(yíng)utoCAD環(huán)境下實(shí)現的快速翻閱工程設計圖表的通用方法。 各行各業(yè)的工程設計手冊和各種標準中的五花八門(mén)的數據表和圖表有一個(gè)共同特點(diǎn),就是它們數量很多,格式紛雜,數據表往往附帶有插圖。在A(yíng)utoCAD顯示屏幕上翻閱這類(lèi)圖表需要顯示插圖和可以滾動(dòng)的數據表格。數據表可以選擇幾種存放形式:1。ASCII碼文件-采用LISP語(yǔ)言讀取文件數據。2。直接存放于LISP語(yǔ)言的表中。3。數據庫文件。其中第3種形式只要有了通用的數據庫操縱手段,就有利于數據共享和維護數據的一致性;采用通用的數據庫接口簡(jiǎn)化讀取數據的過(guò)程;有利于利用數據庫特有的索引功能提高從大量數據中進(jìn)行查找的速度;利用數據庫實(shí)現指定搜索條件的查找;維護管理龐雜的數據圖表。因此第3種形式最為理想。在A(yíng)utoCAD環(huán)境內顯示工程設計手冊的圖形一般采用SLD圖形文件方式。SLD圖形文件有兩種存放方式:1。單獨的SLD文件。2。多個(gè)SLD文件裝人SLB庫中。SLB庫形式節省存儲空間且管理容易,但建庫稍有不便。這兩種形式圖形的具體實(shí)現方法在A(yíng)utoCAD的各種手冊教材中都有,本文不再介紹。 在A(yíng)utoCAD屏幕上顯示工程手冊的數據表和圖形一般采用對話(huà)框來(lái)實(shí)現。在A(yíng)utoCAD環(huán)境內顯示對話(huà)框要用對話(huà)框控制語(yǔ)言編制一個(gè)DCL文件和一段填寫(xiě)顯示對話(huà)框數據的LISP語(yǔ)言程序。如果針對工程手冊的每一個(gè)圖表編制一個(gè)DCL對話(huà)框文件,一個(gè)填寫(xiě)顯示對話(huà)框數據的LISP語(yǔ)言程序,則工作量很大,占用磁盤(pán)空間很大,不便于管理。因為工程設計手冊上的圖表雖然格式各異,但也有它們的共同特點(diǎn)??梢岳盟鼈兊墓餐攸c(diǎn)簡(jiǎn)化程序的編制。筆者編寫(xiě)了一個(gè)通用的用于翻閱工程設計圖表的LISP語(yǔ)言程序--HANDBOOK。實(shí)現的要點(diǎn)是:1。數據存放在DBASE/FOXBASE/FOXPRO格式的數據庫中。2。建立一個(gè)管理所有數據庫的目錄數據庫。3。每次啟動(dòng)翻閱數據庫的程序時(shí),首先翻閱圖表目錄數據庫,選定某個(gè)圖表后,動(dòng)態(tài)地產(chǎn)生針對不同表格的DCL對話(huà)框語(yǔ)言文件以控制對話(huà)框的顯示外觀(guān)。4。利用我們自己開(kāi)發(fā)的LISPBASE數據庫接口操縱所有數據庫。5。圖形存放在SLB庫中并用目錄數據庫進(jìn)行管理。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的菜單下,以方便用戶(hù)使用。激活HANDBOOK程序后,首先顯示所有數據表的目錄選擇對話(huà)框。下圖是一個(gè)例子:
在對話(huà)框的數據表目錄滾動(dòng)列表框內選擇所要翻閱的表格,按OK鍵,HANDBOOK程序就自動(dòng)產(chǎn)生控制該表格的DCL對話(huà)框控制語(yǔ)言文件,然后就可以在屏幕上用對話(huà)框的形式顯示該表格的內容,例子見(jiàn)下圖:

對話(huà)框可以包括一至多個(gè)插圖和滾動(dòng)數據列表框。插圖的多少和列表框的寬度取決于使用顯示器的分辨率,常用的640X480分辨率VGA顯示器一般可以顯示三幅插圖,70列數據字符。如使用較高分辨率的顯示器。也可以對HANDBOOK程序稍加修改,顯示更多的圖形和數據。數據列表框的頂部自動(dòng)根據數據庫字段名和字段寬度顯示字段名,列表框的行數不限。如果用戶(hù)使用中文AutoCAD環(huán)境,可以顯示中文內容。對HANDBOOK程序稍加修改可以用盡量大的面積顯示圖形,也可以實(shí)現完全類(lèi)似于人工在工程設計圖表中的諾模圖類(lèi)型的圖表上直接選擇制定參數的功能。
本文介紹的程序和方法支持網(wǎng)絡(luò )上多用戶(hù)使用,支持DOS和Windows兩種版本的AutoCAD v12.
對于比較大的單位,需要使用
ORACLE,SYBASE,INGRESS,SQL-SERVER,等數據庫的情況,可以使用另外一個(gè)AutoCAD Lisp 語(yǔ)言環(huán)境下的ODBC數據庫接口--LISPODBC。由于現在幾乎所有的數據庫都支持ODBC,因此利用LISPODBC可以不受數據庫的限制。
適用 AUTOCAD 環(huán)境的 LISPBASE 數據庫接口介紹
LISPBASE v2.0
是一個(gè)在 AUTOCAD V12 環(huán)境下訪(fǎng)問(wèn)DBASE/ Foxbase / Foxpro 等Xbase 系列數據庫程序。使用 AUTOCAD 內嵌語(yǔ)言 AUTOLISP 的語(yǔ)法。使AUTOLISP 擴充了訪(fǎng)問(wèn)數據庫的功能。LISPBASE 提供了常用的21個(gè)函數。最多可同時(shí)打開(kāi)操作10個(gè)數據庫文件。索引文件使用擴展名為IDX的Fox系列數據庫索引文件,對每個(gè)數據庫文件所打開(kāi)的索引文件打開(kāi)數不限。并且允許多個(gè)用戶(hù)在網(wǎng)絡(luò )工作站上以共享方式訪(fǎng)問(wèn)在網(wǎng)絡(luò )服務(wù)器上的數據庫。LISPBASE 有DOS 和 WINDOWS 兩種版本,分別運行于DOS 或WINDOWS 版AUTOCAD V12 環(huán)境。 LISPBASE的典型應用是編在AUTOLISP語(yǔ)言程序中實(shí)現的。各種設計任務(wù)中的查表,數據記錄,明細表生成等均可利用LISPBASE訪(fǎng)問(wèn)數據庫。我們還可向需要開(kāi)發(fā)參數設計軟件的用戶(hù)提供按用戶(hù)需要定制的表達式求值函數和通用數據庫查表函數--EVALEXPRS 和 SEEKTABLE。
LISPBASE 的運行
啟動(dòng)了
AUTOCAD 后,用(XLOAD "LISPBASE")命令可以把LISPBASE調入內存并和AUTOCAD建立聯(lián)系。然后就可以使用LISPBASE 提供的LISP語(yǔ)法的函數對用戶(hù)建立的 FOXBASE數據庫進(jìn)行操縱了。注意:
LISPBASE.EXE 可執行文件應該在AUTOCAD的搜索路徑中,即在 DOS 批處理命令中的環(huán)境變量設置命令 SET ACAD= ... 的路徑中。例如有:
SET ACAD=C:\\ACAD;C:\\ACAD\\SUPPORT;C:\\ACAD\\FONTS則
LISPBASE.EXE 可執行文件應該在上述路徑中。關(guān)于 LISPBASE 的數據類(lèi)型的說(shuō)明
1
。LISPBASE 的與數據庫記錄編號有關(guān)的函數受LISP數據類(lèi)型限制,記錄編號在兩字節有符號整數能表示的范圍內。2
。LISPBASE 讀取 DBASE/FOX 系列數據庫的方法:對數值型字段:字段寬度
>= 4 或有小數點(diǎn),作為浮點(diǎn)數處理,否則作為整數處理。日期型字段:作為
8 字符寬度的字符串處理。邏輯型字段:作為
1 字符寬度的字符串處理。字符型字段:作為字符串處理。
通用型字段:
FOXPRO 2.5 版有通用型字段,讀寫(xiě)時(shí)作為 10 字符寬度的字符串處理。對于插入記錄操作應以空格字符串寫(xiě)出。對于替換記錄操作不應改動(dòng)原來(lái)字段的內容,否則會(huì )出現數據庫內容的不一致現象。備注型字段:讀寫(xiě)時(shí)作為
10 字符寬度的字符串處理。對于插入記錄操作應以空格字符串寫(xiě)出。對于替換記錄操作不應改動(dòng)原來(lái)字段的內容,否則會(huì )出現數據庫內容的不一致現象。3
。對于 Locate,Sum,Count 等可對數據庫記錄內容和 AutoLisp 變量?jì)热葸M(jìn)行邏輯運算操作的函數,不可對通用型字段和備注型字段進(jìn)行邏輯運算操作。LISPBASE 的 21個(gè)函數的清單:
(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
函數用于以共享方式打開(kāi)數據庫,并使該數據庫和一個(gè)0…9的整數聯(lián)系起來(lái)。(use DBFFileID Filename)
函數如果成功地打開(kāi)了數據庫,返回 DBFFileID。Filename
是數據庫文件名字符串。必須是一個(gè)合法的DOS文件名。在路徑中表示子目錄的反斜線(xiàn)必須用兩個(gè)。use 函數可以訪(fǎng)問(wèn)網(wǎng)絡(luò )服務(wù)器上的文件。打開(kāi)數據庫后應盡快關(guān)閉。用戶(hù)編制訪(fǎng)問(wèn)數據庫的程序時(shí),應檢測是否打開(kāi)數據庫,如果不能打開(kāi),則經(jīng)過(guò)適當的延時(shí)再試一試打開(kāi)的操作。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9之間的一個(gè)整數。如果成功地打開(kāi)了數據庫,函數返回
DBFFileID,否則返回 -1。例子:
(setq FieID (use 1 "f:\\design\\object1\\partlist.dbf" ) )(if (/= FieID 1) (print "DBF File can't open"))
注解:
Filename ,DBFFileID 都可以是 LISP 變量。以下的12個(gè)函數同樣。以下不再重復。
2
。(index DBFFileID IndexFilename IndexFilename ...)index
函數用于打開(kāi)數據庫的索引文件。(index DBFFileID IndexFilename IndexFilename ...) 函數如果成功地打開(kāi)了索引文件,返回 DBFFileID。否則返回 -1。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9之間的一個(gè)整數。IndexFilename
是索引文件名字符串。必須是一個(gè)合法的DOS文件名。索引文件可以同時(shí)打開(kāi)多個(gè),數量不限。但受內存限制。對打開(kāi)索引文件的數據庫使用
seek 函數進(jìn)行查找時(shí),LISPBASE 使用第一個(gè)索引文件。對打開(kāi)多個(gè)索引文件的數據庫進(jìn)行插入操作時(shí),同時(shí)對多個(gè)索引文件更新。注意索引關(guān)鍵字不能包括FOXBASE能夠執行的字符串或數據轉換函數和表達式,如STR(),CHR(),SUBSTR()等。例子:
(index 0 "d:\\prod\\part01.idx" "d:\\prod\\part02.idx" "d:\\prod\\part03.idx")3
。(getrec DBFFileID)getrec
函數用于取得打開(kāi)的數據庫的當前記錄,getrec 如果執行成功,則返回由數據庫各字段數據構成的一個(gè)表。否則返回 nil 。表的第0個(gè)原子是表示該記錄是否刪除的字符。如已刪除,為 *;如未刪除,為空格。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例子:
(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
用于從當前數據庫記錄指針的位置移動(dòng)數據庫的記錄指針。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。Skip_Num
是要移動(dòng)的記錄條數??梢允钦麛?。也可以是負整數。如果執行成功,函數返回記錄編號。如果正向移動(dòng)記錄指針超出了數據庫的最后一個(gè)記錄,函數返回數據庫記錄數加
1的數字。如果負向移動(dòng)記錄指針超出了數據庫的第一個(gè)記錄,函數返回0。對打開(kāi)了索引文件的數據庫同樣如此。例子:
(skip 0 30)5
。(bof DBFFileID)bof
用于測試記錄指針是否指向文件頭。如果是,返回1,否則返回0。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例子:
(if (= (bof 0) 1) (print "File Begen."))
6
。(eof DBFFileID)eof
用于測試記錄指針是否指向文件尾。如果是,返回1,否則返回0。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例子:
(if (= (eof 0) 1)(print "File End"))
7
。(shut DBFFileID)shut
函數用于關(guān)閉打開(kāi)的數據庫。如果關(guān)閉成功,返回 DBFFileID,否則返回-1。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例子:
(setq f 1)(use f "personal.dbf")
......
(shut f)
8
。(replace DBFFileID RecordList)replace
用于替換打開(kāi)數據庫的當前記錄。操作如果執行成功,函數返回記錄編號,否則返回0。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。RecordList
是由一個(gè)刪除標記字符和數據庫各字段數據構成的一個(gè)表。刪除標記字符必須是表的第一個(gè)原子。其他各原子的數據類(lèi)型必須與數據庫的各對應字段保持一致。如果有索引文件打開(kāi),所有索引關(guān)鍵字字段不允許修改。否則容易造成索引文件的破壞。
例子:
(setq reclst (list " " "Q021234 " 5 20.4 ))(use 0 "part.dbf")
(replace 0 reclst)
(shut 0)
9
。(erase DBFFileID)erase
用于刪除打開(kāi)數據庫的當前記錄。如果該記錄已經(jīng)刪除,則恢復之。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。刪除操作成功,函數返回 DBFFileID,否則返回-1。例子:
(use 5 "part.dbf")(skip 5 10)
(erase 5)
(shut 5)
10
。(insert DBFFileID RecordList)insert
用于向打開(kāi)的數據庫插入一條記錄。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。操作如果執行成功,函數返回記錄編號,否則返回-1。RecordList
是由一個(gè)刪除標記字符和數據庫各字段數據構成的一個(gè)表。刪除標記字符必須是表的第一個(gè)原子。其他各原子的數據類(lèi)型必須與數據庫的各對應字段一致。對打開(kāi)多個(gè)索引文件的數據庫進(jìn)行插入操作時(shí),同時(shí)對多個(gè)索引文件更新。
例子:
(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
用于在打開(kāi)了索引文件的數據庫中進(jìn)行查找。如果找到。函數返回該記錄的記錄號。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。使用
函數之前必須打開(kāi)數據庫和索引文件。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
用于操縱打開(kāi)數據庫的當前記錄號。使之指向 Record_Id,如果 Record 超出了數據庫的最大記錄號或執行不成功,返回 0。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。Record_Id
是要指向的記錄號。對打開(kāi)索引文件的數據庫使用此函數后,索引文件的索引指針會(huì )指向 Record_id。例子:
(use 0 "part.dbf")
(setq rcd(goto 0 5))
(setq rcd(getrec 0))
(print rcd)
(shut 0)
13
。(recno DBFFileID)recno
用于返回打開(kāi)數據庫的當前記錄號。如果BOF或EOF為真,返回0。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例子:
(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
用于把打開(kāi)數據庫的當前記錄號指向為數據庫的第一條記錄。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。對于打開(kāi)了索引文件的數據庫文件,當前記錄號指向索引順序的第一條記錄。例子:
(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
用于把打開(kāi)數據庫的當前記錄號指向為數據庫的最后一條記錄。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。對于打開(kāi)了索引文件的數據庫文件,當前記錄號指向索引順序的最后一條記錄。例子:
(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
用于把打開(kāi)數據庫的當前記錄號指針向后推向滿(mǎn)足條件表達式的第一條記錄,或者說(shuō)是條件表達式為真的記錄。locate 返回記錄號。locate 函數是從當前記錄開(kāi)始操作的。如果要從文件頭開(kāi)始操作,應在 locate 函數執行前執行 gotop。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。ConditionExpress
是由 AutoLisp 變量,數據庫字段,數字,字符串,邏輯運算符,算術(shù)運算符,圓括號等組成的邏輯運算表達式。該表達式與 FoxBase 的相應表達式兼容。圓括號 :
(,)。AutoLisp
變量 :AutoLisp 內部的用戶(hù)建立的變量,可以是整數,浮點(diǎn)數, 字符串類(lèi)型。數據庫字段 :
Dbase/FoxBase/Foxpro 數據庫的字段名。字段數據類(lèi)型 可以是數字,字符串,邏輯,日期。但不能是備注 (mem) 類(lèi)型和通用(general)類(lèi)型的。算術(shù)運算符 :包括
+,-,*,/,取余數%,冪^。數字 :可以是整數,浮點(diǎn)數,科學(xué)計數法數值等。
字符串 :由單引號‘
引導和結束的任何字符,包括漢字。邏輯運算符 :
與: .AND.或: .OR.相等: =大于: >小于: <大于等于: >=小于等于: <=不等于: <>各算術(shù)運算和邏輯運算符的優(yōu)先級別遵從一般程序設計語(yǔ)言的規則,可參閱
BASIC、C、PASCAL、FORTRAN等參考書(shū)。比較邏輯運算可以用于字符串。注:邏輯運算表達式的說(shuō)明適用于
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] 參數時(shí)。累加數據庫的數值字段的數值的條件是滿(mǎn)足條件表達式記錄,或者說(shuō)是條件表達式為真的記錄。當使用了可選的 [FieldList] 參數,對 [FieldList]表中的數據庫字段進(jìn)行累加。[FieldList] 參數沒(méi)有提供時(shí),對所有數值字段累加。函數返回一個(gè)表,表的各項是按照數據庫中數值字段排列的各字段累加數據和。sum
函數是從當前記錄開(kāi)始操作的。如果要從文件頭開(kāi)始操作,應在 sum 函數執行前執行 gotop。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。ConditionExpress
是由 AutoLisp 變量,數據庫字段,數字,字符串,邏輯運算符,算術(shù)運算符,圓括號等組成的邏輯運算表達式。該表達式與 FoxBase 的相應表達式類(lèi)似。詳細說(shuō)明見(jiàn) locate 參考。18
。(count DBFFileID [ConditionExpress])count
用于計算數據庫的記錄條數。當使用了可選的[ConditionExpress] 參數時(shí)。計算數據庫的記錄條數的條件是滿(mǎn)足條件表達式的記錄,或者說(shuō)是條件表達式為真的記錄。函數返回一個(gè)滿(mǎn)足條件表達式的記錄條數的整數。
count
函數是從當前記錄開(kāi)始操作的。如果要從文件頭開(kāi)始操作,應在 count 函數執行前執行 gotop。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。ConditionExpress
是由 AutoLisp 變量,數據庫字段,數字,字符串,邏輯運算符,算術(shù)運算符,圓括號等組成的邏輯運算表達式。該表達式與 FoxBase 的相應表達式類(lèi)似。詳細說(shuō)明見(jiàn) locate 參考。例:
(use 0 "GB3811.dbf")(setq n (count 0 "A>=1.2"))
(print n)
19
。(dbname DBFFileID)dbname
用于返回數據庫文件名。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例:(use 0 "GB3811.dbf")(setq dbn (dbname 0))
20
。(stru DBFFileID)stru
用于返回數據庫結構。函數返回一個(gè)表,表的各項是 17 個(gè)字符的字符串。字符1…10 是數據庫字段名,字符 12 是字段數據類(lèi)型,字符14…15是字段寬,字符 17 是數值型字段的小數點(diǎn)位置。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例:
(use 0 "GB3811.dbf")(setq struct (stru 0))
(print struct)
21
。(reccnt DBFFileID)reccnt
用于返回數據庫記錄數。DBFFileID
是數據庫文件編號。類(lèi)似于FOXBASE的工作區編號。必須是0…9
之間的一個(gè)整數。例:
(use 0 "GB3811.dbf")(setq n (reccnt 0))
(print n)
聯(lián)系客服