⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufrm_level4_3.~pas

📁 完整的进销存系统。 设计文件及完整的源代码。 Delphi6.0
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
//  *******************************************
//  *    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 + -