ufrm_level4_2.pas
来自「完整的进销存系统。 设计文件及完整的源代码。 Delphi6.0」· PAS 代码 · 共 1,010 行 · 第 1/2 页
PAS
1,010 行
// *******************************************
// * Program name: pattern ufrm_level4_2 *
// * AUTHOR : Guo xuliang 郭许良 *
// * Date : 2005/05/15 *
// * Purpose :公共模板第四层 *
// *******************************************
//雙檔維護模板(MASTER) 使用ROWID
//==========================================
//設置項目﹕
//1.放入for 查詢的query1.
//2.放入qy_master,ds_master;qy_detail,ds_detail,設置dbGrid的DATASOURCE.
//3.編寫,取得要操作的table的函數
//4.各個按鈕的功能
//............................
//=================================
//TABLE 的創建注意事項
//1.master file必須包含 'ID' NUMBER(6) //KEY FIELD
// ACTI VARCHAR2(1)
// OWUS VARCHAR2(10)
// GRUP VARCHAR2(10)
// CRET DATE
// MODU VARCHAR2(10)
// MODT DATE
//2.('A','新增');
// ('U','修改');
// ('Y','確認');
// ('Z','反確認');
// ('O','列印');
// ('R','刪除');
// ('S','確認2');
// ('W','反確認2');
// ('G','發送');
// ('I','發出還原');
// ('F','過濾')
//3.查詢初試化(可以查詢master&detail)
//INSERT INTO CZ_FILE VALUES ('TESTD_FILE', 'A.F01', 'MKEY1', 'C', 0,NULL,1,'Y');
//INSERT INTO CZ_FILE VALUES ('TESTD_FILE', 'B.F01', 'DKEY1', 'C', 0,NULL,4,'Y');
//=================================
//調用注意事項:
// 1.prog //程序名稱
// 2.master //主表名稱
// 3.detail //Detail table name
// 4.mpkey:array[1..10] of string; //多層master_detail時master父表關鍵字段
// 5.mpvalue:array[1..10] of string; //master父表的關鍵字段的值
// 6.mkey:array[1..10] of string; //master key
// 7.dkey:array[1..10] of string; //Detail key
// 8.qtable:string; //查詢用的TABLE表名
//需要override的函數﹕
// function chk_save:boolean; virtual; //保存前的檢查
// function chk_conf:boolean; virtual; //確認前的檢查
//=================================================
//要根據情況編寫可以再改進
// procedure set_Focus; virtual; //設置焦點
// procedure chg_canwrite; virtual; //設置關鍵字為可寫
// procedure chg_Readonly; virtual; //設置關鍵字為只讀
// procedure call_detail; virtual; //調用單身維護
// 把錯誤信息存放到 u_error中.
//另外還可以根據需要編寫另外的過程或者函數:
// procedure before_delete;
// function chk_before_delete:boolean;
// 等等﹐現在沒有編寫以后需要時再編寫
//多層關聯刪除時應考慮用trigger因為程序只能刪除兩層.
//==========================================
//存在的問題使用id
//1.刷新時﹐到最后一條記錄會跑到第一條記錄.
//2.新增加記錄后馬上進行(update,confirm,detail)不能進行操作必須刷新
// (取不到id)
//修改使用key後問題解決.
unit ufrm_level4_2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ufrm_level3_2, dxExEdtr, ImgList, dxCntner, dxTL, dxDBCtrl,
dxDBGrid, ExtCtrls, ComCtrls, ToolWin, DB, DBTables, StdCtrls, Menus;
type
Tfrm_level4_2 = class(Tfrm_level3_2)
Query1: TQuery;
qy_master: TQuery;
ds_master: TDataSource;
qy_detail: TQuery;
ds_detail: TDataSource;
procedure FormCreate(Sender: TObject);
procedure tbExitClick(Sender: TObject);
procedure tbAddClick(Sender: TObject);
procedure tbEditClick(Sender: TObject);
procedure tbDeleteClick(Sender: TObject);
procedure tbDetailClick(Sender: TObject);
procedure tbFirstClick(Sender: TObject);
procedure tbPriorClick(Sender: TObject);
procedure tbNextClick(Sender: TObject);
procedure tbLastClick(Sender: TObject);
procedure tbRefreshClick(Sender: TObject);
procedure tbFilterClick(Sender: TObject);
procedure tbQueryClick(Sender: TObject);
procedure tbSaveClick(Sender: TObject);
procedure tbUnsaveClick(Sender: TObject);
procedure tbConfirmClick(Sender: TObject);
procedure tbUnconfirmClick(Sender: TObject);
procedure tbPrintClick(Sender: TObject);
procedure tbExcelClick(Sender: TObject);
procedure tbHelpClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure qy_masterBeforeEdit(DataSet: TDataSet);
procedure qy_masterNewRecord(DataSet: TDataSet);
procedure Query1AfterOpen(DataSet: TDataSet);
procedure qy_masterAfterPost(DataSet: TDataSet);
private
{ Private declarations }
function parse_01:string; //解析_01 join 條件
function parse_02:string; //解析_02 master的過濾
function parse_03:string; //解析_03 :關聯
function parse_04:string; //解析_04:unique檢查
function parse_05:string; //解析_05選擇串
procedure assign_query; //get mkey value form query1;
procedure assign_master; //get mkey value from master;
function parse_06:string; //parse select condition(master's)
function keyis_null:boolean; //master's key is null
protected
u_mpkey:array[1..10] of string; //master的父親的字段
u_mpvalue:array[1..10] of string; //master的父親值
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_keyvalue:array[1..10] of string; //key value
u_error:string; //錯誤信息
u_bookmark:pointer; //當前位置
procedure refresh_all; //刷新
procedure refresh_master; //刷新單頭
procedure refresh_detail; //刷新單身
procedure refresh_query; //刷新query
procedure navistatus; //導航條狀態
function chk_acti:boolean; //檢查是否已經確認
function chk_unique:boolean; //檢查關鍵字是否重復
//================================================
function chk_save:boolean; virtual; //保存前的檢查
function chk_conf:boolean; virtual; //確認前的檢查
procedure set_Focus; virtual; //設置焦點
procedure chg_canwrite; virtual; //設置關鍵字為可寫
procedure chg_Readonly; virtual; //設置關鍵字為只讀
procedure call_detail; virtual; //調用單身維護
public
{ Public declarations }
end;
var
frm_level4_2: Tfrm_level4_2;
implementation
uses udm,uglobal_fun,uglobal_var, ufrm_filter1,ufrm_sql;
{$R *.dfm}
//***********************************************
function Tfrm_level4_2.chk_save:boolean;
begin
result:=true;
end;
function Tfrm_level4_2.chk_conf:boolean;
begin
result:=true;
end;
procedure Tfrm_level4_2.set_Focus;
begin
;
end;
procedure Tfrm_level4_2.chg_canwrite;
begin
;
end;
procedure Tfrm_level4_2.chg_Readonly;
begin
;
end;
procedure Tfrm_level4_2.call_detail;
begin
;
end;
//***********************************************
function Tfrm_level4_2.parse_01:string;
var i:integer;
begin
//for oracle
{
result:=' (';
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
result:=result+' A.'+u_mkey[i]+'=B.'+u_dkey[i]+'(+) AND'
end;
result:=copy(result,1,length(result)-3);
result:=result+')';
}
//for sqlserver
result:=' (';
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
result:=result+' A.'+u_mkey[i]+'=B.'+u_dkey[i]+' AND' //need change 需要修改为sqlserver的外连接
end;
result:=copy(result,1,length(result)-3);
result:=result+')';
end;
//old
//function Tfrm_level4_2.parse_02:string;
//var i:integer;
//begin
// result:='';
// for i:=1 to 10 do
// begin
// if u_mpkey[i]<>'' then
// result:=result+' A.'+u_mpkey[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_2.parse_02:string;
var i:integer;
begin
result:='';
for i:=1 to 10 do
begin
if (u_mpkey[i]<>'') and (u_mpvalue[i]<>'') then
result:=result+' A.'+u_mpkey[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_2.parse_03:string;
var i:integer;
begin
result:='';
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
result:=result+' '+u_dkey[i]+'=:'+u_mkey[i] +' AND';
end;
result:=copy(result,1,length(result)-3);
end;
function Tfrm_level4_2.parse_04:string;
var i:integer;
begin
result:='';
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
result:=result+' '+u_mkey[i]+'='''
+qy_master.fieldbyname(u_mkey[i]).AsString+''' AND';
end;
result:=copy(result,1,length(result)-3);
end;
function Tfrm_level4_2.parse_05:string;
var i:integer;
begin
result:=' ';
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
result:=result+'A.'+u_mkey[i]+','
end;
result:=' '+copy(result,1,length(result)-1)+' ';
end;
procedure Tfrm_level4_2.assign_query;
var i:integer;
begin
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
u_keyvalue[i]:=query1.fieldbyname(u_mkey[i]).AsString;
end;
end;
procedure Tfrm_level4_2.assign_master;
var i:integer;
begin
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
u_keyvalue[i]:=qy_master.fieldbyname(u_mkey[i]).AsString;
end;
end;
function Tfrm_level4_2.parse_06;//parse qy_master's condition
var i:integer;
begin
result:='';
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
result:=result+u_mkey[i]+'='''+u_keyvalue[i]+''' AND ';
end;
result:=' '+copy(result,1,length(result)-4)+' ';
end;
function Tfrm_level4_2.keyis_null;
var i:integer;
begin
result:=false;
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
if u_keyvalue[i]='' then result:=true;
end;
end;
//=================================================
procedure Tfrm_level4_2.navistatus;
begin
tbfirst.Enabled:=true;
tbprior.Enabled:=true;
tbnext.Enabled:=true;
tblast.Enabled:=true;
if query1.Bof and query1.Eof then
begin
tbfirst.Enabled:=false;
tbprior.Enabled:=false;
tbnext.Enabled:=false;
tblast.Enabled:=false;
end
else if query1.Bof then
begin
tbfirst.Enabled:=false;
tbprior.Enabled:=false;
end
else if query1.Eof then
begin
tbnext.Enabled:=false;
tblast.Enabled:=false;
end;
end;
procedure Tfrm_level4_2.refresh_all;
begin
//use id
{g_sqlstr:='SELECT DISTINCT A.ID FROM '+u_master+' A,'+
u_detail+' B WHERE '+u_join+' AND ('+u_pfilter+')'
+' AND ('+u_filter+') AND ('+u_wc+')'+
' ORDER BY A.ID';}//id
//for oracle
{g_sqlstr:='SELECT DISTINCT'+parse_05+' FROM '+u_master+' A,'+
u_detail+' B WHERE '+u_join+' AND ('+u_pfilter+')'
+' AND ('+u_filter+') AND ('+u_wc+')'+
' ORDER BY '+parse_05;}
//for sqlserver
g_sqlstr:='SELECT DISTINCT'+parse_05+' FROM '+u_master+' A LEFT JOIN '+
u_detail+' B ON '+u_join+' WHERE ('+u_pfilter+')'
+' AND ('+u_filter+') AND ('+u_wc+')'+
' ORDER BY '+parse_05;
with query1 do
begin
close;
sql.Clear;
sql.Add(g_sqlstr);
open;
end;
navistatus;
{u_rowid:=query1.fieldbyname('ID').AsString;}//id
assign_query;
refresh_master;
end;
procedure Tfrm_level4_2.refresh_master;
begin
//qy_master.DatabaseName:=dm.connection.DatabaseName;
with qy_master do
begin
{g_sqlstr:='SELECT * FROM '+u_master+' WHERE ID='''+u_rowid+'''';}//id
g_sqlstr:='SELECT * FROM '+u_master+' WHERE '+self.parse_06;
close;
sql.Clear;
sql.Add(g_sqlstr);
Open;
end;
end;
procedure Tfrm_level4_2.refresh_detail;
begin
qy_detail.Close;
qy_detail.Open;
end;
procedure Tfrm_level4_2.refresh_query;
begin
query1.Close;
query1.Open;
end;
function Tfrm_level4_2.chk_acti:boolean;
begin
chk_acti:=false;
with dm.pub1 do
begin
Close;
SQL.Clear;
{g_sqlstr:='SELECT * FROM '+u_master+' WHERE ID='''
+u_rowid+'''';}//id
g_sqlstr:='SELECT ACTI FROM '+u_master+' WHERE '+self.parse_06;
SQL.Add(g_sqlstr);
Open;
IF FieldByName('ACTI').AsString='Y' then result:=true;
Close;
end;
end;
function Tfrm_level4_2.chk_unique:boolean;
var i:integer;
flag:boolean;
begin
chk_unique:=true;
for i:=1 to 10 do
begin
if u_mkey[i]<>'' then
begin
if qy_master.FieldByName(u_mkey[i]).AsString='' then
begin
u_error:='關鍵字段不能為空';
exit;
end;
end;
end;
//todo; ok
flag:=true;
for i:=1 to 10 do
begin
if u_oldkeyvalue[i]<>'' then
begin
flag:=flag and(u_oldkeyvalue[i]=qy_master.FieldByName(u_mkey[i]).AsString);
end;
end;
if (qy_master.state = dsinsert)or
((qy_master.State=dsEdit) and (not flag))
then
begin
with dm.pub1 do
begin
close;
sql.Clear;
g_sqlstr:='SELECT * FROM '+u_master+
' WHERE '+parse_04;
sql.add(g_sqlstr);
Open;
if not(bof and eof ) then
begin
u_error :='記錄已經存在 !';
chk_unique:=false;
Set_focus;
//Kxb01.SetFocus;
exit;
end;
end;
end;
end;
//=================================================
//*************************************************
//first
procedure Tfrm_level4_2.FormCreate(Sender: TObject);
var i:integer;
begin
inherited;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?