神奇的mtable
適用於 mysql paradox mssql
2003年02月25日 版
重要屬性:
autocreate
是否自動建立tablename
autoord
是否為自動欄位 需有ord名稱的欄位
且需用appendatend指令
tablename
設定資料表名稱 改變時 sql.text會改變 通常以
tb_xxx
checkdataed
使用權限設定可否刪除新增與修改
cdfilename
若找不到tablename 會自動建立table 並載入資料 如 def_tb_xxx.cds
datasource
當表身用時 需指向表頭
istempfile
是否為暫存檔
property alldata
以異型變數取得資料
property truedatabasename
取得真的資料庫名稱 如gdbpro為mdb600
property databasetype
取得mtable 的資料庫型態 dtparadox,dtmysql,dtmssql,dtoracle
property sqltb: tmtable
取得mtable 的子table sqltb用於另一執行query使用
property temptb: tmtable
取得mtable 暫存table 參考savetotemp指令
property recordnumber: longint read getrecno;
傳回目前記錄的號碼
函數:
procedure applypost;
儲存檔案(寫回資料庫)
procedure sortord;
排列順序 必須要有"ord"欄位 且autoord屬性要設為真
並且indexfieldnames='ord'; 或indexfieldnames='waterno;ord';
procedure deleteall;
刪除現行所有資料
procedure deletealldata;
刪除所有資料(非可見與不可見,如同新的table一樣
procedure execsql;
執行sql指令(請參考 sql屬性)
procedure flushtables;
更新資料庫的資料表,mysql某些資料表更改結構後需要執行此指令
(mysql使用)
其他型資料庫無效
function ismodify: boolean;
傳回資料表是否有被修改 dsinsert,dsedit=true
function isbrowse: boolean;
資料表是否為瀏覽狀態
function finded(fdname, value: string): boolean;
尋找是否有欄位內容的值 找到會停在該筆 (一筆一筆的找)
procedure findandgoto(fdname, value: string);
尋找是否有欄位內容的值 找到會停在最接近value的該筆
(索引名稱會改變)
function sqlfind(fdname, value: string): boolean;
以sql方式查詢 並開啟資料表 matble 會關閉資料表,並以該條件查詢後開啟資料表
function sqltablefind(tablename, fdname, value: string): boolean;
mtable以另一個query查詢tablename是否有該欄位值
function quicksearch(value: string): boolean;
以value值查詢任何欄位 有符合變列出
資料表會重開
procedure runsql(sqlcommand: string);
以另一個query執行sql指令 mtable本身沒有動作(不開檔也不關檔)
常用於更新或刪除另一資料表的資料
procedure runcommand(command: string);
以本身query執行命令 資料表會重開 如:'select * from tb_client where
kind=1'
function querycommand(condition: string): string;
傳回 條件 sql指令 如 a001 mtable會將整資料表內容有a001的列出
通常很少直接使用 須配quicksearch函數
procedure addmemostr(fieldname, value: string);
將value值填入fieldname欄位 memo欄位無法直接使用
所以需要此指令
procedure appendatend;
資料表設為新增狀態在資料表最尾端
procedure account(st: array of string);
計算陣列的欄位的內容 如 account(['a1','a2']); 並將結果放置於
cacuval[1],cacuval[2]
procedure accountall;
計算所有整數及浮點數欄位 並自動新增一筆資料
並填入值於新的資料中
需要下 post指令
procedure checkrequiredfields;
檢查所有必要欄位(required為true) 是否為空 若為空則出現 xx為為必要欄位
procedure checkrequiredfield(field: tfield);
檢查field欄位 是否為空 若為空則出現 xx為為必要欄位
function checkneedmsg(field: tfield): boolean;
檢查field欄位 是否為空 若為空則出現顯示訊息
並傳回是否為空
procedure trypostorcancel;
需存檔就存檔不然就取消 (有必要欄位時)
procedure trypost;
需存檔就存檔
procedure tryedit;
如果狀態state 不在(dsedit,dsinsert)就修改
通常用於不知該資料表
是否在dsedit狀態下
procedure trydelete;
如果mtable有資料就刪除該筆資料(一筆)
procedure masteredit;
如果mtable為表身時 會將datasource指的dataset設為edit
通常不會直接使用
procedure movetocenter;
將資料(dbgrid)設到中間 (dbgrid為可見時)
function canedit: boolean;
判斷使用者是否有權限更改mtable內容
procedure truecancel;
真的取消所有的異動
procedure reopen;
重新開啟資料表(依照sql.text的指令)
procedure savebook;
儲存現在記錄指標 (配合restorebook)
procedure saveindex;
儲存現在的索引名稱 (配合restoreindex)
procedure savebookindex;
儲存現在的指標與索引名稱 (配合restorebookindex)
procedure saveposdisable;
儲存現在記錄指標並將資料表設為disablecontrols的狀態 (配合restoreposenable)
procedure restorebook;
還原savebook的指標
procedure restoreposenable;
還原指標並將資料表設為enablecontrols
procedure restoreindex;
還原索引
procedure restorebookindex;
還原指標與索引
procedure savetotemp;
將現有資料存到暫存的mtable temptb 可指接使用 temptb
當mtable釋放時會自動釋放temptb 通常用於 複製整個mtable的資料
procedure savesqltext;
將sql.text 內容先儲存起來
procedure restoresqltext;
還原sql.text內容
function openandfindkey(keyst: string): boolean;
開啟檔案並尋找keyst內容
function oldvalue(fieldname: string): string;
取得尚未被修改的欄位值
function curvalue(fieldname: string): string;
取得目前的欄位值
function hasnewvalue(fieldname: string): boolean;
傳回該欄位是否有被修改(新增不算)
function updatingsql(tablename, tfieldname, sfieldname, condition: string): longint;
更新另一資料表的欄位內容
function addstyle: taddstyle;
傳回目前mtable是在新增或修改的狀態
function findlabel(st: string): tfield; //尋找顯示欄欄位
依displaylabel尋找欄位 若找不到則傳回nil
function truepost: boolean;
真的存檔(將資料回寫到資料庫0
procedure switchindex(fieldname: string);
將indexfieldname設為fieldname 現在已很少用
procedure checkwaterno(tbq: tdataset);
表頭與表身用 當表頭waterno欄位有變時會檢查並更新表身
出貨單,進貨單
等等貨單用 必須要有waterno欄位
procedure checkzeroempty;
如果所有欄位值為零將欄位設為空白 (ftinteger,ftfloat,ftcurrency)
procedure updatemasterfields(detailtb: tmtable);
表身有改變時更新表頭
procedure updatedetails;
更新表身
function hasfieldvalue(fieldname, value: string): boolean;
判斷是否有重複資料 有為真
function checkhasfieldvalue(fieldst, st: string): boolean;
判斷是否有重複資料 並顯示訊息
function tableexists(tablename: string): boolean;
判斷某個資料表是否存在
function tablerecord(tablename: string): integer;
傳回某個table有多少筆記錄
procedure getfieldlist(fdname: string; lst: tstrings; filt: boolean);
將某欄位內容放於lst字串陣列 filt為是否過濾 (當filtered設為真時)
procedure getlabellist(lst: tstrings);
將所有可見的field.displaylabel放於lst陣列內
function fn(fieldname: string): tfield;
尋找欄位 為fieldbyname 的縮寫
procedure resetzeorfield(const sfd: array of string);
將陣列內的欄位值填入0
procedure createnew;
建立一新的暫存檔 mtable 本身為記憶體型table
需配合 istempfile=true;注意是否有定義欄位
procedure createfromdataset(otb: tdataset);
建立一新的暫存檔 mtable 格式與otb相同
procedure setfieldfrom(otb: tdataset; const sfd, dfd: array of string);
將otb的sfd值寫入mtable的dfd值
如 setfieldfrom(otb,['a1','a2'],['b1,'b2']);
procedure setfieldfromempty(otb: tdataset; const sfd, dfd: array of string);
將otb的sfd值寫入mtable的dfd值 如果dfd的值為空的話
如 setfieldfrom(otb,['a1','a2'],['b1,'b2']);
procedure setfieldfromsame(otb: tdataset; const dfd: array of string);
將otb的dfd值寫入mtable 欄位名稱需相同 找不到欄位則略過
procedure setfielddefs(otb: tdataset; const dfd: array of string);
將otb的dfd的欄位定義寫入mtable
procedure setallfieldsfrom(itb: tdataset);
將itb的所有資料寫入mtable
procedure setfieldtoautowidth;
將欄位顯示設為欄位大小
procedure autosqldateopen(bgdate, eddate: tdate; searchcommand: string);
//暫時不用這個指令
procedure copyrecord;
複製現有的記錄並為新增狀態
procedure copyrecordqu(qu: tmtable; keyfield, wno: string);
複製表頭表身
procedure setlabelfrom(tb: tmtable);
將mtable的displaylabel設為tb的displaylabel
procedure setlabelas(tb: tmtable);
將mtable的displaylabel設為tb的displaylabel displaywitdh,visible
也會跟著變
procedure loadfromcds(filename: string);
由cds檔案載入資料 *.cds的內容會寫入mtable
使用sqltb sqltb為mtable的子table
procedure savetocds(filename: string);
將資料存到cds檔
procedure processmetadata(xmlstr: string);
以xml的資料處理xmlstr 可新增 修改 刪除 用於web
procedure setindexfieldnames(fieldnames: string);
indexfieldnames='code' 的補強程式 會自動更新dbindex