本人初学遇到如下问题,请各位高手鼎立帮忙!不胜感激!delphi+sql      我做一个进销存的 进货单。进货单分为主表、明细表。现在在添加明细的时候,现要建一临时表,保证临时表内无重复现象。但不会建临时表,也不知怎么处理,各位有没有更好办法解决。      主表(jh_master(dh单号(主键),ghs供货商,jhdate进货日期))
     明细表(jh_detail(dh单号(主键),spno商品编号(主键),qty数量))现在进入页面先添入主表信息后,在添加多条明细,采用adoquery.append添加。但因为我的dbgrid设置的不自动存入数据库,所以必须等到保存时才adoquery.updatebatch保存。为了防止同一单据内商品编号不能重复。我要怎么处理。注意。adoquery.append时数据并没有存入数据库,所以不能查重复。所一想到建临时表,但我不会建。怎么处理呀!

解决方案 »

  1.   

    在生成编号的方式上想办法;
    不到事实表中去判断,而到专门存储当前编号中去判断;
    例如:你可以单独在一个表t1中存储表的当前最大编号;然后在给个事件触发存储过程生成新的商品编号;
    fx:
    表t1中内容;
    f1             f2
    商品编号       sp000001
    客户编号       kh000001
    create procedure createNewID
    @f1 varchar(20),
    @ReturnID varchar(20)
    asdeclare 
      @NewID varchar(20),
      @CurrID varchar(20)
    --获取当前编号
      select @CurrID = f2 from t1 where f1 = @f1
    --得到当前编号
      set @newID = convert(varchar(20),convert(int,right(@currid,6)))
      set @ReturnID = left(@Currid,8-len(@Newid))+@Newid
    go
    --测试结果
    declare 
      @Newid varchar(20)
    exec createNewID '商品编号', @NewID output
    print @Newid
      

  2.   

    不好意思;上面忘记一句将当前id更新回编号存储表中的语句;
    完整代码应该是:
    create procedure createNewID
    @f1 varchar(20),
    @ReturnID varchar(20)
    asdeclare
    @NewID varchar(20),
    @CurrID varchar(20)
    --获取当前编号
    select @CurrID = f2 from t1 where f1 = @f1
    --得到当前编号
    set @newID = convert(varchar(20),convert(int,right(@currid,6)))
    set @ReturnID = left(@Currid,8-len(@Newid))+@Newid
    --更新当前最新编号
    update t1 set f2 = @ReturnID where f1 = @f1
    go
      

  3.   

    create table #T(id int,...)
    带个"#",就是临时表了。