L’INTRODUCTION
Il y a quelque temps, on m’a confié la tâche d’analyser l’exigence de supprimer un entrepôt qui avait été créé lors d’une implémentation. Le client ne voulait plus utiliser l’entrepôt défini. Mais malheureusement, parce qu’il avait été utilisé pour quelques transactions de test, il ne pouvait pas être supprimé (en raison de l’intégrité référentielle évidente) même s’il était « vide » pour autant que l’utilisateur pouvait voir.
Dès le départ, vous pouvez voir que cette demande est beaucoup plus complexe que ce que le client avait demandé. Dans ce cas, non seulement nous devons supprimer cet entrepôt, mais pour ce faire, nous devons également faire ce qui suit:
- Supprimer certains des enfants de l’entrepôt (par exemple, les emplacements d’entrepôt) qui ne sont plus nécessaires;
- Mettre à jour certaines des tables en utilisant l’entrepôt comme clé étrangère (certaines lignes transactionnelles) pour remplacer l’ID d’entrepôt par un autre ID d’entrepôt afin de simuler le fait que l’ID d’entrepôt n’a jamais été « transigé »;
- Agrégez certains tableaux statistiques en utilisant l’entrepôt dans le cadre de la clé primaire pour simuler que l’ID d’entrepôt n’a jamais été utilisé dans de tels calculs statistiques (tels que Total Qty On Hand par article / entrepôt). Maintenant, cela pourrait nécessiter une solution différente pour différentes tables, mais au moins cela permettrait à l’ID d’entrepôt de disparaître sans causer de dommages (par exemple, un reste de Qty On Hand doit être ajouté à un autre entrepôt).
En outre, vous remarquerez peut-être 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.
Maintenant, 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 savoir) toutes les tables. Par conséquent, afin de gagner du temps à rechercher les 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 de champ interne de l’entrepôt) et avec une valeur donnée (36). Maintenant, ce script n’est pas purement un script Acumatica, en soi. Cela est dû à la nomenclature de table / champ naturelle et normalisée d’Acumatica; il devient possible d’utiliser le type de script.
Tout d’abord, nous devons trouver toutes les tables ayant un SiteID. Évidemment, dans certains cas, le champ pourrait être nommé OriginSiteID ou DestSiteID, mais vous avez l’idée.
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, je voulais créer 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. En utilisant cette requête, je voulais générer des scripts de mise à jour et de suppression pour chaque table et champ.
Déclarer une table virtuelle et quelques variables
GIST : https://gist.github.com/ste-bel/b2e13aab2e6a5fe3fd0169e2dfb2c70d
Créez la requête dynamique et générez des scripts
GIST: https://gist.github.com/ste-bel/5c6609b2a6dee84b491b2b86d471e4c3
Enfin, examinez le résultat des valeurs trouvées et mettez à jour / supprimez les scripts générés:
GIST: https://gist.github.com/ste-bel/2d4b5f3f6cf434d7fe1ad172d408c233
RÉSUMÉ
Il ne s’agit évidemment pas simplement d’une solution rapide à ce qui semble être un problème simple. Cependant, je pense que c’est un excellent outil pour les consultants, les ingénieurs de support et les développeurs pour rechercher des 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 qui sont utilisées par des clés étrangères qui étaient strictement des chaînes sans clé entière sous-jacente (telles que ShipVia, TermsID).
Cela m’a sauvé la vie, si vous voulez, à plusieurs reprises au fil des ans. J’espère que vous le trouverez également utile, ce qui vous permettra, à vous et à vos collègues, d’économiser beaucoup de temps et d’efforts à l’avenir.
Bon codage!