none
ZERO FILL EM SQL SERVER 2005 RRS feed

  • Pergunta

  • Olá, essa pergunta eu procurei na net e não encontrei respostas muito boas, espero que alguém possa me ajudar.

     

    Em um projeto que estou desenvolvendo em .NET e SQL 2005 tenho uma tabela chamada NotasFiscais e a chave primária dela é o próprio número da notafiscal (e esta deve ser incrementada de 1 a cada impressão). Até aqui normal, sem problemas. Porém, como vocês sabem uma nota fiscal não possui um número nesse formato "341" e sim "000341", ou seja, possui zeros na frente.

     

    Pois bem, minha pergunta é simples: existe algo parecido com o ZEROFILL do MySql (que eu usava e era tão fácil...) no SQL SERVER 2005?!??!?!?!

     

    Eu precisava modificar essa chave primaria da minha nota fiscal preenchendo com zeros, porém, sem tirar as "propriedades" de autoincrement e int.

    Aguardo resposta e desde já agradeço.

    terça-feira, 22 de julho de 2008 18:05

Respostas

  • Reinaldo,

     

    Até por questões de performance, e principalmente espaço em disco, também recomendaria manter a tabela do jeito que está e formatar a coluna na query de saída, ou melhor ainda no front-end.

     

     

    Junior,

     

    Vi tua query, mas acho que você poderia ter evitado o CASE, veja abaixo:

    Code Snippet

    declare @qtdZeros int

    declare @nf int

    set @qtdZeros = 5

    set @nf = 134

    --set @nf = 12

    select replicate('0', @qtdZeros-len(@nf)) + convert(varchar, @nf) as zerofilled

     

     

    Um abraço,

    Raul Santos

    quarta-feira, 23 de julho de 2008 21:58

Todas as Respostas

  • Reinaldo,

     

    Recentemente tive a mesma necessidade que você, em um sistema que desenvolvemos internamente aqui na empresa para área de controle de qualidade.

     

    Para resolver esta necessidade, a minha chave primária também era gerada automáticamente através da propriedade Identity, mas eu precisava armazenar o número da matéria prima da mesma forma que você em relação a nota fiscal.

     

    Sendo assim, criei mais um campo em minha table, para armazenar especificamente o valor da matéria prima de acordo com a minha formatação.

     

    Utilizei um trigger para fazer todo o controle e formatação, sendo que dentro do trigger, por questões da minha estrutura, estou utilizando uma stored procedure para atualizar e armazenar os valores no campo da forma desejada, de acordo com a quantidade de registros.

     

    Vou postar o código da stored procedure que eu utilizo:

     

    Code Snippet

    SET NOCOUNT ON

     

    UPDATE CTPRODUCAO_MOINHO

    SET NUMMO=(SELECT

    CASE LEN(CODSEQUENCIAL)

    WHEN 1 THEN REPLICATE('0',3)+CONVERT(CHAR(1),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)

    WHEN 2 THEN REPLICATE('0',2)+CONVERT(CHAR(2),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)

    WHEN 3 THEN REPLICATE('0',1)+CONVERT(CHAR(3),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)

    WHEN 4 THEN CONVERT(CHAR(4),CODSEQUENCIAL)+'/'+SUBSTRING(CONVERT(CHAR(4),DATEPART(YEAR,GETDATE())),3,2)

    END

    From CTPRODUCAO_MOINHO WHERE NUMMO='0')

    WHERE NUMMO='0'

     

     

     

     

    terça-feira, 22 de julho de 2008 18:25
    Moderador
  • Obrigado pela resposta Junior, porém, acho que irei deixar a minha tabela como está mesmo e quando eu for mostrar na tela ou imprimir um NF deixar o trabalho de preencher com zeros para a camada de apresentação. Ou algo do tipo:

     

    Code Snippet

    declare @i int

    set @i= 5

    select Integer=@i, ZeroFilled=right('00000'+convert(varchar,@i), 5)

     

     

    Mas mesmo assim obrigado =)
    terça-feira, 22 de julho de 2008 20:07
  • Reinaldo,

     

    Até por questões de performance, e principalmente espaço em disco, também recomendaria manter a tabela do jeito que está e formatar a coluna na query de saída, ou melhor ainda no front-end.

     

     

    Junior,

     

    Vi tua query, mas acho que você poderia ter evitado o CASE, veja abaixo:

    Code Snippet

    declare @qtdZeros int

    declare @nf int

    set @qtdZeros = 5

    set @nf = 134

    --set @nf = 12

    select replicate('0', @qtdZeros-len(@nf)) + convert(varchar, @nf) as zerofilled

     

     

    Um abraço,

    Raul Santos

    quarta-feira, 23 de julho de 2008 21:58