SQL Server w logistyce

Tabela _menu w bazie danych SQL Server

Struktura menu aplikacji zapisana w bazie — pozycje, uprawnienia, ikony i warunki widoczności zależne od danych.

sql.server.net.pl/sql/
Uśmiechnięty analityk w garniturze przy szerokim monitorze
Uśmiechnięty analityk w garniturze przy szerokim monitorze
W skrócie
  • Menu nie jest zaszyte w aplikacji — każda pozycja to wiersz tabeli z własną transakcją docelową, ikoną i uprawnieniami.
  • Widoczność pozycji można uzależnić od wyniku zapytania SQL, więc menu reaguje na stan danych, nie tylko na rolę użytkownika.
  • Cztery zestawy ikon w różnych rozmiarach pozwalają obsłużyć pasek, kafelki i moduł Framework z jednej definicji.
  • Cztery kolumny opisowe zasilają instrukcję użytkownika generowaną wprost ze struktury menu.

Do czego służy tabela [dbo].[_menu]

Dwa magazyny obsługiwane tym samym oprogramowaniem rzadko potrzebują tego samego menu. Jeden korzysta z awizacji, drugi nie; jeden ma moduł palet, drugi kontrolę jakości. Tabela [dbo].[_menu] pozwala złożyć układ pozycji odpowiadający konkretnemu wdrożeniu, bez wydawania osobnej wersji aplikacji.

Pojedynczy wiersz opisuje znacznie więcej niż etykietę i adres. Zawiera transakcję docelową wraz z parametrami przekazywanymi w adresie, sposób otwarcia — w oknie głównym czy w oknie dialogowym o zadanym rozmiarze — kolejność w obrębie grupy, komplet ikon w czterech rozmiarach oraz przypisanie do roli i sekcji.

Najciekawsze są jednak trzy kolumny z zapytaniami. WARUNEKWIDOCZNOSCI decyduje o pokazaniu pozycji na podstawie wyniku polecenia SELECT, ZAPYTANIESQL buduje podmenu dynamicznie z danych, a ZAPYTANIETEKST pozwala umieścić w etykiecie wartość obliczoną — na przykład liczbę dokumentów oczekujących na akceptację. Menu przestaje być statyczną listą, a staje się elementem interfejsu reagującym na stan systemu.

Co składa się na jedną pozycję menu
Miejsce MiejsceKod PRX, grupa, sekcja i kolejność wyznaczają położenie pozycji
Dostęp DostępRola i wskazanie użytkownika ograniczają widoczność
Warunek WarunekZapytanie SQL może ukryć pozycję zależnie od stanu danych
Działanie DziałanieTransakcja docelowa z parametrami i sposobem otwarcia okna

Warunek widoczności oparty na zapytaniu wykonuje się przy budowaniu menu, więc jego koszt dodaje się do czasu ładowania każdego ekranu.

Budowa tabeli — wykaz kolumn

Czterdzieści osiem kolumn układa się w pięć grup odpowiadających kolejnym warstwom definicji pozycji.

