Текстово или числово поле – прост SQL метод за превключване на типа данни
Наскоро работих по проект, при който нашият клиент продава продукт в САЩ, изграден върху Access със SQL Server, той работи чрез импортиране на данни в SQL и след това ги анализира с отчети на Access. За съжаление всеки клиент може да има формат на първичен ключ като дълго цяло число, а други, където това е низ (комбинация от числа и низове), бързо открихме, че причинява проблеми с неправилното сортиране на отчетите. Отчетите бяха проектирани с цели числа и низовете объркаха реда. Трябваше да измислим решение, което не изисква добавяне на код към нашия интерфейс на Access, за да се справим с проблема, а по-скоро да използваме силата на SQL Server за обслужване на данните, независимо от формата, използван в първичния ключ.
Изгледи за спасяване
Едно хубаво нещо за свързването на изгледи и таблици на SQL Server в Access:Можете да им дадете всяко име, което желаете. Използвах го чрез източника на свързаната таблица с изглед, ако първичният ключ е низ, или го оставих като оригиналната таблица, ако беше цяло число. Да имам еднакви имена на таблици в Access, независимо от източника, означаваше, че не трябва да променям кода си.
Ние управляваме свързване с помощта на таблица на SQL Server
Хуан е писал в блог за управление на свързването на таблици от SQL Server, където използваме код за четене на записи в таблица, наречена tblTablePermissions, за да създадем връзките в нашия интерфейс на Access с помощта на VBA код. Обикновено свързваме само в началото на проекта или когато се добави нова таблица към сървъра, но за този проект трябваше да направя крачка напред, като сменя името на таблицата с името на изгледа в tblTablePermissions, ако клиентът използва низ за първичен ключ.
Има две полета в tblTablePermissions, едното се нарича Table_Name и друго, наречено AccessName, нашият код използва първото, за да знае коя таблица или изглед да използва като източник, а второто за името на таблицата в Access. Всичко, което направих, беше да създам прост скрипт, който моят клиент може да изпълни, за да смени имената на таблиците с имената на изгледи за всяка инсталация, която се нуждае от това.
Ето скрипта, който използвах:
--Update tblTablePermissions For Numeric Type Code--
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DELETE FROM [dbo].[tblTablePermissions]
WHERE [Table_Name] =('tablename1')
или [Table_Name] =('tablename2')
или [Table_Name] =('tablename3') )
ОТИДИ
IINSERT INTO [dbo].[tblTablePermissions] ([Table_Name], [Access_Name], [IndexedColumns], [UserSelect], [UserInsert], [UserUpdate], [UserDelete])
СТОЙНОСТИ ('vw_tablename1', 'tablename1', 'True', 'True', 'True', 'True'),
('vw_tablename2', 'tablename2', 'field1,field2,field3 ', 'Вярно', 'Вярно', 'Вярно', 'Вярно'),
('vw_tablename3', 'tablename3', 'поле1,поле2', 'Вярно', 'Вярно', 'Вярно', „Вярно“)
GO
В моя скрипт по-горе първо изтривам таблиците от tblTablePermissions, които искам да разменя с изгледи и след това използвам израз за вмъкване, за да добавя изгледите, които ще заменят таблиците, забележете, че имената на изгледите са различни, но полето Access_Name е същото като изтрити, което позволява на моя код за достъп да работи независимо от това кой тип поле на първичен ключ се използва.
Как използвах CAST за превод на първичния ключ
В изгледите използвах функцията CAST за преобразуване на полето Type от низ в цяло число:
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
Нашият клиент вече може лесно да конфигурира всяка инсталация въз основа на данните на клиента!