⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 relay_baseunt.pas

📁 煤矿行业采掘接替计划自动生成系统
💻 PAS
📖 第 1 页 / 共 4 页
字号:
          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 + -