INTRODUCTION
Il y a quelque temps, j'ai été chargé d'analyser la nécessité de supprimer un entrepôt qui avait été créé au cours d'une mise en œuvre. Le client ne voulait plus utiliser l'entrepôt défini. Malheureusement, comme il avait été utilisé pour quelques transactions de test, il ne pouvait pas être supprimé (pour des raisons évidentes d'intégrité référentielle), même s'il était "vide" à la vue de l'utilisateur.
D'emblée, on constate que cette demande est beaucoup plus complexe que celle du client. Dans ce cas, nous devons non seulement supprimer cet entrepôt, mais aussi effectuer les opérations suivantes :
- Supprimer certains des enfants de l'entrepôt (par exemple, les emplacements d'entrepôt) qui ne sont plus nécessaires ;
- Mettre à jour certaines tables utilisant l'entrepôt comme clé étrangère (certaines lignes transactionnelles) pour remplacer l'ID de l'entrepôt par un autre ID de l'entrepôt afin de simuler le fait que l'ID de l'entrepôt n'a jamais fait l'objet d'une "transaction" ;
- Agréger certains tableaux statistiques en utilisant l'entrepôt comme clé primaire pour simuler que l'ID de l'entrepôt n'a jamais été utilisé dans de tels calculs statistiques (tels que la quantité totale en stock par article/entrepôt). Cela pourrait nécessiter une solution différente pour les différentes tables, mais au moins cela permettrait à l'ID de l'entrepôt de disparaître sans causer de dommages (par exemple, un reliquat de QM doit être ajouté à un autre entrepôt).
Vous remarquerez également que ce processus nous oblige à sélectionner un autre entrepôt qui deviendra la cible ou le bénéficiaire de nos mises à jour en cas de besoin. Dans ce cas, le SiteID de l 'entrepôt à supprimer était 36 et sa cible était 4.
Même si la structure de la base de données vous est familière, il n'est pas nécessairement facile de trouver toutes les références à la valeur de l'entrepôt, même si vous connaissez (ou pensez connaître) toutes les tables. Par conséquent, afin de gagner du temps dans la recherche des lignes, j'ai décidé de créer une requête SQL dynamique qui m'aiderait à trouver n'importe quel champ avec un certain modèle de nom(SiteID est la valeur du champ interne de l'entrepôt) et avec une valeur donnée (36). Ce script n'est pas un script Acumatica à proprement parler. En effet, grâce à la nomenclature naturelle et standardisée des tables et des champs d'Acumatica, il est possible d'utiliser ce type de script.
Tout d'abord, nous devons trouver toutes les tables ayant un SiteID. Évidemment, dans certains cas, le champ pourrait s'appeler OriginSiteID ou DestSiteID, mais vous voyez ce que je veux dire.
Trouver le champ dans toutes les tables
GIST : https://gist.github.com/ste-bel/d37daa37915b6ec35f6bbb84e9bb5965
Voici une capture d'écran des résultats (partiels) après l'exécution du script ci-dessus :
Ensuite, j'ai voulu construire une requête dynamique qui rechercherait toutes les lignes de toutes les tables que j'ai trouvées dans le résultat précédent. À l'aide de cette requête, je voulais générer des scripts de mise à jour et de suppression pour chaque table et chaque champ.
Déclarer une table virtuelle et quelques variables
GIST : https://gist.github.com/ste-bel/b2e13aab2e6a5fe3fd0169e2dfb2c70d
Construire la requête dynamique et générer des scripts
GIST : https://gist.github.com/ste-bel/5c6609b2a6dee84b491b2b86d471e4c3
Enfin, examinez le résultat des valeurs trouvées et des scripts de mise à jour/suppression générés :
GIST : https://gist.github.com/ste-bel/2d4b5f3f6cf434d7fe1ad172d408c233
RÉSUMÉ
Il est évident qu'il ne s'agit pas d'une solution rapide à ce qui semble être un problème simple. Cependant, je pense qu'il s'agit d'un excellent outil pour les consultants, les ingénieurs d'assistance et les développeurs pour rechercher les données problématiques/restantes . Nous l'avons également utilisé avec succès avec ScreenID, BOMID, InventoryID, CustomerID pour résoudre toutes sortes de problèmes. En outre, il peut être utilisé pour recoder les clés primaires utilisées par les clés étrangères qui étaient strictement des chaînes sans clé entière sous-jacente (telles que ShipVia, TermsID).
Il m'a sauvé la vie, si l'on peut dire, à plusieurs reprises au fil des ans. J'espère qu'il vous sera également utile et qu'il vous permettra, à vous et à vos collègues, d'économiser beaucoup de temps et d'efforts à l'avenir.
Bon codage !