declare JSOrder scroll cursor for select Order_ID from DayCredence 
--打开游标
open JSOrder
fetch last from JSOrder into @Order_ID
if @@fetch_status=0  --如果游标成功执行
begin
  if @@rowcount=0--如果日记账表中没有记录
  begin
    set @Order_ID='00000001'
  end  
  else
  begin
    set @TempOrder_ID=convert(bigint,@order_ID)
    set @TempOrder_ID=@TempOrder_ID+1
    if @TempOrder_ID<10
       set @Order_ID='0000000'+Convert(varchar,@TempOrder_ID)
    if @TempOrder_ID<100
       set @Order_ID='000000'+Convert(varchar,@TempOrder_ID)
    if @TempOrder_ID<1000
       Set @Order_ID='00000'+Convert(varchar,@TempOrder_ID)
    if @TempOrder_ID<10000
       Set @Order_ID='0000'+Convert(varchar,@TempOrder_ID)
    if @TempOrder_ID<100000
       Set @order_ID='000'+Convert(varchar,@TempOrder_ID)
    if @TempOrder_ID<1000000
       Set @Order_ID='00'+Convert(varchar,@TempOrder_ID)
    if @TempOrder_ID<10000000
       Set @Order_ID='0'+Convert(varchar,@TempOrder_ID)
    if @TempOrder_ID<100000000
       Set @Order_ID=Convert(varchar,@TempOrder_ID)
  end
end 
close JSOrder
deallocate JSOrder有两个问题,
1,当数据库中没记录的时候Order_ID字段不能生成'00000001'编号.
2,当数据库中有记录时Order_ID不能生成'0000000X',X表示顺序号.
而只是成1,2,3,4,没有前面的'000000'字符。谢谢

