var AdoifExist,AdoGetMaxid : TADOQuery; maxid : String; begin AdoifExist := TADOQuery.Create(nil); AdoGetMaxid := TADOQuery.Create(nil); AdoifExist.Connection := .....//此处是连接字符串或者连接到TADOConnection AdoifExist.Close; AdoifExist.sql.clear; AdoifExist.sql.add('select * from table1 where id like ''' + format('yymm',now) + '%'''); AdoifExist.open; if AdoifExist.IsEmpty then maxid := format('yymm',now) + '001' else begin AdoGetMaxid.close; AdoGetMaxid.sql.clear; AdoGetMaxid.sql.add('select max(yourid)+1 as myid from table1 where left(yourid,4)=''' + format('yymm',now)+'''' ); //这里可能要将yourid转成int型,没试过,自己试试 AdoGetMaxid.open; maxid := format('yymm',now) + Format('%.3d',AdoGetMaxid.FieldbyName('myid').asinteger); end;///////////////////// //maxid就是你要的流水号。 //全凭想像写的代码,如有不对,请高手指教 ////////////////////
建个触发器 CREATE trigger tab_addid on dbo.table for insert as DECLARE @str char(7) declare @str1 char(3) select @str=substring(cast(year(getdate()) as char(4)),3,2) +right('00'+rtrim(cast(month(getdate()) as char(2))),2) select @str1=convert(char(3),inserted.id) from inserted select @str1=right('000'+ltrim(rtrim(@str1)),3) select @str=@str+@str1 Update table set 编号=@str from inserted where table.id=inserted.id
注:id为自增字段。这样你就不用去关心插入编号的问题了
AdoGetMaxid.sql.add('select max(yourid)+1 as myid from table1 where left(yourid,4)=''' + format('yymm',now)+'''' ); 请问这句里的myid是什么呀
yourid呢? 都是指id字段把,一样的?
AdoifExist.sql.add('select * from table1 where id like ''' + format('yymm',now) + '%'''); 运行时这句语法有错,怎么回事呢?
myid是别名,yourid是指你存id的那个字段名
试试这个: AdoifExist.sql.add('select * from table1 where id like ' + format('yymm',now) + '%');
现在这样了,adoifexit,adogetmaxid都已经和工资单表连上 编译通过,可是添加的时候总是出错,费解?? var i:real; maxid : String; begin AdoifExist.sql.clear; AdoifExist.sql.add('select * from 工资单 where 工资单号 like ''' + formatdatetime('yymm',now())+ '%''' ); AdoifExist.open; if AdoifExist.IsEmpty then maxid := formatdatetime('yymm',now()) + '001' else begin Adogetmaxid.close; AdoGetMaxid.sql.clear; AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(yourid,4)=''' + formatdatetime('yymm',now())+'''' ); AdoGetMaxid.open; maxid:= formatdatetime('yymm',now()) + Formatfloat('000',i); end;
整个代码如下 总是说重复的工资单号,数据库里面设的主键不能重复就出错了 procedure TForm1.BitBtn1Click(Sender: TObject); var i:real; maxid : String; begin AdoifExist.sql.clear; AdoifExist.sql.add('select * from 工资单 where 工资单号 like '+'''' + formatdatetime('yymm',now())+ '%'+'''' ); AdoifExist.open; if AdoifExist.IsEmpty then maxid := formatdatetime('yymm',now()) + '001' else begin Adogetmaxid.close; AdoGetMaxid.sql.clear; AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(yourid,4)=''' + formatdatetime('yymm',now())+'''' ); AdoGetMaxid.open; maxid:= formatdatetime('yymm',now()) + Formatfloat('000',i); end; ADOQuery1.Append; ADOQuery1.FieldByName('工资单号').Asfloat:=strtofloat(maxid); ADOQuery1.FieldByName('员工编号').Asfloat:=StrTofloat(Label16.Caption); ADOQuery1.FieldByName('发放日期').AsString:= formatdatetime('yyyymmdd',now()); ADOQuery1.FieldByName('姓名').AsString:= Label17.Caption; ADOQuery1.FieldByName('性别').AsString:=Label6.Caption; ADOQuery1.FieldByName('基本工资').Asinteger:=StrToInt(Edit1.text); ADOQuery1.FieldByName('奖金').Asinteger:=StrToInt(Edit2.text); ADOQuery1.FieldByName('加班费').Asinteger:=StrToInt(Edit3.text); ADOQuery1.FieldByName('其他费用').Asinteger:=StrToInt(Edit4.text); ADOQuery1.FieldByName('扣除费用').Asinteger:=StrToInt(Edit5.text); ADOQuery1.FieldByName('工时工资').Asinteger:=StrToInt(Edit6.text); ADOQuery1.FieldByName('合计').Asinteger:=ADOQuery1.FieldByName('基本工资').Asinteger+ADOQuery1.FieldByName('奖金').Asinteger+ADOQuery1.FieldByName('加班费').Asinteger+ADOQuery1.FieldByName('其他费用').Asinteger-ADOQuery1.FieldByName('扣除费用').Asinteger+ADOQuery1.FieldByName('工时工资').Asinteger; ADOQuery1.Post; ADOQUERY1.active:=false; ADOquery1.active:=true; end;
procedure setsql(adoquery:TADOQuery;sqlstr:string;cn:integer); begin adoquery.close; adoquery.sql.clear; adoquery.sql.add(sqlstr); if cn = 1 then adoquery.open else adoquery.ExecSQL; end;function getid(str:string):string; ///str即为0504005中前四位 begin setsql(dm.tmpquery,'select max(编号') as 编号 from 入库表 where substring(编号,1,4)='+''''+str+'''',1); if dm.tmpquery.fieldbyname('编号').asstring = '' then result:=str+'001' else result:=str+rightstr('000'+inttostr(strtoint(rightstr(dm.tmpquery.fieldbyname('编号').asstring,3))+1),3); end;试试看吧,没有调试,应该正确的.
AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(工资单号,4)=''' + formatdatetime('yymm',now())+'''' );
还有Format('%.3d',[MonthOfTheYear(now)+1]);是什么意思呀
年份后两位’+‘月份’(两位)+001 来生成流水号
ElSE
就去现有帐单流水号最大值+1当然你要有一个来用来记录流水帐号的最大值得表或其他什么的文件。也可以用select max(id) from 表名 的形式来取流水号最大值,不过这样如果表很大就不行了。方法比较笨,仅供参考。
AdoifExist,AdoGetMaxid : TADOQuery;
maxid : String;
begin
AdoifExist := TADOQuery.Create(nil);
AdoGetMaxid := TADOQuery.Create(nil); AdoifExist.Connection := .....//此处是连接字符串或者连接到TADOConnection
AdoifExist.Close;
AdoifExist.sql.clear;
AdoifExist.sql.add('select * from table1 where id like ''' + format('yymm',now) + '%''');
AdoifExist.open; if AdoifExist.IsEmpty then
maxid := format('yymm',now) + '001'
else
begin
AdoGetMaxid.close;
AdoGetMaxid.sql.clear;
AdoGetMaxid.sql.add('select max(yourid)+1 as myid from table1 where left(yourid,4)=''' + format('yymm',now)+'''' ); //这里可能要将yourid转成int型,没试过,自己试试
AdoGetMaxid.open; maxid := format('yymm',now) + Format('%.3d',AdoGetMaxid.FieldbyName('myid').asinteger);
end;/////////////////////
//maxid就是你要的流水号。
//全凭想像写的代码,如有不对,请高手指教
////////////////////
CREATE trigger tab_addid on dbo.table
for insert
as
DECLARE @str char(7)
declare @str1 char(3)
select @str=substring(cast(year(getdate()) as char(4)),3,2)
+right('00'+rtrim(cast(month(getdate()) as char(2))),2)
select @str1=convert(char(3),inserted.id) from inserted
select @str1=right('000'+ltrim(rtrim(@str1)),3)
select @str=@str+@str1
Update table set 编号=@str from inserted where table.id=inserted.id
注:id为自增字段。这样你就不用去关心插入编号的问题了
请问这句里的myid是什么呀
都是指id字段把,一样的?
运行时这句语法有错,怎么回事呢?
AdoifExist.sql.add('select * from table1 where id like ' + format('yymm',now) + '%');
现在这句总出错,因为我的工资单号是float型,这样写有什么错呢?
编译通过,可是添加的时候总是出错,费解??
var
i:real;
maxid : String;
begin
AdoifExist.sql.clear;
AdoifExist.sql.add('select * from 工资单 where 工资单号 like ''' + formatdatetime('yymm',now())+ '%''' );
AdoifExist.open;
if AdoifExist.IsEmpty then
maxid := formatdatetime('yymm',now()) + '001'
else
begin
Adogetmaxid.close;
AdoGetMaxid.sql.clear;
AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(yourid,4)=''' + formatdatetime('yymm',now())+'''' );
AdoGetMaxid.open;
maxid:= formatdatetime('yymm',now()) + Formatfloat('000',i);
end;
总是说重复的工资单号,数据库里面设的主键不能重复就出错了
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i:real;
maxid : String;
begin
AdoifExist.sql.clear;
AdoifExist.sql.add('select * from 工资单 where 工资单号 like '+'''' + formatdatetime('yymm',now())+ '%'+'''' );
AdoifExist.open;
if AdoifExist.IsEmpty then
maxid := formatdatetime('yymm',now()) + '001'
else
begin
Adogetmaxid.close;
AdoGetMaxid.sql.clear;
AdoGetMaxid.sql.add('select max(工资单号)+1 as i from 工资单 where left(yourid,4)=''' + formatdatetime('yymm',now())+'''' );
AdoGetMaxid.open;
maxid:= formatdatetime('yymm',now()) + Formatfloat('000',i);
end; ADOQuery1.Append; ADOQuery1.FieldByName('工资单号').Asfloat:=strtofloat(maxid);
ADOQuery1.FieldByName('员工编号').Asfloat:=StrTofloat(Label16.Caption);
ADOQuery1.FieldByName('发放日期').AsString:= formatdatetime('yyyymmdd',now());
ADOQuery1.FieldByName('姓名').AsString:= Label17.Caption;
ADOQuery1.FieldByName('性别').AsString:=Label6.Caption;
ADOQuery1.FieldByName('基本工资').Asinteger:=StrToInt(Edit1.text);
ADOQuery1.FieldByName('奖金').Asinteger:=StrToInt(Edit2.text);
ADOQuery1.FieldByName('加班费').Asinteger:=StrToInt(Edit3.text);
ADOQuery1.FieldByName('其他费用').Asinteger:=StrToInt(Edit4.text);
ADOQuery1.FieldByName('扣除费用').Asinteger:=StrToInt(Edit5.text);
ADOQuery1.FieldByName('工时工资').Asinteger:=StrToInt(Edit6.text);
ADOQuery1.FieldByName('合计').Asinteger:=ADOQuery1.FieldByName('基本工资').Asinteger+ADOQuery1.FieldByName('奖金').Asinteger+ADOQuery1.FieldByName('加班费').Asinteger+ADOQuery1.FieldByName('其他费用').Asinteger-ADOQuery1.FieldByName('扣除费用').Asinteger+ADOQuery1.FieldByName('工时工资').Asinteger;
ADOQuery1.Post;
ADOQUERY1.active:=false;
ADOquery1.active:=true;
end;
begin
adoquery.close;
adoquery.sql.clear;
adoquery.sql.add(sqlstr);
if cn = 1 then adoquery.open
else adoquery.ExecSQL;
end;function getid(str:string):string; ///str即为0504005中前四位
begin
setsql(dm.tmpquery,'select max(编号') as 编号 from 入库表 where substring(编号,1,4)='+''''+str+'''',1);
if dm.tmpquery.fieldbyname('编号').asstring = '' then
result:=str+'001'
else
result:=str+rightstr('000'+inttostr(strtoint(rightstr(dm.tmpquery.fieldbyname('编号').asstring,3))+1),3);
end;试试看吧,没有调试,应该正确的.
改成
maxid:= formatdatetime('yymm',now()) + Formatfloat('000',ADOQuery1.Fields[0].asString);