Wykaz kolumn tabeli
KolumnaTypWymaganaZnaczenie
Identyfikacja i położenie
ID_X_SHORTCUTinttakUnikalny identyfikator wiersza tabeli
REFNObigintnieUnikalny identyfikator pozycji
NAMEvarchar(50)takUnikalny identyfikator (klucz tekstowy) pozycji menu; używany w odwołaniach JS, atrybutach HTML i logice uprawnień
UNIQUEIDvarchar(50)nieUnikalny identyfikator
PRXvarchar(3)takKod klasyfikujący pozycję menu; „MBR” - główna sekcja boczna, „BAR” - pasek skrótów, inne wartości rezerwowane dla dodatkowych modułów
GRUPAvarchar(50)nieOpis grupy obiektów
SEKCJAFRAMEWORKvarchar(50)nieNazwa obszaru logicznego w module Framework, do którego przypisana jest dana pozycja menu - pozwala na organizację i filtrowanie zawartości interfejsu
KOLEJNOSCinttakOznaczenie porządku - kolejności obiektów na liście menu
TYPDOKvarchar(3)nieOznaczenie typu dokumentu
Treść i wygląd
TEKSTvarchar(50)nieTekst wyświetlany jako etykieta pozycji menu w interfejsie użytkownika - może zawierać zmienne dynamiczne np. @ZAPYTANIETEKST
TOOLTIPvarchar(100)nieDodatkowe informacje o obiekcie wyświetlane w formie okna nad obiektem
IMAGEvarchar(100)nieIkona przypisana do obiektu
IMAGE24varchar(100)nieIkona przypisana do obiektu miniatura 24×24
IMAGE32varchar(100)nieIkona przypisana do obiektu miniatura 32×32
IMAGE48varchar(100)nieIkona przypisana do obiektu miniatura 48×48
IMAGEFRAMEWORKvarchar(100)nieIkona przypisana do obiektu wykorzystywana przez moduł Framework
IKONAvarchar(100)nieObrazek, który jest wyświetlany po wywołaniu transakcji role_sys/ last_activity.aspx Propozycja: Ścieżka do obrazu ikony wyświetlanej w interfejsie po aktywacji transakcji - stosowana w systemowym widoku ostatnich aktywności
BACKCOLORvarchar(20)nieKolor tła ikony wyświetlanej po uruchomieniu transakcji role_sys/last_activity.aspx - pozwala wyróżnić element na liście aktywności
EXPANDbittakOkreślenie czy domyślnie pozycje submenu są rozwinięte czy zwinięte
Działanie pozycji
TARGETURLvarchar(100)nieWskazanie docelowej transakcji (adresu URL), którą należy uruchomić po kliknięciu pozycji menu
TARGETPARAMETERSvarchar(500)nieLista parametrów przekazywana do transakcji - parametry przekazywane w URL-u do transakcji; łączone z TARGETURL w postaci zapytania (query string)
GOVIEWvarchar(50)nieNazwa widoku systemowego (np. pliku ASPX), który zostanie załadowany po kliknięciu pozycji menu - alternatywa dla docelowego adresu URL
GOFUNCTIONvarchar(50)nieNazwa funkcji w systemie, która zostanie wywołana po kliknięciu pozycji menu - używana zamiast klasycznej transakcji URL lub widoku
DIALOGBOXbitnieOznaczenie czy transakcja ma być uruchamiana jako nowe okno czy jako wyskakujące okienko - DialogBox
DIALOGBOXSIZEvarchar(15)nieJeżeli wyświetlenie transakcji następuje w trybie wyskakującego okienka - DialogBox - to za pomocą tej kolumny okresla się jej rozmiar
DIALOGBOXREFRESHbittakOznaczenie czy przy zamknięciu okna dialogowego - DialogBox - prorgam ma odświezyć dane w tabeli
SHOW_CLOSE_BUTTONbitnieDotyczy poleceń otwierających okna. Parametr okresla, czy ma być widzoczny przycisik X zamykajacy okno
POZXinttakOznaczenie współrzędnej X, położenia okna w DASHBORAD
POZYinttakOznaczenie współrzędnej Y, położenia okna w DASHBORAD
SZEROKOSCintnieDla transakcji DASHBOARD określenie szerokości okna
WYSOKOSCintnieDla transakcji DASHBOARD określenie wysokości okna
Dostęp i widoczność
ROLAvarchar(20)nieIdentyfikator roli
KTOvarchar(50)nieIdentyfikator użytkownika lub grupy, dla której dana pozycja menu jest dostępna; wartość NULL oznacza, że pozycja widoczna jest dla wszystkich użytkowników
DLAKOGOvarchar(50)nieNazwa użytkownika, dla którego widoczne jest polecenia. Pustepole - polecenie jest widoczne dla wszystkich użytkowników
WIDOCZNEbittakOznaczenie czy dany wiersz - obiekt- jest widoczny
AKTYWNEbittakOkreślenie czy dany wiersz tabeli jest aktywny
ACHvarchar(1)takStatus logiczny rekordu - przyjmuje wartość '1′ dla aktywnych wpisów oraz 'X’ dla ukrytych lub usuniętych elementów menu
WARUNEKWIDOCZNOSCIvarchar(max)nieZapytanie, na podstawie wynikow którego jest wyświetlana grupa menu. W przypadku, gdy zapytanie nie zwraca rekordu lub zwraca jedne rekord, którego pola mają wartość NULL, grupa menu nie jest wyświetlana
ZAPYTANIESQLvarchar(max)nieOkreśla zapytanie SQL jakie ma być wykonane do utworzenia dynamicznego SubMenu
ZAPYTANIETEKSTvarchar(max)nieZapytanie pozwla na wykorzystanie w kolumnie TEKST zmiennej @ZAPYTANIETEKST, której wartość zostanie podstawiona z wyniku zapytania. ZASTOSOWANIE: w tekście opisującym przycisk jaki licznik pozycji np. „Dokumenty (3)” dla użytkownika będzie informacją , że są trzy dokumenty. w kolumnie TEKST wpisujemy Dokumenty (@ZAPYTANIETEKST) a w kolumnie zaytanietekst wpisujemy select zwracajacy taki wynik np. SELECT COUNT(REFNO) FROM DPDOK WHERE ACH=’1′
ZAPYTANIECONNECTIONvarchar(100)nieNazwa ConnectionString wykorzystywanego do wykonania ZAPYTANIASQL, jeżlei jest NULL to wykorzystywane jest domyślne połączenie z bazą
Instrukcja i metryka
INSTRUKCJA_IDvarchar(20)nieKod (Refno) pozycji do grpowania, sortowania pozycji w instrukcji. Brak wypełnienia pola, brak pozycji w instrukcji
INSTRUKCJA_TYTULvarchar(250)nieTytuł opisu na potrzeby instrukcji
INSTRUKCJA_OPISvarchar(max)nieOpis na potrzeby instrukcji
INSTRUKCJA_IMGvarchar(250)nieLink do zdjęcia, zrzutu ekranu na potrzeby instrukcji, uwaga link powinien zaczynać się od https !
KIEDYdatetimetakData i czas zapisu rekordu
SYSTEMOWEbittakOznaczenie wiersza czy jest systemowy, tzn, czy podczas synchronizacji z bazą ROOT dane wiersze zostaną przegrane z bazy wzorcowej do instalacji klienta
KONFIGURACJAbittakOznaczenie wiersza, czy dotyczy konfiguracji ROOT. Podczas synchronizacji z bazą ROOT dane wiersze zostaną przegrane z bazy wzorcowej do instalacji klienta

Kolumna NAME jest tekstowym kluczem pozycji używanym w odwołaniach z kodu, natomiast ID_X_SHORTCUT to numer lokalny dla instancji bazy. Przy przenoszeniu konfiguracji między środowiskami odwoływać należy się do pierwszej z nich.

Indeksy i wydajność zapytań

Cztery indeksy odpowiadają sposobom, w jakie menu jest odczytywane: przy budowaniu całej struktury oraz przy odnajdywaniu pojedynczej pozycji.

Indeksy zdefiniowane na tabeli
IndeksKolumnyRodzaj
PK_x_shortcutID_X_SHORTCUTklucz główny
PRX_GRUPA_GOVIEW_AKTYWNEPRX, GRUPA, GOVIEW, AKTYWNEzwykły
PRX_NAME_GOVIEWPRX, NAME, GOVIEWzwykły
ROLA_PRXROLA, PRXzwykły

Indeks PRX_GRUPA_GOVIEW_AKTYWNE obsługuje główny scenariusz — złożenie menu dla wskazanej sekcji z pominięciem pozycji wyłączonych. Indeks ROLA_PRX zawęża zbiór do uprawnień użytkownika już na poziomie odczytu, zamiast filtrować wynik po pobraniu wszystkich wierszy.

Menu reagujące na dane — możliwości i ich koszt

