用DBGRID做录入,请问怎样避免关键字的重复输入?

解决方案 »

  1.   

    在录入的before事件中检查,以避免重复。(不一定合你意)
      

  2.   

    做两个Table,保存时用另一个查找有没有此值,没有则插入。
      

  3.   

    再用一个查询(Query),在提交前检查
      

  4.   

    在关建字段的OnCellExit中用另一个Query判断,不太难吧,要不要源码?
      

  5.   

    在提交前beforepost里写查找与当前关键字是否有相同的值,,
      

  6.   

    主键也是个很好的办法比如access主键自动增值,
      

  7.   

    在posterror事件根据错误代码判断是否主键重复
     adoerrors:=ADOC_boss.Errors;
     for i:=0 to adoerrors.count-1 do
     begin
         adoerror:=adoerrors.item[i];
         if adoerror.nativeerror=2627 then
            //已经存在
         
     end;
      

  8.   

    面向中国用户的增强型 DBGrid 和 DBLookupComboBox。详情请访问:
    http://www.nicesoft.net特性 
     
    中国财务凭证式的金额显示。各显示位之间的分隔线颜色可自行定义,并可在标题行上显示“...万千百十个角分”!!! 1. 支持多种方式的合计行。支持合计、平均、计数、文本等方式的合计行。中国财务凭证式的金额显示在合计行上同样适用。合计行的颜色可自行定义!!! 
    2. 可在 Grid 的各列上嵌入任意控件来代替默认编辑器,例如可在布尔型字段的列上嵌入 DBCheckBox,在一只读或计算字段的列上嵌入 DBEdit!!! 
    3. 支持交替式的行颜色显示。奇数行和偶数行可定义不同的颜色 
    4. 自适应宽度。Grid 中的各列的宽度随 Grid 宽度的改变可自行调整宽度,使其始终填充整个 Grid 客户区域 
    5. 回车键转换为制表键。可将回车键当作制表键来处理,使用户敲回车键时自动转入下一列或行,输入数据更快速方便 
    6. 结合 TQLQRDBGridBuilder 自动生成 QuickReport 报表,省去手工制作报表的麻烦!!! 
    7. 结合 TQLDBLookupComboBox 实现输入内容按拼音码查找(如同速达 E2 中的品名输入方式),而不必在大量的产品目录中来回查找或强迫用户记忆大量的产品代码!!! 
    8. 继承自标准的 TDBGrid,使用 TDBGrid 或其子类开发的现有程序可实现平滑升级 更多强大的特性.... 
     
    详情请访问:
    http://www.nicesoft.net
      

  9.   

    鎺у埗鏁版嵁搴撳叧閿瓧鐨勯噸澶嶈緭鍏?
    璧栫珛璋?
    [璇蜂綔鑰呭拰鎴戜滑鑱旂郴] 
    ---- 鍦―elphi涓悜鏁版嵁搴撴坊鍔犻噸澶嶇殑鍏抽敭瀛楁槸寮傚父澶勭悊鐨勪竴閮ㄥ垎銆傚叿浣撶殑瑙e喅鏂规硶鏄娇浣犵殑绋嬪簭鑳藉瀵瑰紓甯稿搷搴斻€?---- 鎴戜滑涓句竴涓畝鍗曠殑渚嬪瓙鏉ヨ鏄庛€備负浜嗘柟渚挎垜浠氨浣跨敤Delphi鑷甫鐨勬暟鎹簱DBDEMOS锛屽畠鏄疨aradox鍨嬬殑鏁版嵁搴擄紝鍏朵腑琛╡mployee.db鍏锋湁鍏抽敭瀛桬mpNo銆?---- Table1鐨凞ataBaseName鏄疍BDEMOS 锛孴ableName鏄痚mployee.db锛孉ctive璁句负True銆侱ataSource1鐨凞ataSet鏄疶able1銆侱BNavigator1鍜孌BGrid1鐨凞ataSource鏄疍ataSource1銆?---- 涓嬮潰鎴戜滑灏辫鍐橳able鐨凮nPostError浜嬩欢锛氬綋鍑虹幇閲嶅鐨勫叧閿瓧鏃讹紝棣栧厛瑕佹彁绀虹敤鎴凤紝鐒跺悗鍙栨秷姝ゆ鎿嶄綔銆傝繖涓簨浠舵槸鍦ㄤ慨鏀规垨鍚戞暟鎹簱鎻掑叆璁板綍鏃朵骇鐢熷紓甯告椂鎵嶅搷搴旂殑銆傚叿浣撲唬鐮佸涓嬶細 procedure TForm1.Table1PostError
    (DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
      begin
        if (E is EDBEngineError) then
    if (E as EDBEngineError).Errors
    [0].Errorcode = eKeyViol then
        begin
          MessageDlg('鍑虹幇閲嶅璁板綍锛?,
     mtWarning, [mbOK], 0);
          Table1.Cancel;
          Abort;
        end;
    end;---- 璇存槑锛?
    ---- 1. 閫氳繃EDBEngineError寮傚父鍙互鑾峰緱鎻忚堪鏁版嵁搴撻┍鍔ㄩ敊璇殑璇︾粏淇℃伅銆傚綋EDBEngineError寮傚父浜х敓鏃讹紝灏变細鐢熸垚涓€涓狤DBEngineError瀵硅薄锛岃繖涓狤DBEngineError瀵硅薄鍖呭惈鏈夊紓甯哥殑閿欒淇℃伅锛屽彲浠ョ敤绋嬪簭杩涜鍒嗘瀽锛屼粠鑰屽喅瀹氳瀹屾垚鐨勬搷浣溿€?---- 2. 涓婇潰绋嬪簭鐨凟rrorcode鏄疊DE鐨勯敊璇唬鐮侊紝鏄竴涓獁ord绫诲瀷鐨勫彉閲忥紝鎴戜滑杩橀渶瑕佸畾涔夊畠锛屽畾涔夊涓嬶細   const
      eKeyViol = 9729;---- 3. 姝ょ▼搴忚繍琛屾椂锛孌elphi鐨勯敊璇俊鎭彁绀轰細鍦ㄤ綘鐨勫紓甯稿搷搴斾箣鍓嶃€傛墍浠ュ湪Delphi鐨処DE鐜涓繍琛岃繖涓▼搴忔椂锛屼綘灏嗗厛鐪嬪埌Delphi鐨勯敊璇俊鎭彁绀猴紝绋嬪簭涓柇鎵ц锛岃繖骞朵笉鏄鏄庝綘鐨勭▼搴忔湁閿欒锛屾鏃跺啀鎸塅9锛岀户缁墽琛岋紝鎵嶄細鐪嬪埌浣犵殑寮傚父鍝嶅簲锛屼篃灏辨槸浣犺嚜宸辩殑閿欒淇℃伅鎻愮ず銆備笉杩囧鏋滀綘鐩存帴鎵цexe鏂囦欢灏变笉浼氭湁杩欎簺闂浜嗐€傛绋嬪簭鍦―elphi4.0銆乄indows95鐜涓嬭繍琛岄€氳繃銆?
      

  10.   

    控制数据库关键字的重复输入 
    赖立谦 
    [请作者和我们联系] 
    ---- 在Delphi中向数据库添加重复的关键字是异常处理的一部分。具体的解决方法是使你的程序能够对异常响应。 ---- 我们举一个简单的例子来说明。为了方便我们就使用Delphi自带的数据库DBDEMOS,它是Paradox型的数据库,其中表employee.db具有关键字EmpNo。 ---- Table1的DataBaseName是DBDEMOS ,TableName是employee.db,Active设为True。DataSource1的DataSet是Table1。DBNavigator1和DBGrid1的DataSource是DataSource1。 ---- 下面我们就要写Table的OnPostError事件:当出现重复的关键字时,首先要提示用户,然后取消此次操作。这个事件是在修改或向数据库插入记录时产生异常时才响应的。具体代码如下: procedure TForm1.Table1PostError
    (DataSet: TDataSet; E: EDatabaseError;
      var Action: TDataAction);
      begin
        if (E is EDBEngineError) then
    if (E as EDBEngineError).Errors
    [0].Errorcode = eKeyViol then
        begin
          MessageDlg('出现重复记录!',
     mtWarning, [mbOK], 0);
          Table1.Cancel;
          Abort;
        end;
    end;---- 说明: 
    ---- 1. 通过EDBEngineError异常可以获得描述数据库驱动错误的详细信息。当EDBEngineError异常产生时,就会生成一个EDBEngineError对象,这个EDBEngineError对象包含有异常的错误信息,可以用程序进行分析,从而决定要完成的操作。 ---- 2. 上面程序的Errorcode是BDE的错误代码,是一个word类型的变量,我们还需要定义它,定义如下:   const
      eKeyViol = 9729;---- 3. 此程序运行时,Delphi的错误信息提示会在你的异常响应之前。所以在Delphi的IDE环境中运行这个程序时,你将先看到Delphi的错误信息提示,程序中断执行,这并不是说明你的程序有错误,此时再按F9,继续执行,才会看到你的异常响应,也就是你自己的错误信息提示。不过如果你直接执行exe文件就不会有这些问题了。此程序在Delphi4.0、Windows95环境下运行通过。
      

  11.   

    你在关键字的Change事件里判断就行啦
      

  12.   

    在三层架构中,用TclientDataSet时ApplyUpdates时批次提交时,是捕捉不到错误的,请问要如何处理?
      

  13.   

    可以的,当ApplyUpdates<>0时就出错