publicfunction.pas

来自「pasa人力资源考勤管理系统」· PAS 代码 · 共 1,538 行 · 第 1/4 页

PAS
1,538
字号
unit publicfunction;

interface

uses
  Windows, Messages, SysUtils, Classes, AppEvnts, Db, DBTables, Graphics, Controls, Forms, Dialogs,
  BdeUtils, Menus, Math, ADODB, ExtCtrls, StdCtrls, DBGrids, Registry, Dbctrls, Inifiles, ComCtrls;

type
   Tdbgridsort=class
    procedure sort(column:Tcolumn;DtSet:TCustomADODataSet;var f:string);overload;
end;

type
   PUserRight=^UserRight;
   UserRight=Record
     no:string;         //帐号
     menuname:string;   //菜单项名
     formname:TForm;    //窗体名
     R_Add:boolean;     //新增权限
     R_Edit:boolean;    //修改权限
     R_Del:boolean;     //删除权限
     R_Print:boolean;   //打印权限
end;
procedure dbgrid_keypress(sender:TObject;var key:char);
procedure GetWhere(xx_QyAw:TADODataset;var Select,where,OG:string);
procedure AnalyseSQLWhereOrderGroup(Old_SQL:String;var Str_Select,Str_Where,Str_OG:String);
function Gettablename(sql:string):string;   //获得Select 语句中table的名字
function getdays(month,year:string):integer;
function hans1Dechans2Hour(hanss1,hanss2:string;sj:integer):Real;
Function FindField(Data:TDataset;Str:String):TField; //判断STR是否为Table中的一个栏位
function DateDec(rq:String;days:integer):String;     //将字符串型日期加上days天   days可为正也可为负
function MonthDec(rq:string;inteval:integer):String; //将字符串型月份加上Inteval月 inteval可为正也可为负
function date1Decdate2Hour(date1,date2:string;sj:integer):Real;
function date1decdate2day(date1,date2:string):real;  //计算两个日期之间的天数
function date1Decdate2Minute(date1,date2:string):Integer;
function booleantostr(b:boolean):string;     //布尔型转化成字符型
function strtoboolean(s:string):boolean;     //字符型转化成布尔型
function calcfixot(kind:string;workno:string):Real;   //计算固定加班(每小时加班费)
function calcaddmoney(workno:string):Real;   //计算员工的津贴(迟到扣津贴、请假扣津贴)
function calcjiangchengmoney(workno:string):Real;
function dayofmonthy(rq:string):string;      //此日属于那个月
function copychar(ch:string;twice:integer):string;   //将字串ch复制twice遍
function numstring(s:string):boolean;        //判断此字串是否全为数字
procedure getdata(workno:string;rq:string);  //获取考勤主档及异动档中的资料并合并
procedure getdata2; //获取考勤异动档中的资料并合并
procedure inscal;   //计算保险金
procedure medcal;  //汇总就诊金
procedure mealcal(monthy:string);  //就餐汇总
function addpassword(p:string):string;  //加密密码
function GetOSInfo(Var systemver:string):string;  //用来获得系统版本
function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM):LRESULT;  //产生键盘Hook
function MouseHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM):LRESULT;     //产生鼠标Hook
function EnableHotKeyHook: BOOL;  //启动Hook
function DisableHotKeyHook: BOOL; //关闭Hook
procedure HotKeyHookExit;         //退出Hook
procedure SetDBGridLength(Formname:String;GridName:TDBGrid;TableName:TCustomADODataSet);
procedure GetDBGridLength(Formname:String;GridName:TDBGrid);
procedure GetRight(Menuname:String;Formname:TForm);  //获取当前使用者的权限资料
function IsRight(formname:TForm; dataset:TDataset):boolean;  //判断使用者是否具有该权限
procedure getworker(w:string;var c,n,d,p,g,s:string);  //当给它一个w-工号,它给出c-卡号,n-姓名,d-部门,p-职务,g-职等职级
procedure writeRecorder(aqy:Tadodataset;bn:boolean); //传回一条记录的内容,写入历史档案中
function  isdate(fieldvalue:string):boolean;         //判断字段值是否为日期型
function  istime(fieldvalue:string):boolean;
function  workistrue(workno:string):boolean;         //判断工号是否存在
procedure findrecorder(ast:Tadodataset;aname,tname:string);       //调用查找的共用窗体
function  checkstr(s:string):boolean;                      //判断输入的字符是否是数字型
procedure getdbgridwidth(var dg:Tdbgrid;formname:string);  //取出dbgrid栏位宽度
procedure setdbgridwidth(var dg:Tdbgrid;formname:string);  //存入dbgrid栏位宽度
procedure returnzhi(fm:Tform;order:integer);       //点击绿色lable,调出基本参数值
function  showcombox(n:integer;s:string):string;  //下拉combobox中的部门编号时,在另一框中显示部门名称
function  TimeDec(Ts,Te:string):string;    //时间差,Ts是开始时间,Te是结束时间(格式:hh:mm)
function  TimeDec1(Ts,Te:string):string;    //时间差,Ts是开始时间,Te是结束时间(格式:hh:mm)
function  DecDate(Ds,De:string):integer;    //年相减,Ds是开始日期,De是结束日期(格式:yyyy/mm/dd);
function GetGUID(var rg1,rg2,rg3,rg4,rg5:integer):String;   //获得一个键值名
function Tax:string;
var
   hNextHookProc: HHook;
   procSaveExit: Pointer;
   hMouseHookProc: HHook;
   i,j:boolean;
implementation

uses datamol,main,canfind,jiben;

procedure Tdbgridsort.sort(column:Tcolumn;DtSet:TCustomADODataSet;var f:string);
begin
  dtset.Sort :=column.Fieldname+' '+f;
  if f='ASC' then
    f:='DESC'
  ELSE
    f:='ASC';
end;
function istime(fieldvalue:string):boolean;
var
    s,s1:string;
begin
  if (length(fieldvalue)=5)  then
    begin
     s:=copy(fieldvalue,1,2);  // s是第一个/或-之后的字符
     s1:=copy(fieldvalue,4,2);        //求出第二个/或-位置
     if (s>='24') or (s1>'59') then
       istime:=false            //年月日是否符合
     else
       istime:=true;
    end
  else
    istime:=false;
end;
//---------------------------------------------
// function getdays(month,year:string):integer;
//用来获得某年某月共有多少天,其中区别闫年
//如: getdays('10','2000')
//返回:31
//---------------------------------------------
function getdays(month,year:string):integer;
var
    mon:integer;
    yea:integer;
begin
    Result:=0;
    try
      mon:=strtoint(month);
      yea:=strtoint(year);
      case  mon  of
         1,3,5,7,8,10,12:Result:=31;
         4,6,9,11:Result:=30;
         2:  if (yea mod 400 = 0) or ((yea mod 4 = 0) and (yea mod 100 <> 0)) then
                Result:=29
             else
                Result:=28;
      end;
    except
      Application.MessageBox(Pchar(month+' '+year+'不是一个有效的日期类型类型值!'),'日期错误',mb_okcancel+mb_iconerror);
    end;
end;

//----------------------------------------------------------------------------------
//procedure GetWhere(query1name:TADOQuery;Var Select,where,OG:String);
//用来获得Query的SQL.Text中的Where,Order by,Group by部分内容
//参数:query1name:Query的名,Select,where,OG:Select部分,Where部分,Order by,Group by部分
//----------------------------------------------------------------------------------
procedure GetWhere(xx_QyAw:TADODataset;var Select,where,OG:string);
var
  hanFilter:string;
  k,i:integer;
begin
    if xx_QyAw.Filtered then
      hanFilter:=xx_QyAw.Filter ;
    if xx_QyAw is TADODataset then
      AnalyseSQLWhereOrderGroup((xx_QyAw as TADODataset).commandtext,Select,Where,OG);

      while Pos('(',hanFilter)>0 do
        hanFilter[Pos('(',hanFilter)]:=' ';
      while Pos(')',hanFilter)>0 do
        hanFilter[Pos(')',hanFilter)]:=' ';

      while Pos('*',hanFilter)>0 do
      begin
        k:=Pos('*',hanFilter);
        hanFilter[k]:='%';
        for i:=k  downto 1 do
          if hanFilter[i]='=' then break;
          if i<2 then break;//退出while
          delete(hanFilter,i,1);
          insert(' Like ',hanFilter,i);
      end;
      if (hanFilter<>'') and (Where<>'') then
        Where:=' '+Where +' and '+hanFilter
      else if hanFilter<>'' then
        Where :=' where '+hanFilter;
