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

📄 uncdm.pas

📁 本产品是开发LISTVIEW相关功能的可定制产品
💻 PAS
字号:
{**********************************************************************
                 显示及打印定制需要的数据库操作
代码名称:   显示及打印定制需要的数据库操作
编译工具:  Delphi 6.0,适用于SQL SERVER数据库
作者:      邓普德
版权:      成都四方信息技术有限公司
定义时间:  2006-08-02
修改时间:  2006-08-09
//添加数据库连接断开后的自动重连接功能
**********************************************************************}
unit unCDM;

interface

uses
  SysUtils, Classes, DB, DBTables,Forms,ComCtrls,Grids,StdCtrls,QrPrntr,
  ExtCtrls,Controls,DateUtils;
type
  TCDM = class(TDataModule)
    dbData: TDatabase;
    sqlExecute: TQuery;
    Session1: TSession;
    Query: TQuery;
    LogDayTimer: TTimer;
    QueryTime: TQuery;
    procedure DataModuleCreate(Sender: TObject);
    procedure LogDayTimerTimer(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  private
    { Private declarations }
    FIndex: Integer;
    bNoticeDestroy:Boolean;//是否要退出系统

  public
    function ConnectDataBase(const DatabaseName, ServerName, UserName,
      Password: string):Boolean;//连接数据库系统
    procedure GetShowColor;
    function SelSQL(Str: String): TQuery;
    procedure doNewPriview(const sCustomshow, sFormCaption, sBname,
      UserName, sPringType: string; cClass: TForm; flist: Tlist;
      flistview: TlistView; sgNormal: TStringGrid; mMemo: TMemo);
    function GetReportName(sFromCaption: String): String;
    function IsStaffCustomShow(fStaffID: String): Boolean;
    function GetDBTime: TDateTime;

    { Public declarations }
  end;

var
  CDM: TCDM;

implementation
uses unCDefine,unMakeReportDetail;

{$R *.dfm}

procedure TCDM.DataModuleCreate(Sender: TObject);
begin
  FIndex := 0;
  bNoticeDestroy:=False;
  CMemo:=nil;
  CreateLog; //调用去本地可执行文件所在目录,并如果不存在日志目录则创建
end;

//建立与数据库的连接
Function TCDM.ConnectDataBase(const DatabaseName,ServerName,UserName,Password:string):Boolean;
begin
   try
   begin
      Result:=False;
      dbData.Params.Clear;
      dbData.Params.Values['SERVER NAME'] :=ServerName;
      dbData.Params.Values['DATABASE NAME'] :=DatabaseName;
      dbData.Params.Values['USER NAME'] :=UserName;
      dbData.Params.Values['PASSWORD'] :=Password;
      dbData.Connected:=True;
      if dbData.Connected=True then
         Result:=True
      else
         WriteLog(CMemo,'数据库重连失败(TCDM.GetDBTime),系统将每30秒钟自动进行连接1次,直到连接成功为止');
   end;
   except
      WriteLog(CMemo,'数据库重连异常(TCDM.GetDBTime),请检查数据库连接参数输入正常');
      LogDayTimer.Enabled:=False;
   end;
end;

procedure TCDM.GetShowColor;
begin
    if(sUserID<>'')then
    begin
       sqlExecute.Close;
       sqlExecute.Sql.Clear;
       sqlExecute.sql.Add('SELECT COLORCASE,BPLAYSOUND,BCUSTOMLOGIN,WAITNUM FROM SFRJSHOWCOLOR WHERE  STAFFID='''+sUserID+'''');
       Try
           sqlExecute.Open;
       except
           sqlExecute.Close;
       end;
       sqlExecute.First;
       if not sqlExecute.Eof then
       begin
           ColorCase:=sqlExecute.FieldByName('COLORCASE').AsInteger;
           bPlaySound:=sqlExecute.FieldByName('BPLAYSOUND').AsInteger;
           bCustomLogin:=sqlExecute.FieldByName('BCUSTOMLOGIN').AsInteger;
           nWaitNum:=sqlExecute.FieldByName('WAITNUM').AsInteger;
       end;
       sqlExecute.Close;
    end;
end;

function TCDM.SelSQL(Str: String): TQuery;
var
  i:integer ;
  str1 : string ;
begin
  result := nil;
  result := TQuery.Create(nil);
  result.DatabaseName := dbData.DatabaseName;
  result.SessionName := dbData.SessionName;
  //为防止sql语句过长,将sql语句拆分
  if length(str)>1000 then
  begin
    while Pos('or ',str)<>0 do
    begin
      if Pos('or ',str)=pos('order',str)then break
      else begin
        i:=Pos('or ',str) ;
        str1 := copy(str,1,i+2);
        result.sql.Add(str1);
        str := copy(str,i+3,length(str)) ;
      end;
    end;
    result.SQL.Add(str);
  end else
  result.SQL.Add(str) ;
  try
    result.open ;
  except
    try
      dbData.Close ;
      dbData.Open ;
    except
      ;
    end;
    result.close;
    result.sql.Clear;
  end;
end;

//通过窗体名称取报表标题
function TCDM.GetReportName(sFromCaption: String): String;
var
  strsql : string;
  Temquery : Tquery ;
begin
  Result:='';
  strsql := 'select REPORTNAME from SFRJREPORTNAME where FORMCAPTION='''+sFromCaption+'''';
  Temquery := SelSql(strsql);
  try
    Temquery.First ;
  except
    ;
  end;
  if Temquery.RecordCount>0 then
     Result:=Temquery.fieldbyname('REPORTNAME').asstring;
end;
//sCustomshow:是否需要定制打印
//sFormCaption:窗体名称
//sBname:
//UserName:登录用户名称
//cClass:所在窗体
//bAllPreviewNew:是否打印统计明细
//flist:所在窗体Listview
//sgNormal:所在窗体Tstringlist
//mMemo:所在窗体备注信息
procedure TCDM.doNewPriview(Const sCustomshow,sFormCaption,sBname,UserName,sPringType:string;
   cClass:TForm;flist:Tlist;flistview:TlistView;sgNormal: TStringGrid;mMemo:TMemo);
var sReprotName:string;
begin
  begin
    //自定义报表打印
    sReprotName:=CDm.GetReportName(sFormCaption);
    MakeReportDetail:=TMakeReportDetail.Create;
    if sPringType='DoAllPreviewNew' then
    begin
      if sCustomshow='1' then
        MakeReportDetail.DoAllPreviewNew(cClass,flist,sReprotName,
          '','',sFormCaption,sBname,sReprotName,UserName,
          Date(),TQRPaperSize(9),mMemo,sgNormal)
      else
        MakeReportDetail.DoAllPreview(cClass,flistview,sReprotName,
          '','',sFormCaption,sBname,sReprotName,UserName,
          Date(),TQRPaperSize(9),mMemo,sgNormal);
    end
    else if sPringType='DoOnlyTotalPreview' then
      MakeReportDetail.DoOnlyTotalPreview(cClass,sReprotName,
        sFormCaption,sBname,sReprotName,UserName,
         DATE(),TQRPaperSize(9),sgNormal)
    else
    begin
       if sCustomshow='1' then
          MakeReportDetail.DoOnlyDetailPreviewNew(cClass,flist,sReprotName,
          '','',sFormCaption,sBname,sReprotName,UserName,
          Date(),TQRPaperSize(9),mMemo)
       else
          MakeReportDetail.DoOnlyDetailPreview(cClass,flistview,sReprotName,
          '','',sFormCaption,sBname,sReprotName,UserName,
          Date(),TQRPaperSize(9),mMemo);
    end;
    MakeReportDetail.Free;
  end;
end;

//判断指定工号员工是否有定制显示要求
function TCDM.IsStaffCustomShow(fStaffID: String): Boolean;
var
  SQL:String;
begin
  Result := false;
  SQL:='SELECT BCUSTOMSHOW FROM SFRJSHOWCOLOR WHERE STAFFID='''+fStaffID+'''';
  try
    if Query.Active then
      Query.close;
    Query.Sql.Clear;
    Query.Sql.Add(SQL);
    Query.Open;
    if NOT Query.Eof then
    begin
      Query.First;
      Result := (Query.FieldByName('BCUSTOMSHOW').AsInteger = 1);
    end;
    Query.close;
  except
  end;
end;

//获取数据库服务器系统时间,,如果发现连接断开,则需要在5秒钟后进行自动重连
function TCDM.GetDBTime: TDateTime;
var
  sql: string;
  i:integer;
begin
  sql := 'SELECT GETDATE() As SELF_DATE';
  try
    if QueryTime.Active then
      QueryTime.close;
    QueryTime.Sql.Clear;
    QueryTime.Sql.Add(sql);
    QueryTime.Open;
    Result := QueryTime.FieldByName('SELF_DATE').AsDateTime;
    LogDayTimer.Enabled:=False; //如果发生数据库连接正常,则需要将定时器触发时间调大
    LogDayTimer.Interval:=120000;
    LogDayTimer.Enabled:=True;

  except
    WriteLog(CMemo,'从数据库取时间失败(TCDM.GetDBTime),重新连接');
    LogDayTimer.Enabled:=False; //如果发生数据库连接失败,则为进行及时的数据库连接,将数据库连接时间调小
    LogDayTimer.Interval:=25000;
    LogDayTimer.Enabled:=True;
    Result := Now();
    dbData.Connected := False;
    Application.ProcessMessages;
    i:=0;
    while(i<100) do
    begin
        if bNoticeDestroy=True then exit;
        i:=i+1;
        Application.ProcessMessages;
        sleep(50);
    end;
    try
       dbData.Connected := True;
       if dbData.Connected = False then
          WriteLog(CMemo,'数据库重连失败(TCDM.GetDBTime)');
    except
       WriteLog(CMemo,'数据库重连发生错误(TCDM.GetDBTime)');
    end;
    Exit;
  end;    
end;

procedure TCDM.LogDayTimerTimer(Sender: TObject);
begin
  MaintenanceLogDay;//调用自动维护最近30天的日志函数
  GetDBTime;//通过取数据库服务器时间检查数据库连接是否正常,若不正常则需要进行自动连接
end;

procedure TCDM.DataModuleDestroy(Sender: TObject);
begin
    try
       bNoticeDestroy:=True;
       LogDayTimer.Enabled:=False;
       dbData.Connected := False;
       WriteLog(CMemo,'退出数据库连接(TCDM.DataModuleDestroy)');
    except
       WriteLog(CMemo,'退出数据库连接(TCDM.DataModuleDestroy)');
    end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -