📄 thread_yxxx_view.pas
字号:
unit thread_yxxx_view;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
RXCtrls, ExtCtrls, StdCtrls, Mask, ToolEdit, DBCtrls, Buttons, Grids,
DBGrids, ComCtrls,db,bde;
type
thread_yxxx = class(TThread)
private
first_da:tdatetime;
last_da:tdatetime;
{ Private declarations }
protected
procedure Execute; override;
procedure Exec;
function roundtime(time1,time2:tdatetime):integer;
function ttom(time1:tdatetime):Integer;
function dectime(time1,time2:tdatetime):integer;
function decdatetime(date1,time1,date2,time2:tdatetime):integer;
procedure DeleteSameRec; //删除两点连续
//procedure checktime(worker,ln,sh:string;date1:tdatetime;bm1,bm2:tbookmark);//检查时间异常
procedure selectoneday(date1:tdatetime);//选择单天的有效记录
procedure checkrecord(date1:tdatetime;pen1,code1,linename1,shifts1:string);//选择漏点、乱序、完整、时间异常记录
procedure save_ldjl(pen1,lx,linename1,shifts1,code1,lost_node,_pencode,_pstatu:string;date1,l_cf_ti:tdatetime);
public
constructor create(flag:boolean;begin_date:tdatetime;end_date:tdatetime);
end;
var
//begindate,enddate:tdate;
flag:boolean;
l_com,n:integer; //点数
l_begintime,l_endtime:Ttime; //上下班时间
_linename,_shifts,_code:string; //线路、班次、员工、日期
l_pencode:string;//笔号
_pdate:Tdatetime;
_chkcycl,_dgpcxx,_dgpcsx,_ntime:integer; //周期、下限、上限 、向前间隔
check_times:integer;
implementation
uses dm_yxxx_view_pas,FileCtrl,IniFiles;
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure yxxx_view.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ yxxx_view }
constructor thread_yxxx.create(flag:boolean;begin_date:tdatetime;end_date:tdatetime);
begin
first_da:=begin_date;
last_da:=end_date;
inherited create(flag);
freeonterminate:=true;
end;
//procedure thread_yxxx.reset; //formshow;
//begin
//end;
procedure thread_yxxx.Execute;
begin
Synchronize(exec);
end;
procedure thread_yxxx.Exec;
var _date:tdatetime;
_c,_n:string;
begin
dm_yxxx_view.Table1.Close;
dm_yxxx_view.Table1.open;
with dm_yxxx_view do
begin
q_fpxl.close;
q_fpxl.open;
end;
while not dm_yxxx_view.Table1.Eof do
begin
dm_yxxx_view.Table1.delete;
end;
dm_yxxx_view.q_yxxx_fl.close;
dm_yxxx_view.q_yxxx_fl.open;
while not dm_yxxx_view.q_yxxx_fl.Eof do
begin
dm_yxxx_view.q_yxxx_fl.delete ;
end ;
dm_yxxx_view.q_xxwh.close;
dm_yxxx_view. q_xxwh.open;
dm_yxxx_view.T_yxxx_view.Close;
dm_yxxx_view.T_yxxx_view.open;
{with dm_yxxx_view.q_xxlr do
begin
close;
open;
while not eof do
begin
_c:=fieldbyname('workercode').asstring;
_n:=fieldbyname('node').asstring;
if not dm_yxxx_view.q_xxwh.Locate('code;node',vararrayOf([_c,_n]),[loCaseInsensitive]) then
begin
showmessage('巡更員或巡更點在此前沒有完善維護,可能造成資料查詢有誤!');
break;
//exit;
end;
next;
end;
end; }
//statusbar.Panels[0].Text :='正在查询数据,请等待......';
_date:=first_da;
while _date<=last_da do
begin
selectoneday(_date);
_date:=_date+1;
end;
with dm_yxxx_view.q_yxxx do
begin
close;
sql.clear;
sql.add('select * from yxxx');
sql.add('order by yxxx.pdate,yxxx.pencode,yxxx.workercode,yxxx.linename,yxxx.shifts,yxxx.ptime,yxxx.lseq ') ;
open;
end;
with dm_yxxx_view do
begin
q_ldxx_view.close;
q_wzxx_view.close;
q_lxxx_view.close;
q_sjyc.close;
q_line.close;
q_point.close;
q_shifts.close;
q_worker.close;
q_yxxx.close;
q_ldxx_view.open;
q_wzxx_view.open;
q_lxxx_view.open;
q_sjyc.open;
q_line.open;
q_point.open;
q_shifts.open;
q_worker.open;
q_yxxx.open;
end;
end;
procedure thread_yxxx.DeleteSameRec; //删除两点连续现象
var
l_date,l_time,L_d2,l_t2:tdatetime;
l_node,l_workercode,l_statu,l_n2,l_w2,l_ps2:string;
click_time:integer;
inif:tinifile;
filename,temp,ch_time:string;
begin
filename:=ExtractFiledir(APPLICATION.EXENAME)+'\'+ExtractFilename(APPLICATION.EXENAME);//+'\hdxgxt.ini';
if not fileexists(filename) then
filename:=ExtractFileDir(APPLICATION.EXENAME)+'hdxgxt.ini'
else filename:=extractfiledir(application.exename)+'\hdxgxt.ini';
inif:=TInifile.Create(filename);
ch_time:=inif.readstring('time','value',temp);
if ch_time='' then
click_time:=5
else
click_time:=strtoint(ch_time);
with dm_yxxx_view.t_yxxx_view do
begin
if isempty then exit;
first;
L_DATE:=FieldByName('pdate').asdatetime;
L_TIME:=FieldByName('ptime').asdatetime;
L_NODE:=FieldByName('node').asstring;
//L_WORKerCODE:=FieldByName('workercode').asstring;
//L_STATU:=FieldByName('pstatu').value;
NEXT;
WHILE NOT EOF do
begin
L_D2:=FieldByName('pdate').asdatetime;
L_T2:=FieldByName('ptime').asdatetime;
L_N2:=FieldByName('node').asstring;
// L_W2:=FieldByName('workercode').asstring;
// l_ps2:=FieldByName('pstatu').value;
IF (L_NODE=l_n2) then
begin
IF decdatetime(l_D2,l_t2,L_Date,l_time)<=click_time then
begin
//showmessage(inttostr(click_time));
prior;
DELETE;
end;
end;
L_DATE:=FieldByName('pdate').asdatetime;
L_TIME:=FieldByName('ptime').asdatetime;
L_NODE:=FieldByName('node').asstring;
// L_WORKerCODE:=FieldByName('workercode').asstring;
// L_STATU:=FieldByName('pstatu').value;
NEXT;
END;
end;
// if not Table1.isempty then T_Patrol.batchmove(Table1,batAppend);
end;
procedure thread_yxxx.selectoneday(date1:tdatetime); //选择一天的巡更记录
var
l_tx:integer;
L_DATE,L_TIME:TDATETIME;
l_lseq:integer;
l_d1,l_t1,L_d2,l_t2:tdatetime;
l_node,l_workercode,l_statu,l_n2,l_w2,l_ps2:string;//检点巡更点连续显现
begin // 选择一天的巡更情况
_pdate:=date1;
with dm_yxxx_view.q_pen do
begin
close;
sql.clear;
sql.add('select distinct pencode from patrolrec');
open;
first;
end;
while not dm_yxxx_view.q_pen.Eof do
begin//按棒号分类
l_pencode:=dm_yxxx_view.q_pen.fieldbyname('pencode').asstring;
with dm_yxxx_view.q_fpxl do
begin //0.02
first;
while not eof do
begin //查找人员、线路、班次
with dm_yxxx_view.T_yxxx_view do
begin
//close;
//open;
first;
while not eof do
begin
delete;
END;
END;
_code:=fieldbyname('code').asstring;
_linename:=fieldbyname('linename').asstring;
_shifts:=fieldbyname('shift').asstring;
with dm_yxxx_view.q_ysxx do //可以建立存储过程,每次循环都打开
begin //生成有效信息 临时
close;
sql.clear;
sql.add(' SELECT patrolrec.dataseq,patrolrec.workercode,patrolrec.pencode,patrolrec.pdate,');
sql.add(' patrolrec.ptime,patrolrec.pstatu,patrolrec.node,point.linename,point.name,');
sql.add(' point.nodeplace,point.lseq,point.ntime,worker.name as workername,worker.number,shiftrule.shifts,');
sql.add(' shiftrule.firstp,shiftrule.lastp,shiftrule.times,shiftrule.chkcycl,shiftrule.dgpcsx,shiftrule.dgpcxx ');
sql.add(' from patrolrec inner join ');
sql.add(' point on patrolrec.node=point.node inner join ');
sql.add(' worker on patrolrec.workercode=worker.code inner join ');
sql.add(' fpxl on (patrolrec.workercode=fpxl.code) and (point.linename=fpxl.linename) inner join ');
sql.add(' shiftrule on fpxl.shift=shiftrule.shifts');
//sql.add(' where patrolrec.pdate>= '''+datetostr(_pdate-1)+'''');
//sql.add(' and patrolrec.pdate<='''+datetostr(_pdate+1)+'''');
sql.add(' where patrolrec.pdate>=:_pdate1');
sql.add(' and patrolrec.pdate<=:_pdate2');
sql.add(' and point.linename='''+_linename+'''');
sql.add(' and shiftrule.shifts='''+_shifts+'''');
sql.add(' and patrolrec.workercode='''+_code+'''');
sql.add(' and patrolrec.pencode='''+l_pencode+'''');
sql.add('order by patrolrec.pdate,patrolrec.workercode,point.linename,shiftrule.shifts,patrolrec.ptime') ;
//showmessage(sql.text);
parambyname('_pdate1').asdatetime:=_pdate-1 ;
parambyname('_pdate2').asdatetime:=_pdate+1;
{parambyname('_linename').asstring:=_linename;
parambyname('_workercode').asstring:=_code;
parambyname('_shifts').asstring:=_shifts;}
//sql.add(order by )
open;
first;
if recordcount >0 then
begin //0.01
// dm_yxxx_view.t_yxxx_view.BatchMove(dm_yxxx_view.q_ysxx,batAppend);
while not eof do
begin //建立临时
with dm_yxxx_vieW.T_YXXX_VIEW do //t_yxxxx_view----临时表temp;q_yxxx(table1)-----yxxx.db
begin
append;
edit;
fieldbyname('linename').asstring:=dm_yxxx_view.q_ysxx.fieldbyname('linename').asstring;
fieldbyname('pencode').asstring:=dm_yxxx_view.q_ysxx.fieldbyname('pencode').asstring;
fieldbyname('node').asstring:=dm_yxxx_view.q_ysxx.fieldbyname('node').asstring;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -