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

📄 drillworkpriortask_unt.pas

📁 煤矿行业采掘接替计划自动生成系统
💻 PAS
📖 第 1 页 / 共 3 页
字号:
unit DrillWorkPriorTask_Unt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DataEdit_BaseUnt, DB, Grids, DBGrids, StdCtrls, Buttons,
  ExtCtrls, Mask, DBCtrls, ADODB;

type
  TPriorTask=record
    Sequence:integer;
    DrillTask_Id:integer;
    Id:integer;
    PriorTask_Name:string;
    PriorTask_Id:integer;
  end;
  TDrillWorkPriorTask_Frm = class(TDataEdit_BaseFrm)
    Label1: TLabel;
    DBLookupComboBox1: TDBLookupComboBox;
    Label2: TLabel;
    DBLookupComboBox2: TDBLookupComboBox;
    DrillWorkTask_DataS: TDataSource;
    SelectPriorTask_DataS: TDataSource;
    SelectPriorTask_AdoQ: TADOQuery;
    BitBtn9: TBitBtn;
    DrillWorkTask_AdoQ: TADOQuery;
    procedure BitBtn8Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure DBLookupComboBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DBLookupComboBox2KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn9Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure DBLookupComboBox1Click(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
    InsertMode:boolean;// 控制‘确定’按钮是否按照插入来执行操作的变量
    Modify:boolean; //控制‘确定’按钮是否按照修改来执行操作的变量
    CurrentBehind:array of TPriorTask;
    Current,CurrentPrior,CurrentNext:TPriorTask;
    PriorTask:array of TPriorTask;
    Mark:TBookMark;
    procedure Insert_Deal;  //在当前记录的前一个位置上插入新记录,并且对相关字段值进行调整
  end;

var
  DrillWorkPriorTask_Frm: TDrillWorkPriorTask_Frm;

implementation
uses Data_Unt,Tools_Unt;
{$R *.dfm}

procedure TDrillWorkPriorTask_Frm.BitBtn8Click(Sender: TObject);
begin
  inherited;
  BitBtn9.Enabled:=false;
  Modify:=true;
  DBLookupComboBox1.SetFocus;
end;

procedure TDrillWorkPriorTask_Frm.BitBtn3Click(Sender: TObject);
var PriorTask,PriorTask_Sequence,i,a,b,DrillTask:integer;
begin
  if VarIsNull(Base_DataS.DataSet.FieldByName('DrillTask_Id').Value)
    then
      begin
        showmessage('请输入对应的掘进工作任务后再确定!');
        BitBtn3.Enabled:=true;
        DBLookUpComboBox1.Enabled:=true;
        DBLookUpComboBox1.SetFocus;
        exit;
      end;
  if VarIsNull(Base_DataS.DataSet.FieldByName('PriorTask_Id').Value)
    then
      begin
        showmessage('请输入对应的前置工序后再确定!');
        BitBtn3.Enabled:=true;
        DBLookUpComboBox2.Enabled:=true;
        DBLookUpComboBox2.SetFocus;
        exit;
      end;

  //如果是插入操作,则执行插入
  if InsertMode then
    begin
      Insert_Deal;
      InsertMode:=false;
      BitBtn9.Enabled:=true;
      exit;
    end;
  PriorTask:=Base_DataS.DataSet.FieldByName('PriorTask_Id').Value;
  Data_Frm.DrillCommonTask_AdoTab.Locate('Id',PriorTask,[locaseinsensitive]);
  Base_DataS.DataSet.FieldByName('PriorTask_Name').AsString:=Data_Frm.DrillCommonTask_AdoTab.FieldByName('Name').AsString;
  inherited;
  if Modify then //如果是按下修改键后,再按下的确定键,则更新(Post)完后,到此就不再往下执行
    begin
      Modify:=false;
      BitBtn9.Enabled:=true;
      exit;
    end;
  DrillTask:=Base_DataS.DataSet.FieldByName('DrillTask_Id').Value;
  PriorTask_Sequence:=0;
  //找到编号为DrillTask的掘进工作任务的前工序最大编号(Id号)
  Base_DataS.DataSet.First;
  for i:=1 to Base_DataS.DataSet.RecordCount do
    begin
      a:=Base_DataS.DataSet.FieldByName('DrillTask_Id').Value;
      if VarIsNull(Base_DataS.DataSet.FieldByName('Id').Value) then b:=0
         else b:=Base_DataS.DataSet.FieldByName('Id').Value;
      if (a=DrillTask)and(b>PriorTask_Sequence) then PriorTask_Sequence:=b;
      Base_DataS.DataSet.Next;
    end;
  Base_DataS.DataSet.Last;
  Base_DataS.DataSet.Edit;
  Base_DataS.DataSet.FieldByName('Id').AsInteger:=PriorTask_Sequence+1;
  try
    Base_DataS.DataSet.Post;
  except
    Base_DataS.DataSet.Cancel;
    showmessage('数据更新没有成功!');
  end;
  BitBtn9.Enabled:=true;
end;

procedure TDrillWorkPriorTask_Frm.BitBtn1Click(Sender: TObject);
var
LastId:integer;
begin
  inherited;
  try
    if Base_DataS.DataSet.RecordCount=0 then LastId:=0
       else LastId:=GetLastRecId(Base_DataS.DataSet,'Sequence');
    Base_DataS.DataSet.Append;
    Base_DataS.DataSet.FieldByName('Sequence').Value:=LastId+1;
  except
    showmessage('数据库未连接正确!');
  end;
  DBLookupComboBox1.Enabled:=true;
  DBLookupComboBox2.Enabled:=true;
  DBLookupComboBox1.SetFocus;
end;

procedure TDrillWorkPriorTask_Frm.DBLookupComboBox1KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
   if key=VK_RETURN then DBLookupComboBox2.SetFocus;

end;

procedure TDrillWorkPriorTask_Frm.DBLookupComboBox2KeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
   if key=VK_RETURN then BitBtn3.SetFocus;

end;

procedure TDrillWorkPriorTask_Frm.BitBtn2Click(Sender: TObject);
var
//Current,CurrentPrior,CurrentNext:TPriorTask;
MK:TBookMark;
WillAdjust:boolean;
CurrentRecNo,LastRecNo:integer;
m,i,j,s,k:integer;
begin
  //删除后需要调整的字段是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
      DelRecord(Base_DataS.DataSet);
      exit;
    end;
  Base_DataS.DataSet.GotoBookmark(MK);

  Current.Sequence:=Base_DataS.DataSet.FieldByName('Sequence').AsInteger;
  Current.DrillTask_Id:=Base_DataS.DataSet.FieldByName('DrillTask_Id').AsInteger;
  Current.Id:=Base_DataS.DataSet.FieldByName('Id').AsInteger;
  Current.PriorTask_Name:=Base_DataS.DataSet.FieldByName('PriorTask_Name').AsString;
  Current.PriorTask_Id:=Base_DataS.DataSet.FieldByName('PriorTask_Id').AsInteger;
  if Current.Sequence<>1 then
    begin
      Base_DataS.DataSet.Prior;
      with Base_DataS.DataSet do
        begin
          CurrentPrior.Sequence:=FieldByName('Sequence').AsInteger;
          CurrentPrior.DrillTask_Id:=FieldByName('DrillTask_Id').AsInteger;
          CurrentPrior.Id:=FieldByName('Id').AsInteger;
          CurrentPrior.PriorTask_Name:=FieldByName('PriorTask_Name').AsString;
          CurrentPrior.PriorTask_Id:=FieldByName('PriorTask_Id').AsInteger;
        end;
      Base_DataS.DataSet.Next;  //返回原位置
    end;

  m:=LastRecNo-CurrentRecNo+1;
  Setlength(CurrentBehind,m+1);
  //读取当前记录及其以后的所有记录信息
  i:=1;
  while not Base_DataS.DataSet.Eof do
    begin
      with Base_DataS.DataSet do
        begin
          CurrentBehind[i].Sequence:=FieldByName('Sequence').AsInteger;
          CurrentBehind[i].DrillTask_Id:=FieldByName('DrillTask_Id').AsInteger;
          CurrentBehind[i].Id:=FieldByName('Id').AsInteger;
          CurrentBehind[i].PriorTask_Name:=FieldByName('PriorTask_Name').AsString;
          CurrentBehind[i].PriorTask_Id:=FieldByName('PriorTask_Id').AsInteger;
          next;
          i:=i+1;
        end;
    end;

  Base_DataS.DataSet.GotoBookmark(Mk);
  Base_DataS.DataSet.FreeBookmark(MK);
  WillAdjust:=false; //如果删除的是某个掘进任务的最后一个前置工序(此时WillAdjust:=false;),则可以不进行调整Id字段值,只需要调整Sequence字段值即可
  if not Base_DataS.DataSet.Eof then
    begin
      Base_DataS.DataSet.Next;
      CurrentNext.Sequence:=Base_DataS.DataSet.FieldByName('Sequence').AsInteger;
      CurrentNext.DrillTask_Id:=Base_DataS.DataSet.FieldByName('DrillTask_Id').AsInteger;
      CurrentNext.Id:=Base_DataS.DataSet.FieldByName('Id').AsInteger;
      CurrentNext.PriorTask_Name:=Base_DataS.DataSet.FieldByName('PriorTask_Name').AsString;
      CurrentNext.PriorTask_Id:=Base_DataS.DataSet.FieldByName('PriorTask_Id').AsInteger;

      Base_DataS.DataSet.Prior;
      if (CurrentNext.DrillTask_Id=Current.DrillTask_Id)
           then WillAdjust:=true; //需要调整Id
    end;
  DelRecord(Base_DataS.DataSet); //进行删除操作

  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
               s:=Base_DataS.DataSet.FieldByName('DrillTask_Id').AsInteger;
               Base_DataS.DataSet.Edit;
               Base_DataS.DataSet.FieldByName('Sequence').AsInteger:=j;
               if WillAdjust then
                 if (s=Current.DrillTask_Id) then
                   begin
                     k:=k+1;
                     Base_DataS.DataSet.FieldByName('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('Id').AsInteger;//被删除的记录的前一条记录的Id,也就是删除后的表的当前记录的Id
        Base_DataS.DataSet.Next; //定位在被删除记录的下一条记录
        k:=0; //当前掘进任务的前置工序的序号变量

        while not Base_DataS.DataSet.Eof do
          begin
            s:=Base_DataS.DataSet.FieldByName('DrillTask_Id').AsInteger;//被删除的记录的后一条记录的Lane_Id
            Base_DataS.DataSet.Edit;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -