起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 179|回复: 9

【搞定】BeforeCommit的使用提问**

[复制链接]
发表于 2007-7-15 16:46:57 | 显示全部楼层 |阅读模式
我在在数据集中写了相关的代码,我查了论坛上相关的一个帖子,发现它好像是在窗体上,因为是看到procedure TMainForm.DataSetBroker1BeforePost(DataSet: TDataSet);

我把代码放在数据集上,录入时如果有多条记录,只要最后一条符合要求,就能保存成功,否则就会有错误提示。请问如何让代码检查所有没有的数据。
另外,使用BeforePost,FocusControl是可以对应到响应到错误的字段,但是用BeforeCommit则不能。

PIECE_NUM:String;
begin
//检查批号
     PIECE_NUM:=DataSet.FieldByName('PIECE_NUM').AsString;
     if StringUtils.Copy(PIECE_NUM,0,1) <> '0' then
     begin
          Dialogs.ShowMessage('批号第一个数字必须为0,请修改!');
          DataSetSALES_RECORD_IMPORT_DT.FieldByName('PIECE_NUM').FocusControl;
          SysUtils.Abort;
     end;
回复

使用道具 举报

 楼主| 发表于 2007-7-15 17:16:54 | 显示全部楼层
上面说错,我试了一下,是我鼠标选中符合的那条然后点保存,其他不符合也都能保存
回复 支持 反对

使用道具 举报

发表于 2007-7-16 08:51:55 | 显示全部楼层
可以在数据集的BeforeApplyUpdate事件中,用一个循环来判断每一条记录是否符合业务规则。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-16 10:44:57 | 显示全部楼层
代码没接触过,目前能看懂和效仿一些,怎么循环可否大致写一下,谢谢!
回复 支持 反对

使用道具 举报

发表于 2007-7-16 11:57:59 | 显示全部楼层
procedure TDDSQB.DataSetDDBBeforeApplyUpdates(Sender: TObject; var OwnerData: object);
var
  currentNo: integer;
begin
  currentNo := DataSetDDB.RecNo;
  DataSetDDB.First;
  while not DataSetDDB.Eof do
    begin
      if DataSetDDB.FieldByName('PIECE_NUM').AsInteger <> 0 then
        SysUtils.Abort;
      DataSetDDB.Next;
    end;
  DataSetDDB.RecNo := currentNo;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-19 00:41:05 | 显示全部楼层
按你说的做了,但是效果有点怪异,我加了个Dialogs.ShowMessage,用鼠标点了不合规定的单元格按保存,会出提示,当我把所有记录都改成都符合,还是不能保存,也不提示了。
回复 支持 反对

使用道具 举报

发表于 2007-7-19 15:50:45 | 显示全部楼层
看看你怎么做的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-30 16:07:43 | 显示全部楼层
这些天对代码有多点认识,基本上已经搞定了。但是有个问题是FocusControl对不上,例如第二行不符合,我把鼠标放在其他列,按了保存后,焦点跳到这一列的第二行,但不是跳到第二行的'PIECE_NUM'列上。

var
PIECE_NUM : String;

begin
     DataSetSALES_RECORD_INPUT_DTS.First;
  while not DataSetSALES_RECORD_INPUT_DTS.Eof do
  begin
       PIECE_NUM :=DataSetSALES_RECORD_INPUT_DTS.FieldByName('PIECE_NUM').AsString;
       if (PIECE_NUM.Length <> 6) OR (Variants.VarToStr(StringUtils.Copy(PIECE_NUM,0,1))<>'0') then
       begin
            DataSetSALES_RECORD_INPUT_DTS.FieldByName('PIECE_NUM').FocusControl;
            Dialogs.ShowMessage('批号第一个数字必须为0,且必须6位,请修改!');
            SysUtils.Abort;
       end;
    DataSetSALES_RECORD_INPUT_DTS.Next;
  end;
end;
回复 支持 反对

使用道具 举报

发表于 2007-8-1 15:00:18 | 显示全部楼层
但不是跳到第二行的'PIECE_NUM'列上。

DataSetSALES_RECORD_INPUT_DTS.FieldByName('PIECE_NUM').FocusControl;
这个很奇怪,你用代码跟一下,执行这句代码了吗?
'PIECE_NUM'字段是什么类型的字段?自定义的?计算字段?
回复 支持 反对

使用道具 举报

发表于 2007-8-6 17:51:38 | 显示全部楼层
由于长时间没有反馈,先结贴了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-13 14:27 , Processed in 0.042399 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表