end;

procedure AnalyseSQLWhereOrderGroup(Old_SQL:String;var Str_Select,Str_Where,Str_OG:String);
var
  i,i1,i2:integer;
begin
  i:=POS(UpperCase('where'),UpperCase(Old_SQL));
  i1:=POS(UpperCase('order by'),UpperCase(Old_SQL));
  i2:=POS(UpperCase('group by'),UpperCase(Old_SQL));
  if i<>0 then
  begin
    if i1<>0 then
    begin
      if i2<>0 then
      begin
        i2:= Min(i1,i2);
        Str_Select := Copy(Old_SQL,1,i-1);//where 前的
        Str_Where :=Copy(Old_SQL,i,i2-i);//where part
        Str_OG :=Copy(Old_SQL,i2,Length(Old_SQL)-i2);//order or group part
      end else
      begin
        Str_Select := Copy(Old_SQL,1,i-1);
        Str_Where :=Copy(Old_SQL,i,i1-i);
        Str_OG :=Copy(Old_SQL,i1,Length(Old_SQL)-i1);
      end;
    end else
    if i2<>0 then
    begin
      Str_Select := Copy(Old_SQL,1,i-1);
      Str_Where :=Copy(Old_SQL,i,i2-i);
      Str_OG :=Copy(Old_SQL,i2,Length(Old_SQL)-i2);
    end else
    begin
      Str_Select := Copy(Old_SQL,1,i-1);
      Str_Where :=Copy(Old_SQL,i,Length(Old_SQL));
    end;
  end else
  if i1<>0 then
  begin
    if i2<>0 then
    begin
      i2:= Min(i1,i2);
      Str_Select := Copy(Old_SQL,1,i2-1);
      Str_OG :=Copy(Old_SQL,i2,Length(Old_SQL)-i2);
    end else
    begin
      Str_Select := Copy(Old_SQL,1,i1-1);
      Str_OG :=Copy(Old_SQL,i1,Length(Old_SQL)-i1);
    end;
  end else
  if i2<>0 then
  begin
    Str_Select := Copy(Old_SQL,1,i2-1);
    Str_OG :=Copy(Old_SQL,i2,Length(Old_SQL)-i2);
  end else
  Str_Select:=Old_SQL;
end;

function hans1Dechans2Hour(hanss1,hanss2:string;sj:integer):Real;
var
  hanInt:Real;
  hanReal:Real;
  hans1,hans2:TDatetime;
begin
 Result:=0;
 try
  hans1:=strtodatetime(copy(hanss1,1,4)+dateseparator+copy(hanss1,5,2)+dateseparator+copy(hanss1,7,2)+' '+copy(hanss1,9,2)+timeseparator+copy(hanss1,11,2));
  hans2:=strtodatetime(copy(hanss2,1,4)+dateseparator+copy(hanss2,5,2)+dateseparator+copy(hanss2,7,2)+' '+copy(hanss2,9,2)+timeseparator+copy(hanss2,11,2));
 except
  Application.Messagebox('你输入的日期格式有误,请重新输入.','日期错误',mb_okcancel+mb_iconerror);
  exit;
 end;
  hanInt:=(hans2-hans1)*24*60+0.00005;
  if hanInt>1440 then
     hanInt:=hanInt-1440;
  hanInt:=hanInt-sj;
  hanReal:=hanInt/60;
  hanInt:=Trunc(hanReal*2);
  Result:=hanInt/2;
end;

