adoquery中怎样避免重复写入记录(55分)

  • 主题发起人 主题发起人 gunwithlove
  • 开始时间 开始时间
G

gunwithlove

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好,我遇到了这样一个问题,特此求教!
我通过adoquery往dbgrid中写入数据:
adoquery对应的表中有这样几项:付款编号、发票编号、发票金额(其中一个付款编号
对应了几个发票编号)。我根据输入的付款编号首先进行查询,如果在“发票回收详细信息
表”中还没有任何发票信息(即本次付款尚未收到发票),就直接输入发票;如果已经有
发票(但发票金额小于付款金额),那么就在已有的发票信息之后继续添加发票,最后进行
保存(adoquery.updatebatch),但因为原来表中已有一些发票信息,现在又把数据全写入
表,肯定会出现重复写入记录的现象(即原有的发票信息被多次写入),这样就出错了。
请问能不能只追加新输入的发票信息?怎样追加呢?
 
还有一个问题:对于追加输入发票信息时,怎样保证dbgrid中原来的发票信息不被修改呢?
 
对不起,刚才因为把“付款编号”作为主键,所以不能追加,现在去掉主键后,就可以了。
请问怎样才能使查询出的记录信息为只读,同时又可以输入新的发票信息呢?
 
用一个唯一确定记录的字段(例如发票编号)作为主键,这样就可以输入新的发票信息了
原来的数据库也不会被修改
 
追加的问题已经解决!对于追加输入发票信息时,怎样保证dbgrid中原来的发票信息不被修改呢?
 
手工控制dbgrid的Options中的dgEditing
 
怎样在程序中控制呢?原有的发票信息可能有n条,是不确定的。
 
dbgrid.Options:=dbgrid.Options-[dgEditing]
 
那要看你本次输入但已经提交的数据算不算旧数据了?
如果算的话就是说只能在新增的时候将dgEditing加到Options中。
如果不算还真不好办。除非有什么用做确认的标志。
也可以这么做,保存本次新增东东的主键列表。:)
 
可以使用bookmarks把新数据放入,如果不在表示中则不可删除
 
我想对于这个问题应该用两个表来解决,第一个表用来保存已录入的发票数据,
第二个表用来录入数据,每次录入成功提交后清空。这样你的问题应该好解决了。
 
怎样使用bookmark呢?
 
gunwithlove:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
应该用主细表。其中付款编号在主表,发票号码在细表,付款编号在主表中做主键,在
细表中做外键与其关联。。。。

关于bookmark用法:
可先选择要操作的记录,如在DBGRID中,用鼠标+Ctrl键选择多条记录(先将Options下的
dgMultiSelect设true),然后用GotoBookMark方法
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: Integer;
s: string;
begin
if DBGrid1.SelectedRows.Count>0 then
with DBGrid1.DataSource.DataSet do
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
GotoBookmark(pointer(DBGrid1.SelectedRows.Items));
//这里是对该记录的操作,比如删除。。。
end;
end;


 
post 之前在表中查询是否有相同的记录有就不保存进去!
 
多人接受答案了。
 
后退
顶部