Pole tekstowe lub numeryczne — prosta metoda SQL do zmiany typu danych
Niedawno pracowałem nad projektem, w którym nasz klient sprzedaje w USA produkt zbudowany na Access z SQL Server, działa poprzez importowanie danych do SQL, a następnie analizowanie ich za pomocą raportów Access. Niestety każdy klient może mieć format klucza podstawowego jako długą liczbę całkowitą, a inne, w których jest to ciąg (połączenie liczb i ciągów), szybko odkryliśmy, że powoduje to problemy z niepoprawnym sortowaniem raportów. Raporty zostały zaprojektowane z myślą o liczbach całkowitych, a ciągi znaków popsuły kolejność. Musieliśmy wymyślić rozwiązanie, które nie wymagało dodawania kodu do naszego frontendu Access w celu rozwiązania problemu, ale raczej wykorzystywało moc SQL Server do obsługi danych niezależnie od formatu używanego w kluczu podstawowym.
Poglądy na ratunek
Jedna fajna rzecz dotycząca łączenia widoków i tabel SQL Server w programie Access:możesz nadać im dowolną nazwę. Wykorzystałem go przez źródło połączonej tabeli z widokiem, jeśli klucz podstawowy jest ciągiem lub pozostawiłem go jako oryginalną tabelę, jeśli była to liczba całkowita. Posiadanie tych samych nazw tabel w programie Access niezależnie od źródła oznaczało brak konieczności zmiany kodu.
Napędzamy łączenie za pomocą tabeli SQL Server
Juan pisał na blogu o sterowaniu łączeniem tabel z SQL Server, w którym używamy kodu do odczytywania rekordów w tabeli o nazwie tblTablePermissions, aby utworzyć łącza w naszym interfejsie dostępu za pomocą kodu VBA. Zwykle łączymy się tylko na początku projektu lub gdy do serwera dodawana jest nowa tabela, ale w tym projekcie musiałem pójść o krok dalej, zamieniając nazwę tabeli z nazwą widoku w tblTablePermissions, jeśli klient używa ciąg dla klucza podstawowego.
W tabeli tblTablePermissions znajdują się dwa pola, jedno o nazwie Nazwa_tabeli, a drugie o nazwie Nazwa dostępu. Nasz kod używa tego pierwszego, aby wiedzieć, której tabeli lub widoku użyć jako źródła, a drugiego jako nazwy tabeli w programie Access. Wszystko, co zrobiłem, to stworzenie prostego skryptu, który mój klient może uruchomić, aby zamienić nazwy tabel na nazwy widoków dla każdej instalacji, która tego potrzebowała.
Oto skrypt, którego użyłem:
--Update tblTablePermissions For Numeric Type Code--
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DELETE FROM [dbo].[tblTablePermissions]
WHERE [Nazwa_tabeli] =('nazwa_tabeli1')
lub [Nazwa_tabeli] =('nazwa_tabeli2')
lub [Nazwa_tabeli] =('nazwa_tabeli3' )
GO
IINSERT INTO [dbo].[tblTablePermissions] ([Table_Name], [Access_Name], [IndexedColumns], [UserSelect], [UserInsert], [UserUpdate], [UserDelete])
WARTOŚCI ('vw_tablename1', 'tablename1', ', 'True', 'True', 'True', 'True'),
('vw_tablename2', 'tablename2', 'field1,field2,field3 ', 'Prawda', 'Prawda', 'Prawda', 'Prawda'),
('vw_tablename3', 'tablename3', 'field1,field2', 'Prawda', 'Prawda', 'Prawda', „Prawda”)
PRZEJDŹ
W powyższym skrypcie najpierw usuwam tabele z tblTablePermissions, które chcę zamienić na widoki, a następnie używam instrukcji insert, aby dodać widoki, które zastąpią tabele. Zauważ, że nazwy widoków są różne, ale pole Access_Name jest takie samo jak te usunięte, dzięki czemu mój kod dostępu może działać niezależnie od tego, jaki typ pola klucza podstawowego jest używany.
Jak użyłem CAST do przetłumaczenia klucza podstawowego
W widokach użyłem funkcji CAST do konwersji pola Typ z łańcucha na liczbę całkowitą:
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
Nasz klient może teraz łatwo skonfigurować każdą instalację w oparciu o dane klienta!