SUGESTÃO
Preciso de uma ideia como fazer o seguinte
temos um campo id_registo que é auto increment
mas queria sempre que exista mudança do ano ele comece novamente do 1
por exemplo
1/2025
2/2025
3/2025
4/2025
...
Quando mudar para 2026
a contagem passava novamente a 1
1/2026
temos um campo id_registo que é auto increment
mas queria sempre que exista mudança do ano ele comece novamente do 1
por exemplo
1/2025
2/2025
3/2025
4/2025
...
Quando mudar para 2026
a contagem passava novamente a 1
1/2026
Esse caractere antes da barra seria o Mês ?.
Sua ID é uma string, um campo auto increment não pode ser string e nem repetido, crie uma id string, exemplo:
dim id as string= format(now,"M/yyyy")
resulta em 3/2025
Sua ID é uma string, um campo auto increment não pode ser string e nem repetido, crie uma id string, exemplo:
dim id as string= format(now,"M/yyyy")
resulta em 3/2025
Citação:Esse caractere antes da barra seria o Mês ?.Sua ID é uma string, um campo auto increment não pode ser string e nem repetido, crie uma id string, exemplo:dim id as string= format(now,"M/yyyy")resulta em 3/2025
Não. ou seja é a numeração automática / ano
Exemplo
https://www.imghippo.com/i/yo1819JFY.JPG
O que eu queria era o seguinte, o nrcantinaregisto (que é numeração automatica) quando chegasse a 1/1/2026 começasse do 1 a contagem. Dai eu colocar a “/2005” ou seja /ano
Qual banco de dados? Tem alguns que você poderia criar um tipo de dados customizado pra isso.
Gerei por ia, mas testei no SQL Server e funciona:
?? Objetivo
Criar um campo CustomID no formato 1/2025, 2/2025, ..., onde: ? O número antes da barra (/) começa em 1 e aumenta sequencialmente.
? A numeração reinicia a cada novo ano.
? O valor é gerado automaticamente, sem necessidade de inserção manual.
?? Passo 1: Criar a Tabela de Controle do Contador Anual
Essa tabela vai armazenar o último número usado para cada ano.
CREATE TABLE YearlyCounter (
Year INT PRIMARY KEY, -- Armazena o ano atual
LastNumber INT DEFAULT 0 -- Último número gerado para esse ano
);
?? O que essa tabela faz?
Mantém um único registro por ano.
Controla qual foi o último número gerado para evitar duplicações.
?? Passo 2: Criar a Tabela Principal
Agora criamos a tabela onde o campo CustomID será gerado.
CREATE TABLE MyTable (
CustomID VARCHAR(50) PRIMARY KEY, -- Chave primária no formato "1/2025"
SomeData NVARCHAR(100) -- Outros dados da tabela
);
?? Explicação:
CustomID será gerado automaticamente no formato <número>/<ano>.
SomeData representa outras informações que podem ser armazenadas na tabela.
?? Passo 3: Criar um Procedimento Armazenado para Gerar o CustomID
Esse stored procedure gerencia a lógica de auto-incremento.
CREATE PROCEDURE GetNextCustomID
@CustomID VARCHAR(50) OUTPUT
AS
BEGIN
DECLARE @Year INT = YEAR(GETDATE()); -- Obtém o ano atual
DECLARE @NextNumber INT;
-- Se o ano não existir na tabela, começa do zero
IF NOT EXISTS (SELECT 1 FROM YearlyCounter WHERE Year = @Year)
BEGIN
INSERT INTO YearlyCounter (Year, LastNumber) VALUES (@Year, 0);
END
-- Atualiza e obtém o próximo número sequencial
UPDATE YearlyCounter
SET LastNumber = LastNumber + 1
OUTPUT inserted.LastNumber INTO #TempTable
WHERE Year = @Year;
-- Recupera o valor atualizado
SELECT @NextNumber = LastNumber FROM YearlyCounter WHERE Year = @Year;
-- Monta o CustomID no formato "<número>/<ano>"
SET @CustomID = CAST(@NextNumber AS VARCHAR) + '/' + CAST(@Year AS VARCHAR);
END;
?? O que esse código faz?
? Verifica se já existe uma entrada para o ano atual.
? Se for um novo ano, adiciona uma entrada para ele.
? Atualiza o contador do ano e obtém o próximo número disponível.
? Gera o CustomID no formato correto (1/2025, 2/2025, etc.).
?? Passo 4: Criar um Trigger para Gerar o CustomID Automaticamente
Esse trigger preenche o campo CustomID automaticamente quando um novo registro for inserido.
CREATE TRIGGER trg_MyTable_Insert
ON MyTable
INSTEAD OF INSERT
AS
BEGIN
DECLARE @CustomID VARCHAR(50);
-- Chama o procedimento para gerar o próximo CustomID
EXEC GetNextCustomID @CustomID OUTPUT;
-- Insere os dados na tabela com o CustomID gerado
INSERT INTO MyTable (CustomID, SomeData)
SELECT @CustomID, SomeData FROM inserted;
END;
?? Explicação:
Quando alguém tenta inserir um novo registro, o trigger:
Chama o GetNextCustomID para gerar um novo identificador.
Usa esse identificador para inserir o registro automaticamente.
?? Agora, você não precisa mais se preocupar com o CustomID ao inserir dados!
?? Passo 5: Testando o Código
Agora, vamos testar o funcionamento do sistema inserindo alguns registros.
?? Inserindo novos registros
INSERT INTO MyTable (SomeData) VALUES ('Primeiro Registro');
INSERT INTO MyTable (SomeData) VALUES ('Segundo Registro');
INSERT INTO MyTable (SomeData) VALUES ('Terceiro Registro');
?? Visualizando os registros inseridos
SELECT * FROM MyTable;
?? Saída esperada
CustomID SomeData
1/2025 Primeiro Registro
2/2025 Segundo Registro
3/2025 Terceiro Registro
?? Passo 6: Testando o Reset Anual
Agora, vamos simular a virada do ano e testar o reset automático.
?? Inserindo um novo ano na tabela manualmente
(Apenas para teste, no uso real isso acontece automaticamente no trigger!)
INSERT INTO YearlyCounter (Year, LastNumber) VALUES (2026, 0);
?? Inserindo um novo registro em 2026
INSERT INTO MyTable (SomeData) VALUES ('Novo Ano Registro');
?? Visualizando os registros novamente
SELECT * FROM MyTable;
?? Saída esperada
CustomID SomeData
1/2025 Primeiro Registro
2/2025 Segundo Registro
3/2025 Terceiro Registro
1/2026 Novo Ano Registro
?? O contador foi resetado com sucesso no novo ano!
?? Benefícios dessa Solução
? Gerenciamento automático: O CustomID é gerado sem precisar ser inserido manualmente.
? Reinício anual: O contador reseta sempre que o ano muda.
? Escalável: Funciona bem mesmo com um alto volume de dados.
?? Conclusão
Agora você tem um sistema no SQL Server que:
Gera um ID no formato <número>/<ano> automaticamente.
Reinicia a contagem todo novo ano.
Funciona sem precisar alterar a estrutura da tabela.
Gerei por ia, mas testei no SQL Server e funciona:
?? Objetivo
Criar um campo CustomID no formato 1/2025, 2/2025, ..., onde: ? O número antes da barra (/) começa em 1 e aumenta sequencialmente.
? A numeração reinicia a cada novo ano.
? O valor é gerado automaticamente, sem necessidade de inserção manual.
?? Passo 1: Criar a Tabela de Controle do Contador Anual
Essa tabela vai armazenar o último número usado para cada ano.
CREATE TABLE YearlyCounter (
Year INT PRIMARY KEY, -- Armazena o ano atual
LastNumber INT DEFAULT 0 -- Último número gerado para esse ano
);
?? O que essa tabela faz?
Mantém um único registro por ano.
Controla qual foi o último número gerado para evitar duplicações.
?? Passo 2: Criar a Tabela Principal
Agora criamos a tabela onde o campo CustomID será gerado.
CREATE TABLE MyTable (
CustomID VARCHAR(50) PRIMARY KEY, -- Chave primária no formato "1/2025"
SomeData NVARCHAR(100) -- Outros dados da tabela
);
?? Explicação:
CustomID será gerado automaticamente no formato <número>/<ano>.
SomeData representa outras informações que podem ser armazenadas na tabela.
?? Passo 3: Criar um Procedimento Armazenado para Gerar o CustomID
Esse stored procedure gerencia a lógica de auto-incremento.
CREATE PROCEDURE GetNextCustomID
@CustomID VARCHAR(50) OUTPUT
AS
BEGIN
DECLARE @Year INT = YEAR(GETDATE()); -- Obtém o ano atual
DECLARE @NextNumber INT;
-- Se o ano não existir na tabela, começa do zero
IF NOT EXISTS (SELECT 1 FROM YearlyCounter WHERE Year = @Year)
BEGIN
INSERT INTO YearlyCounter (Year, LastNumber) VALUES (@Year, 0);
END
-- Atualiza e obtém o próximo número sequencial
UPDATE YearlyCounter
SET LastNumber = LastNumber + 1
OUTPUT inserted.LastNumber INTO #TempTable
WHERE Year = @Year;
-- Recupera o valor atualizado
SELECT @NextNumber = LastNumber FROM YearlyCounter WHERE Year = @Year;
-- Monta o CustomID no formato "<número>/<ano>"
SET @CustomID = CAST(@NextNumber AS VARCHAR) + '/' + CAST(@Year AS VARCHAR);
END;
?? O que esse código faz?
? Verifica se já existe uma entrada para o ano atual.
? Se for um novo ano, adiciona uma entrada para ele.
? Atualiza o contador do ano e obtém o próximo número disponível.
? Gera o CustomID no formato correto (1/2025, 2/2025, etc.).
?? Passo 4: Criar um Trigger para Gerar o CustomID Automaticamente
Esse trigger preenche o campo CustomID automaticamente quando um novo registro for inserido.
CREATE TRIGGER trg_MyTable_Insert
ON MyTable
INSTEAD OF INSERT
AS
BEGIN
DECLARE @CustomID VARCHAR(50);
-- Chama o procedimento para gerar o próximo CustomID
EXEC GetNextCustomID @CustomID OUTPUT;
-- Insere os dados na tabela com o CustomID gerado
INSERT INTO MyTable (CustomID, SomeData)
SELECT @CustomID, SomeData FROM inserted;
END;
?? Explicação:
Quando alguém tenta inserir um novo registro, o trigger:
Chama o GetNextCustomID para gerar um novo identificador.
Usa esse identificador para inserir o registro automaticamente.
?? Agora, você não precisa mais se preocupar com o CustomID ao inserir dados!
?? Passo 5: Testando o Código
Agora, vamos testar o funcionamento do sistema inserindo alguns registros.
?? Inserindo novos registros
INSERT INTO MyTable (SomeData) VALUES ('Primeiro Registro');
INSERT INTO MyTable (SomeData) VALUES ('Segundo Registro');
INSERT INTO MyTable (SomeData) VALUES ('Terceiro Registro');
?? Visualizando os registros inseridos
SELECT * FROM MyTable;
?? Saída esperada
CustomID SomeData
1/2025 Primeiro Registro
2/2025 Segundo Registro
3/2025 Terceiro Registro
?? Passo 6: Testando o Reset Anual
Agora, vamos simular a virada do ano e testar o reset automático.
?? Inserindo um novo ano na tabela manualmente
(Apenas para teste, no uso real isso acontece automaticamente no trigger!)
INSERT INTO YearlyCounter (Year, LastNumber) VALUES (2026, 0);
?? Inserindo um novo registro em 2026
INSERT INTO MyTable (SomeData) VALUES ('Novo Ano Registro');
?? Visualizando os registros novamente
SELECT * FROM MyTable;
?? Saída esperada
CustomID SomeData
1/2025 Primeiro Registro
2/2025 Segundo Registro
3/2025 Terceiro Registro
1/2026 Novo Ano Registro
?? O contador foi resetado com sucesso no novo ano!
?? Benefícios dessa Solução
? Gerenciamento automático: O CustomID é gerado sem precisar ser inserido manualmente.
? Reinício anual: O contador reseta sempre que o ano muda.
? Escalável: Funciona bem mesmo com um alto volume de dados.
?? Conclusão
Agora você tem um sistema no SQL Server que:
Gera um ID no formato <número>/<ano> automaticamente.
Reinicia a contagem todo novo ano.
Funciona sem precisar alterar a estrutura da tabela.
ok, já percebi a sua lógica, faz sentido
Vou prosseguir assim
Obrigado
Vou prosseguir assim
Obrigado
Tópico encerrado , respostas não são mais permitidas