如何在本地判断是否有重复?请帮忙看看小函数。 ( 积分: 50 )

  • 主题发起人 主题发起人 WilliamGui
  • 开始时间 开始时间
W

WilliamGui

Unregistered / Unconfirmed
GUEST, unregistred user!
函数如何:
function TfrmBasGenFrm.DataSetFieldIsRepeat(DataSet: TDataSet;
ARepeatField: TField): boolean;
var
iRecNo:integer;
RepeatFieldValue: string;
begin
Result:=true;
if (DataSet=nil) or (not DataSet.Active)
or (ARepeatField=nil) or DataSet.IsEmpty
then
begin
Result:=false;
exit;
end;
iRecNo:=DataSet.RecNo;
RepeatFieldValue:=ARepeatField.AsString;
if DataSet is TClientDataSet then
begin
with TClientDataSet.Create(self)do
begin
CloneCursor(TClientDataSet(DataSet), False, True);
First;
while not Eofdo
begin
if iRecNo<>RecNo then
begin
//有问题
if FieldByName(ARepeatField.FieldName).AsString=RepeatFieldValue
then
begin
SetDBControlFocus(DataSet, ARepeatField);
//设置焦点
WarningMsgBox(ARepeatField.DisplayLabel+' 不能重复!');
Exit;
end;
end;
//RecNo
Next;
end;
Free;
end;
//with
end else
if DataSet is TADODataSet then
begin
end;
Result:=False;
end;
 
函数如何:
function TfrmBasGenFrm.DataSetFieldIsRepeat(DataSet: TDataSet;
ARepeatField: TField): boolean;
var
iRecNo:integer;
RepeatFieldValue: string;
begin
Result:=true;
if (DataSet=nil) or (not DataSet.Active)
or (ARepeatField=nil) or DataSet.IsEmpty
then
begin
Result:=false;
exit;
end;
iRecNo:=DataSet.RecNo;
RepeatFieldValue:=ARepeatField.AsString;
if DataSet is TClientDataSet then
begin
with TClientDataSet.Create(self)do
begin
CloneCursor(TClientDataSet(DataSet), False, True);
First;
while not Eofdo
begin
if iRecNo<>RecNo then
begin
//有问题
if FieldByName(ARepeatField.FieldName).AsString=RepeatFieldValue
then
begin
SetDBControlFocus(DataSet, ARepeatField);
//设置焦点
WarningMsgBox(ARepeatField.DisplayLabel+' 不能重复!');
Exit;
end;
end;
//RecNo
Next;
end;
Free;
end;
//with
end else
if DataSet is TADODataSet then
begin
end;
Result:=False;
end;
 
clientdataset设置主Key即可,并且是可以动态改变主key的.
 
其实可以用TStringList来实现相同功能。
function TfrmBasGenFrm.DataSetFieldIsRepeat(DataSet: TDataSet;
ARepeatField:TField): boolean;
var
sl:TStrings;
sFieldName:String;
begin
Result:=true;
sl:=TStringList.Create;
if (DataSet=nil) or (not DataSet.Active)
or (ARepeatField=nil) or DataSet.IsEmpty
then
begin
Result:=false;
exit;
end;
sFieldName:=ARepeatField.FieldName;
DataSet.Frist;
While Not DataSet.Eofdo
begin
If sl.IndexOf(DataSet.FieldByName(sFieldName).AsString)>0 then
begin
Result:=False;

SetDBControlFocus(DataSet, ARepeatField);
//设置焦点
WarningMsgBox(ARepeatField.DisplayLabel+' 不能重复!');
Break;
end
else

sl.Add(DataSet.FieldByName(sFieldName).AsString);
DataSet.Next;
end;
sl.Free;
end;
 
同意chinaman81的办法,这样比较方便,速度快啊!
 
同意chinaman81的办法!
 
To chinaman81:
照你写的,如果我修改了当前记录,再调用这个函数,那肯定会重复,我不想对当前记录也进行判断
 
首先程序要定义两种状态:新增,修改
新增,用locate就可以了.
修改:修改前先记录原来的值,比较的时候把原来的值除开就是了,Filter即可
 
后退
顶部