📄 relay_baseunt.pas
字号:
CurrentPriorRec.Sequence:=FieldByName('Sequence').AsInteger;
CurrentPriorRec.Project_Id:=FieldByName('Project_Id').AsInteger;
CurrentPriorRec.Relay_Route:=FieldByName('Relay_Route').AsInteger;
CurrentPriorRec.Relay_Id:=FieldByName('Relay_Id').AsInteger;
CurrentPriorRec.Face_Lane:=FieldByName('Face_Lane').AsInteger;
CurrentPriorRec.Area:=FieldByName('Area').AsInteger;
CurrentPriorRec.WorkGroup:=FieldByName('WorkGroup').AsInteger;
CurrentPriorRec.B_Date:=FieldByName('Begin_Date').AsDateTime;
CurrentPriorRec.E_Date:=FieldByName('End_Date').AsDateTime;
end;
Base_DataS.DataSet.Next;
CurrentInterv:=round(CurrentRec.B_Date-CurrentPriorRec.E_Date);
end; //end:if not FirstRelay then
if FirstRelay then //若是首采面,则要寻找该首采面的回采开始前的间歇时间,因为作为首采面是不考虑开始前的间歇时间的,所以在接替表中无法得出间歇时间,要通过其它表来查询得出
begin
Data_Frm.Face_AdoTab.Locate('Face_Id',CurrentRec.Face_Lane,[locaseinsensitive]);
CurrentRec.TechnicType:=Data_Frm.Face_AdoTab.fieldbyname('Technic_Type').AsInteger;
Data_Frm.MineInterval_AdoTab.Locate('Technic_Type',CurrentRec.TechnicType,[locaseinsensitive]);
CurrentRec.Interval:=Data_Frm.MineInterval_AdoTab.fieldbyname('Interval_Time').AsInteger;
CurrentInterv:=CurrentRec.Interval;
end;
Base_DataS.DataSet.Next;
with Base_DataS.DataSet do
begin
CurrentNextRec.Sequence:=FieldByName('Sequence').AsInteger;
CurrentNextRec.Project_Id:=FieldByName('Project_Id').AsInteger;
CurrentNextRec.Relay_Route:=FieldByName('Relay_Route').AsInteger;
CurrentNextRec.Relay_Id:=FieldByName('Relay_Id').AsInteger;
CurrentNextRec.Face_Lane:=FieldByName('Face_Lane').AsInteger;
CurrentNextRec.Area:=FieldByName('Area').AsInteger;
CurrentNextRec.WorkGroup:=FieldByName('WorkGroup').AsInteger;
CurrentNextRec.B_Date:=FieldByName('Begin_Date').AsDateTime;
CurrentNextRec.E_Date:=FieldByName('End_Date').AsDateTime;
end;
CurrentNextTaskT:=round(CurrentNextRec.E_Date-CurrentNextRec.B_Date);
Base_DataS.DataSet.Prior;
//当前记录与下一条记录不是同一个方案
if CurrentRec.Project_Id<>CurrentNextRec.Project_Id then exit;
//如果当前记录与下一条记录不属于同一个施工队(即当前记录是当前施工队的最后一个回采面),则不准向下移动
if CurrentRec.Relay_Route<>CurrentNextRec.Relay_Route then exit;
CurrentNextInterv:=round(CurrentNextRec.B_Date-CurrentRec.E_Date);
if not FirstRelay then
begin
//修改当前记录的相关信息,当前记录将获取下一条记录的相关信息
with Base_DataS.DataSet do
begin
Edit;
//if not Data_Frm.Face_AdoTab.Locate('Face_Id',CurrentNextRec.Face_Lane,[locaseinsensitive])
//then exit;
FieldByName('Face_Lane').AsInteger:=CurrentNextRec.Face_Lane;
FieldByName('Area').AsInteger:=CurrentNextRec.Area;
FieldByName('Begin_Date').AsDateTime:=CurrentPriorRec.E_Date+CurrentNextInterv;
FieldByName('End_Date').AsDateTime:=CurrentPriorRec.E_Date+CurrentNextInterv+CurrentNextTaskT;
Post;
end;
Base_DataS.DataSet.Next;
//修改当前记录的下一条记录的信息
with Base_DataS.DataSet do
begin
Edit;
//if not Data_Frm.Face_AdoTab.Locate('Face_Id',CurrentRec.Face_Lane,[locaseinsensitive])
//then exit;
FieldByName('Face_Lane').AsInteger:=CurrentRec.Face_Lane;
FieldByName('Area').AsInteger:=CurrentRec.Area;
FieldByName('Begin_Date').AsDateTime:=CurrentPriorRec.E_Date+CurrentNextInterv+CurrentNextTaskT+CurrentInterv;
FieldByName('End_Date').AsDateTime:=CurrentPriorRec.E_Date+CurrentNextInterv+CurrentNextTaskT+CurrentInterv+CurrentTaskT;
Post;
end;
end;
if FirstRelay then
begin
//修改当前记录的相关信息,当前记录将获取下一条记录的相关信息
with Base_DataS.DataSet do
begin
Edit;
//if not Data_Frm.Face_AdoTab.Locate('Face_Id',CurrentNextRec.Face_Lane,[locaseinsensitive])
//then exit;
FieldByName('Face_Lane').AsInteger:=CurrentNextRec.Face_Lane;
FieldByName('Area').AsInteger:=CurrentNextRec.Area;
FieldByName('Begin_Date').AsDateTime:=CurrentRec.B_Date;
FieldByName('End_Date').AsDateTime:=CurrentRec.B_Date+CurrentNextTaskT;
Post;
end;
Base_DataS.DataSet.Next;
//修改当前记录的下一条记录的信息
with Base_DataS.DataSet do
begin
Edit;
//if not Data_Frm.Face_AdoTab.Locate('Face_Id',CurrentRec.Face_Lane,[locaseinsensitive])
//then exit;
FieldByName('Face_Lane').AsInteger:=CurrentRec.Face_Lane;
FieldByName('Area').AsInteger:=CurrentRec.Area;
FieldByName('Begin_Date').AsDateTime:=CurrentRec.B_Date+CurrentNextTaskT+CurrentInterv;
FieldByName('End_Date').AsDateTime:=CurrentRec.B_Date+CurrentNextTaskT+CurrentInterv+CurrentTaskT;
Post;
end;
end;
end;
procedure TRelay_BaseFrm.DeleteAndAdjust;
var
i,j,k,t,s,m,pos:integer;
DelT:integer;//被删除记录的工序的工期及其开始前的间隔时间之和
WillAdjust:boolean;
MK:TBookMark;
CurrentRecNo,LastRecNo:integer;
begin
HaveDeleted:=false; //假设删除操作没有成功,后面的删除操作若成功则进行标记
//记录要删除的记录信息,以便进行调整
//删除后需要调整的字段是Sequence,Relay_Id,Begin_Date,End_Date调整时需要借助Project_Id和Relay_Route两个字段的信息
CurrentRecNo:=Base_DataS.DataSet.RecNo;
MK:=Base_DataS.DataSet.GetBookmark;
Base_DataS.DataSet.Last;
LastRecNo:=Base_DataS.DataSet.RecNo;
if CurrentRecNo=LastRecNo then //如果是最后一条记录
begin
//inherited;
Current.Sequence:=Base_DataS.DataSet.FieldByName('Sequence').AsInteger;
Current.Project_Id:=Base_DataS.DataSet.FieldByName('Project_Id').AsInteger;
Current.Relay_Route:=Base_DataS.DataSet.FieldByName('Relay_Route').AsInteger;
Current.Relay_Id:=Base_DataS.DataSet.FieldByName('Relay_Id').AsInteger;
Current.Face_Lane:=Base_DataS.DataSet.FieldByName('Face_Lane').AsInteger;
Current.WorkGroup:=Base_DataS.DataSet.FieldByName('WorkGroup').AsInteger;
Current.Area:=Base_DataS.DataSet.FieldByName('Area').AsInteger;
Current.B_Date:=Base_DataS.DataSet.FieldByName('Begin_Date').AsDateTime;
Current.E_Date:=Base_DataS.DataSet.FieldByName('End_Date').AsDateTime;
Current.TaskTime:=trunc(Current.E_Date-Current.B_Date);
DelRecord(Base_DataS.DataSet);
HaveDeleted:=true;
exit;
end;
Base_DataS.DataSet.GotoBookmark(MK);
Current.Sequence:=Base_DataS.DataSet.FieldByName('Sequence').AsInteger;
Current.Project_Id:=Base_DataS.DataSet.FieldByName('Project_Id').AsInteger;
Current.Relay_Route:=Base_DataS.DataSet.FieldByName('Relay_Route').AsInteger;
Current.Relay_Id:=Base_DataS.DataSet.FieldByName('Relay_Id').AsInteger;
Current.Face_Lane:=Base_DataS.DataSet.FieldByName('Face_Lane').AsInteger;
Current.WorkGroup:=Base_DataS.DataSet.FieldByName('WorkGroup').AsInteger;
Current.Area:=Base_DataS.DataSet.FieldByName('Area').AsInteger;
Current.B_Date:=Base_DataS.DataSet.FieldByName('Begin_Date').AsDateTime;
Current.E_Date:=Base_DataS.DataSet.FieldByName('End_Date').AsDateTime;
Current.TaskTime:=trunc(Current.E_Date-Current.B_Date);
if Current.Sequence<>1 then
begin
Base_DataS.DataSet.Prior;
with Base_DataS.DataSet do
begin
CurrentPriorRelay.Sequence:=FieldByName('Sequence').AsInteger;
CurrentPriorRelay.Project_Id:=FieldByName('Project_Id').AsInteger;
CurrentPriorRelay.Relay_Route:=FieldByName('Relay_Route').AsInteger;
CurrentPriorRelay.Relay_Id:=FieldByName('Relay_Id').AsInteger;
CurrentPriorRelay.Face_Lane:=FieldByName('Face_Lane').AsInteger;
CurrentPriorRelay.Area:=FieldByName('Area').AsInteger;
CurrentPriorRelay.WorkGroup:=FieldByName('WorkGroup').AsInteger;
CurrentPriorRelay.B_Date:=FieldByName('Begin_Date').AsDateTime;
CurrentPriorRelay.E_Date:=FieldByName('End_Date').AsDateTime;
CurrentPriorRelay.TaskTime:=trunc(CurrentPriorRelay.E_Date-CurrentPriorRelay.B_Date);
end;
Base_DataS.DataSet.Next; //返回原位置
end;
m:=LastRecNo-CurrentRecNo+1;
Setlength(BehindRelay,m+1);
//读取当前记录及其以后的所有记录信息
i:=1;
while not Base_DataS.DataSet.Eof do
begin
with Base_DataS.DataSet do
begin
BehindRelay[i].Sequence:=FieldByName('Sequence').AsInteger;
BehindRelay[i].Project_Id:=FieldByName('Project_Id').AsInteger;
BehindRelay[i].Relay_Route:=FieldByName('Relay_Route').AsInteger;
BehindRelay[i].Relay_Id:=FieldByName('Relay_Id').AsInteger;
BehindRelay[i].Face_Lane:=FieldByName('Face_Lane').AsInteger;
BehindRelay[i].Area:=FieldByName('Area').AsInteger;
BehindRelay[i].WorkGroup:=FieldByName('WorkGroup').AsInteger;
BehindRelay[i].B_Date:=FieldByName('Begin_Date').AsDateTime;
BehindRelay[i].E_Date:=FieldByName('End_Date').AsDateTime;
BehindRelay[i].TaskTime:=trunc(BehindRelay[i].E_Date-BehindRelay[i].B_Date);
next;
i:=i+1;
end;
end;
Base_DataS.DataSet.GotoBookmark(Mk);
Base_DataS.DataSet.FreeBookmark(MK);
WillAdjust:=false; //如果删除的是某个施工队队的最后一个接替任务,则可以不进行调整Relay_Id,Begin_Date,End_Date字段值,只需要调整Sequence字段值即可
if not Base_DataS.DataSet.Eof then
begin
Base_DataS.DataSet.Next;
CurrentNextRelay.Sequence:=Base_DataS.DataSet.FieldByName('Sequence').AsInteger;
CurrentNextRelay.Project_Id:=Base_DataS.DataSet.FieldByName('Project_Id').AsInteger;
CurrentNextRelay.Relay_Route:=Base_DataS.DataSet.FieldByName('Relay_Route').AsInteger;
CurrentNextRelay.Relay_Id:=Base_DataS.DataSet.FieldByName('Relay_Id').AsInteger;
CurrentNextRelay.Face_Lane:=Base_DataS.DataSet.FieldByName('Face_Lane').AsInteger;
CurrentNextRelay.WorkGroup:=Base_DataS.DataSet.FieldByName('WorkGroup').AsInteger;
CurrentNextRelay.Area:=Base_DataS.DataSet.FieldByName('Area').AsInteger;
CurrentNextRelay.B_Date:=Base_DataS.DataSet.FieldByName('Begin_Date').AsDateTime;
CurrentNextRelay.E_Date:=Base_DataS.DataSet.FieldByName('End_Date').AsDateTime;
CurrentNextRelay.TaskTime:=trunc(CurrentNextRelay.E_Date-CurrentNextRelay.B_Date);
Base_DataS.DataSet.Prior;
if (CurrentNextRelay.Project_Id=Current.Project_Id)and(CurrentNextRelay.Relay_Route=Current.Relay_Route)
then WillAdjust:=true;
end;
if DelRecord(Base_DataS.DataSet)then HaveDeleted:=true; //进行删除操作,若删除成功则用HaveDeleted进行标记
MK:=Base_DataS.DataSet.GetBookmark; //此时表的指针定位是:若删除的是第一条记录,则定位在原表的第二条记录的位置;若删除的是原表中的非第一条记录,则指针定位在被删除记录的前一条记录
//对删除后的表进行调整
if Base_DataS.DataSet.RecordCount=0 then
begin
Base_DataS.DataSet.FreeBookmark(MK);
exit;
end;
//如果删除的是第一条记录,进行以下调整(在原表中删除第一条记录后,指针指向新表的第一条记录)
if Base_DataS.DataSet.RecNo=1 then //删除的记录为第一条,其后的起始日期不变,若想改变,通过修改功能实现
begin
i:=Base_DataS.DataSet.FieldByName('Sequence').AsInteger;
if i<>1 then //排除删除记录是第二条的情况
begin
j:=1; k:=0;
while not Base_DataS.DataSet.Eof do
begin
t:=Base_DataS.DataSet.FieldByName('Project_Id').AsInteger;
s:=Base_DataS.DataSet.FieldByName('Relay_Route').AsInteger;
Base_DataS.DataSet.Edit;
Base_DataS.DataSet.FieldByName('Sequence').AsInteger:=j;
if WillAdjust then
if (t=Current.Project_Id)and(s=Current.Relay_Route) then
begin
k:=k+1;
Base_DataS.DataSet.FieldByName('Relay_Id').AsInteger:=k;
end;
Base_DataS.DataSet.Post;
Base_DataS.DataSet.Next;
j:=j+1;
end;
exit;
end;
end;
//如果删除的不是第一条记录,也不是最后一条记录,进行以下调整(在原表中删掉非第一条记录后,指针指向上一条记录)
i:=Base_DataS.DataSet.FieldByName('Sequence').AsInteger;//被删除的记录的前一条记录的Sequence,也就是删除后的表的当前记录的Sequence
j:=Base_DataS.DataSet.FieldByName('Relay_Id').AsInteger;//被删除的记录的前一条记录的Relay_Id,也就是删除后的表的当前记录的Relay_Id
Base_DataS.DataSet.Next; //定位在被删除记录的下一条记录
pos:=2;//BehindRelay数组中,BehindRelay[1]是原被删除的记录,BehindRelay[2]是原被删除的记录的下一条记录,也就是在此处Base_DataS.DataSet所定位的当前记录
k:=0; //当前施工队的接替序号变量
while not Base_DataS.DataSet.Eof do
begin
t:=Base_DataS.DataSet.FieldByName('Project_Id').AsInteger;//被删除的记录的后一条记录的Project_Id
s:=Base_DataS.DataSet.FieldByName('Relay_Route').AsInteger;//被删除的记录的后一条记录的Relay_Route
Base_DataS.DataSet.Edit;
Base_DataS.DataSet.FieldByName('Sequence').AsInteger:=i+1;
if Current.Relay_Id=1 //删除的记录是某施工队的第一个接替任务,其后的起始时间不变,可以通过修改功能来改变
then
begin
if(t=Current.Project_Id)and(s=Current.Relay_Route)then
begin
k:=k+1;
Base_DataS.DataSet.FieldByName('Relay_Id').AsInteger:=k;
end;
end
else
begin
if(t=Current.Project_Id)and(s=Current.Relay_Route)then
begin
Base_DataS.DataSet.FieldByName('Relay_Id').AsInteger:=j+1;
//DelT:被删除的记录的工序的工期和该工序开始前的间隔时间(或者停留时间),可理解为该工序所耗费的时间段
//Current.B_Date-CurrentPriorRelay.E_Date:被删除记录的工序开始前的间隔时间(停歇时间)
DelT:=Current.TaskTime+trunc(Current.B_Date-CurrentPriorRelay.E_Date);
Base_DataS.DataSet.FieldByName('Begin_Date').AsDateTime:=trunc(BehindRelay[pos].B_Date-DelT);
Base_DataS.DataSet.FieldByName('End_Date').AsDateTime:=trunc(BehindRelay[pos].E_Date-DelT);
j:=j+1;
end;
end;
Base_DataS.DataSet.Post;
i:=i+1;
pos:=pos+1;
Base_DataS.DataSet.Next;
end;
if Base_DataS.DataSet.RecordCount>1 then Base_DataS.DataSet.GotoBookmark(MK);
Base_DataS.DataSet.FreeBookmark(MK);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -