Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 12867|回复: 22

SQLITE 資料庫瀏覽工具

[复制链接]

该用户从未签到

发表于 2010-8-25 23:55:47 | 显示全部楼层 |阅读模式
SQLITE 是小型高效能的單機版資料庫, 評估後拿來當作 POS 上可單機獨立作業的 LOCAL 端單機資料庫非常適合, 之前在 WINDOWS 下我用 PARADOX 或 ACCESS  , 在 LINUX 下我就用 SQLITE ( 應該比 LAZARUS 內建的單機資料庫 DBF 更好用) , 使用 SQLITE 後, 當然要為它寫一個可以瀏覽內容的工具 ,順便透過工具程式開發的練習瞭解 LAZARUS 資料庫物件有哪些特性或 BUG 限制 , 以後真正寫 POS 系統或其他程式時可以瞭解這些特性跟避開既有的 BUG

在 Linux 中安裝 sqlite3 資料庫環境

All required headers come with Lazarus+fpc. Problem is that there is no libsqlite3.so in system.
Basically it all depends on system but in general you must type as root (network connection required):
On Debian/Ubuntu like systems: apt-get install sqlite3
On RedHat and other yum based: yum install sqlite3
On openSUSE: zypper install sqlite3


安裝資料庫 (以 ubuntu 10.04 之 Linux 環境下為例)
apt-get install sqlite3

裝完, 為 libsqlite3.so.0.8.6 (視安裝版本而有不同) 做個 symbo link (libsqlite3.so), 這樣 Lazarus 程式就可執行 sqlite3 相關的資料庫操作

sudo ln -s /usr/lib/libsqlite3.so.0.8.6 libsqlite3.so


  列出 DATABASE 內所有 TABLE  (程式畫面中左邊的部份)
select * from sqlite_master where type='table' order by name


  列出某 TABLE 的 SCHEMA
select sql from sqlite_master where type='table' and name='某 TABLE'
p.s. 在工具程式的左邊 TABLE LIST 中, 在任一 TABLE 上按滑鼠右鍵, 有 SCHEMA 功能, 可以倒出該 TABLE 的結構, 就是執行這段 SQL


要讓 SQLQuery1.RecordCount 取出的記錄筆數正確
SQLQuery1.PacketRecords:=-1;  //要設定這個屬性


執行 DROP TABLE 或 CREATE TABLE 的 SQL 語句時要用到 SQLTransaction 物件
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Text:='你的 SQL 語句';
//SQLite DROP 跟 CREATE TABLE 要用到 Transaction, 否則無法真實寫入
if not SQLTransaction1.Active then SQLTransaction1.StartTransaction;
SQLQuery1.ExecSQL;
SQLTransaction1.Commit;
           

要可以在 DBGRID 物件上直接新增或編輯資料  (程式畫面中右下邊的物件)
1.TABLE 要設 PRIMARY KEY
2.或許是 LAZARUS 的 BUG, 我需在 SQLQuery1 的下面兩個事件中加入 CODE

procedure TForm1.SQLQuery1BeforePost(DataSet: TDataSet);
begin
  SQLQuery1.UpdateMode:=upWhereKeyOnly;
end;   

//這樣才能在 dbgrid 中編輯資料
procedure TForm1.SQLQuery1AfterPost(DataSet: TDataSet);
var row_idx: integer;
begin
  row_idx:=SQLQuery1.RecNo;
  try
  SQLQuery1.ApplyUpdates;
  SQLTransaction1.Commit;
  except
    SQLTransaction1.Rollback;
  end;
  SQLQuery1.Open;
  SQLQuery1.First;
  SQLQuery1.MoveBy(row_idx-1);
end;

要可以在 DBGRID 物件上直接按 CTRL+DELETE 刪除一筆資料  (程式畫面中右下邊的物件)
1.TABLE 要設 PRIMARY KEY
2.或許是 LAZARUS 的 BUG, 我需在 SQLQuery1 的下面兩個事件中加入 CODE

procedure TForm1.SQLQuery1BeforeDelete(DataSet: TDataSet);
begin
  SQLQuery1.UpdateMode:=upWhereAll;
end;   

//這樣才能在 dbgrid 中刪除資料
procedure TForm1.SQLQuery1AfterDelete(DataSet: TDataSet);
var row_idx: integer;
begin
  row_idx:=SQLQuery1.RecNo;
  try
  SQLQuery1.ApplyUpdates;
  SQLTransaction1.Commit;
  except
    SQLTransaction1.Rollback;
  end;
  SQLQuery1.Open;
  SQLQuery1.First;
  if (row_idx-1)>(SQLQuery1.RecordCount-1) then
  SQLQuery1.Last
  else
  SQLQuery1.MoveBy(row_idx-1);
