Usuário com melhor resposta
Chave Alfanumérica

Pergunta
-
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..
Respostas
-
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 SnippetTB_CONTROLE_ID
Letra | Max_ID
'M' | 28
'N' | 72Na 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
-
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) -
Todas as Respostas
-
-
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... -
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 SnippetTB_CONTROLE_ID
Letra | Max_ID
'M' | 28
'N' | 72Na 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
-
-
-
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) -
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... -
-
-
-
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())
ENDSELECT @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 -
-
-