Campo di testo o numerico:un semplice metodo SQL per cambiare tipo di dati
Di recente ho lavorato a un progetto in cui il nostro cliente vende un prodotto negli Stati Uniti basato su Access con SQL Server, funziona importando i dati in SQL e quindi analizzandoli con i report di Access. Sfortunatamente ogni cliente può avere un formato di chiave primaria come un intero lungo e altri in cui è una stringa (combinazione di numeri e stringhe), abbiamo scoperto rapidamente che causava problemi con l'ordinamento non corretto dei rapporti. I report sono stati progettati tenendo conto dei numeri interi e le stringhe hanno incasinato l'ordine. Dovevamo trovare una soluzione che non richiedesse l'aggiunta di codice al nostro frontend di Access per gestire il problema, ma piuttosto utilizzare la potenza di SQL Server per fornire i dati indipendentemente dal formato utilizzato sulla chiave primaria.
Viste in soccorso
Una cosa interessante sul collegamento di viste e tabelle di SQL Server in Access:puoi dare loro qualsiasi nome desideri. L'ho sfruttato dall'origine della tabella collegata con una vista se la chiave primaria è una stringa o l'ho lasciata come tabella originale se era un numero intero. Avere gli stessi nomi di tabella in Access indipendentemente dall'origine significava non dover modificare il mio codice.
Gestiamo i collegamenti utilizzando una tabella di SQL Server
Juan ha scritto sul blog sulla guida del collegamento delle tabelle da SQL Server, in cui utilizziamo il codice per leggere i record in una tabella chiamata tblTablePermissions per creare i collegamenti nel nostro frontend di Access utilizzando il codice VBA. Di solito ci colleghiamo solo all'inizio del progetto o quando una nuova tabella viene aggiunta al server, ma per questo progetto dovevo fare un ulteriore passo avanti scambiando il nome della tabella con il nome della vista in tblTablePermissions se il client usa un stringa per la chiave primaria.
Ci sono due campi in tblTablePermissions, uno chiamato Table_Name e un altro chiamato AccessName, il nostro codice usa il primo per sapere quale tabella o vista usare come origine e il secondo per il nome della tabella in Access. Tutto quello che ho fatto è stato creare un semplice script che il mio cliente può eseguire per scambiare i nomi delle tabelle con i nomi delle viste per ogni installazione che ne aveva bisogno.
Ecco lo script che ho usato:
--Update tblTablePermissions For Numeric Type Code--
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ELIMINA DA [dbo].[tblTablePermissions]
WHERE [Table_Name] =('tablename1')
o [Table_Name] =('tablename2')
o [Table_Name] =('tablename3' )
VAI
IINSERT INTO [dbo].[tblTablePermissions] ([Table_Name], [Access_Name], [IndexedColumns], [UserSelect], [UserInsert], [UserUpdate], [UserDelete])
VALORI ('vw_tablename1', 'tablename1', ”, 'True', 'True', 'True', 'True'),
('vw_tablename2', 'tablename2', 'field1,field2,field3 ', 'True', 'True', 'True', 'True'),
('vw_tablename3', 'tablename3', 'field1,field2', 'True', 'True', 'True', 'Vero')
VAI
Nel mio script sopra elimino prima le tabelle da tblTablePermissions che desidero scambiare con le viste e quindi utilizzo un'istruzione di inserimento per aggiungere le viste che sostituiranno le tabelle, notare che i nomi delle viste sono diversi ma il campo Access_Name è lo stesso del quelli eliminati, consentendo al mio codice di accesso di funzionare indipendentemente dal tipo di campo della chiave primaria utilizzato.
Come ho usato CAST per tradurre la chiave primaria
Nelle viste ho usato la funzione CAST per convertire il campo Tipo da una stringa in un numero intero:
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
Il nostro cliente può ora configurare facilmente ogni installazione in base ai dati del cliente!