神奇的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