比如有一张学生表:
 字段主要是 :学号,姓名,年龄,班级;
这里设置 学号,姓名 为非空字段; 使用 DbEditNO,DbEditName,DbEditAge,DbEditClass 和 数据集AdoTable1关联 
我现在想实现这样的功能:
因为学号,姓名 不能为空,
所有在 AdoTable.post 之前, 如果 DbEditNO或DbEditName的值为空,那么就提示哪个
字段为空,从而不让AdoTable.post 执行;而且鼠标光点最好能自动定位到那个为空的数据感应控件上。当让,要实现以上功能,可以通过这样的判断实现:
 if DbEditNO.text='' then
 begin
    shommessage('学号不能为空');
    DbEditNO.setFocus;
    exit;
  end;
 if DbEditName.text='' then
 begin
    shommessage('姓名不能为空');
   DbEditName.setFocus;
    exit;
  end;
  adoTable.post;上面这种方法是最原始的写法,很费时间;最关键的是 这种做法不通用;如果有10张类似这样的基本信息维护处理;就要写10次不同的判断;
而且万一以后我们把“年龄”字段也认为不能为空,
那么就又要写上:
 if DbEditAge.text='' then
 begin
    shommessage('年龄不能为空');
    DbEditAge.setFocus;
    exit;
  end;
通用性很差;能否写一个通用的函数,自动识别出表里的非空字段,并作提示, 保存前,调用这个函数
就行了;
  比如:  function  CheckTableIsNull(dataSet:TAdoSet):TFields;
        dataSet--表示关联的表的数据集;
       如果检测到当前的数据集的纪录中那些不能为空的纪录出现为空情况时,返回那些为空的字段;这个函数一般在保存前使用,如果返回的字段为空,说明 该添的字段值都填好了,
如果返回了几个字段值,比如上面的“学号”、“名称”等,那么我们就做提示;当然,这个函数需要和数据库里表的属性结合起来考虑,而且不同的数据库,可能写出的函数都不一样,我目前使用的是oracle 9;
 
 我想,上面我提到的这个问题,应该是广大开发人员在实践过程中常遇到的。希望大家能够就此作深入的讨论。

解决方案 »

  1.   

    if  dataSet.fieldvalues['学号']=null then
      

  2.   


     if (DbEditName.text='') or (DbEditName.text=null) then
     begin
        shommessage('姓名不能为空');
        DbEditName.setFocus;
        exit;
     end;
      

  3.   

    1)DBEdit要按一定的规则命名,和数据集的字段关联起来,比如 Name -》DBEditName
    2)
       for i:=0 to myDataSet.FieldCount - 1 do
         if myDataSet.Fields[i].IsNull then
         begin
           if Self.FindComponent('DBEdit'+myDataSet.Fields[i].FieldName)<>nil then
                        TDBEdit(Self.FindComponent('DBEdit'+myDataSet.Fields[i].FieldName)).SetFocus;
           shommessage(myDataSet.Fields[i].FieldName+'不能为空');
           Break;
         end;上面的程序比较粗糙,没有实际测试过,随手写的,仅供参考
      

  4.   

    xxmmmx(踢踏)的应该可以,大体思想就这了,不过楼主要判断具体哪个字段肯定需要特别指定,不可能通用的
      

  5.   

    一、函数:
    function TForm1.IsEmpty(FieldsStr: string; CurrDataset: TADODataset): Boolean;
    var
      i:integer;
      tmpField:string;
    begin
      Result:=True;
      For i:=1 to Length(FieldsStr) do
        begin
        if FieldsStr[i] <> ';' then
          tmpField:=tmpField+FieldsStr[i]
        else
          begin
          if trim(CurrDataset.FieldByName(tmpField).AsString) = '' then
            begin
            Showmessage(tmpField+' 字段不能为空!');
            Result:=false;
            exit;
            end;
          tmpField:='';
          end;
        end;
    end;二、调用:
      if IsEmpty('no;name;age',ADODataSet1) then ADODataSet1.Post;