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

📄 drillstatistic_unt.pas

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