📄 drillstatistic_unt.pas
字号:
begin
if (AddStat.WorkGroup_Id<>DrillStat[m].WorkGroup_Id)
then
begin //互换最后一条记录和倒数第二条记录
j:=High(DrillStat);
With Base_DataS.DataSet do
begin
last;
edit;
FieldByName('WorkGroup_Id').AsInteger:=DrillStat[j].WorkGroup_Id;
FieldByName('Item_Id').AsInteger:=DrillStat[j].Item_Id;
FieldByName('Begin_Date').AsDateTime:=DrillStat[j].Begin_Date;
FieldByName('End_Date').AsDateTime:=DrillStat[j].End_Date;
FieldByName('Finished').AsInteger:=DrillStat[j].Finished;
FieldByName('Remain').AsInteger:=DrillStat[j].Remain;
FieldByName('Finished_Sum').AsInteger:=DrillStat[j].Finished_Sum;
FieldByName('Relay_Id').AsInteger:=DrillStat[j].Relay_Id;
post;
prior;
edit;
FieldByName('WorkGroup_Id').AsInteger:=AddStat.WorkGroup_Id;
FieldByName('Item_Id').AsInteger:=AddStat.Item_Id;
FieldByName('Begin_Date').AsDateTime:=AddStat.Begin_Date;
FieldByName('End_Date').AsDateTime:=AddStat.End_Date;
FieldByName('Finished').AsInteger:=AddStat.Finished;
FieldByName('Remain').AsInteger:=AddStat.Remain;
FieldByName('Finished_Sum').AsInteger:=AddStat.Finished_Sum;
FieldByName('Relay_Id').AsInteger:=AddStat.Relay_Id;
post;
end;
end;
exit;
end
else
begin
//把需要插入位置及其以后的记录保存在TempStat数组中,以便把记录后移
setlength(TempStat,((High(DrillStat)-n)+1)+1);
for i:=1 to High(TempStat) do
begin
TempStat[i].WorkGroup_Id:=DrillStat[n].WorkGroup_Id;
TempStat[i].Item_Id:=DrillStat[n].Item_Id;
TempStat[i].Begin_Date:=DrillStat[n].Begin_Date;
TempStat[i].End_Date:=DrillStat[n].End_Date;
TempStat[i].Finished:=DrillStat[n].Finished;
TempStat[i].Finished_Sum:=DrillStat[n].Finished_Sum;
TempStat[i].Remain:=DrillStat[n].Remain;
TempStat[i].Relay_Id:=DrillStat[n].Relay_Id;
n:=n+1;
end;
//从表中第m条记录开始,插入新添加的记录,同时后面的记录相应后移一个位置
n:=m;
DrillStat[n].WorkGroup_Id:=AddStat.WorkGroup_Id;
DrillStat[n].Item_Id:=AddStat.Item_Id;
DrillStat[n].Begin_Date:=AddStat.Begin_Date;
DrillStat[n].End_Date:=AddStat.End_Date;
DrillStat[n].Finished:=AddStat.Finished;
DrillStat[n].Remain:=Remain;
DrillStat[n].Finished_Sum:=SumOutput;
DrillStat[n].Relay_Id:=AddStat.Relay_Id;
j:=0;
for i:=n+1 to High(DrillStat) do
begin
j:=j+1;
DrillStat[i].WorkGroup_Id:=TempStat[j].WorkGroup_Id;
DrillStat[i].Item_Id:=TempStat[j].Item_Id;
DrillStat[i].Begin_Date:=TempStat[j].Begin_Date;
DrillStat[i].End_Date:=TempStat[j].End_Date;
DrillStat[i].Finished:=TempStat[j].Finished;
DrillStat[i].Remain:=TempStat[j].Remain;
DrillStat[i].Finished_Sum:=TempStat[j].Finished_Sum;
DrillStat[i].Relay_Id:=TempStat[j].Relay_Id;
end;
j:=j+1;
AddStat.WorkGroup_Id:=TempStat[j].WorkGroup_Id;
AddStat.Item_Id:=TempStat[j].Item_Id;
AddStat.Begin_Date:=TempStat[j].Begin_Date;
AddStat.End_Date:=TempStat[j].End_Date;
AddStat.Finished:=TempStat[j].Finished;
AddStat.Remain:=TempStat[j].Remain;
AddStat.Finished_Sum:=TempStat[j].Finished_Sum;
AddStat.Relay_Id:=TempStat[j].Relay_Id;
end; //end: if n=High(DrillStat)
//更新数据库
//首先更新最后一条记录
With Base_DataS.DataSet do
begin
last;
edit;
FieldByName('WorkGroup_Id').AsInteger:=AddStat.WorkGroup_Id;
FieldByName('Item_Id').AsInteger:=AddStat.Item_Id;
FieldByName('Begin_Date').AsDateTime:=AddStat.Begin_Date;
FieldByName('End_Date').AsDateTime:=AddStat.End_Date;
FieldByName('Finished').AsInteger:=AddStat.Finished;
FieldByName('Remain').AsInteger:=AddStat.Remain;
FieldByName('Finished_Sum').AsInteger:=AddStat.Finished_Sum;
FieldByName('Relay_Id').AsInteger:=AddStat.Relay_Id;
post;
end;
WorkGroupId:=DrillStat[m-1].WorkGroup_Id;
//ItemId:=DrillStat[m].Item_Id;
//找到需要更新的位置
with Base_DataS.DataSet do
begin
first;
while (not eof) do
begin
if(FieldByName('WorkGroup_Id').AsInteger=WorkGroupId)then
begin
break;
end;
next;
end;
while(FieldByName('WorkGroup_Id').AsInteger=WorkGroupId)do
begin
next;
end;
end;
BK:=Base_DataS.DataSet.GetBookmark;
With Base_DataS.DataSet do
begin
i:=m;
while i<=High(DrillStat) do
begin
edit;
FieldByName('WorkGroup_Id').AsInteger:=DrillStat[i].WorkGroup_Id;
FieldByName('Item_Id').AsInteger:=DrillStat[i].Item_Id;
FieldByName('Begin_Date').AsDateTime:=DrillStat[i].Begin_Date;
FieldByName('End_Date').AsDateTime:=DrillStat[i].End_Date;
FieldByName('Finished').AsInteger:=DrillStat[i].Finished;
FieldByName('Remain').AsInteger:=DrillStat[i].Remain;
FieldByName('Finished_Sum').AsInteger:=DrillStat[i].Finished_Sum;
FieldByName('Relay_Id').AsInteger:=DrillStat[i].Relay_Id;
post;
next;
i:=i+1;
end;
end; //end: With Base_DataS.DataSet do
Base_DataS.DataSet.GotoBookmark(BK);
Base_DataS.DataSet.FreeBookmark(BK);
end; //end: if k>0 then
end;
end;
procedure TDrillStatistic_Frm.DBLookupComboBox2Click(Sender: TObject);
var
LaneId,Remain:integer;
i,j,k:integer;
NoOne:boolean;
BeginDate,EndDate:TDate;
begin
LaneId:=Base_DataS.DataSet.FieldByName('Item_Id').AsInteger;
Remain:=trunc(RelayDrill_DataS.DataSet.FieldByName('WorkQuantity').AsFloat);
BeginDate:=RelayDrill_DataS.DataSet.FieldByName('Begin_Date').AsDateTime;
EndDate:=RelayDrill_DataS.DataSet.FieldByName('End_Date').AsDateTime;
NoOne:=true;//假设统计表中没有新添加的掘进任务
for i:=1 to High(DrillStat) do
begin
if DrillStat[i].Item_Id=LaneId then
begin
NoOne:=false;
break;
end;
end;
if NoOne then //若新添加的记录对应的掘进任务在原表中没有,则设置该添加的掘进任务的剩余量
begin
Base_DataS.DataSet.FieldByName('Remain').AsInteger:=Remain;
Base_DataS.DataSet.FieldByName('Finished_Sum').AsInteger:=0;
Base_DataS.DataSet.FieldByName('Finished').AsInteger:=0;
DateTimePicker1.DateTime:=BeginDate;
DateTimePicker2.DateTime:=BeginDate;
end;
DateTimePicker1.Enabled:=true;
DateTimePicker2.Enabled:=true;
DBEdit1.Enabled:=true;
DBEdit2.Enabled:=true;
DBEdit3.Enabled:=true;
end;
procedure TDrillStatistic_Frm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//处理掘进统计情况后,更新到“掘进接替跟踪f”表中
Hint_Frm:=THint_Frm.Create(self);
Hint_Frm.Timer1.Enabled:=true;
Hint_Frm.Caption:='处理信息提示';
Hint_Frm.Image1.Visible:=false;
Hint_Frm.Label1.Caption:='处理统计数据......';
Hint_Frm.ShowModal;
Hint_Frm.Free;
Hint_Frm:=nil;
DealDrillStat;
end;
procedure TDrillStatistic_Frm.DealDrillStat;
var
i,j,k,m,n,s,t:integer;
Item_Id,LaneNum:integer;
Remain,Finished,Finished_Sum,Percent,DateDis:integer;
BeginDate,EndDate:TDate;
Find:Boolean;
begin
//读取统计数据
ReadStatData;
//首先计算统计数据(存在DrillStat数组中)涉及到几个不同的掘进任务
Item_Id:=DrillStat[1].Item_Id;
LaneNum:=1;
for i:=2 to High(DrillStat) do
begin
if DrillStat[i].Item_Id<>Item_Id then
begin
LaneNum:=LaneNum+1;
Item_Id:=DrillStat[i].Item_Id;
end;
end;
//接着把统计数据中的不同掘进任务的信息提取并存放在Drill数组中
setlength(Drill,LaneNum+1);
j:=1;
Drill[j].WorkGroup_Id:=DrillStat[1].WorkGroup_Id;
Drill[j].Item_Id:=DrillStat[1].Item_Id;
Drill[j].Name:=DrillStat[1].Name;
Drill[j].Plan_Amount:=DrillStat[1].Plan_Amount;
Drill[j].Plan_TaskTime:=DrillStat[1].Plan_TaskTime;
//Drill[j].Plan_DayOutput:=DrillStat[1].Plan_DayOutput;
Drill[j].Plan_DayProgress:=DrillStat[1].Plan_DayProgress;
Item_Id:=DrillStat[1].Item_Id;
for i:=2 to High(DrillStat) do
begin
if DrillStat[i].Item_Id<>Item_Id then
begin
j:=j+1;
Drill[j].WorkGroup_Id:=DrillStat[i].WorkGroup_Id;
Drill[j].Item_Id:=DrillStat[i].Item_Id;
Drill[j].Name:=DrillStat[i].Name;
Drill[j].Plan_Amount:=DrillStat[i].Plan_Amount;
Drill[j].Plan_TaskTime:=DrillStat[i].Plan_TaskTime;
//Drill[j].Plan_DayOutput:=DrillStat[i].Plan_DayOutput;
Drill[j].Plan_DayProgress:=DrillStat[i].Plan_DayProgress;
Item_Id:=DrillStat[i].Item_Id;
end;
end;
//把统计的各掘进任务的实际开、完工日期默认值暂设为计划开、完工日期
with Data_Frm.DrillRelay_AdoTab do
begin
first;
while not eof do
begin
for i:=1 to High(Drill) do
begin
if Drill[i].Item_Id=FieldByName('Face_Lane').AsInteger then
begin
Drill[i].Begin_Date:=FieldByName('Begin_Date').AsDateTime;
Drill[i].Plan_BeginDate:=FieldByName('Begin_Date').AsDateTime;
Drill[i].End_Date:=FieldByName('End_Date').AsDateTime;
Drill[i].Plan_EndDate:=FieldByName('End_Date').AsDateTime;
break;
end;
end;
next;
end;
end;
//开始处理
for i:=1 to High(Drill) do
begin
Item_Id:=Drill[i].Item_Id;
//Dealed:=false;
for j:=1 to High(DrillStat) do
begin
if DrillStat[j].Item_Id=Item_Id then
begin
//首先处理掘进任务Drill[i]对应的第一条记录,以确定实际开工日期
TimePara_Frm:=TTimePara_Frm.Create(self);
TimePara_Frm.Caption:='确认实际开工日期';
TimePara_Frm.Label1.Caption:='"'+Drill[i].Name+'" 计划'
+datetostr(Drill[i].Begin_Date)+'开工,实际日期请确认:';
TimePara_Frm.DateTimePicker1.Date:=DrillStat[j].Begin_Date;
TimePara_Frm.ShowModal;
Drill[i].Begin_Date:=TimePara_Frm.BeginTime;
TimePara_Frm.Free;
TimePara_Frm:=nil;
//首先找到编号为Item_Id的掘进任务在表中对应的最后一条统计记录,以读取其统计结束日期等其它信息
k:=j;
while DrillStat[k].Item_Id=Item_Id do
begin
k:=k+1;
if k>High(DrillStat) then //统计表中涉及的最后一个掘进任务只有一个统计记录
begin
break;
end;
if k=High(DrillStat) then //统计表中涉及的最后一个掘进任务有多个统计记录
begin
k:=k+1;
break;
end;
end;
Drill[i].Finished_Sum:=DrillStat[k-1].Finished_Sum;
// 1:采掘工作结束
if(DrillStat[k-1].Remain<=0)
then
begin
Drill[i].End_Date:=DrillStat[k-1].End_Date;
Drill[i].PercentComplete:=100;
end;
// 2:采掘工作没有结束
if(DrillStat[k-1].Remain>0)
then
begin
Percent:=round((DrillStat[k-1].Finished_Sum/Drill[i].Plan_Amount)*100);
Drill[i].PercentComplete:=Percent;
end;
break; //break: for j:=1 to High(DrillStat) do
end; //end: if DrillStat[j].Item_Id=Item_Id then
end; //end: for j:=1 to High(DrillStat) do
end;//end: for i:=1 to High(Drill) do
//把对掘进统计情况处理的结果(存放在Drill数组中)更新到“掘进接替跟踪”表中
try
With Data_Frm.DrillRelayTrace_AdoTab do
begin
first;
while not eof do
begin
Find:=false;
Item_Id:=FieldByName('Face_Lane').AsInteger;
for i:=1 to High(Drill) do
begin
if Drill[i].Item_Id=Item_Id then
begin
Find:=true;
break; //break: for i:=1 to High(Drill) do
end;
end;
if Find then //如果“掘进统计”表中统计的掘进任务中有“掘进接替跟踪”表当前的记录对应的掘进任务时,则进行更新处理
begin
Edit;
FieldByName('Begin_Date').AsDateTime:=Drill[i].Begin_Date;
FieldByName('End_Date').AsDateTime:=Drill[i].End_Date;
FieldByName('PercentComplete').AsInteger:=Drill[i].PercentComplete;
post;
end;
next;
end;
end; //end: With Data_Frm.DrillRelayTrace_AdoTab do
except
showmessage('向“掘进接替跟踪”表中更新数据时出现错误,位置在DrillStatistic_Unt单元中的DealDrillStat过程中。');
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -