none
Chave Alfanumérica

    Question

  • Boas..

    Preciso que sempre um determinado campo da tabela seja X, a chave primaria comece por M e com numeração sequencial a seguir, se for Y então a chave começa por N com a sua numeração sequencial..

    A numerações sequencias são diferentes para M e N..

    Alguém em pode ajudar, sei que tem que ser no SP de Inserir os dados, mas não estou a ver como..

    Desde já obrigado..

    Monday, October 13, 2008 1:22 PM

Answers

  • Olá Vitor,

     

    Você até poderia resolver isto com uma Trigger, ou ainda na tua própria stored procedure, pegar o maior valor já inserido para cada uma das letras.


    Mas aconselho que crie uma tabela de controlar isto, algo como:

    Code Snippet

    TB_CONTROLE_ID


    Letra | Max_ID
    'M' | 28
    'N' | 72

     

     

     

    Na tua procedure de inserção, você sempre irá ler esta tabela, de acordo com a letra desejada, pegar o maior valor e incrementá-lo em 1 (um). Use o valor incrementado, concatene com a letra desejada, e insira na tua tabela final.

     

    Qualquer dúvida, é só falar.

     

    Um abraço,

    Raul Santos

    Monday, October 13, 2008 2:01 PM
  • Ola ..

     

    Seguindo a ideia passada pelo Raul segue um exemplo ...

     

    Code Snippet

    -- Cria a tabela para controle
    CREATE TABLE CONTROLE
     (
     MAX_ID INT NOT NULL,
     LETRA CHAR(1) NOT NULL
     )

     

     

    -- Insere alguns registro para exemplo
    INSERT INTO CONTROLE VALUES (1,'M')
    INSERT INTO CONTROLE VALUES (2,'M')
    INSERT INTO CONTROLE VALUES (1,'N')
    INSERT INTO CONTROLE VALUES (2,'N')

     

     

    -- Dentro da procedure recupera o ID da seguinte maneira
    DECLARE @LETRA CHAR(1), @ID INT
    SET @LETRA = 'M'

    SELECT @ID = MAX(MAX_ID)+1 FROM CONTROLE WHERE LETRA = @LETRA

     


    -- No final da procedure insere o ID
    INSERT INTO CONTROLE VALUES (@ID, @LETRA)

     

     

     

    Abraços
    Monday, October 13, 2008 4:15 PM
  • Ola ..

     

    faz da seguinte maneira

     

    Code Snippet
    declare @Var int
    set @Var = 1
    print right(replicate('0',5) + casT(@Var as varchar),5)

     

     

     

    Abraços
    Tuesday, October 14, 2008 2:11 PM

