INTRODUCCIÓN
Hace algún tiempo, recibí el encargo de analizar la necesidad de eliminar un almacén que se había creado durante una implantación. El cliente ya no quería utilizar el almacén definido. Pero, por desgracia, como se había utilizado para algunas transacciones de prueba, no se podía eliminar (debido a la integridad referencial obvia) a pesar de que estaba "vacío" hasta donde podía ver el usuario.
De entrada, se puede ver que esta petición es mucho más compleja de lo que el cliente había solicitado. En este caso, no sólo tenemos que eliminar este almacén, sino que para hacerlo, también debemos hacer lo siguiente:
- Eliminar algunos de los hijos del almacén (por ejemplo, ubicaciones de almacén) que ya no son necesarios;
- Actualizar algunas de las tablas que utilizan el almacén como clave externa (algunas filas transaccionales) para sustituir el ID del almacén por otro ID de almacén para simular el hecho de que el ID del almacén nunca fue "transaccionado";
- Agregue algunas tablas estadísticas utilizando el almacén como parte de la clave primaria para simular que el ID de almacén nunca se utilizó en dichos cálculos estadísticos (como Cantidad total disponible por artículo/almacén). Ahora bien, esto podría necesitar una solución diferente para tablas diferentes, pero al menos permitiría que el ID de almacén desapareciera sin causar daños (por ejemplo, un Qty On Hand sobrante debe añadirse a otro almacén).
Además, puede observar que este proceso requiere que seleccionemos otro almacén que se convertirá en el objetivo o beneficiario de nuestras actualizaciones cuando sea necesario. En este caso, el almacén SiteID a eliminar era el 36 y su destino el 4.
Ahora bien, aunque la estructura de la base de datos le resulte familiar, no es tarea fácil encontrar todas las referencias al valor del almacén, aunque conozca (o crea conocer) todas las tablas. Por lo tanto, para ahorrar tiempo buscando las filas, decidí crear una consulta SQL dinámica que me ayudara a encontrar cualquier campo con un patrón de nombre determinado(SiteID es el valor del campo interno del almacén) y con un valor dado (36). Ahora bien, este script no es puramente un script de Acumatica, per se. Esto se debe a la nomenclatura natural y estandarizada de tablas/campos de Acumatica; se hace posible utilizar el tipo de script.
En primer lugar, tenemos que encontrar todas las tablas que tengan un SiteID. Obviamente, en algunos casos, el campo podría llamarse OriginSiteID o DestSiteID, pero se entiende la idea.
Buscar el campo en todas las tablas
GIST: https://gist.github.com/ste-bel/d37daa37915b6ec35f6bbb84e9bb5965
Aquí hay una captura de pantalla de los resultados (parciales) después de ejecutar el script anterior:
A continuación, quería construir una consulta dinámica que buscara todas las filas de todas las tablas que he encontrado en el resultado anterior. Utilizando esta consulta, quería generar scripts de actualización y eliminación para cada tabla y campo.
Declarar una tabla virtual y algunas variables
GIST: https://gist.github.com/ste-bel/b2e13aab2e6a5fe3fd0169e2dfb2c70d
Construir la consulta dinámica y generar scripts
GIST: https://gist.github.com/ste-bel/5c6609b2a6dee84b491b2b86d471e4c3
Por último, observe el resultado de los valores encontrados y los scripts de actualización/eliminación generados:
GIST: https://gist.github.com/ste-bel/2d4b5f3f6cf434d7fe1ad172d408c233
RESUMEN
Obviamente, no se trata de una solución rápida para lo que parece ser un problema sencillo. Sin embargo, creo que es una gran herramienta para consultores, ingenieros de soporte y desarrolladores para buscar datos problemáticos/sobrantes. También lo hemos utilizado con éxito con ScreenID, BOMID, InventoryID, CustomerID para solucionar todo tipo de problemas. Además, se puede utilizar para recodificar claves primarias utilizadas por claves externas que eran estrictamente cadenas sin una clave entera subyacente (como ShipVia, TermsID).
A lo largo de los años me ha salvado la vida en varias ocasiones. Espero que a usted también le resulte útil y le ahorre a usted y a sus colegas mucho tiempo y esfuerzo en el futuro.
¡Feliz codificación!