在SQL Server 中可以用如下的SQL语句实现:SELECT MAX(CONVERT(int, SUBSTRING(入库单号字段名, 3, 9))) AS maxrkdh FROM tb1
pilicat(delphi迷) : 是否要限定日期,因为日期不同,最大值也不同。
Oracle有一个Dual表可以实现序列的自动累加! Create sequence aaa increment by 1 start with 1;--创建一个序列 Select aaa.Nextval from Dual;--下一个值 Select aaa.Currval from Dual;--当前值
var MaxBH, AYear, AMonth,fieldBh,firstA,maincode: String; i: Integer; begin AYear := DateToStr(DmDcom.SysDate); //2003-08-07 Delete(AYear, 5, 6); //2003 AMonth := MidStr(DateToStr(SysDate),6,2); // 08 if MidStr(AMonth,2,1) = '-' then begin AMonth := '0' + AMonth ; AMonth := MidStr(AMonth,1,2); //08 end; firstA:='RK'; maincode:= firstA+UserName+AYear+AMonth; with DataSet do begin Close; CommandText := 'Select MAX('RKDBH') maxbh From '+tablename +' Where RKDBH Like ''' + FirstA + UserName + '%''' +'and SUBSTR(RKDBH,8,4)='+chr(39)+AYear +chr(39) +'and SUBSTR(RKDBH,12,2)='+chr(39)+AMonth +chr(39) +'and length(RKDBH)=16 '; Open; MaxBH := FindField('maxbh').AsString; close; end; delete(MaxBH, 1, Length(MaxBH)-3); try if MaxBH = '' then begin result := maincode+'001'; exit; end;
MaxBH := IntToStr(StrToInt(MaxBH) + 1); if Length(MaxBH) < 3 then For i := 1 to 3 - Length(MaxBH) do MaxBH := '0' + MaxBH; //补零 Result := FirstA + UserName + AYear+ AMonth + MaxBH; except Application.MessageBox('单据编号生成数据错误', '错误', MB_OK); Result := 'ERROR'; Exit; end;
以上的方法解决不了多人同时并发的问题。 具体的方法看你用的是什么数据库。 如果是 ORACLE ,你可以建一个序列对象的字段,由 ORACLE 自己来控制单号的递增。-- Create sequence create sequence inc_field minvalue 1 maxvalue 999999 start with 1 increment by 1 cache 20; 以后你可以用 inc_field 来控制; 如下所示在 INSERT INTO 时:CREATE TABLE MYTEST(ID NUMBER,NAME VARCHAR(8));insert into mytest values(Inc_field.Nextval, 'ddggd');Inc_field.Nextval 在那个字段的位置,那个字段便增中一, 但是该字段必须在为 NUMBER 类型, 如上面的 ID 字段。
如果是oracle可能创建一个序列,它会自动增加的。如: create sequence ECS.AR_TAX_LINES_S minvalue 1 maxvalue 2147483647 start with 1 increment by 1 cache 20 order; 用下面语句取值: SELECT ECS.AR_TAX_LINES_S.NEXTVAL INTO NO FROM DUAL;如果是sql server用: SELECT MAX(CONVERT(int, SUBSTRING(入库单号, 3, 9))) AS maxrkdh FROM tb1 或者用一字典表记录当前表的最大数,下次取出这个最大数加1即可。如现在为1005,就在这里写入1005,下次把1005取出加1,并update 1005为1006。
字符型不会按照数值大小排序,一般是这样:年月日+4位流水号, 你可以用:select * from table order by convert(int,fieldname);//fieldname就是指序号字段名 你可以 last; str:=fieldbyname('fieldname').asstring; 取出字符串,copy(str,1,6)取出年月日,再strtoint(copy(str,7,4))取出后4位的整形值,加1即可。
2、Select Max(字段名) Form 表名
然后将返回的值加1————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
它由'rk'及'030901'日期及001组成,后面的数字自动能增加,在数据库中怎么找到最大值?
FROM tb1
是否要限定日期,因为日期不同,最大值也不同。
Create sequence aaa increment by 1 start with 1;--创建一个序列
Select aaa.Nextval from Dual;--下一个值
Select aaa.Currval from Dual;--当前值
MaxBH, AYear, AMonth,fieldBh,firstA,maincode: String;
i: Integer;
begin
AYear := DateToStr(DmDcom.SysDate); //2003-08-07
Delete(AYear, 5, 6); //2003
AMonth := MidStr(DateToStr(SysDate),6,2); // 08
if MidStr(AMonth,2,1) = '-' then
begin
AMonth := '0' + AMonth ;
AMonth := MidStr(AMonth,1,2); //08
end;
firstA:='RK'; maincode:= firstA+UserName+AYear+AMonth;
with DataSet do
begin
Close;
CommandText := 'Select MAX('RKDBH') maxbh From '+tablename
+' Where RKDBH Like ''' + FirstA + UserName + '%'''
+'and SUBSTR(RKDBH,8,4)='+chr(39)+AYear +chr(39)
+'and SUBSTR(RKDBH,12,2)='+chr(39)+AMonth +chr(39)
+'and length(RKDBH)=16 ';
Open;
MaxBH := FindField('maxbh').AsString;
close;
end; delete(MaxBH, 1, Length(MaxBH)-3); try
if MaxBH = '' then
begin
result := maincode+'001';
exit;
end;
MaxBH := IntToStr(StrToInt(MaxBH) + 1);
if Length(MaxBH) < 3 then
For i := 1 to 3 - Length(MaxBH) do
MaxBH := '0' + MaxBH; //补零
Result := FirstA + UserName + AYear+ AMonth + MaxBH;
except
Application.MessageBox('单据编号生成数据错误', '错误', MB_OK);
Result := 'ERROR';
Exit;
end;
具体的方法看你用的是什么数据库。
如果是 ORACLE ,你可以建一个序列对象的字段,由 ORACLE 自己来控制单号的递增。-- Create sequence
create sequence inc_field
minvalue 1
maxvalue 999999
start with 1
increment by 1
cache 20;
以后你可以用 inc_field 来控制;
如下所示在 INSERT INTO 时:CREATE TABLE MYTEST(ID NUMBER,NAME VARCHAR(8));insert into mytest values(Inc_field.Nextval, 'ddggd');Inc_field.Nextval 在那个字段的位置,那个字段便增中一,
但是该字段必须在为 NUMBER 类型, 如上面的 ID 字段。
create sequence ECS.AR_TAX_LINES_S
minvalue 1
maxvalue 2147483647
start with 1
increment by 1
cache 20
order;
用下面语句取值:
SELECT ECS.AR_TAX_LINES_S.NEXTVAL INTO NO FROM DUAL;如果是sql server用:
SELECT MAX(CONVERT(int, SUBSTRING(入库单号, 3, 9))) AS maxrkdh FROM tb1
或者用一字典表记录当前表的最大数,下次取出这个最大数加1即可。如现在为1005,就在这里写入1005,下次把1005取出加1,并update 1005为1006。
我也想要一个,
[email protected]
建个表,存有当前的最大单据号,可以用触发器写
要实现这一点还是用一个表保存最大数。
你可以用:select * from table order by convert(int,fieldname);//fieldname就是指序号字段名
你可以
last;
str:=fieldbyname('fieldname').asstring;
取出字符串,copy(str,1,6)取出年月日,再strtoint(copy(str,7,4))取出后4位的整形值,加1即可。