SUGESTÃO

SMZTODOPODEROSO 21/03/2025 14:36:31
#504878
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
NILSONTRES 21/03/2025 16:54:34
#504879
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
SMZTODOPODEROSO 21/03/2025 17:32:56
#504880

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


KERPLUNK 21/03/2025 17:42:41
#504881
Resposta escolhida
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.
SMZTODOPODEROSO 22/03/2025 06:03:38
#504882
ok, já percebi a sua lógica, faz sentido
Vou prosseguir assim
Obrigado
Tópico encerrado , respostas não são mais permitidas