CS结构,多人同时录入数据,怎么样才能使用生成的货号不重复呢(不要用自动ID,因为货号需要加入一些前置字母) CS结构,多人同时录入数据,怎么样才能使用生成的货号不重复呢(不要用自动ID,因为货号需要加入一些前置字母) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/jinjazz/archive/2004/09/27/118183.aspx 参考一下这个————————————————————————————————————————说明: 档案号的格式: 四位年+两位月+两位日+四位档案号 即: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 档案编号 = @NoENDEND 货号用random可能不大合适吧还是可以使用自动编号的..只不过你的货号不是自动编号而已货号这个字段的值可以使用前置字母+自动编号 回复人: goodloop(小志) ( ) 信誉:105 2004-11-11 18:34:00 得分: 0 货号用random可能不大合适吧还是可以使用自动编号的..只不过你的货号不是自动编号而已货号这个字段的值可以使用前置字母+自动编号 ==========================同意这个方法...... DebugXP(武林高手,系用公筷架~~~) 这个方法不错 不过,还有其它的方法{{==============================================================================//名称: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//当前编号之后用上面的方法 怎么连接SQL数据库 想吧 01 格式化为 字符串 '01'该怎么转? 向lpt1端口发送字符串,如何控制打印的字符串长度? 汉字 一个关于报表的问题 倒美帝国主义!把布什恶棍送上绞刑架!!!!!!!!!!!!!! 谁能把这个程序改成递归函数?高分求救! 怎么判断窗体已经创建? 离开两天,好象好多事情发生似的! 关于几个 dialog box 的问题 早上好,我的问题又来了,只剩十分,祝分十分健康 !!!!!!!看谁基础牢!!!!!!!!!!!
档案号的格式: 四位年+两位月+两位日+四位档案号
即: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
还是可以使用自动编号的..只不过你的货号不是自动编号而已
货号这个字段的值可以使用前置字母+自动编号
货号用random可能不大合适吧
还是可以使用自动编号的..只不过你的货号不是自动编号而已
货号这个字段的值可以使用前置字母+自动编号
==========================
同意这个方法......
//名称: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//当前编号之后用上面的方法