急用:请问有没有简便的办法来求最大值?(50分)

  • 主题发起人 主题发起人 puremoonstone
  • 开始时间 开始时间
P

puremoonstone

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个“承付单表”,表中有一字段“付款编号”
付款编号是这样生成的:"FK"+年份的缩写(两位)+编号数字(编号从1开始)
在进行新的承付时,需要生成新的付款编号。我现在是先比较年份,再找出最大的付款编号
最后生成新的付款编号。我是通过遍历,逐一比较的,程序很费时,很麻烦,请问有没有
简便的方法来实现呢?譬如通过写SQL语句之类的。谢谢!
 
一般可以可以在表中添加一自增字段,
如果年份相同,取其最大值加1,放入“付款编号”,即 FK+year+(max+1)
如果不同,FK+year+1
 
>>编号数字(编号从1开始)
你可以定编号的位数如:00001
再用SQL语句:
with adoQuery1 do
begin
close;
sql.clear;
sql.add('Select Max(编号) as 最大编号 From 表1');
open;
first;
T_Max:=fieldbyname('最大编号').asstring;
end;
 
你可以再建一个表,每次生成新的编号时将它记录在这个表中,下次取出即可。
 
你只能遍历了,不过可以查询优化,如加索引、优化语句等。
如果表太大,你可以通过建立扩展计数表来提高速度,
或改变你的表结构,
或采用PostgreSQL、InterBase数据库来利用数据库特性去实现。
 
to sportsman:采用自增型的存在一个问题,如果删除一个记录后,付款编号就不连续了。
每年的编号都是从1开始的。
to 黄文林:编号不是一个字段,是付款编号中的一个组成部分。付款编号是字符串。
补充一下:
付款编号是这样组成的:
"FK"+年份的缩写(两位)+编号数字+小编号(小编号是表示用户对某笔付款的承付次数,
因为有时不是一次付清的)
我的代码如下,请大家帮忙分析一下(效率太低),优化一下:
function Tpaymentdetailform.Getthebiggestfkbh():integer; //获取最大的付款编号
var
yy1,mm1,dd1,yy2,mm2,dd2:word;
tempnum,maxnumber:integer;
str1,str2,tempstr:string;
begin
//使用querytemp来进行查询
with querytemp do
begin
with sql do
begin
close;
clear;
text:='select 付款编号 from 承付单表';
end;
open;
end;
decodedate(date(),yy1,mm1,dd1); //先求出年份
maxnumber:=0; //最大的付款编号数
if (not querytemp.isempty) then
begin
querytemp.First;
while (not querytemp.eof) do
begin
decodedate(querytemp.fieldbyname('付款日期').asdatetime,yy2,mm2,dd2);
if (yy1=yy2) then //属于同一年份的
begin
tempstr:=querytemp.fieldbyname('付款编号').asstring;
str1:=trim(copy(tempstr,pos('-',tempstr)+1,Length(tempstr))); //取出"fFK00-1-2"的"1-2"
str2:=trim(copy(str1,1,pos('-',str1)-1)); //取出"1-2"的"1"
tempnum:=strtoint(str2);
if (tempnum>maxnumber) then maxnumber:=tempnum;
end;
querytemp.next;
end;
end;
maxnumber:=maxnumber+1;
Getthebiggestfkbh:=maxnumber;
end;

 
如果编号格式统一的话,使用黄文林的办法是可行的,sql 语句如下:
select max(付款编号) as biggest from 承付单表;
通过xx:=query1['付款编号']可以取得当前最大编号;
然后通过字符串运算生成下一编号
 
付款编号是字符串,而且是每年都是从1开始编号的,不能直接用max(付款编号)
否则,会得出"FK01-1-5">"FK01-10-1"的结果。
 
写条SQL语句:
ADOQuery1.SQL.Text:='Select Max(convert(int,Substring(承付单号,7,5))) as MaxID From 丝类提货单 Where SubString(承付单号,4,2)='+''''+Year+'''';
 
同意楼上说的
不过在条件子句中等号左边的函数会使sql效率变低。
 
如果要删除,付款编号不可能连续!!
 
当前最大号 = Select Max(convert(int,Substring(承付单号,5,datalength(承付单号) - 4))) as MaxID From 丝类提货单 Where SubString(承付单号,4,2)=Current_Year
 
我写过一个Ms sql server 存储过程 希望对你有所帮助
于你的类似 每月自动编号 '20010100001'
CREATE PROCEDURE 保存受理信息
@日期 datetime

declare @id char(11)
declare @mid char(11)
if not exists(select * from table1 where datepart(yy,日期)=datepart(yy,@日期) and datepart(mm,日期)=datepart(mm,@日期))
begin
set @id=convert(char(6),@日期,112)+'00001'

end
else
begin
select @mid=max(理号) from table1 where datepart(yy,日期)=datepart(yy,@日期) and datepart(mm,日期)=datepart(mm,@日期)
/* print @mid */
set @id=convert(char(11),(convert(numeric,@mid)+1))
/* print @id */
end

insert into table1 (受理号,日期) values (@id,@日期)
 
问题已经解决,谢谢!
 
多人接受答案了。
 
后退
顶部