在DBGrid中,我就不信找不到解决它的办法 ---------(100分)

  • 主题发起人 主题发起人 jettop
  • 开始时间 开始时间
J

jettop

Unregistered / Unconfirmed
GUEST, unregistred user!
Q1:
我用ADOConnection+ADOquery+DataSetProvider构成COM+
客户端用 SocketConnection+ClientDataSet+DataSource访问 ,这一切都 是没问题的
问题:
我在DBgrid中录入数据时,我想检查它的录入正确性时,有一个问题不知怎样做?
如我有一字段为A,我要A不能有重复(用户录入时就要检查),或FieldChange时检查它是否与
已录入的数据中有重复,(注,我不想让数据提交后让DB去检查),同时我不想用纯环每条记录
这样去检查,因为用户的录入焦点仍在DBGrid 中。
概括去讲,这是一个简单的ClientDataSet或DBGrid 的使用技巧问题。请众友帮忙看一下。[:)]
Q2:
同上机制下,后台用MS SQL2000 前端是D7
我用ADO+ADOQuery 连接后台CHAR型数据时,DBEedit 感知后,不会截断字段中多余的空格。
用BDE 连接同样是CHAR型数据, 就能截断多余空格。就与读varchar类型是一致的。
我认为是ADO的问题,但就想不通如何搞掂她??[:(!]

 
第一个问题,我认为无解,可以在Cds上定义唯一索引,但错误是英文的
第二个问题
TField.FixedChar和Clientdataset.DiableStringTrim
的属性试一下,
 
第一个问题 你可以先把关键字段所有的值放到一个变量中,每输入一个关键值在变量中找
(这就避免在表中寻找),合法值继续加入到变量中
KeyStr:='001,002,003,004...';
每输入一个值
if Pos(Table1.FieldByName('DbGrid1.SelectedField.FieldName).asString,KeyStr)>0 then
......
 
无解的问题会解的人来了
1.clientDataSet里的所有关键字段.ProviderFlags=[pfInUpdate,pfInWhere,pfInKey]
2.
procedure TfrmEmp.EmpclientDataSetPostError(DataSet: TDataSet;
E: EDatabaseError;
var Action: TDataAction);
begin
//raised exception class EDBClient with message 'Key violation.'. ErrorCode = 9729;
if (E as EDBClient).ErrorCode= 9729 then
begin
Application.MessageBox('工号重复,请重新输入!','系统提示' ,MB_ICONEXCLAMATION+MB_OK );
DtlGrid.SelectedField :=EmpclientDataSetEmpNo;
Abort;
end;
end;
还有一笨方法是我以前用的:
Function KeyVol(DataSet:TDataSet;SKeyField:String):boolean;
Var
DataSet1 : TClientDataSet;
begin
Result := False;
DataSet1 := TClientDataSet.Create(Application);
Try
DataSet1.CloneCursor(TClientDataSet(DataSet),True);
With DataSet1do
begin
//现在在这里写循环也罢写其它也罢,总之有办法判断重复还不会动原来的光标
end;
Finally
DataSet1.Free;
end;
end;

 
第一个问题:
另外加一个Query查询编号。然后用个函数调用,判断是否重复
 
我来吧:
保存时处理
cdsidx。IndexFieldNames := '需要验证的数据’字段名';
cdsidx。Refresh;
if cds.state = dsinsert then
//注意这个是操作的cds
begin
if cdsidx.FindKey(‘需要验证的数据’) then
begin
application.MessageBox('编码已重复', '系统', mb_iconinformation + mb_defbutton1);
//自己处理
exit;
end;
end;
效率高的。
 
自己写一个过程,写入数据库的时候调用一下
 
后退
顶部