📄 ufrm_level4_3.~pas
字号:
// *******************************************
// * Program name: pattern ufrm_level4_3 *
// * AUTHOR : Guo xuliang 郭许良 *
// * Date : 2005/05/15 *
// * Purpose :公共模板第四层 *
// *******************************************
{
雙檔維護模板(DETAIL)
==========================================
設置項目﹕
1.放入query1,qy_detail,ds_detail.
2.添加各個功能按鈕的
調用注意事項﹕
1.需要傳遞的參數﹕
1.prog //程序名稱
2.master //主表名稱
3.detail //Detail table name
4.mkey:array[1..10] of string; //master key
5.dkey:array[1..10] of string; //Detail key
6.mpvalue:array[1..10] of string; //master的關鍵字段的值
//7.qtable:string; //查詢用的TABLE表名
//8.mpkey:array[1..10] of string; //多層master_detail時master父表關鍵字段
需要override的函數﹕
procedure Set_focus;virtual; //設置編輯時的focus
function chk_canedit:boolean;virtual; //是否可以修改
function chk_before_edit:boolean;virtual; //編輯前檢查
function chk_before_append:boolean;virtual; //添加前檢查
function chk_before_delete:boolean;virtual; //刪除前檢查
function chk_save:boolean; virtual; //保存前的檢查
//=================================================
把錯誤信息存放到 u_error中.
另外還可以根據需要編寫另外的過程或者函數:
現在沒有編寫以后需要時再編寫
==========================================
}
unit ufrm_level4_3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ufrm_level3_3, dxExEdtr, ImgList, dxCntner, dxTL, dxDBCtrl,
dxDBGrid, ExtCtrls, ComCtrls, ToolWin, DB, DBTables, StdCtrls, Menus;
type
Tfrm_level4_3 = class(Tfrm_level3_3)
qy_master: TQuery;
qy_detail: TQuery;
ds_detail: TDataSource;
l_RecordCount: TLabel;
procedure FormCreate(Sender: TObject);
procedure tbExitClick(Sender: TObject);
procedure tbAddClick(Sender: TObject);
procedure tbEditClick(Sender: TObject);
procedure tbDeleteClick(Sender: TObject);
procedure tbFirstClick(Sender: TObject);
procedure tbPriorClick(Sender: TObject);
procedure tbNextClick(Sender: TObject);
procedure tbLastClick(Sender: TObject);
procedure tbRefreshClick(Sender: TObject);
procedure tbSaveClick(Sender: TObject);
procedure tbUnsaveClick(Sender: TObject);
procedure tbPrintClick(Sender: TObject);
procedure tbExcelClick(Sender: TObject);
procedure tbHelpClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure qy_detailBeforeEdit(DataSet: TDataSet);
procedure qy_detailNewRecord(DataSet: TDataSet);
procedure qy_detailAfterOpen(DataSet: TDataSet);
private
{ Private declarations }
function parse_01:string; //解析_01 關聯過濾信息FOR MASTER
function parse_02:string; //解析_02 關聯過濾信息FOR DETAIL
function parse_03:string; //解析_03 for chk_unique;
function next_ordinal:integer; //D_SN
procedure re_index; //reindex D_SN.
protected
u_mpkey:array[1..10] of string; //父親的字段
u_mpvalue:array[1..10] of string; //父親字段的值
u_mkey:array[1..10] of string; //master的key
u_dkey:array[1..10] of string; //Detail的key
u_rowid:string; //rowid
u_master:string; //主表名稱
u_detail:string; //輔表名稱
u_pfilter:string; //父表的過濾
//u_join:string; //join條件
//u_filter:string; //過濾條件
u_wc:string; //查詢條件
u_dfilter:string; //detail的過濾條件
u_order:string; //排序字段(no use)
u_qtable:string; //用戶傳遞查詢表的變量
u_oldkeyvalue:array[1..10]of string;//舊的關鍵字段值
u_error:string; //錯誤信息
u_bookmark:pointer; //當前位置
//========================================================
procedure navistatus; //導航條狀態
procedure refresh_master; //刷新單頭
procedure refresh_detail; //刷新單身
function chk_unique:boolean; //檢查關鍵字是否重復
//********************************************************
procedure Set_focus;virtual; //設置編輯時的focus
function chk_canedit:boolean;virtual; //是否可以修改
function chk_before_edit:boolean;virtual; //編輯前檢查
function chk_before_append:boolean;virtual; //添加前檢查
//procedure prc_before_append;virtual; //添加前的處理
function chk_before_delete:boolean;virtual; //刪除前檢查
function chk_save:boolean; virtual; //保存前的檢查
public
{ Public declarations }
end;
var
frm_level4_3: Tfrm_level4_3;
implementation
uses udm,uglobal_var,uglobal_fun;
{$R *.dfm}
//*************************************************
procedure Tfrm_level4_3.Set_focus;
begin
;
end;
function Tfrm_level4_3.chk_canedit:boolean;
begin
result:=true;
end;
function Tfrm_level4_3.chk_before_edit:boolean;
begin
result:=true;
end;
function Tfrm_level4_3.chk_before_append:boolean;
begin
result:=true;
end;
{procedure Tfrm_level4_3.prc_before_append;
begin
;
end;}
function Tfrm_level4_3.chk_before_delete:boolean;
begin
result:=true;
end;
function Tfrm_level4_3.chk_save:boolean;
begin
result:=true;
end;
//*************************************************
function Tfrm_level4_3.parse_01:string;
var i:integer;
begin
result:='';
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
result:=result+' '+u_mkey[i]+'='''+u_mpvalue[i]+''' AND';
end;
result:=copy(result,1,length(result)-3);
result:=trim(result);
if result='' then
result:=' 1=1 ';
end;
//function Tfrm_level4_3.parse_02:string;
//var i:integer;
//begin
// result:='';
// for i:=1 to 10 do
// begin
// if u_mkey[i]<>'' then
// result:=result+' '+u_dkey[i]+'='''+u_mpvalue[i]+''' AND';
// end;
// result:=copy(result,1,length(result)-3);
// result:=trim(result);
// if result='' then
// result:=' 1=1 ';
//end;
function Tfrm_level4_3.parse_02:string;
var i:integer;
begin
result:='';
for i:=1 to 10 do
begin
if (u_mkey[i]<>'') and (u_mpvalue[i]<>'') then
result:=result+' '+u_dkey[i]+'='''+u_mpvalue[i]+''' AND';
end;
result:=copy(result,1,length(result)-3);
result:=trim(result);
if result='' then
result:=' 1=1 ';
end;
function Tfrm_level4_3.parse_03:string;
var i:integer;
begin
result:='';
for i:=1 to 10 do
begin
if u_dkey[i]<>'' then
result:=result+' '+u_dkey[i]+'='''
+qy_detail.fieldbyname(u_dkey[i]).AsString+''' AND';
end;
result:=copy(result,1,length(result)-3);
end;
function Tfrm_level4_3.next_ordinal;
var l_value:integer;
begin
result:=0;
with dm do
begin
g_sqlstr:='SELECT MAX(D_SN) FROM '+u_detail+' WHERE '+parse_02;
pub1.Close;
pub1.sql.Clear;
pub1.SQL.Add(g_sqlstr);
pub1.Open;
l_value:=pub1.Fields[0].AsInteger;
l_value:=l_value+1;
end;
result:=l_value;
end;
procedure Tfrm_level4_3.re_index;
var i:integer;
begin
i:=1;
dm.connection.StartTransaction;
try
with dm do
begin
g_sqlstr:='SELECT D_SN FROM '+u_detail+' WHERE '+parse_02;
//g_sqlstr:='SELECT F02 FROM T_WORKSECTIME WHERE F01='''+u_mpvalue[1]+'''';
p_update1.Close;
p_update1.sql.Clear;
p_update1.SQL.Add(g_sqlstr);
p_update1.Open;
while not p_update1.Eof do
begin
p_update1.Edit;
p_update1.fieldbyname('D_SN').AsInteger:=i;
p_update1.Post;
i:=i+1;
p_update1.Next;
end;
end;
dm.connection.Commit;
except
dm.connection.Rollback;
end;
end;
//*************************************************
procedure Tfrm_level4_3.navistatus;
begin
tbfirst.Enabled:=true;
tbprior.Enabled:=true;
tbnext.Enabled:=true;
tblast.Enabled:=true;
if qy_detail.Bof and qy_detail.Eof then
begin
tbfirst.Enabled:=false;
tbprior.Enabled:=false;
tbnext.Enabled:=false;
tblast.Enabled:=false;
end
else if qy_detail.Bof then
begin
tbfirst.Enabled:=false;
tbprior.Enabled:=false;
end
else if qy_detail.Eof then
begin
tbnext.Enabled:=false;
tblast.Enabled:=false;
end;
end;
procedure Tfrm_level4_3.refresh_master;
begin
g_sqlstr:='SELECT * FROM '+u_master+ ' WHERE '+u_pfilter;
qy_master.Close;
qy_master.SQL.Clear;
qy_master.SQL.Add(g_sqlstr);
qy_master.Open;
end;
procedure Tfrm_level4_3.refresh_detail;
begin
g_sqlstr:='SELECT * FROM '+u_detail+' WHERE '+u_dfilter;
with qy_detail do
begin
close;
sql.Clear;
sql.Add(g_sqlstr);
open;
end;
end;
function Tfrm_level4_3.chk_unique;
var i:integer;
flag:boolean;
begin
chk_unique:=true;
for i:=1 to 10 do
begin
if u_dkey[i]<>'' then
begin
if qy_detail.FieldByName(u_dkey[i]).AsString='' then
begin
u_error:='關鍵字段不能為空';
result:=false;
exit;
end;
end;
end;
//todo;
flag:=true;
for i:=1 to 10 do
begin
if u_oldkeyvalue[i]<>'' then
begin
flag:=flag and(u_oldkeyvalue[i]=qy_detail.FieldByName(u_dkey[i]).AsString);
end;
end;
if (qy_detail.state = dsinsert)or
((qy_detail.State=dsEdit) and (not flag))
then
begin
with dm.pub1 do
begin
close;
sql.Clear;
g_sqlstr:='SELECT * FROM '+u_detail+
' WHERE '+parse_03;
sql.add(g_sqlstr);
Open;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -