表X内有一字段BM内容格式如下:
A001
A002
B001
B002
....
如何通过SQL或Delphi得到A003或B003得最大编号???

解决方案 »

  1.   

    首先要分組,然後取最大值.
    Select max(BM) from X group By substring(bm,1,1)
      

  2.   

    select max(BM) from X group by left(BM, 1)
      

  3.   


    var
      lsCondition: string;
      lsSQL: string;
    begin
      lsCondition := 'A001'; //已知条件
      lsCondition := Copy(lsCondition, 1, 1);
      lsSQL := 'SELECT ISNULL(MAX(BM), 0)+1 AS BM FROM TableName WHERE BM LIKE ' 
             + QuotedStr(lsCondition) + '%';
    end;
      

  4.   

    参照一下这个贴子,稍加改动就可以了.
    http://topic.csdn.net/u/20080127/20/92479f1a-f6d2-4dad-82b2-0397b7b25514.html
     
    //数据库sqlserver     
    //在窗体中放一个adoconnection,一个adoquery,一个edit,一个button 
    //设置好联接数据库等。 
    //测试表结构:create   table   recv_info(flowno   varchar(20),indate   datetime,feature   varchar(20)) 
    //flowno   单号,indate 入库日期,feature   商品名称 
    //函数名称   getflowno unit   Unit1; interface uses 
        Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms, 
        Dialogs,   StdCtrls,   DB,   ADODB; type 
        TForm1   =   class(TForm) 
            ADOConnection1:   TADOConnection; 
            ADOQuery1:   TADOQuery; 
            Button1:   TButton; 
            Edit1:   TEdit; 
            procedure   Button1Click(Sender:   TObject); 
            procedure   FormCreate(Sender:   TObject); 
        private 
            {   Private   declarations   } 
            function   GetFlowNO(PreConstantChar,vRig_Date:String):string; 
        public 
            {   Public   declarations   } 
        end; var 
        Form1:   TForm1; implementation {$R   *.dfm} {   TForm1   } 
    function   TForm1.GetFlowNO(PreConstantChar,   vRig_Date:   String):   string; 
    var 
            sSqlText,sMaxSerialNO:   string; 
            i,iLength:   integer; 
    begin 
            Result   :=   ''; 
            sSqlText   :=   '   SELECT   MAX(flowno)   MaxNO       FROM     RECV_INFO'+ 
                                    '   Where   flowno   like   '''+PreConstantChar+FormatDateTime('YYYYMMDD',StrToDate(vRig_Date))+'%'''+ 
                                    '   and   indate>   ='''+formatdatetime('yyyy-mm-dd',StrToDate(vRig_date))+''''+ 
                                    '   and   indate   <'''+formatdatetime('yyyy-mm-dd',strtoDate(vRig_date)+1)+''''; 
            with       adoquery1       do 
            begin 
                    Close; 
                    SQL.Text       :=       sSqlText; 
                    Open; 
                    if       FieldByname('MaxNO').AsString=''       then       sMaxSerialNO       :=       '001' 
                    else 
                    begin 
                            sMaxSerialNO       :=       FieldByName('MaxNO').asString; 
                            sMaxSerialNO       :=       Copy(sMaxSerialNO,       length(sMaxSerialNO)-2,       3); 
                            sMaxSerialNO       :=       IntToStr(StrToInt(sMaxSerialNO)+1); 
                    end; 
            end;         for   i:=1   to   3-Length(sMaxSerialNO)   do 
            begin 
                insert('0',sMaxSerialNO,i); 
            end; 
            Result   :=   trim(PreConstantChar+FormatDateTime('YYYYMMDD',StrToDate(vRig_Date))+sMaxSerialNO); 
    end; 
    //按钮的事件,生成一个存到表中一个 
    procedure   TForm1.Button1Click(Sender:   TObject); 
    begin 
        adoconnection1.BeginTrans; 
        try 
            Edit1.Text   :=   GetFlowNO('BJ',formatdatetime('yyyy-mm-dd',now())); 
            with   adoquery1   do 
            begin 
                close; 
                sql.Text   :=   '   insert   into   recv_info(flowno,indate,feature)   values(:flowno,:indate,:feature)'; 
                Parameters.ParamByName('flowno').Value   :=   Edit1.Text; 
                Parameters.ParamByName('indate').Value   :=   Formatdatetime('yyyy-mm-dd',now()); 
                Parameters.ParamByName('feature').Value   :=   Formatdatetime('yyyy-mm-dd',now())+'物料'; 
                ExecSql; 
            end; 
            adoconnection1.CommitTrans; 
        except 
            adoconnection1.RollbackTrans; 
            messagebox(handle,'生成新单号失败','提示',mb_iconinformation); 
        end; 
    end; procedure   TForm1.FormCreate(Sender:   TObject); 
    begin 
        adoconnection1.Connected   :=   true;   //开始联接数据库 
    end; end.
      

  5.   

    select   max(Substring(BM,2,10))   from   X   where substring(BM,1,1)='A'