📄 drillworkpriortask_unt.pas
字号:
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 + -