怎样利用导航条的post按钮检查要插入的记录是否已经存在?(100分)

  • 主题发起人 主题发起人 刘林
  • 开始时间 开始时间

刘林

Unregistered / Unconfirmed
GUEST, unregistred user!
我现有一个dbedit1,一个table1,一个datasource1,一个DBNavigator1和一个DBGrid1。它们都与同一张表连在一块,其中dbedit1显示的是表的主关键字。当我利用导航条添加一条记录时,如果该主索引记录已经存在,则数据库会出错。所以,我现想在按下导航条的post按钮之前,先判断该记录是否存在,若存在,则取消当前操作,否则添加该记录。这个问题已经困住我很久了,实在不知如何下手,还请各位大虾多多指教。
 
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
if Table1.FieldByName('???').isNull then Abort;
end;
 
你还想这样啊,在POST之前FIND一下吧,如果找到的话,就不插入了。
 
不行呀,我find不知多少次了,可总是出错。
 
use Query:

dm.Qexist.Close;
dm.Qexist.ParamByName('pempNo').asstring:=dm.Qclass0.FieldByName('empNo').value;
dm.Qexist.ParamByName('pmonth').asstring:=EGatherMonth.Text;
dm.Qexist.open;
if dm.Qexist.fieldbyname('okok').value=1 then
begin
dm.Qup300.Close;
dm.Qup300.ParamByName('pempNo').asstring:=dm.Qclass0.FieldByName('empNo').value;
dm.Qup300.ParamByName('p300').asfloat:=iTotalHours;
dm.Qup300.ParamByName('pmonthG').asstring:=EGatherMonth.Text;
dm.Qup300.execsql;
end
else
begin
dm.Qins300.Close;
dm.Qins300.ParamByName('pempNo').asstring:=dm.Qclass0.FieldByName('empNo').value;
dm.Qins300.ParamByName('p300').asfloat:=iTotalHours;
dm.Qins300.ParamByName('pmonthG').asstring:=EGatherMonth.Text;
dm.Qins300.execsql;
end;

Qexist:select count(*) okok from yourtable
where empNo=:pempNo
and monthG=:pmonth
Qup300 update yourtable
set over300=over300+:p300
where empNo=:pempNo
and monthG=:pmonthG

Qins300: insert into yourtable
(empNo,monthG,over300,status)
values(:pempNo,:pmonthG,:p300,'T')

对不起,不想改了,你自己改吧。



 
各位大虾,我只想在按下导航条DBNavigator1的post按钮时,先检查欲插入的值是否已经存在,若不存在则插入,否则不插入。我不知道这个想法是否幼稚,请各位大虾指点。急!
 
把字段设置为主键多简单
 
两种方法:
1、设好数据表的主键,让数据库自动检测,程序中只做错误处理,例如:
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
ShowMessage('重码!');
Action := daAbort
end;
当然,这里你要进行一些其他的判断来确定其他种类的错误。

2、自己通过程序判断,这要求数据源的 CachedUpdates 为 True
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
var b1,b2: TBookMark;
s : String;
begin

s := table1.Fieldbyname('Name').AsString;
b1 := Table1.GetBookmark;
table1.FindKey();
b2 := table1.GetBookMark;
if (table1.BookmarkValid(b2)) and
(Table1.CompareBookmarks(b1,b2) = 1) then begin
ShowMessage('重码');
table1.GotoBookmark(b1);
table1.Edit;
table1.FieldByName('name').Value := s; //回到BeforePost状态
abort
end;

end;
 
接受答案了.
 
后退
顶部