📄 drillstatistic_unt.pas
字号:
var Key: Word; Shift: TShiftState);
begin
if key=VK_RETURN then DBEdit3.SetFocus;
end;
procedure TDrillStatistic_Frm.DBEdit1KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key=VK_RETURN then DBEdit2.SetFocus;
end;
procedure TDrillStatistic_Frm.DateTimePicker2KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key=VK_RETURN then DBEdit1.SetFocus;
end;
procedure TDrillStatistic_Frm.DateTimePicker1KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key=VK_RETURN then DateTimePicker2.SetFocus;
end;
procedure TDrillStatistic_Frm.DBLookupComboBox2KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key=VK_RETURN then DateTimePicker1.SetFocus;
end;
procedure TDrillStatistic_Frm.DBLookupComboBox1KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key=VK_RETURN then DBLookUpComboBox2.SetFocus;
end;
procedure TDrillStatistic_Frm.DBEdit3KeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if key=VK_RETURN then BitBtn3.SetFocus;
end;
procedure TDrillStatistic_Frm.ReadStatData;
var
m,n,i,j:integer;
Item_Id:integer;
begin
if Base_DataS.DataSet.RecordCount=0 then exit;
m:=Base_DataS.DataSet.RecordCount;
setlength(DrillStat,m+1);
with Base_DataS.DataSet do
begin
first;
i:=1;
while not eof do
begin
DrillStat[i].Id:=FieldByName('Id').AsInteger;
DrillStat[i].WorkGroup_Id:=FieldByName('WorkGroup_Id').AsInteger;
DrillStat[i].Item_Id:=FieldByName('Item_Id').AsInteger;
DrillStat[i].Begin_Date:=FieldByName('Begin_Date').AsDateTime;
DrillStat[i].End_Date:=FieldByName('End_Date').AsDateTime;
DrillStat[i].Finished:=FieldByName('Finished').AsInteger;
DrillStat[i].Remain:=FieldByName('Remain').AsInteger;
DrillStat[i].Finished_Sum:=FieldByName('Finished_Sum').AsInteger;
DrillStat[i].Relay_Id:=FieldByName('Relay_Id').AsInteger;
DrillStat[i].PercentComplete:=0; //暂时设置初值为0
next;
i:=i+1;
end;
end;
with Data_Frm.Lane_AdoTab do
begin
first;
while not eof do
begin
Item_Id:=FieldByName('Lane_Id').AsInteger;
for i:=1 to High(DrillStat) do
begin
if DrillStat[i].Item_Id=Item_Id then
begin
DrillStat[i].Plan_Amount:=FieldByName('WorkQuantity').AsInteger;
DrillStat[i].Plan_DayProgress:=FieldByName('DayProgress').AsFloat;
DrillStat[i].Plan_TaskTime:=FieldByName('TaskTime').AsInteger;
DrillStat[i].Name:=FieldByName('Name').AsString;
break;//这样,每个掘进任务的多条统计记录中,只有第一条记录有Plan_Amount,Day_Progress,TaskTime等信息
end;
end;
next;
end;
end;
end;
procedure TDrillStatistic_Frm.Taxis;
var
m,n,i,j,k:integer;
SumOutput,Remain:integer;
WorkGroupId,ItemId:integer;
TempStat:array of TDrillStatData; //辅助排序之用
WorkGroupExist,FaceExist:boolean;
BK:TBookMark;
begin
WorkGroupExist:=false;
FaceExist:=false;
//判断添加的记录的采煤队是否已经存在
//MineStat的读取是在点击“添加”按钮执行添加记录之前进行的
for i:=1 to High(DrillStat) do
begin
if AddStat.WorkGroup_Id=DrillStat[i].WorkGroup_Id then
begin
WorkGroupExist:=true;
break;
end;
end;
//判断添加的记录的回采面是否已经存在,在“采煤统计”表中,不同采煤队的回采面是不会相同的
for i:=1 to High(DrillStat) do
begin
if AddStat.Item_Id=DrillStat[i].Item_Id then
begin
if not WorkGroupExist then
begin
showmessage('有问题,出现了多个采煤队被安排同一个回采面的情况!');
exit;
end;
FaceExist:=true;
break;
end;
end;
//如果添加的记录是原表中已经存在的采煤队,而且也记录过添加记录的回采面的统计情况,则进行相关排序
k:=0; m:=0; n:=0; SumOutput:=0; Remain:=0;
if (WorkGroupExist)and(FaceExist)then
begin
for i:=1 to High(DrillStat) do
begin
if (AddStat.WorkGroup_Id=DrillStat[i].WorkGroup_Id)
and(AddStat.Item_Id=DrillStat[i].Item_Id)
then
begin
k:=i;
break;
end;
end;
if k>0 then
begin
m:=k;
while(m<High(DrillStat))and((AddStat.WorkGroup_Id=DrillStat[m].WorkGroup_Id)
and(AddStat.Item_Id=DrillStat[m].Item_Id))do
begin
m:=m+1;
end;
n:=m; //m记录了新添加的记录应该插入的位置
if n=High(DrillStat)
then //如果原表中的最后一条记录与新添加的记录是同一个采煤队且是同一个回采面,则新添加的记录不需要变化
begin
if (AddStat.WorkGroup_Id=DrillStat[m].WorkGroup_Id)
and(AddStat.Item_Id=DrillStat[m].Item_Id)
then
begin
SumOutput:=DrillStat[n].Finished_Sum+AddStat.Finished;
Remain:=DrillStat[n].Remain-AddStat.Finished;
with Base_DataS.DataSet do
begin
last;
edit;
FieldByName('Finished_Sum').AsInteger:=SumOutput;
FieldByName('Remain').AsInteger:=Remain;
post;
end;
end
else
begin //互换最后一条记录和倒数第二条记录
SumOutput:=DrillStat[n-1].Finished_Sum+AddStat.Finished;
Remain:=DrillStat[n-1].Remain-AddStat.Finished;
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:=Remain;
FieldByName('Finished_Sum').AsInteger:=SumOutput;
FieldByName('Relay_Id').AsInteger:=AddStat.Relay_Id;
post;
end;
end;
exit;
end
else //n<High(DrillStat)时,添加的记录需要向前插入
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;
SumOutput:=DrillStat[m-1].Finished_Sum+AddStat.Finished;
Remain:=DrillStat[m-1].Remain-AddStat.Finished;
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;
//更新数据库
//首先更新最后一条记录
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-1].Item_Id;
//找到需要更新的位置
//首先找到首次出现相同采煤队且相同回采面(与新添加的记录相同)的记录
with Base_DataS.DataSet do
begin
first;
while (not eof) do
begin
if(FieldByName('WorkGroup_Id').AsInteger=WorkGroupId)and(FieldByName('Item_Id').AsInteger=ItemId)then
begin
break;
end;
next;
end;
//向后移动记录指针,找到出现相同采煤队和相同回采面的记录(与新添加的记录相同)后的第一个不同采煤队的记录,该位置就是要插入的位置
with Base_DataS.DataSet do
begin
while (FieldByName('WorkGroup_Id').AsInteger=WorkGroupId)
and(FieldByName('Item_Id').AsInteger=ItemId)do
begin
next;
end;
end;
end; //end: with Base_DataS.DataSet do
//记录插入的位置,以便操作完成后再把指针移至此处,以方便用户查看添加和排序后的效果
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;
if i=m
then
begin
FieldByName('Finished_Sum').AsInteger:=SumOutput;
FieldByName('Remain').AsInteger:=Remain;
end
else
begin
FieldByName('Finished_Sum').AsInteger:=DrillStat[i].Finished_Sum;
FieldByName('Remain').AsInteger:=DrillStat[i].Remain;
end;
FieldByName('Relay_Id').AsInteger:=DrillStat[i].Relay_Id;
post;
next;
i:=i+1;
end;
end; //end: With Base_DataS.DataSet do
end; // end: if k>0 then
Base_DataS.DataSet.GotoBookmark(BK);
Base_DataS.DataSet.FreeBookmark(BK);
exit;
end; //end: if (WorkGroupExist)and(FaceExist)then
//如果添加的记录是原表中已经存在的采煤队,但是没有记录过添加记录的回采面的统计情况,进行相关排序
k:=0; m:=0; n:=0;
if (WorkGroupExist)and(not FaceExist) then
begin
for i:=1 to High(DrillStat) do
begin
if DrillStat[i].WorkGroup_Id=AddStat.WorkGroup_Id then
begin
k:=i;
break;
end;
end;
if k>0 then
begin
m:=k;
while(m<High(DrillStat))and(DrillStat[m].WorkGroup_Id=AddStat.WorkGroup_Id) do
begin
m:=m+1;
end;
n:=m; //m记录了新添加的记录应该插入的位置
if n=High(DrillStat) //若应该插入的位置是表中倒数第二条记录,则不需要处理
then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -