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

📄 drillstatistic_unt.pas

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