Trzy kolumny z zapytaniami dają dużą swobodę, ale każda z nich dokłada pracę wykonywaną przy budowaniu menu, czyli przy wejściu użytkownika na dowolny ekran.

Kolumny z zapytaniami i ich zastosowanie
KolumnaCo robiNa co uważać
WARUNEKWIDOCZNOSCIUkrywa pozycję, gdy zapytanie nie zwraca wynikuWykonuje się przy każdym budowaniu menu — zapytanie musi być tanie
ZAPYTANIESQLBuduje podmenu na podstawie danych, np. listę magazynówLiczba pozycji rośnie razem z danymi; warto ograniczyć wynik
ZAPYTANIETEKSTWstawia wartość do etykiety, np. liczbę zaległych dokumentówOdczyt przy każdym odświeżeniu; unikać zapytań agregujących duże tabele
ZAPYTANIECONNECTIONKieruje zapytanie na inną bazę niż domyślnaCzas odpowiedzi bazy zewnętrznej opóźnia wyświetlenie menu

Wszystkie cztery wykonują się przed pokazaniem ekranu, więc ich koszt odczuwa użytkownik przy każdym kliknięciu.

Praktyczna zasada brzmi: zapytanie w menu powinno kończyć się w kilkudziesięciu milisekundach i korzystać z indeksu. Licznik dokumentów oczekujących na akceptację, oparty na zawężonym warunku, spełnia to bez trudu. Zestawienie obliczające sumę obrotów z całego roku — nie, i objawi się jako ogólne spowolnienie systemu, którego przyczyny nikt nie będzie szukał w definicji menu.

Jak korzystać z tabeli w praktyce

Przy budowaniu i utrzymaniu struktury menu sprawdzają się poniższe zasady:

  • Nadawaj kolumnie NAME czytelne, trwałe nazwy — to one występują w odwołaniach z kodu i przy przenoszeniu konfiguracji.
  • Sprawdzaj koszt zapytań z kolumn warunkowych; wykonują się przed pokazaniem każdego ekranu, nie raz na sesję.
  • Uzupełniaj kolumny INSTRUKCJA_* na bieżąco — pozwalają wygenerować instrukcję użytkownika wprost ze struktury menu.
  • Ograniczaj rolom dostęp przez kolumnę ROLA, a nie przez ukrycie pozycji; ukryta pozycja bywa nadal osiągalna adresem.
  • Wypełniaj komplet ikon w czterech rozmiarach; brakująca miniatura objawia się pustym miejscem w widoku kafelkowym.
  • Nie modyfikuj wierszy z SYSTEMOWE = 1; kopiuj je pod nową nazwą, jeśli potrzebujesz zmiany.

Przegląd pozycji menu wykorzystujących zapytania — kandydatów do sprawdzenia przy diagnozie wolnego ładowania ekranów:

SELECT  PRX,
        GRUPA,
        NAME,
        TEKST,
        ROLA,
        CASE WHEN WARUNEKWIDOCZNOSCI IS NOT NULL THEN 'warunek' ELSE '' END
      + CASE WHEN ZAPYTANIESQL       IS NOT NULL THEN ' submenu' ELSE '' END
      + CASE WHEN ZAPYTANIETEKST     IS NOT NULL THEN ' etykieta' ELSE '' END AS ZAPYTANIA
FROM    dbo._menu
WHERE   AKTYWNE = 1
  AND   (WARUNEKWIDOCZNOSCI IS NOT NULL
      OR ZAPYTANIESQL       IS NOT NULL
      OR ZAPYTANIETEKST     IS NOT NULL)
ORDER BY PRX, GRUPA, KOLEJNOSC;

Jeżeli system ładuje się wolno na wszystkich ekranach jednakowo, przyczyny warto szukać właśnie tutaj — zapytania menu wykonują się niezależnie od tego, co użytkownik otwiera.

