table 结构
dm varchar(8),dmmc varchar(40),sl numeric(13,2)
在DBGRIDEH中录入时怎么才能实现这样的功能
当录入重复的DM时马上进行提示,而非执行TABLE.POST时才进行提示

解决方案 »

  1.   

    奇怪的要求.
    三个字段,只有全输入后,还要等光标/输入点离开后DBGridEn后才能判断.
    这和POST前后差不多了.
      

  2.   

    可以在与DBGridEH相关联的Table/Query控件的OnPostError事件中写代码啊!  ShowMessage('编号重复了!');
      Action:=daAbort;
      

  3.   

    我的TABLE的LOCKTYPE设置为ltBatchOptimistic
    数据写入是UpdateBatch(arAll)来写的,当换行时是不写入数据库的,而且我要录入几十行数据,如果有重复的数据检查起来十分麻烦。
      

  4.   

    procedure TFormJhys.DBGridEh1ColExit(Sender: TObject);
    var
      t_DM:string;
    begin
       if DBGridEh1.selectedindex =0 then
           begin
             t_DM:=trim(DBGridEh1.SelectedField.Text);
             FindBmplu(t_DM);//测试DM是否重复的过程      end;
    end;
      

  5.   

    楼上的同志,我现在最根本的问题就是如你所说的“FindBmplu(t_DM);//测试DM是否重复的过程”这个过程该如何写!!
      

  6.   

    这个比较麻烦,1,因为你首先要检查数据库原来的数据,
    2,又要检查你刚才已经输入的(比如已经输入了10条),
    你如果静态绑定了字段在adoquery里面的话,可以在字段的onchange事件里面检查,但检查仅限于1,2还是不好检查的,因为在输入的过程中你不能把光标移开,所以可以考虑每一条输入完成保存(非提交)后,把缓冲区的这个dm字段的值放到一个stringlist里面,呵呵
      

  7.   

    把DM值放到STRINGLIST是一个可行的办法,然后在下一个录入时查找STRINGLIST,大伙还有没有什么更合理的办法?
      

  8.   

    放到STRINGLIST如果有多主键,处理起来就比较麻烦了.还要处理字符串,其实你可以开一个N维数组或CLIENTDATASET放这些信息,在POST前查询,如果记录数>1,如果已有就重复了.
      

  9.   

    我的一般做法是,输入数据时,不用DBGridEH直接关联目标表,而使用临时表,而临时表则用内存表(如 TClientDataSet,但我一般用odac中的TVirtualTable),当数据输入结束要提交时,再用sql判数据是否符合要求后插入目标表
      

  10.   

    我完全明白,可能是我没说清楚
    我上面说过,在提交时,用sql判数据是否符合要求后插入目标表(输入的数据在临时表中),也就是说先用select  * from table where id=xxx按关键字先在表中查一下数据是否存在重复,如果不重复,再用insert into table插入数据