解决方案 »

  1.   

    CREATE PROCEDURE PR_DayCredence  @Order_ID varchar(50) output ASdeclare @TempOrder_ID bigintdeclare JSOrder scroll cursor for select Order_ID from DayCredence 
    --打开游标
    open JSOrder
    fetch last from JSOrder into @Order_ID
    if @@fetch_status=0  --如果游标成功执行
    begin
        set @TempOrder_ID=convert(bigint,@order_ID)
        set @TempOrder_ID=@TempOrder_ID+1
        if @TempOrder_ID<10
           set @Order_ID='0000000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<100
           set @Order_ID='000000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<1000
           Set @Order_ID='00000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<10000
           Set @Order_ID='0000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<100000
           Set @order_ID='000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<1000000
           Set @Order_ID='00'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<10000000
           Set @Order_ID='0'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<100000000
           Set @Order_ID=Convert(varchar,@TempOrder_ID)
    end else
    begin
       Set @order_ID='00000001'
    end
    close JSOrder
    deallocate JSOrder
    GO
      

  2.   

    按上面的重新建一个存储过程,先看看效果问题集锦:
    1.@@rowcount的判断问题
    2.不能用return返回@order_ID
      

  3.   

    我把整个发给你看看。
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GOALTER          PROCEDURE InCredence
    @Operation_ID  varchar(10),  --操作员编号
    @Subject_ID     varchar(10),   --科目编号
    @JF_ID             varchar(15),    --借方编号
    @DF_ID            varchar(15),    --贷方编号
    @JF_Name         varchar(100),
    @DF_Name         varchar(100),
    @PZ_Code       varchar(10),    --凭证编号
    @Summary        varchar(50),   --备注
    @FS_Money     decimal(18,2) ,         --发生额
    @Credence_Type int               --单据类型(1,现金收,2现金付,3转账,4转账借,5转账贷) AS
    declare @DateTime   datetime              --单据时间
    declare @year            int                         --年
    declare @Month        int                        --月
    declare @Order_ID    varchar(10)      --流水号
    declare @TempOrder_ID  bigint
    --------------------------------------------------------------------------
    set @DateTime =getdate()               --得到当前日期
    set @year=year(@DateTime)           --根据当前日期得到年
    set @Month=month(@datetime)      --根据当前日期得到月--------------------------------------------------------------------------
    --开始业务
    --计算流水号
    --定义游标
    declare JSOrder scroll cursor for select Order_ID from DayCredence 
    --打开游标
    open JSOrder
    fetch last from JSOrder into @Order_ID
    if @@fetch_status=0  --如果游标成功执行
    begin
        set @TempOrder_ID=convert(bigint,@order_ID)
        set @TempOrder_ID=@TempOrder_ID+1
        if @TempOrder_ID<10
           set @Order_ID='0000000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<100
           set @Order_ID='000000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<1000
           Set @Order_ID='00000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<10000
           Set @Order_ID='0000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<100000
           Set @order_ID='000'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<1000000
           Set @Order_ID='00'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<10000000
           Set @Order_ID='0'+Convert(varchar,@TempOrder_ID)
        if @TempOrder_ID<100000000
           Set @Order_ID=Convert(varchar,@TempOrder_ID)
    end 
    else
    begin
      set @Order_ID='00000001'
    end
    close JSOrder
    deallocate JSOrder
    select * from credence where datetime=@datetime   --检查当日是否日结
    if @@rowcount=0  --如果当天没有日结
    begin
      insert into DayCredence  ( [DateTime],
             [Operation_ID],
             [Order_ID],
             [JF_ID],
             [DF_ID],
             [Subject_ID],
             [JF_Name],
             [DF_Name],
     [Year],
     [Month],
     [PZ_Code],
     [Summary],
     [FS_Money],
     [Credence_Type]) 
        values
             (
               @datetime,
               @Operation_ID,
               @Order_ID,
               @JF_ID,
               @DF_ID,
               @Subject_ID,
               @JF_Name,
               @DF_Name,
               @Year,
               @Month,
               @PZ_Code,
               @Summary,
               @FS_Money,
               @Credence_Type         
             )
    end
    else
    begin
      raiserror('已经日结,不能进行记账操作!',16,1)
    endGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
      

  4.   

    第二个问题还是这们,只是显示'1',2,3,....没有前面的000000----------------------------------------------------------输出参数,既可以返回数据(整型值或字符值等)返回代码,始终是整型值。!!一定不能用Return @Order_ID 来获取@Order_ID 
      否则就是'00000001'返回1,是'00000002'返回2,......
      

  5.   

    是得到Order_ID值,然后直接写数据库
      

  6.   

    呵呵, 你没有输出参数应该这样ALTER          PROCEDURE InCredence
    @Operation_ID  varchar(10),  --操作员编号
    @Subject_ID     varchar(10),   --科目编号
    @JF_ID             varchar(15),    --借方编号
    @DF_ID            varchar(15),    --贷方编号
    @JF_Name         varchar(100),
    @DF_Name         varchar(100),
    @PZ_Code       varchar(10),    --凭证编号
    @Summary        varchar(50),   --备注
    @FS_Money     decimal(18,2) ,         --发生额
    @Credence_Type int,               --单据类型(1,现金收,2现金付,3转账,4转账借,5转账贷)@Order_ID    varchar(10) output ---老冯的修改 AS
    declare @DateTime   datetime              --单据时间
    declare @year            int                         --年
    declare @Month        int                        --月
    --declare @Order_ID    varchar(10)      --流水号 ---老冯的修改
    declare @TempOrder_ID  bigint
    --------------------------------------------------------------------------
    set @DateTime =getdate()               --得到当前日期
    set @year=year(@DateTime)           --根据当前日期得到年
    set @Month=month(@datetime)      --根据当前日期得到月--------------------------------------------------------------------------
      

  7.   

    办法是有了,原因我再看看.........close JSOrder
    deallocate JSOrder
    --增加下面两条
    if @order_id<>'00000001' 
    set @Order_ID='0000000'+Convert(varchar,@TempOrder_ID)
    ---
    select * from credence where datetime=@datetime   --检查当日是否日结
      

  8.   

    按下面修改就没有问题了,在每个IF后面全部加上ELSE    set @TempOrder_ID=convert(bigint,@order_ID)
        set @TempOrder_ID=@TempOrder_ID+1
        if @TempOrder_ID<10
           set @Order_ID='0000000'+Convert(varchar,@TempOrder_ID)
        else
        if @TempOrder_ID<100
           set @Order_ID='000000'+Convert(varchar,@TempOrder_ID)
        else
        if @TempOrder_ID<1000
           Set @Order_ID='00000'+Convert(varchar,@TempOrder_ID)
        else
        if @TempOrder_ID<10000
           Set @Order_ID='0000'+Convert(varchar,@TempOrder_ID)
        else
        if @TempOrder_ID<100000
           Set @order_ID='000'+Convert(varchar,@TempOrder_ID)
        else
        if @TempOrder_ID<1000000
           Set @Order_ID='00'+Convert(varchar,@TempOrder_ID)
       else
        if @TempOrder_ID<10000000
           Set @Order_ID='0'+Convert(varchar,@TempOrder_ID)
        else
        if @TempOrder_ID<100000000
           Set @Order_ID=Convert(varchar,@TempOrder_ID)
      

  9.   

    因为你原来的语句实际上是执行了最后一条if @TempOrder_ID<100000000
           Set @Order_ID=Convert(varchar,@TempOrder_ID)所以返回的值就没有任何前缀了.
      

  10.   

    你还可以这样修改(不要else)
    if @TempOrder_ID<10 
     ....
    if @TempOrder_ID<100 and @TempOrder_ID >= 10
     ....if @TempOrder_ID<1000 and @TempOrder_ID >= 100
    ...
      

  11.   

    简洁点:
    @No--单号@NoLen--单号长度   =@prefix为单号前缀if len(@No)<@NoLen and @NoLen>0
        set @No=@prefix+left('000000000000000000000000000000000000',@NoLen-len(@No))+@No
      else
        set @No=@prefix+@No