- 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.
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.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
| Identyfikacja i położenie | |||
ID_X_SHORTCUT | int | tak | Unikalny identyfikator wiersza tabeli |
REFNO | bigint | nie | Unikalny identyfikator pozycji |
NAME | varchar(50) | tak | Unikalny identyfikator (klucz tekstowy) pozycji menu; używany w odwołaniach JS, atrybutach HTML i logice uprawnień |
UNIQUEID | varchar(50) | nie | Unikalny identyfikator |
PRX | varchar(3) | tak | Kod klasyfikujący pozycję menu; „MBR” - główna sekcja boczna, „BAR” - pasek skrótów, inne wartości rezerwowane dla dodatkowych modułów |
GRUPA | varchar(50) | nie | Opis grupy obiektów |
SEKCJAFRAMEWORK | varchar(50) | nie | Nazwa obszaru logicznego w module Framework, do którego przypisana jest dana pozycja menu - pozwala na organizację i filtrowanie zawartości interfejsu |
KOLEJNOSC | int | tak | Oznaczenie porządku - kolejności obiektów na liście menu |
TYPDOK | varchar(3) | nie | Oznaczenie typu dokumentu |
| Treść i wygląd | |||
TEKST | varchar(50) | nie | Tekst wyświetlany jako etykieta pozycji menu w interfejsie użytkownika - może zawierać zmienne dynamiczne np. @ZAPYTANIETEKST |
TOOLTIP | varchar(100) | nie | Dodatkowe informacje o obiekcie wyświetlane w formie okna nad obiektem |
IMAGE | varchar(100) | nie | Ikona przypisana do obiektu |
IMAGE24 | varchar(100) | nie | Ikona przypisana do obiektu miniatura 24×24 |
IMAGE32 | varchar(100) | nie | Ikona przypisana do obiektu miniatura 32×32 |
IMAGE48 | varchar(100) | nie | Ikona przypisana do obiektu miniatura 48×48 |
IMAGEFRAMEWORK | varchar(100) | nie | Ikona przypisana do obiektu wykorzystywana przez moduł Framework |
IKONA | varchar(100) | nie | Obrazek, 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 |
BACKCOLOR | varchar(20) | nie | Kolor tła ikony wyświetlanej po uruchomieniu transakcji role_sys/last_activity.aspx - pozwala wyróżnić element na liście aktywności |
EXPAND | bit | tak | Określenie czy domyślnie pozycje submenu są rozwinięte czy zwinięte |
| Działanie pozycji | |||
TARGETURL | varchar(100) | nie | Wskazanie docelowej transakcji (adresu URL), którą należy uruchomić po kliknięciu pozycji menu |
TARGETPARAMETERS | varchar(500) | nie | Lista parametrów przekazywana do transakcji - parametry przekazywane w URL-u do transakcji; łączone z TARGETURL w postaci zapytania (query string) |
GOVIEW | varchar(50) | nie | Nazwa widoku systemowego (np. pliku ASPX), który zostanie załadowany po kliknięciu pozycji menu - alternatywa dla docelowego adresu URL |
GOFUNCTION | varchar(50) | nie | Nazwa funkcji w systemie, która zostanie wywołana po kliknięciu pozycji menu - używana zamiast klasycznej transakcji URL lub widoku |
DIALOGBOX | bit | nie | Oznaczenie czy transakcja ma być uruchamiana jako nowe okno czy jako wyskakujące okienko - DialogBox |
DIALOGBOXSIZE | varchar(15) | nie | Jeżeli wyświetlenie transakcji następuje w trybie wyskakującego okienka - DialogBox - to za pomocą tej kolumny okresla się jej rozmiar |
DIALOGBOXREFRESH | bit | tak | Oznaczenie czy przy zamknięciu okna dialogowego - DialogBox - prorgam ma odświezyć dane w tabeli |
SHOW_CLOSE_BUTTON | bit | nie | Dotyczy poleceń otwierających okna. Parametr okresla, czy ma być widzoczny przycisik X zamykajacy okno |
POZX | int | tak | Oznaczenie współrzędnej X, położenia okna w DASHBORAD |
POZY | int | tak | Oznaczenie współrzędnej Y, położenia okna w DASHBORAD |
SZEROKOSC | int | nie | Dla transakcji DASHBOARD określenie szerokości okna |
WYSOKOSC | int | nie | Dla transakcji DASHBOARD określenie wysokości okna |
| Dostęp i widoczność | |||
ROLA | varchar(20) | nie | Identyfikator roli |
KTO | varchar(50) | nie | Identyfikator 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 |
DLAKOGO | varchar(50) | nie | Nazwa użytkownika, dla którego widoczne jest polecenia. Pustepole - polecenie jest widoczne dla wszystkich użytkowników |
WIDOCZNE | bit | tak | Oznaczenie czy dany wiersz - obiekt- jest widoczny |
AKTYWNE | bit | tak | Określenie czy dany wiersz tabeli jest aktywny |
ACH | varchar(1) | tak | Status logiczny rekordu - przyjmuje wartość '1′ dla aktywnych wpisów oraz 'X’ dla ukrytych lub usuniętych elementów menu |
WARUNEKWIDOCZNOSCI | varchar(max) | nie | Zapytanie, 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 |
ZAPYTANIESQL | varchar(max) | nie | Określa zapytanie SQL jakie ma być wykonane do utworzenia dynamicznego SubMenu |
ZAPYTANIETEKST | varchar(max) | nie | Zapytanie 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′ |
ZAPYTANIECONNECTION | varchar(100) | nie | Nazwa ConnectionString wykorzystywanego do wykonania ZAPYTANIASQL, jeżlei jest NULL to wykorzystywane jest domyślne połączenie z bazą |
| Instrukcja i metryka | |||
INSTRUKCJA_ID | varchar(20) | nie | Kod (Refno) pozycji do grpowania, sortowania pozycji w instrukcji. Brak wypełnienia pola, brak pozycji w instrukcji |
INSTRUKCJA_TYTUL | varchar(250) | nie | Tytuł opisu na potrzeby instrukcji |
INSTRUKCJA_OPIS | varchar(max) | nie | Opis na potrzeby instrukcji |
INSTRUKCJA_IMG | varchar(250) | nie | Link do zdjęcia, zrzutu ekranu na potrzeby instrukcji, uwaga link powinien zaczynać się od https ! |
KIEDY | datetime | tak | Data i czas zapisu rekordu |
SYSTEMOWE | bit | tak | Oznaczenie wiersza czy jest systemowy, tzn, czy podczas synchronizacji z bazą ROOT dane wiersze zostaną przegrane z bazy wzorcowej do instalacji klienta |
KONFIGURACJA | bit | tak | Oznaczenie 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.
| Indeks | Kolumny | Rodzaj |
|---|---|---|
PK_x_shortcut | ID_X_SHORTCUT | klucz główny |
PRX_GRUPA_GOVIEW_AKTYWNE | PRX, GRUPA, GOVIEW, AKTYWNE | zwykły |
PRX_NAME_GOVIEW | PRX, NAME, GOVIEW | zwykły |
ROLA_PRX | ROLA, PRX | zwykł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.
| Kolumna | Co robi | Na co uważać |
|---|---|---|
WARUNEKWIDOCZNOSCI | Ukrywa pozycję, gdy zapytanie nie zwraca wyniku | Wykonuje się przy każdym budowaniu menu — zapytanie musi być tanie |
ZAPYTANIESQL | Buduje podmenu na podstawie danych, np. listę magazynów | Liczba pozycji rośnie razem z danymi; warto ograniczyć wynik |
ZAPYTANIETEKST | Wstawia wartość do etykiety, np. liczbę zaległych dokumentów | Odczyt przy każdym odświeżeniu; unikać zapytań agregujących duże tabele |
ZAPYTANIECONNECTION | Kieruje zapytanie na inną bazę niż domyślna | Czas 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
NAMEczytelne, 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: