Bonjour,
J'ai crée dans mon entreprise un Workflow pour la création, modification et suppression de produit de l'usine.
Quand une fiche article est clôturée celle-ci va mettre automatiquement à jour des tables d'une autre BDD (JOB SQL tournant tous les jours la nuit).
A savoir que la BDD pour le Workflow et celui permettant de stocker les données articles sont sur le même serveur SQL Server 2005.
Mon application et mes PS avec mes JOB SQL fonctionnent très bien, mais voilà je dois apporter une modification à mon JOB de mise à jour automatique des données articles afin qu'il soit plus souple.
Si j'ai une modification article je dois historiser les données article avant ma mise à jour automatique. Puis mettre à jour les informations de l'article modifié.
Actuellement, je duplique avec des requêtes SQL du genre =>
A cette étape je en sélectionne pas ma colonne auto-incrémentée (Identity) et j'ajoute dans mon SELECT pour la date de suppression un "CURRENT_TIMESTAMP".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 INSERT INTO BDDArticle.dbo.maTable(cln_01, cln_02, date_suppression, ...) SELECT cln_01, cln_02, CURRENT_TIMESTAMP, ... FROM BDDArticle.dbo.maTable WHERE id_article = yyyy;
En gros les historiques ont un ID plus fort dans la table que les données de l'article en vigueur.
Si j'aurais mis une date de suppression pour l'article modifié et ensuite ajouté les nouvelles données j'aurais eu un ID différent et cela aurait posé problème pour d'autres applications pour le service Qualité, Production, Magasin, ... Au niveau des paramètres et des stats.
Je ne sais pas si j'ai bien été clair sur ce point particulier ?
Ensuite j'exécute une requête SQL me permettant de mettre à jour l'article (celui avec l'ID le plus faible de la table).
Ma question, c'est que je sélectionne les colonnes par leur nom en omettant l'ID de l'occurrence car Identity et je rentre manuellement la date de suppression.
Seulement il se trouve que certaines tables servant de destination utilisé par mon Workflow peuvent-être modifiée sur leur structure. Le problème c'est que je dois absolument historiser la ligne entière en cas de modification article.
L'idéal serait de faire =>
Mais voilà la contrainte sur la colonne qui a Identity n'apprécie pas bien ce genre de chose. De plus, je ne peux pas renseigner manuellement la date de suppression.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 INSERT INTO BDDArticle.dbo.maTable SELECT * FROM BDDArticle.dbo.maTable WHERE id_article = yyyy;
L'idée que j'ai commencé à faire est de créer une table temporaire =>
Mais voilà je dois préciser dans l'instruction "INSERT INTO" les noms des colonnes de destination.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SELECT * INTO #tmp FROM BDDArticle.dbo.maTable WHERE id_article = yyyy; UPDATE #tmp SET date_suppression = CURRENT_TIMESTAMP; ALTER TABLE #tmp DROP COLUMN id; INSERT INTO BDDArticle.dbo.maTable(cln_02, cln_03, cln_04, ...) SELECT * FROM BDDArticle.dbo.maTable;
J'ai imaginé un cas comme celui-là après mon "DROP COLUMN" =>
J'ai pas eu le temps de tester avant de partir, car j'ai cherché sur le net et sur les articles de ce site et j'ai pas trouvé une situation similaire à la mienne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 INSERT INTO BDDArticle.dbo.maTable SELECT Identity(), * FROM BDDArticle.dbo.maTable;
L'une des soluce que je vois est d'utiliser les requêtes dynamiques. Je récupère toutes les colonnes de "BDDArticle.dbo.maTable" en excluant celle de "ID" dans le "WHERE" de la vue système. Ensuite =>
Sinon l'autre idée et de désactiver temporairement l'Identity puis de le réactiver en générant mes ID entre-temps, mais bon je trouve ça cra cra perso.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 DECLARE @colonnes NVARCHAR(1000) DECLARE @var NVARCHAR(1000) -- -- Traitement pour parcourir colonnes de la "BDDArticle.dbo.maTable" et de concaténer les résultats dans "@colonnes" -- SET @var = 'INSERT INTO BDDArticle.dbo.maTable(' + @colonnes + ') SELECT * FROM BDDArticle.dbo.maTable;' exec sp_execute(@var);
Auriez-vous d'autres propositions ou des avis ?
Merci d'avance pour votre aide.
Partager