function date1decdate2day(date1,date2:string):real;  //计算两个日期之间的天数
var   Qry1:TADOQuery;
begin
    with datamod do
    begin
      Qry1:=TADOQuery.Create(application);
      Qry1.connection:=Query1.connection;
      Qry1.sql.text:='Select datediff(dd,'''+date1+''','''+date2+''') as day ';
      Qry1.open;
      Result:=Qry1.fieldbyname('day').asfloat;
      Qry1.free;
    end;
end;

function  DayofMonthy(rq:string):string;   //计算此日属于那月
var
   month:string;
   Qry1:TADOQuery;
begin
{  with datamod do
  begin
     Qry1:=TADOQuery.create(application);
     Qry1.connection:=Query1.connection;
     Qry1.sql.text:='Select * from sal02010';
     Qry1.open;
     if (qry1.fieldbyname('calcmoneysrq').value<qry1.fieldbyname('calcmoneyerq').value) then   //若月结是在本月
        month:=copy(rq,1,7)      //26~25   28日
     else
     begin
          if (qry1.fieldbyname('calcmoneymon').value='0') then   //计前月
          begin
             if ((copy(rq,9,2)>=qry1.fieldbyname('calcmoneysrq').value) and (copy(rq,9,2)>qry1.fieldbyname('calcmoneyerq').value)) then    //跨月结且算成前月的
                month:=copy(rq,1,7)
             else if ((copy(rq,9,2)<=qry1.fieldbyname('calcmoneyerq').value) and (copy(rq,9,2)<qry1.fieldbyname('calcmoneysrq').value)) then
                month:=monthdec(rq,-1);
          end
          else if (adosalsetcalcmoneymon.value='2')then //计后月
          begin
             if ((copy(rq,9,2)>=qry1.fieldbyname('calcmoneysrq').value) and (copy(rq,9,2)>qry1.fieldbyname('calcmoneyerq').value)) then    //跨月结且算成前月的
                month:=monthdec(rq,1)
             else if ((copy(rq,9,2)<=qry1.fieldbyname('calcmoneyerq').value) and (copy(rq,9,2)<qry1.fieldbyname('calcmoneysrq').value)) then
                month:=copy(rq,1,7);
          end;
     end;
     result:=month;
     Qry1.free;
  end;  //with  }
end;  //计算此日属于那月

//在dbgrid中实现回车键
procedure dbgrid_keypress(sender:TObject;var key:char);
begin
     if key=#13 then
     begin
        key:=#0;
        with sender as twincontrol do
           postmessage(handle,wm_keydown,VK_Tab,0);
     end;
end;

function copychar(ch:string;twice:integer):string;   //将字串ch复制twice遍
var
    s:string;
    i:integer;
begin
    result:='';
    s:='';
    for i:=1 to twice do
        s:=s+ch;
    result:=s;
end;

//********************************************************//
//当给它一个工号时,它给出这个员工的信息c--卡号,n--姓名,//
//d--部门,p--职称,g--职等职级。                         //
//********************************************************//
procedure getworker(w:string;var c,n,d,p,g,s:string);
begin
  with datamod.adoquery1 do
    begin
      close; 
      sql.clear;
      sql.add('select cardno,name,sexname,deptno,prof,gradename from per24010 where workno='''+w+''' and leave<>1 and stoppay<>1 ');
      open;
      if not eof then
        begin
          c:=fieldbyname('cardno').asstring;
          n:=fieldbyname('name').asstring;
          d:=fieldbyname('deptno').asstring;
          p:=fieldbyname('prof').asstring;
          g:=fieldbyname('gradename').asstring;
          s:=fieldbyname('sexname').asstring;
        end;
      close;
    end;
end;

//*****************************************************//
//判断字段值是否是日期型数据,fieldvalue如1999/10/21       //
function isdate(fieldvalue:string):boolean;
var i,j:integer;
    s:string;
begin
  if (length(fieldvalue)>=8) and (length(fieldvalue)<=10) then
    begin
     i:=pos(copy(fieldvalue,5,1),fieldvalue); //求出第一个/或-位置
     s:=copy(fieldvalue,i+1,length(fieldvalue)-i);  // s是第一个/或-之后的字符
     j:=i+pos(copy(fieldvalue,5,1),s);        //求出第二个/或-位置
     if (copy(fieldvalue,1,4)<'1900') or (copy(fieldvalue,1,4)>'2099') or (copy(fieldvalue,i+1,j-i-1)<'01') or (copy(fieldvalue,i+1,j-i-1)>'12') or (copy(fieldvalue,j+1,length(fieldvalue)-j)<'01') or (copy(fieldvalue,j+1,length(fieldvalue)-j)>'31') then
       isdate:=false            //年月日是否符合
     else
       isdate:=true;
    end
  else
    isdate:=false;
end;

//*************************************************************************************
//在存档时,判断工号存不存在
//*************************************************************************************
function workistrue(workno:string):boolean;
begin
  with datamod.adoQuery1 do
  begin
    sql.Clear;
    sql.Add ('select * from per24010 where workno='''+workno+''' and leave<>1 ');
    open;
    workistrue:=eof;
    close;
  end;
end;

//找出一个字段

⌨️ 快捷键说明

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