Jakiś czas po konwersji do wersji 2013 zauważyłem, iż niektóre towary przestały spełniać warunki pewnej filtracji, co do tej pory normalnie działało. Jak się okazało wersja 2013 ma nową funkcjonalność polegającą na wklejaniu w kod towaru znaku ASCII [US], czyli separatora.
co na pierwszy rzut oka wydaje się być poprawne i tak jest, tak długo jak zrobiliśmy to świadomie. W przypadku wprowadzania przez użytkowników kodów w kartotekach towarowych ten warunek niekoniecznie jest spełniony.
Dla pewności napisałem więc funkcję, która zamienia znaki specjalne na coś bardziej czytelniejszego:
CREATE FUNCTION [CDN].[PokazUkryteZnaki] (@tekst VARCHAR(8000))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @Wynik VARCHAR(8000);
SET @Wynik = @tekst
SET @Wynik = REPLACE( @Wynik, CHAR(1), '[SOH]')
SET @Wynik = REPLACE( @Wynik, CHAR(2), '[STX]')
SET @Wynik = REPLACE( @Wynik, CHAR(3), '[ETX]')
SET @Wynik = REPLACE( @Wynik, CHAR(4), '[EOT]')
SET @Wynik = REPLACE( @Wynik, CHAR(5), '[ENQ]')
SET @Wynik = REPLACE( @Wynik, CHAR(6), '[ACK]')
SET @Wynik = REPLACE( @Wynik, CHAR(7), '[BEL]')
SET @Wynik = REPLACE( @Wynik, CHAR(8), '[BS]')
SET @Wynik = REPLACE( @Wynik, CHAR(9), '[HT]')
SET @Wynik = REPLACE( @Wynik, CHAR(10), '[LF]')
SET @Wynik = REPLACE( @Wynik, CHAR(11), '[VT]')
SET @Wynik = REPLACE( @Wynik, CHAR(12), '[FF]')
SET @Wynik = REPLACE( @Wynik, CHAR(13), '[CR]')
SET @Wynik = REPLACE( @Wynik, CHAR(14), '[SO]')
SET @Wynik = REPLACE( @Wynik, CHAR(15), '[SI]')
SET @Wynik = REPLACE( @Wynik, CHAR(16), '[DLE]')
SET @Wynik = REPLACE( @Wynik, CHAR(17), '[DC1]')
SET @Wynik = REPLACE( @Wynik, CHAR(18), '[DC2]')
SET @Wynik = REPLACE( @Wynik, CHAR(19), '[DC3]')
SET @Wynik = REPLACE( @Wynik, CHAR(20), '[DC4]')
SET @Wynik = REPLACE( @Wynik, CHAR(21), '[NAK]')
SET @Wynik = REPLACE( @Wynik, CHAR(22), '[SYN]')
SET @Wynik = REPLACE( @Wynik, CHAR(23), '[ETB]')
SET @Wynik = REPLACE( @Wynik, CHAR(24), '[CAN]')
SET @Wynik = REPLACE( @Wynik, CHAR(25), '[EM]')
SET @Wynik = REPLACE( @Wynik, CHAR(26), '[SUB]')
SET @Wynik = REPLACE( @Wynik, CHAR(27), '[ESC]')
SET @Wynik = REPLACE( @Wynik, CHAR(28), '[FS]')
SET @Wynik = REPLACE( @Wynik, CHAR(29), '[GS]')
SET @Wynik = REPLACE( @Wynik, CHAR(30), '[RS]')
SET @Wynik = REPLACE( @Wynik, CHAR(31), '[US]')
--SET @Wynik = REPLACE( @Wynik, CHAR(32), '[SP]') -- SPACJA
RETURN(@Wynik)
END
GO
W efekcie jej wywołania, nasze kody wyglądają już trochę inaczej:
Dla towarów można napisać coś takiego:
SELECT CDN.PokazUkryteZnaki(Twr_Kod) AS KodPelny,Twr_Kod AS Kod
FROM CDN.TwrKarty
WHERE Twr_Archiwalny = 0
AND CDN.PokazUkryteZnaki(Twr_Kod) <> Twr_Kod
Dla przykładu:
SELECT 'TEST1' AS [String1], 'TEST' + CHAR(31) + '2' AS [String2]
da nam wynik
co na pierwszy rzut oka wydaje się być poprawne i tak jest, tak długo jak zrobiliśmy to świadomie. W przypadku wprowadzania przez użytkowników kodów w kartotekach towarowych ten warunek niekoniecznie jest spełniony.
Dla pewności napisałem więc funkcję, która zamienia znaki specjalne na coś bardziej czytelniejszego:
CREATE FUNCTION [CDN].[PokazUkryteZnaki] (@tekst VARCHAR(8000))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @Wynik VARCHAR(8000);
SET @Wynik = @tekst
SET @Wynik = REPLACE( @Wynik, CHAR(1), '[SOH]')
SET @Wynik = REPLACE( @Wynik, CHAR(2), '[STX]')
SET @Wynik = REPLACE( @Wynik, CHAR(3), '[ETX]')
SET @Wynik = REPLACE( @Wynik, CHAR(4), '[EOT]')
SET @Wynik = REPLACE( @Wynik, CHAR(5), '[ENQ]')
SET @Wynik = REPLACE( @Wynik, CHAR(6), '[ACK]')
SET @Wynik = REPLACE( @Wynik, CHAR(7), '[BEL]')
SET @Wynik = REPLACE( @Wynik, CHAR(8), '[BS]')
SET @Wynik = REPLACE( @Wynik, CHAR(9), '[HT]')
SET @Wynik = REPLACE( @Wynik, CHAR(10), '[LF]')
SET @Wynik = REPLACE( @Wynik, CHAR(11), '[VT]')
SET @Wynik = REPLACE( @Wynik, CHAR(12), '[FF]')
SET @Wynik = REPLACE( @Wynik, CHAR(13), '[CR]')
SET @Wynik = REPLACE( @Wynik, CHAR(14), '[SO]')
SET @Wynik = REPLACE( @Wynik, CHAR(15), '[SI]')
SET @Wynik = REPLACE( @Wynik, CHAR(16), '[DLE]')
SET @Wynik = REPLACE( @Wynik, CHAR(17), '[DC1]')
SET @Wynik = REPLACE( @Wynik, CHAR(18), '[DC2]')
SET @Wynik = REPLACE( @Wynik, CHAR(19), '[DC3]')
SET @Wynik = REPLACE( @Wynik, CHAR(20), '[DC4]')
SET @Wynik = REPLACE( @Wynik, CHAR(21), '[NAK]')
SET @Wynik = REPLACE( @Wynik, CHAR(22), '[SYN]')
SET @Wynik = REPLACE( @Wynik, CHAR(23), '[ETB]')
SET @Wynik = REPLACE( @Wynik, CHAR(24), '[CAN]')
SET @Wynik = REPLACE( @Wynik, CHAR(25), '[EM]')
SET @Wynik = REPLACE( @Wynik, CHAR(26), '[SUB]')
SET @Wynik = REPLACE( @Wynik, CHAR(27), '[ESC]')
SET @Wynik = REPLACE( @Wynik, CHAR(28), '[FS]')
SET @Wynik = REPLACE( @Wynik, CHAR(29), '[GS]')
SET @Wynik = REPLACE( @Wynik, CHAR(30), '[RS]')
SET @Wynik = REPLACE( @Wynik, CHAR(31), '[US]')
--SET @Wynik = REPLACE( @Wynik, CHAR(32), '[SP]') -- SPACJA
RETURN(@Wynik)
END
GO
W efekcie jej wywołania, nasze kody wyglądają już trochę inaczej:
SELECT CDN.PokazUkryteZnaki(Twr_Kod) AS KodPelny,Twr_Kod AS Kod
FROM CDN.TwrKarty
WHERE Twr_Archiwalny = 0
AND CDN.PokazUkryteZnaki(Twr_Kod) <> Twr_Kod
Powyższe zapytanie spowoduje wyświetlenie listy towarów których kod zawiera niepożądany znak specjalny. Warto zauważyć, że w ciele funkcji wykomentowany jest fragment zamieniający "spację" na [SP], ponieważ w moim przypadku znak spacji jest dopuszczalny w kodzie towaru i nie było potrzeby wyszukiwania towarów, które ją zawierają. W bazie którą sprawdzałem zapytanie zwróciło skromne 70 kartotek, a wszystkie zostały zmodyfikowane po wgraniu wersji 2013.5 (nowy interface). Wychodzi więc na to, że nowa wersja XL-a nie ignoruje znaków specjalnych i użytkownik może wprowadzić co tylko wymyśli :)
Pozdrawiam,
Mateusz
Brak komentarzy:
Prześlij komentarz