end;      


使用 SQLITE 遇到的其它問題
不曉得是 Lazarus 元件 BUG 還是 SQLITE3 本身不支援 NVARCHAR 型態,  在 CREATE TABLE 時只能宣告 VARCHAR 型態, 遇到有放中文字的欄位,  欄位要加大一些(尤其是中文字塞滿整個欄位長度的情況下), 否則尾端中文字會變亂碼
           
P.S. 可以把 VARCHAR 型態宣告為原本的兩倍長度以取代 NVARCHAR , 例如 NAME 這個欄位原本預計要放五個中文字(10 個 BYTE), 在 UNICODE 情況下應該宣告為 NAME NVARCHAR(10) , 但因  Lazarus 元件 不能使用 NVARCHAR 型態 (會出現 UNKNOWN DATA TYPE 錯誤), 我們又一定要可以存放五個中文字的 UNICODE, 此時可宣告為 NAME VARCHAR(20)



■ 程式下載 (含 source code)
digitraveler.homelinux.com/down_load/LazSqlLiteTool(Linux).zip  (前面請加 HTTP://)
P.S.
1.因圖中呈現資料為我客戶商業資料, 不能釋出, 所以下載中 POSDB.SDB 內只有空的資料結構
2. 在 WINDOWS 下使用 SQLITE 更簡單, 只要把 sqlite3.dll (下載中有附 , Linux 版不用這個 dll 檔 ) 跟你的執行檔放在同一目錄即可使用, 連安裝都不必 , LAZARUS 是跨平台的, 把本工具改成 WINDOWS 版的不用一分鐘 ...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x

评分

参与人数 1威望 +6 收起 理由
猫工 + 6 谢谢分享

查看全部评分

回复

使用道具 举报

该用户从未签到

发表于 2010-8-26 00:00:54 | 显示全部楼层
原来用过sqlite的客户端工具,不过是第三方的,不是lazarus写的,现在看到用lazarus写的了
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-8-26 04:04:43 | 显示全部楼层

回 2楼(bruce0829) 的帖子

楼主有研究过用LAZ打印條码么?有解决思路么?
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2010-8-26 07:19:03 | 显示全部楼层
POS 通常只用來讀條碼, 不對條碼做打印, 不過也算相關領域, 但目前還沒接觸到, 有空再找找 ....
最近要幫上海一家百貨公司的小吃街 POS 做出單, 有用到一種熱感應式印表機, 看到其 EPSON 指令集中有打印條碼的指令, 我是沒用到該指令, 但看起來好像是送出 EPSON COMMAND 就可打印出條碼的樣子
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-8-26 08:19:38 | 显示全部楼层
个人觉得pos(指的前台收款)需要用到这几个方面的技术(可能没说全):
1.本地数据库存储(离线时收款)
2.远程数据库调用(直接连接和用webservice)
3.对键盘按个按键设置快捷键
4.不同的收款机会有不同的接口,接口的调用,如dll
5.外设的控制(打印机、条屏、钱箱、密码键盘等)
6.个人觉得条码枪和条码设备不用开发,直接接上去,就可以扫得出来,即插即用
7.算法,很多算法,价格的,打折的,流程的
8.对键盘的锁定(不允许切换出去,不允许用开始键等)
9.数据包上传下载的完整性

其它还没有想到,再补充吧
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-8-26 16:32:03 | 显示全部楼层
LAZ对打印机支持不好,不知道楼主在做的时候遇上了没有 .
不能自定打印纸张大小,只能默认用 A4大小.
遇上票据打印那种连续進纸的.可能有会造成问题,
连续進纸我未试過,所以不是很确定
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2010-8-26 17:35:49 | 显示全部楼层
以 POS 系統來說, 個人使用經驗中打印都是使用所謂的 Serial Port 印表機, 也就是透過 RS-232 控制, 列印內容就是小票發票之類的內容, 常用的有控制方式有 EPSON 指令集, 也就是對打印機發出"列印一行, 跳 N 行, 切紙, 定位 ....等幾個指令, 只要發出相對應的 EPSON 指令集, 打印機就會做對應的動作

Lazarus 拿來做一般行政文書工作的打印目的的確不方便, 但對 POS 系統的打印動作應用足矣 ...
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2010-8-26 18:58:15 | 显示全部楼层
在pos中有见过串口和并口打印机
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2010-8-26 18:59:02 | 显示全部楼层
."算法,很多算法,价格的,打折的,流程的" ..... 我們這統稱叫"組合促銷"
日本人把組合促銷玩的最瘋, 台灣流通業又都是跟隨日本系統,
一種商品背後綁了好幾種玩法 ,
兩件八折, 再加群組折扣, 到最後可能還因你支付使用特定付款方式再來個 9 折
(沒用該付款就只有商品本身量販促+群組折扣)
搞到收銀員自己都算不出商品最後該賣多少錢, 只能完全相信收銀機算出的價格, 有沒有可能程式會算錯? 有可能 , 但機率很小

小弟參與過全台約三千家連鎖規模的便利超商 POS 開發,
以每家平均兩台收銀機來看, 程式一灑下去就是六千台 POS 在使用, 這種規模的客戶不可能讓我隨便乎巄的,
程式交付之前公司有整組測試人員在測試, 交付後他們IT 也要再測一遍, 沒人敢拿三千家的店開玩笑,


不過組合促銷屬於商業邏輯, 不算 IT 技術, 靠的是經驗及數學, 跟 Lazarus 寫不寫得出來沒有關係, 計算處理過程需要使用 Structure, Array, Memory Table 之類的物件 , 小弟前面 PO 過一篇 "記憶體資料表 TMemDataset 控件的使用 " 幫原本功能不足的 Lazarus TMemDataset 控件加上了排序搜尋等方法, 主要也是為了以後這類內部最佳化 (Optma) 數學處理的問題做準備
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2010-8-26 21:15:12 | 显示全部楼层
我來分析一下貓工長官提供的 POS 領域需用到的技術, 跟我貼過的幾篇研究做個對照 (與 Lazarus 有關係的)

1.本地数据库存储(离线时收款)   

小弟打算用 SQLITE 當 本地数据库存储,  "SQLITE 資料庫瀏覽工具", 就是研究如何存取與處理 SQLITE 的相關應用技術

2.远程数据库调用(直接连接和用webservice)

小弟遇到的客戶(主要都是承襲日本系統習慣), POS 只對 POS SERVER 做遠程調用, 對其它服務都透過 POS SERVER 代勞, POS 不直接對外部其它 SERVER 做 REQUEST ; 而 POS 跟 POS SERVER 間只使用專屬的 Middle ware 做通信, 小弟 INDY 那篇就是在研究這個部份的實作

3.对键盘按个按键设置快捷键 ->

屬商業邏輯, 跟 Lazarus 開發能力無關

4.不同的收款机会有不同的接口,接口的调用,如dll

對 Lazarus 如何 import *.dll 到是還沒研究, 不過對於 WIN32 環境下, 一套程式開發工具, 如 C, C#, VB , DELPHI等等對 DLL 對向的使用應該是最基本的能力, 我想 Lazarus 引用各種接口的 *.DLL 應該無問題

5.外设的控制(打印机、条屏、钱箱、密码键盘等)

很多週邊都是使用 RS-232 來控制, 對於 COMPORT RS-232 的使用我也貼過文了

6.个人觉得条码枪和条码设备不用开发,直接接上去,就可以扫得出来,即插即用

台灣習慣使用 RS-232 條碼槍, 在深圳遇過用 K/B 相容的 USB 條碼槍 (發出跟 K/B 一樣的 ASC II 訊號)會有個問題, 當刷會員卡牽涉到返利金時, 輸入卡號無法判斷是手工 KEYIN 或是使用條碼槍
因為信號都是從 KEY DOWN 進來, 如果我說沒帶卡, 胡亂唸一個卡號要收銀員 KEYIN, 剛好有這個卡號, 又剛好該卡號有不少返利金可使用, 變成任何人都可以去盜用別人的返利金, 所以我客戶要求程式能判斷卡號是手輸就不能使用返利金, 條碼槍刷入(表示有帶卡)才能使用卡裡面的返利金, 若用 RS-232 條碼槍很好判斷, 因為進來的接口地方不一樣, 深圳的這個問題(使用 USB 條碼槍 , 程式就無法分辨卡號是 KEYIN 還是掃瞄進來的)
我最後還是解決了這個問題, 留給大家猜猜我的解決方式



7.算法,很多算法,价格的,打折的,流程的

組合促銷, 屬商業邏輯, 跟 Lazarus 開發能力無關

8.对键盘的锁定(不允许切换出去,不允许用开始键等)   

屬商業邏輯, 跟 Lazarus 開發能力無關

9.数据包上传下载的完整性

靠經驗規劃架構的完整性 , 若規劃不好, 使用最先進的傳輸技術一樣會 LOSS 資料, 屬商業邏輯, 跟 Lazarus 開發能力無關 ; 若真要保證資料在物理傳輸通訊上的完整性, INDY 那篇可以再研究如加強對 DATA 傳輸過程中的 HAND SHAKING, ERROR RETRY, 等容錯處理能力
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 23:57 , Processed in 0.046152 second(s), 14 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表