保存时灵异了,大伙帮小弟我看看
保存时灵异了,大伙帮我看看
问题比较简单,但是我脑袋被门板夹过了,不知道怎么弄了。
界面是一张内存表TMemTableEh,连一个DataSource,下带一个Dbgrid,然后一个新增和保存按钮,表字段3个String类型。
这时我点击新增,在dbgrid中输入输入一条后回车,点击保存。因为光标在第二行,我一般会对此行保存一下,这时
会保存一条空的记录。大家看我的代码
代码基本上是这样,我输入一行后回车,dbgrid光标会跳到第二行,这时我保存时SetBzWorkStatus事件就保存了,这时会将第二行一个空记录保存到内存表中,后面做检查时,当然是通不过的。这时我准备在BeforePost事件做,判断如果是一条空记录就DateSet.cancel;这时顺利保存了,但是灵异事件是前台dbgrid居然显示有两条同样的记录,我到数据库看了一下,确实只保存了一条记录。这是什么情况?前台的第二天记录还能编辑。。我晕倒了。在BeforePost中加入一个abort;这明显大家能看出来其他的记录也是没有保存到后台的,行不通。脑袋不清醒了,大伙给个意见,这个问题应该很常规呀。我只想不保存一条空的记录,什么方式实现比较好?在线等,不甚感激。。。
------解决方案--------------------
感觉还是数据刷新的问题。内存表中的数据没有和服务器的数据同步。
浏览可用内存表,如果是编辑尽量不要用内存表,很麻烦的。
问题比较简单,但是我脑袋被门板夹过了,不知道怎么弄了。
界面是一张内存表TMemTableEh,连一个DataSource,下带一个Dbgrid,然后一个新增和保存按钮,表字段3个String类型。
这时我点击新增,在dbgrid中输入输入一条后回车,点击保存。因为光标在第二行,我一般会对此行保存一下,这时
会保存一条空的记录。大家看我的代码
- Delphi(Pascal) code
//这是保存时调用的函数 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;这明显大家能看出来其他的记录也是没有保存到后台的,行不通。脑袋不清醒了,大伙给个意见,这个问题应该很常规呀。我只想不保存一条空的记录,什么方式实现比较好?在线等,不甚感激。。。
------解决方案--------------------
感觉还是数据刷新的问题。内存表中的数据没有和服务器的数据同步。
浏览可用内存表,如果是编辑尽量不要用内存表,很麻烦的。