Menu zapisane w bazie jest jednym z najsilniejszych narzędzi dopasowania systemu do klienta i jednocześnie jednym z najłatwiejszych do zepsucia. Wystarczy kilka pozycji z kosztownymi zapytaniami warunkowymi, żeby cała aplikacja sprawiała wrażenie powolnej — a przyczyna jest wtedy niewidoczna dla kogoś, kto szuka jej w kodzie.

Powiązane tabele i dokumentacja

Struktura menu współpracuje z definicjami zapytań, uprawnieniami i pozostałymi elementami konfiguracji interfejsu:

FAQ

Najczęściej zadawane pytania o tabelę _menu

01

Jak działa warunkowa widoczność pozycji menu?

Kolumna WARUNEKWIDOCZNOSCI zawiera zapytanie SELECT, którego wynik decyduje o pokazaniu pozycji. Pozwala to ukryć moduł, dopóki nie ma w nim danych, albo pokazać skrót do akceptacji tylko wtedy, gdy coś na nią czeka. Zapytanie wykonuje się przy każdym budowaniu menu, więc musi być tanie.

02

Po co cztery kolumny z ikonami?

Odpowiadają różnym miejscom, w których pozycja może się pojawić: pasek narzędzi używa miniatury 24 pikseli, lista — 32, widok kafelkowy — 48, a moduł Framework ma własny zestaw. Wypełnienie tylko jednej z nich skutkuje pustym miejscem w pozostałych widokach.

03

Czym różni się kolumna NAME od ID_X_SHORTCUT?

NAME to tekstowy klucz pozycji, stabilny przy przenoszeniu konfiguracji między środowiskami i używany w odwołaniach z kodu. ID_X_SHORTCUT to numer nadawany lokalnie przez bazę — na innej instalacji ta sama pozycja będzie miała inną wartość, więc nie nadaje się do odwołań.

04

Dlaczego cała aplikacja działa wolno po zmianach w menu?

Bo zapytania z kolumn WARUNEKWIDOCZNOSCI, ZAPYTANIESQL i ZAPYTANIETEKST wykonują się przed pokazaniem każdego ekranu, niezależnie od tego, co użytkownik otwiera. Jedno kosztowne zapytanie agregujące dużą tabelę spowalnia więc cały system, a przyczyna jest niewidoczna dla kogoś, kto szuka jej w kodzie aplikacji.

Słownik pojęć

Słownik pojęć

Pojęcia potrzebne przy konfigurowaniu interfejsu aplikacji w bazie danych.

MMicrosoft SQL Server
Serwer relacyjnej bazy danych, na którym pracują aplikacje SoftwareStudio. Odpowiada za spójność danych, uprawnienia dostępu, kopie zapasowe i wydajność zapytań.
TT-SQL
Transact-SQL — dialekt języka SQL używany w Microsoft SQL Server. Służy do zapytań, procedur składowanych, wyzwalaczy i logiki uruchamianej po stronie serwera.
IIndeks bazodanowy
Struktura przyspieszająca wyszukiwanie wierszy w tabeli. Dobrze dobrane indeksy skracają czas zapytań, ale spowalniają zapisy i zajmują miejsce na dysku.
RRole i uprawnienia
Mechanizm przypisywania użytkownikom dostępu do funkcji i danych. Zamiast nadawać uprawnienia pojedynczo, przypisuje się je do roli odpowiadającej stanowisku.
WWydajność zapytań
Czas, w jakim baza danych zwraca wynik. Zależy od indeksów, planu wykonania i objętości przetwarzanych danych.
PPraca w przeglądarce
Dostęp do systemu bez instalowania programu na komputerze użytkownika. Upraszcza aktualizacje i pozwala pracować zdalnie.
WWdrożenie
Proces uruchomienia systemu w firmie: analiza procesów, konfiguracja, migracja danych, szkolenia i uruchomienie produkcyjne.
PPulpit menedżerski
Ekran zbierający najważniejsze wskaźniki w jednym widoku, odświeżany na bieżąco z bazy danych.

Zobacz to w praktyce

Sprawdź, jak systemy SoftwareStudio oparte na MS SQL Server wspierają ten obszar Twojej firmy.