Je développe un système qui gère les ordres de travail pour les véhicules. L'ID des ordres de travail est composé comme suit: OT-001-16
.Réinitialiser le compteur d'ID sur une procédure stockée dans SQL Server
Où OT-
est une chaîne, 001
est le compteur, suivi par -
caractère et enfin le nombre 16
est l'année en cours.
Exemple:
Si l'année en cours est 2018, l'ID devrait être OT-001-18
.
Le problème est lorsque l'année change, le compteur doit redémarrer de 001
. J'ai une procédure stockée pour le faire, mais je pense que je fais beaucoup plus de travail.
Ceci est mon code de procédure stockée:
CREATE PROCEDURE ot (@name varchar(100), @area varchar(100), @idate varchar(100), @edate varchar(100))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @aux varchar(100);
DECLARE @aux2 varchar(100);
DECLARE @aux3 int;
DECLARE @aux4 varchar(100);
SELECT @aux = id_workorder FROM idaux;
IF (@aux IS NULL)
SET @aux = CONCAT('OT-000-', RIGHT(YEAR(GETDATE()), 2));
SET
@aux2 = SUBSTRING(
@aux, CHARINDEX('-', @aux) + 1,
LEN(@aux) - CHARINDEX('-', @aux) - CHARINDEX('-', REVERSE(@aux)));
SET @aux3 = CAST(@aux2 AS int) + 1;
SET @aux4 = @aux3;
IF @aux3 < 1000
IF @aux3 >= 10
SET @aux4 = CONCAT('0', @aux4);
ELSE
SET @aux4 = CONCAT('00', @aux4);
ELSE
SET @aux4 = @aux4;
DECLARE @f varchar(100);
DECLARE @y varchar(50);
SELECT TOP 1
@y = id_workorder
FROM workorder
WHERE (RIGHT(id_workorder, 2)) = (RIGHT(YEAR(GETDATE()), 2))
ORDER BY id_workorder DESC;
DECLARE @yy varchar(10);
SET
@yy = RIGHT(@y, 2);
DECLARE @yn varchar(10);
SET
@yn = RIGHT(YEAR(GETDATE()), 2);
BEGIN
IF @yn = @yy
BEGIN
DECLARE @laux varchar(20)
SET @f = 'OT-' + @aux4 + '-' + RIGHT(YEAR(GETDATE()), 2);
INSERT INTO workorder (id_workorder, name, area, initial_date, end_date)
VALUES (@f, @name, @area, @idate, @edate);
SELECT
@laux = id_workorder
FROM idaux
IF (@laux IS NULL)
BEGIN
INSERT idaux (id_workorder) VALUES (@f);
END
ELSE
BEGIN
UPDATE idaux SET id_workorder = @f;
END
END
ELSE
BEGIN
SET @f = CONCAT('OT-001-', (RIGHT(YEAR(GETDATE()), 2)));
INSERT INTO workorder (id_workorder, name, area, initial_date, end_date)
VALUES (@f, @name, @area, @idate, @edate);
SELECT @laux = id_workorder FROM idaux;
IF (@laux IS NULL)
BEGIN
INSERT idaux (id_workorder) VALUES (@f);
END
ELSE
BEGIN
UPDATE idaux SET id_workorder = @f;
END
END
END
END
Fondamentalement, je crée une table Auxiliar pour enregistrer le dernier ordre de travail ID, puis de ce tableau appelé idaux
i prendre l'ID et i par rapport à la nouvelle ID possible par une manipulation de chaîne. Ensuite, si l'année du dernier ID enregistré est égale à l'année en cours, le compteur augmente, sinon le compteur est remis à 001, le nouvel ID est mis à jour dans la table auxiliaire et le Work Order est inséré dans la table workorder
.
Ma procédure stockée fonctionne, mais j'ai besoin de votre aide pour optimiser la procédure stockée. Toute question sur les commentaires.
Puis-je me renseigner sur la configuration de la table où cet 'ID' est stocké? Je comprends que vous voulez montrer l'identification complète comme OT-001-18. Pourtant, ce ne serait pas pratique de stocker comme tel dans un tableau. Je préfère enregistrer dans une colonne l'année comme un «int» et dans une autre colonne le compteur pour cette année comme un «int» et ensuite (éventuellement) créer une colonne calculée (peut-être même «persistante») qui crée automatiquement le plein ID. Bien sûr, une contrainte unique sur les deux colonnes devrait également être ajoutée. En fonction de la configuration de la base de données, la procédure pourrait être mieux optimisée. – Ralph