All replies

  • Olá Vitor,

     

    Você poderia exemplificar ?

     

    [ ]s,

     

    Gustavo

     

    Monday, October 13, 2008 1:44 PM
  • Eu tenho num form um Combo box com os valores M e N.
    Se escolher o M, ele deve guardar a chave primária com o valor M0001, M0002, etc
    Se escolher o N, ele deve guardar a chave primária com o valor N0001, N0002, etc

    Não sei se me expliquei melhor agora...
    Monday, October 13, 2008 1:55 PM
  • Olá Vitor,

     

    Você até poderia resolver isto com uma Trigger, ou ainda na tua própria stored procedure, pegar o maior valor já inserido para cada uma das letras.


    Mas aconselho que crie uma tabela de controlar isto, algo como:

    Code Snippet

    TB_CONTROLE_ID


    Letra | Max_ID
    'M' | 28
    'N' | 72

     

     

     

    Na tua procedure de inserção, você sempre irá ler esta tabela, de acordo com a letra desejada, pegar o maior valor e incrementá-lo em 1 (um). Use o valor incrementado, concatene com a letra desejada, e insira na tua tabela final.

     

    Qualquer dúvida, é só falar.

     

    Um abraço,

    Raul Santos

    Monday, October 13, 2008 2:01 PM
  • Na teoria percebi como se faz, na prática é que não..

    Eu costumo inserir os dados na BD com um INSERT INTO em que a chave é númerica e como tal não há problema..
    Podia me dar um exemplo o código que sugere?

    Obrigado..
    Monday, October 13, 2008 2:12 PM
  • Como faço?
    Monday, October 13, 2008 3:19 PM
  • Ola ..

     

    Seguindo a ideia passada pelo Raul segue um exemplo ...

     

    Code Snippet

    -- Cria a tabela para controle
    CREATE TABLE CONTROLE
     (
     MAX_ID INT NOT NULL,
     LETRA CHAR(1) NOT NULL
     )

     

     

    -- Insere alguns registro para exemplo
    INSERT INTO CONTROLE VALUES (1,'M')
    INSERT INTO CONTROLE VALUES (2,'M')
    INSERT INTO CONTROLE VALUES (1,'N')
    INSERT INTO CONTROLE VALUES (2,'N')

     

     

    -- Dentro da procedure recupera o ID da seguinte maneira
    DECLARE @LETRA CHAR(1), @ID INT
    SET @LETRA = 'M'

    SELECT @ID = MAX(MAX_ID)+1 FROM CONTROLE WHERE LETRA = @LETRA

     


    -- No final da procedure insere o ID
    INSERT INTO CONTROLE VALUES (@ID, @LETRA)

     

     

     

    Abraços
    Monday, October 13, 2008 4:15 PM
  • Entretanto estive a tentar fazer, mas não testei o seguinte..

       
        IF @Loja = 'VM'
        BEGIN
            SET @Cod = 'VM' + ((SELECT MAX(MAX_ID)+1 FROM Controle_ID WHERE Letra = 'VM'))
        END
        ELSE IF @Loja = 'MM'
        BEGIN
            SET @Cod = 'MM' + ((SELECT MAX(MAX_ID)+1 FROM Controle_ID WHERE Letra = 'MM'))   
        END


    Lembrei-me agora de uma coisa, sempre que o ano mudar, ou seja, a data da encomenda ,mude para o ano seguinte, a contagem tem de começar de novo...

    Monday, October 13, 2008 4:22 PM
  • Pelo que percebi do exemplo que me deu, sempre que crio uma encomenda crio um novo registo, não era melhor só ter uma linha a tabela e ir actualizando-o?
    Monday, October 13, 2008 4:24 PM
  • Vitor,

     

    Pode sim fazer dessa maneira caso queira ..

     

     

    Abraços

    Monday, October 13, 2008 4:28 PM
  • Boas..
    Mas como acrescento a isto o facto de por cada ano da data da encomenda ter que iniciar a contagem?
    Tuesday, October 14, 2008 8:05 AM
  • Bom dia ..

     

    Seguindo o exemplo que passei anteriormente faria da seguinte maneira ..

     

    Code Snippet

    -- Cria a tabela para controle
    CREATE TABLE CONTROLE
     (
     MAX_ID INT NOT NULL,
     LETRA CHAR(1) NOT NULL,
     ANO CHAR(4) NOT NULL
     )

     


    -- Insere alguns registro para exemplo
    INSERT INTO CONTROLE VALUES (1,'M',YEAR(GETDATE()))
    INSERT INTO CONTROLE VALUES (1,'N',YEAR(GETDATE()))

     


    -- Dentro da procedure recupera o ID da seguinte maneira
    DECLARE @LETRA CHAR(1), @ID INT
    SET @LETRA = 'M'


    -- Verifica se mudou de ano
    IF NOT YEAR(GETDATE()) = (SELECT DISTINCT(ANO) FROM CONTROLE)
    BEGIN
          UPDATE CONTROLE
          SET MAX_ID = 1, ANO = YEAR(GETDATE())
    END

     

    SELECT @ID = MAX(MAX_ID)+1 FROM CONTROLE WHERE LETRA = @LETRA

     

     

    -- No final da procedure atualiza o ID

    UPDATE CONTROLE
    SET MAX_ID = @ID
    WHERE LETRA = @LETRA

     

     

    Abraços
    Tuesday, October 14, 2008 11:21 AM
  • Entretanto já consengui, se quiserem mostro o código..

    Neste momento, falta é fazer uma coisa..
    Como faço para formatar o valor do MAX_ID para ter 5 digitos sempre..
    Por exemplo, 00001, 00002, 00192, etc...
    Tuesday, October 14, 2008 1:59 PM
  • Ola ..

     

    faz da seguinte maneira

     

    Code Snippet
    declare @Var int
    set @Var = 1
    print right(replicate('0',5) + casT(@Var as varchar),5)

     

     

     

    Abraços
    Tuesday, October 14, 2008 2:11 PM
  • Funcionou..Não existe nada parecido com o format do VB?
    Obrigado a todos problema resolvido..

    -- The End --
    Tuesday, October 14, 2008 2:30 PM