保存时灵异了,大伙帮我看看

jonathanbear 2012-02-07 10:31:16
问题比较简单,但是我脑袋被门板夹过了,不知道怎么弄了。
界面是一张内存表TMemTableEh,连一个DataSource,下带一个Dbgrid,然后一个新增和保存按钮,表字段3个String类型。
这时我点击新增,在dbgrid中输入输入一条后回车,点击保存。因为光标在第二行,我一般会对此行保存一下,这时
会保存一条空的记录。大家看我的代码


//这是保存时调用的函数
function Tfrmabc.DoSave: Integer;
begin
if BzWorkStatus=wsBrowse then //BzWorkStatus即为内存表的状态
begin
ShowMessage('浏览状态无法保存记录!');
exit;
end;
SetBzWorkStatus; //此事件判断一下如果状态为dsEdit或dsInsert时,保存最后一条记录
{代码大致为 if (Components[i] as TMemTableEh).State in [dsEdit, dsInsert] then
(Components[i] as TMemTableEh).Post;}
//后面就是一个检查字段不能为空,否则退出
sResult := CheckFieldValidity(cftNull,dataset,字段1,字段2,字段3);
if sResult<>'' then
begin
BzMessageBox('提示:','['+sResult+'] 不得为空!',DM_INFO);
exit;
end;
//最后就是一个xml的提交到后台数据库保存的过程 protocol事件
//代码略。。。
Protocol;

代码基本上是这样,我输入一行后回车,dbgrid光标会跳到第二行,这时我保存时SetBzWorkStatus事件就保存了,这时会将第二行一个空记录保存到内存表中,后面做检查时,当然是通不过的。这时我准备在BeforePost事件做,判断如果是一条空记录就DateSet.cancel;这时顺利保存了,但是灵异事件是前台dbgrid居然显示有两条同样的记录,我到数据库看了一下,确实只保存了一条记录。这是什么情况?前台的第二天记录还能编辑。。我晕倒了。在BeforePost中加入一个abort;这明显大家能看出来其他的记录也是没有保存到后台的,行不通。脑袋不清醒了,大伙给个意见,这个问题应该很常规呀。我只想不保存一条空的记录,什么方式实现比较好?在线等,不甚感激。。。
...全文
206 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jonathanbear 2012-02-07
  • 打赏
  • 举报
回复
我的这个BeforePost是DateSet中写的,这个是服务器的保存吗?一般Dbgrid换行的时候就会有一个Post的过程吧?这时dbgrid中输入的数据就会Post到内存表的。我跟踪了一下代码,在换行的时候也会有BeforePost的呀,我的后台是另外一个提交保存的过程,现在的内存表只是做为一个保存输入数据的控件。如果说控制的话,不知道有好的方法没?
babydog01 2012-02-07
  • 打赏
  • 举报
回复
BeforePost是保存至服务器,你看到的是内存表,虽然你没有保存到服务器,但你也未删除内存表的记录,也未将内存表与服务器的requery一下。所以你的内存表中仍是2条记录。
内存表中的数据和服务器中的数据是相对独立的,除非你执行了更改命令,它会将改动保存至服务器,虽然你上面的处理,不让它保存到服务器,但这并不影响内存表中的数据。
jonathanbear 2012-02-07
  • 打赏
  • 举报
回复
这里我补充一下:我看了一下内存表的recordcount,虽然只输入了一行数据,另一行为空,即使在BeforePost中调用Cancel后,仍然为2,我的保存机制有几种,如果改为dmall,就是整表更新的话,这时数据库中就保存2条同样的记录了。但是明明我只输入一条,另一条是空的,我就不明白另一条记录的内容是怎么来的。这个也太奇怪了
babydog01 2012-02-07
  • 打赏
  • 举报
回复
感觉还是数据刷新的问题。内存表中的数据没有和服务器的数据同步。
浏览可用内存表,如果是编辑尽量不要用内存表,很麻烦的。
babydog01 2012-02-07
  • 打赏
  • 举报
回复
我就是像如果是其他的数据元件,保存时,当你换行后,保存时,会退回到上一行,这步操作是怎么实现的,有什么好的方法吗?
这个还是不要改的好,你可以增两个按扭(保存、取消,这两个按扭的enabled:=(MemTableEh1.State in [dsEdit, dsInsert]),初始为false,这样只要数据被改动,它俩就会显示),如果只是单一的需要保存时,按下这两个即可,如果是想保存并移动至下一行,就会自动保存。
jonathanbear 2012-02-07
  • 打赏
  • 举报
回复
对的,内存表的主键我会从服务器里做回写的动作
MemTableEh1.ApplyUpdates(0);
WriteBackID(MemTableEh1);//回写ID
就是上面出的问题有点想不通,看来只能保存后,重新从数据库重读一遍。我就是像如果是其他的数据元件,保存时,当你换行后,保存时,会退回到上一行,这步操作是怎么实现的,有什么好的方法吗?感谢你的回复
babydog01 2012-02-07
  • 打赏
  • 举报
回复
Self.MemTableEh1.ApplyUpdates()

不是dbgrid换行会产生post动作,是表的记录移动会产生post动作也就是afterstroll。
如果是只是显示用内存表,如果是编辑不要用内存表,还会产生很多问题如:新增记录主键的问题等等。

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