CS结构,多人同时录入数据,怎么样才能使用生成的货号不重复呢(不要用自动ID,因为货号需要加入一些前置字母)

解决方案 »

  1.   

    http://blog.csdn.net/jinjazz/archive/2004/09/27/118183.aspx
      

  2.   

    参考一下这个————————————————————————————————————————说明:
           档案号的格式: 四位年+两位月+两位日+四位档案号
                    即:200202260001       档案编号表:记录当前最新的档案编号,只有一个记录.为了防止记录 出现重复的情况.
    CREATE PROCEDURE prGetNo --产生按年月日排列的档案号
        @No varchar(12) output ---为产生的档案号
    AS 
    declare @Year Int,
            @Month int,
            @Day int,
            @Temp_No varchar(12),
            @NeedNo varchar(4) --档案号
    BEGIN
      select @year=Year(GetDate())
      select @Month=Month(GetDate())
      select @Day=Day(GetDate())
      select @No=Str(@Year,4,0)+
                    (select
                     case
                      when @Month>=10 then Str(@Month,2,0)
                      when @Month<10 Then '0'+Str(@Month,1,0)
                    end)+
                    (select
                     case
                      when @Day>=10 then Str(@Day,2,0)
                      when @Day<10 Then '0'+Str(@Day,1,0)
                     end)
      SELECT @Temp_No = 档案编号 FROM 档案编号表
         IF @No <> SUBSTRING( @Temp_No,1,8)
         SELECT @No = @No+'0001'
      ELSE
       BEGIN
         SELECT @RandNo = STR(CONVERT(int,(SUBSTRING( @Temp_No ,9,4))+1),4,0)
         SELECT @RandNo = REPLACE( @RandNo,' ','0')
         SELECT @No = @No + @RandNo
       END
      UPDATE 档案编号表
             SET 档案编号 = @No
    END
    END
      

  3.   

    货号用random可能不大合适吧
    还是可以使用自动编号的..只不过你的货号不是自动编号而已
    货号这个字段的值可以使用前置字母+自动编号
      

  4.   

    回复人: goodloop(小志) ( ) 信誉:105  2004-11-11 18:34:00  得分: 0  
     
     
       货号用random可能不大合适吧
    还是可以使用自动编号的..只不过你的货号不是自动编号而已
    货号这个字段的值可以使用前置字母+自动编号
      
     
    ==========================
    同意这个方法......
      

  5.   

    DebugXP(武林高手,系用公筷架~~~) 这个方法不错
      

  6.   

    不过,还有其它的方法{{==============================================================================
    //名称:getNewPrimeKey
    //功能描述:得到物资数据库表strEntityName对应有表下一个主键值,并返回客户端
    //实现方法:
    //输入参数:strEntityName:实体表名
    //
    //输出参数:
    //          返回的主键值
    }function TMaterialServer.getNewPrimeKey(
      const strEntityName: WideString): WideString;
    const
      strSelectSQL = 'SELECT * FROM TABLEIDPROVIDER where tableid=''%s''';
      strInsertSQL = 'INSERT INTO TABLEIDPROVIDER(Tableid,maxid,minid,currentdate,currentid)Values(''%s'',1000,1,''%s'',1)';
      strUpdateSQL = 'UPDATE TABLEIDPROVIDER SET currentdate=''%s'',currentid=currentid+%d where tableid=''%s''';
    var
      adoDs: TAdoDataSet;
      strSQL: string;
      strDate: string;
      strResult: string;
      iCurrentID: integer;
    begin
      Result := '-1';
      strDate := FormatDatetime('YYYY-mm-DD', now());
      Connection.BeginTrans;
      try
        adoDs := TAdoDataSet.Create(nil);
        adoDs.Connection := Connection;
        strSQL := Format(strSelectSQL, [strEntityName]);
        adoDS.CommandText := strSQL;
        adoDs.Open;
        if adoDS.Eof and adoDS.Bof then
        begin
          strResult := FormatDatetime('YYMMDD', now) + '0001';
          strSQL := Format(strInsertSQL, [strEntityName, strDate]);
        end
        else
        begin
          iCurrentID := adoDs.fieldbyname('Currentid').AsInteger;
          if adoDs.FieldByName('CurrentDate').AsDateTime = date then
          begin
            strResult := '0000' + inttostr(ICurrentid + 1);
            strResult := copy(strResult, length(strResult) - 3, 4);
            strResult := FormatDatetime('YYMMDD', now) + strResult;
            strSQL := format(strUpdateSQL, [strDate, 1, strEntityName]);
          end
          else
          begin
            strResult := FormatDatetime('YYMMDD', now) + '0001';
            strSQL := format(strUpdateSQL, [strDate, 1 - iCurrentid, strEntityName]);
          end;    end;
        Connection.Execute(strSQL, iCurrentid, []);
        freeandnil(adoDs);
         //得到下一主键值
        result := strResult;
        Connection.CommitTrans;
      except
        if Assigned(AdoDS) then Freeandnil(AdoDS);
        if Connection.InTransaction then Connection.RollbackTrans;
        raise Exception.Create('服务器得到主键值出错,请与系统管理员联系!')  end;这是我的思路是在数据库上建一表
    结构如下:
    Tableid, //表编号
    currentid//当前编号之后用上面的方法