「Sqlitelsp」の版間の差分
編集の要約なし |
編集の要約なし |
||
| 31行目: | 31行目: | ||
* [[DSQL_KEYWORDS]] | * [[DSQL_KEYWORDS]] | ||
* [[DSQL_FUNCLIST]] | * [[DSQL_FUNCLIST]] | ||
サンプル | |||
* 引用:https://bricscadapi.wordpress.com/2010/08/25/sqlite-and-lisp-part1/ | |||
<pre class="brush:autolisp;"> | |||
; テーブル作成例 | |||
(DEFUN C:CREATETABLE (/ db) | |||
(SETQ DB "C:\\MySQLite.db") | |||
(DSQL_OPEN DB) | |||
(DSQL_DML DB "CREATE TABLE Products (ID INT unique, Name TEXT, Desc TEXT, Cost FLOAT);") | |||
; | |||
(DSQL_DML DB "begin transaction;") | |||
(DSQL_DML DB "REPLACE INTO Products VALUES (1,'シンク12x12','12x12 Sink', %g );" 175.50) | |||
(DSQL_DML DB "REPLACE INTO Products VALUES (2,'シンク18x24','18x24 Sink', %g );" 185.50) | |||
(DSQL_DML DB "REPLACE INTO Products VALUES (3,'シンク24x24','24x24 Sink', %g );" 205.50) | |||
(DSQL_DML DB "commit transaction;") | |||
; | |||
(DSQL_CLOSE DB) | |||
) | |||
; ファイル内のブロックを検索・集計して、結果を XML ファイルに書き込むシンプルな Lisp ルーチン | |||
(defun listXML (ls / itm sl str tstr) | |||
(setq str "" | |||
str (strcat str "<?xml version=\"1.0\" encoding=\"utf-8\" ?><products>")) | |||
(foreach sl ls | |||
(setq str (strcat str "<product ") tstr "") | |||
(foreach itm sl | |||
(setq tstr (strcat tstr (vl-princ-to-string (car itm)) "=\"" (vl-princ-to-string (cdr itm)) "\" ")) | |||
) | |||
(setq str (strcat str tstr " />")) | |||
) | |||
(setq str (strcat str "</products>")) | |||
) | |||
(defun getTotal (ls / cnt e1 e2 len lsout) | |||
(setq lsout '()) | |||
(setq ls (vl-sort ls | |||
(function (lambda (e1 e2) | |||
(< (cdr(car e1)) (cdr(car e2))))))) | |||
;CAB @ TheSwamp | |||
(while (setq itm (car ls)) | |||
(setq len (length ls) | |||
ls (vl-remove itm ls) | |||
cnt (- len (length ls)) | |||
lsout (cons (cons (cons "QTY" cnt ) itm) lsout) | |||
) | |||
) | |||
) | |||
(defun c:doit (/ activedocument c db iacadapplication modelspace s) | |||
(vl-load-com) | |||
(setq ls '() | |||
DB "C:\\MySQLite.db" | |||
s (ssget (list (cons 0 "INSERT"))) | |||
c 0 | |||
) | |||
(if s | |||
(progn | |||
(DSQL_OPEN DB) | |||
(While (< c (sslength s)) | |||
(setq e (vlax-ename->vla-object (cdr (car (entget (ssname s c))))) | |||
res (DSQL_ASSOCQUERY DB "SELECT * FROM Products where Name=('%s');" (vlax-get e 'name)) | |||
) | |||
(if res | |||
(setq ls (append(list res) ls)) | |||
) | |||
(setq c (1+ c)) | |||
) | |||
(DSQL_CLOSE DB) | |||
) | |||
(alert (strcat "製品が見つからなったよ")) | |||
) | |||
(setq fl (open "c:\\bom.xml" "w")) | |||
(princ(listXML(getTotal ls)) fl) | |||
(close fl) | |||
(princ) | |||
) | |||
</pre> | |||
2022年12月8日 (木) 06:47時点における版
SQLiteLsp 関数
AutoLISP からデータベースを操作するのは Microsoft ActiveX Data Objects (ADO) を使う方法がありますが、軽い Sqlite 直接操作したいねっていうことでなんやかんややられて SQLiteLsp として公開されている ARX アドオンによる LISP 関数のメモです。
- AutoCAD, BricsCAD, ZWCAD で使える。(2022年7月現在)
入手先とか細かいところはフォーラムのスレッドを読むといいでしょう。 theswamp.org
SQLiteLsp の関数
- DSQL_OPEN
- DSQL_CLOSE
- DSQL_CLOSEALL
- DSQL_QUERY
- DSQL_ASSOCQUERY
- DSQL_DML
- DSQL_SCALAR
- DSQL_SCALARSTR
- DSQL_CMPSTMT
- DSQL_STMTBIND
- DSQL_STMTFNL
- DSQL_VER
- DSQL_SQLITEVER
- DSQL_PRINTF
- DSQL_GETFORMAT
- DSQL_PRINTFX
- DSQL_GETFORMATX
- DSQL_LOADEXT
- DSQL_LASTERR
- DSQL_DUMPERR
- DSQL_KEYWORDS
- DSQL_FUNCLIST
サンプル
; テーブル作成例
(DEFUN C:CREATETABLE (/ db)
(SETQ DB "C:\\MySQLite.db")
(DSQL_OPEN DB)
(DSQL_DML DB "CREATE TABLE Products (ID INT unique, Name TEXT, Desc TEXT, Cost FLOAT);")
;
(DSQL_DML DB "begin transaction;")
(DSQL_DML DB "REPLACE INTO Products VALUES (1,'シンク12x12','12x12 Sink', %g );" 175.50)
(DSQL_DML DB "REPLACE INTO Products VALUES (2,'シンク18x24','18x24 Sink', %g );" 185.50)
(DSQL_DML DB "REPLACE INTO Products VALUES (3,'シンク24x24','24x24 Sink', %g );" 205.50)
(DSQL_DML DB "commit transaction;")
;
(DSQL_CLOSE DB)
)
; ファイル内のブロックを検索・集計して、結果を XML ファイルに書き込むシンプルな Lisp ルーチン
(defun listXML (ls / itm sl str tstr)
(setq str ""
str (strcat str "<?xml version=\"1.0\" encoding=\"utf-8\" ?><products>"))
(foreach sl ls
(setq str (strcat str "<product ") tstr "")
(foreach itm sl
(setq tstr (strcat tstr (vl-princ-to-string (car itm)) "=\"" (vl-princ-to-string (cdr itm)) "\" "))
)
(setq str (strcat str tstr " />"))
)
(setq str (strcat str "</products>"))
)
(defun getTotal (ls / cnt e1 e2 len lsout)
(setq lsout '())
(setq ls (vl-sort ls
(function (lambda (e1 e2)
(< (cdr(car e1)) (cdr(car e2)))))))
;CAB @ TheSwamp
(while (setq itm (car ls))
(setq len (length ls)
ls (vl-remove itm ls)
cnt (- len (length ls))
lsout (cons (cons (cons "QTY" cnt ) itm) lsout)
)
)
)
(defun c:doit (/ activedocument c db iacadapplication modelspace s)
(vl-load-com)
(setq ls '()
DB "C:\\MySQLite.db"
s (ssget (list (cons 0 "INSERT")))
c 0
)
(if s
(progn
(DSQL_OPEN DB)
(While (< c (sslength s))
(setq e (vlax-ename->vla-object (cdr (car (entget (ssname s c)))))
res (DSQL_ASSOCQUERY DB "SELECT * FROM Products where Name=('%s');" (vlax-get e 'name))
)
(if res
(setq ls (append(list res) ls))
)
(setq c (1+ c))
)
(DSQL_CLOSE DB)
)
(alert (strcat "製品が見つからなったよ"))
)
(setq fl (open "c:\\bom.xml" "w"))
(princ(listXML(getTotal ls)) fl)
(close fl)
(princ)
)