Campo de texto o numérico:un método SQL simple para cambiar el tipo de datos
Recientemente trabajé en un proyecto en el que nuestro cliente vende un producto en todo EE. UU. basado en Access con SQL Server, funciona importando datos en SQL y luego analizándolos con informes de Access. Desafortunadamente, cada cliente puede tener un formato de clave principal como un número entero largo y otros donde es una cadena (combinación de números y cadenas), descubrimos rápidamente que causaba problemas con los informes que no se ordenaban correctamente. Los informes se diseñaron con números enteros en mente y las cadenas desordenaron el orden. Necesitábamos encontrar una solución que no requiriera agregar código a nuestra interfaz de Access para manejar el problema, sino usar el poder de SQL Server para entregar los datos sin importar el formato usado en la clave principal.
Vistas al rescate
Una cosa interesante acerca de vincular vistas y tablas de SQL Server en Access:puede darles el nombre que desee. Lo aproveché por la fuente de la tabla vinculada con una vista si la clave principal es una cadena o la dejé como la tabla original si era un número entero. Tener los mismos nombres de tabla en Access, independientemente de la fuente, significaba no tener que cambiar mi código.
Impulsamos la vinculación mediante una tabla de SQL Server
Juan ha escrito en su blog sobre la conducción de enlaces de tablas desde SQL Server, donde usamos código para leer registros en una tabla llamada tblTablePermissions para crear los enlaces en nuestra interfaz de Access usando código VBA. Por lo general, vinculamos solo al comienzo del proyecto o cuando se agrega una nueva tabla al servidor, pero para este proyecto necesitaba ir un paso más allá intercambiando el nombre de la tabla con el nombre de la vista en tblTablePermissions si el cliente usa un cadena para la clave principal.
Hay dos campos en tblTablePermissions, uno llamado Table_Name y otro llamado AccessName, nuestro código usa el primero para saber qué tabla o vista usar como fuente y el segundo para el nombre de la tabla en Access. Todo lo que hice fue crear un script simple que mi cliente puede ejecutar para intercambiar los nombres de las tablas con los nombres de las vistas para cada instalación que lo necesite.
Este es el script que usé:
--Update tblTablePermissions For Numeric Type Code--
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DELETE FROM [dbo].[tblTablePermissions]
WHERE [Table_Name] =('tablename1')
o [Table_Name] =('tablename2')
o [Table_Name] =('tablename3' )
IR
IINSERT INTO [dbo].[tblTablePermissions] ([Table_Name], [Access_Name], [IndexedColumns], [UserSelect], [UserInsert], [UserUpdate], [UserDelete])
VALORES ('vw_nombretabla1', 'nombretabla1', ”, 'Verdadero', 'Verdadero', 'Verdadero', 'Verdadero'),
('vw_nombretabla2', 'nombretabla2', 'campo1,campo2,campo3 ', 'Verdadero', 'Verdadero', 'Verdadero', 'Verdadero'),
('vw_nombretabla3', 'nombretabla3', 'campo1,campo2', 'Verdadero', 'Verdadero', 'Verdadero', 'Verdadero')
IR
En mi secuencia de comandos anterior, primero elimino las tablas de tblTablePermissions que deseo intercambiar con las vistas y luego uso una declaración de inserción para agregar las vistas que reemplazarán las tablas, observe que los nombres de las vistas son diferentes pero el campo Access_Name es el mismo que el eliminados, lo que permite que mi código de acceso funcione independientemente del tipo de campo de clave principal que se utilice.
Cómo usé CAST para traducir la clave principal
En las vistas utilicé la función CAST para convertir el campo Tipo de una cadena a un entero:
CREATE VIEW vw_tablename1
AS
SELECT RangeID,
UseFlagAsNeeded,
CAST(Type AS int) AS Type,
Line,
Ownership,
Include,
Public,
Limit,
RangeA,
RangeB,
RangeC,
SSMA_TimeStamp
FROM dbo.tablename1;
GO
¡Nuestro cliente ahora puede configurar fácilmente cada instalación en función de los datos del cliente!