Où se trouvent ces données ?

Stéphane Bélanger | 5 mai 2021

Où se trouvent ces données ?

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 :

Où se trouvent ces données ?

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

Où se trouvent ces données ?

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 !

Auteur du blog

La carrière de Stéphane, qui s'étend sur plus de 25 ans, a débuté en tant que développeur ERP sur un langage 4GL appelé Miracle. Après quelques années, il a été envoyé à Philadelphie pour travailler avec Weyerhaeuser pour un contrat de 10 jours qui a duré 4 ans, où il a contribué à la réingénierie des modules Transport et EDI. Il a créé, entre autres, près d'une douzaine de nouvelles transactions EDI. Il s'est ensuite aventuré dans le désert des personnalisations et du middleware Java à la recherche de son Graal ERP. En 2016, il a été engagé par le studio de jeux vidéo Behaviour Interactive où il a sélectionné, implémenté et intégré un ERP avec d'autres applications cloud. Quel ERP ? Acumatica bien sûr. En 2018, il a décidé de revenir à ses racines en tant que développeur ERP et a commencé à travailler pour des partenaires Acumatica Gold de premier plan afin de partager ses connaissances, sa passion et ses idées. Depuis, il n'a cessé d'être heureux.

Recevez les mises à jour du blog dans votre boîte de réception.