Środowisko modułów branżowych udostępnia specjalizowaną bibliotekę klas, w oparciu, o którą mogą powstawać nowe rozwiązania informatyczne (nowe moduły) zintegrowane z systemem. Jest to opcja dająca największe możliwości dostosowania oprogramowania do potrzeb przedsiębiorstwa.
6.1. Konfiguracja i uruchomienie modułu
6.1.1. Tabele konfiguracyjne
Uruchomienie modułu wymaga utworzenia i wypełnienia następujących tabel:
a) FIRMY w bazie Hermes
Tabela FIRMY zawiera dodatkową kolumnę ‘baza_mod’, która zawiera nazwę bazy modułu. Wpis w tej kolumnie wskazuje na to, że dla danej firmy jest utworzony moduł.
b) CONFIG w bazie modułu
Polecenie SQL do utworzenia tabeli: CREATE TABLE [CONFIG] ( [NR_WERSJI] [numeric](10, 0) NOT NULL CONSTRAINT [DF_CONFIG_NR_WERSJI] DEFAULT (0), [NAZWA] [VARCHAR] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_CONFIG_NAZWA] DEFAULT (''), [PATH_APP] [VARCHAR] (254) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_CONFIG_PATH_APP] DEFAULT (''), [NAME_APP] [VARCHAR] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_CONFIG_NAME_APP] DEFAULT (''), CONSTRAINT [PK_CONFIG] PRIMARY KEY CLUSTERED ( [NAZWA] ) ON [PRIMARY] ) INSERT INTO CONFIG(nr_wersji, nazwa, path_app, name_app) VALUES(0,'Nazwa modułu','','')
Dodatkowe informacje dla tabeli config:
Jeśli nie zostanie podana nazwa pliku uruchamialnego modułu w kolumnie name_app (lub plik ten nie istnieje – uwzględniana jest wtedy ścieżka do modułu, czyli kolumna path_app), to moduł jest wyłączany
Kolumna path_app zawiera ścieżkę modułu. Ścieżka modułu musi być zakończona znakiem ‘\’, np. c:\hermes\modul\ Jeśli w tej kolumnie zostanie użyta zmienna programu, zostanie ona zamieniona na odpowiadający jej ciąg znaków:
_xsc\ – zostanie zamieniony na katalog programu
c) M_FIRMA w bazie z danymi firmy
Polecenie SQL do utworzenia tabeli:
CREATE TABLE [M_FIRMA] ( [NR_WERSJI] [numeric](10, 0) NOT NULL CONSTRAINT [DF_M_FIRMA_NR_WERSJI] DEFAULT (0), CONSTRAINT [PK_CONFIG] PRIMARY KEY CLUSTERED ( [NR_WERSJI] ) ON [PRIMARY] ) INSERT INTO M_FIRMA(nr_wersji) VALUES(0)
6.1.2. Menu modułu – tabela M_MENU
Obsłużona jest dowolna ilość menu modułu (pierwsze menu ma numer 1). Są trzy przyciski na toolbarze odpowiadające pierwszemu, drugiemu lub trzeciemu menu modułu (wszystkie menu będą występować w menu operacje). Oczywiście można zakazać dostępu do jakiegoś menu lub pozycji w menu. Jeśli zabronione będzie menu pierwsze, drugie lub trzecie to nie pokażą się odpowiednie przyciski na toolbarze. Oczywiście jeśli nie będzie zdefiniowanych menu w tabelce m_menu w bazie modułu nie pokażą się odpowiednie przyciski i menu.
Kolumna MENU definiuje odpowiednie menu (1, 2, 3 itd.). Kolumna NR definiuje pozycję w menu (1 pozycja, 2 itd.; pozycja 0 to jest definicja menu nadrzędnego oraz przycisku na toolbarze).
Polecenie SQL do utworzenia tabeli:
CREATE TABLE [M_MENU] ( [NR] [tinyint] NOT NULL CONSTRAINT [DF_M_MENU_NR] DEFAULT (''), [MENU] [tinyint] NOT NULL CONSTRAINT [DF_M_MENU_MENU] DEFAULT (''), [OPIS] [varchar] (100) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_OPIS] DEFAULT (''), [ICO] [varchar] (254) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_ICO] DEFAULT (''), [AKCJA] [varchar] (254) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_AKCJA] DEFAULT (''), CONSTRAINT [PK_M_MENU] PRIMARY KEY CLUSTERED ([NR], [MENU] ) ON [PRIMARY] )
Dla kolumny ico w tabeli m_menu:
_xsc\ – zostanie zamieniony na katalog programu
_mpath\ – zostanie zamieniony na katalog modułu, zdefiniowany w kolumnie path_app tabeli config
I podobnie będzie w kolumnie akcja:
_xsc\ – zostanie zamieniony na katalog programu
_mpath\ – zostanie zamieniony na katalog modułu, zdefiniowany w kolumnie path_app
_mapp – zostanie zamieniony na plik modułu (połączenie ścieżki + nazwy pliku)
6.1.3. Obsługa upgrade’u modułu
a) Numer wersji modułu wpisywany jest w bazie jako liczba całkowita – w programie będzie pokazywany dzielony przez 100000 – czyli nr 1 będzie jako wersja 0.00.001, nr 123000 będzie jako wersja 1.23.000 itd.)
b) jeśli nr wersji modułu (kolumna nr_wersji w tabeli config w bazie modułu) nie zgadza się z wersją danych modułu w wybranej firmie (kolumna nr_wersji w tabeli m_firma w bazie firmy) pojawiają się stosowne komunikaty
c) jeśli nr wersji modułu jest wyższy od nr wersji danych modułu pojawia się stosowny komunikat wraz z pytaniem czy zaktualizować dane modułu – w przypadku twierdzącej odpowiedzi wywoływana jest funkcja m_upgrade z pliku wykonywalnego modułu (UWAGA! funkcja, lub procedura m_upgrade musi się znajdować w pliku głównym modułu!); w przypadku, gdy po aktualizacji nr wersji modułu i nr wersji danych modułu dalej są niezgodne, pojawi się okienko ze stosowną informacją, a obsługa modułu zostanie wyłączona
d) jeśli nr wersji modułu jest niższy od nr wersji danych modułu pojawia się stosowny komunikat, a obsługa modułu zostanie wyłączona
e) procedura lub funkcja upgradująca moduł musi nazywać się m_upgrade i znajdować się w pliku głównym modułu (może ona np. wywoływać inną procedurę z pliku)
f) procedura upgradująca moduł musi zadbać o poprawną aktualizację tabel, o zaktualizowanie informacji o numerze wersji danych modułu (kolumna nr_wersji w tabeli m_firma w bazie danej firmy), wyświetlenie okienka z informacją o poprawnym zaktualizowaniu struktury tabel
g) jeśli nie udało się odczytać nr wersji danych modułu (bo np. jeszcze nie istnieje taka tabela) to nr wersji danych modułu przyjmowany jest jako 0 – i jeśli nr wersji modułu jest wyższy to wywoływana jest funkcja upgradująca (np. sytuacja pierwszego upgrade’u)
h) dla ułatwienia upgrade’u w programie są dostępne dwie funkcje sprawdzające, czy dany obiekt istnieje w bazie
- sysobj sprawdzająca, czy dany obiekt istnieje w aktualnie otworzonej bazie (czyli bazie otworzonej firmy)
pierwszy parametr – rodzaj obiektu – najczęściej używany T – tabela i K – kolumna
drugi i trzeci parametr – nazwa obiektu
np.
sysobj(‘T’,’M_MENU’,”) sprawdza, czy istnieje tabela o nazwie m_menu w bazie firmy
sysobj(‘K’,’M_MENU’,’menu’) sprawdza, czy istnieje kolumna menu w tabeli m_menu - dbsysobj sprawdzająca, czy dany obiekt istnieje w danej bazie identycznie jak sysobj, tylko ze pierwszym parametrem będzie nazwa bazy
dbsysobj(‘Modul1′,’T’,’M_MENU’,”) sprawdza, czy istnieje tabela o nazwie m_menu w bazie firmy
dbsysobj(‘Modul1′,’K’,’M_MENU’,’menu’) sprawdza, czy istnieje kolumna menu w tabeli m_menu
Przykladowe wywolania tych funkcji:
IF !sysobj('T','M_MENU','') lcCommand = "CREATE TABLE [M_MENU] ( "+; "[MENU] [tinyint] NOT NULL CONSTRAINT [DF_M_MENU_MENU] DEFAULT (''), "+; "[NR] [tinyint] NOT NULL CONSTRAINT [DF_M_MENU_NR] DEFAULT (''), "+; "[OPIS] [varchar] (100) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_OPIS] DEFAULT (''), "+; "[ICO] [varchar] (254) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_ICO] DEFAULT (''), "+; "[AKCJA] [varchar] (254) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_AKCJA] DEFAULT (''), "+; "CONSTRAINT [PK_M_MENU] PRIMARY KEY CLUSTERED "+; "([MENU], [NR] "+; ") ON [PRIMARY] "+; ")" IF !IsOK(SQLEXEC(_connection, lcCommand)) llError = .T. ENDIF ENDIF
IF !dbsysobj('MODUL1','T','M_MENU','') lcCommand = "CREATE TABLE [MODUL1].[dbo].[M_MENU] ( "+; "[MENU] [tinyint] NOT NULL CONSTRAINT [DF_M_MENU_MENU] DEFAULT (''), "+; "[NR] [tinyint] NOT NULL CONSTRAINT [DF_M_MENU_NR] DEFAULT (''), "+; "[OPIS] [varchar] (100) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_OPIS] DEFAULT (''), "+; "[ICO] [varchar] (254) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_ICO] DEFAULT (''), "+; "[AKCJA] [varchar] (254) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_M_MENU_AKCJA] DEFAULT (''), "+; "CONSTRAINT [PK_M_MENU] PRIMARY KEY CLUSTERED "+; "([MENU], [NR] "+; ") ON [PRIMARY] "+; ")" IF !IsOK(SQLEXEC(_connection, lcCommand)) llError = .T. ENDIF ENDIF
6.1.4. Dodatkowe informacje
Widoczność procedur w pliku wykonywalnym modułu jest ograniczona do wszystkich procedur i funkcji znajdujących się w pliku głównym modułu (tym ustawionym poprzez set main) – stad jest możliwość wywoływania odpowiednich procedur, a procedura główna może np. pokazywać okienko z informacja, że jest to plik modułu uruchamialny z systemu
W związku z tym jest możliwość takiego wywoływania akcji:
DO procedura IN _mapp
Przykładowe równoważniki ciągów symboli _xsc\, _mpath\, _mapp które można używać w kolumnach ikonki, akcji tabeli m_menu oraz kolumny app_path w tabeli config w bazie modułu:
_xsc\ – katalog programu (np. c:\hermes sql\)
_mpath\ – katalog modułu (_xsc\modul\ -> c:\hermes sql\modul\)
_mapp – plik wykonywalny modułu (‘c:\hermessql\modul\modul.app’)
Aby dostać się do danych na serwerze sql’owym można użyć polecenia:
SQLEXEC(_connection, lcCommand, kursor)
lub
mySqlExec(lcCommand) zwracającego nazwę kursora z uzyskanym rezultatem zapytania
Przykładowe użycie mySqlExec:
lcCommand="SELECT baza_mod FROM Hermes.dbo.firmy WHERE symbol='"+_xmojfrm+"'" lcCursor=mySqlExec(lcCommand) IF !EMPTY(lcCursor) SELECT &lcCursor IF RECCOUNT()>0 BazaModulu=ALLTRIM(baza_mod) ENDIF USE IN (lcCursor) ENDIF lcCommand="SELECT nr_wersji FROM m_firma" lcCursor=mySqlExec(lcCommand) IF !EMPTY(lcCursor) SELECT &lcCursor IF RECCOUNT()>0 lnNrWersjiModuluWFirmie=nr_wersji ENDIF USE IN (lcCursor) ENDIF
6.2. Widoki fabryczne modułu
1) W bazie modułu powinno być założonych pięć tabel zgodnie z poniższymi poleceniami SQL:
a) sl_view
CREATE TABLE [SL_VIEW] ( [WIDOK] [char] (10) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_WIDOK] DEFAULT (''), [TABELA] [char] (10) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_TABELA] DEFAULT (''), [SL_TYTUL] [char] (70) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_TYTUL] DEFAULT (''), [TYTUL_FORM] [char] (70) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_TYTUL_FORM] DEFAULT (''), [TYTUL_WW] [char] (70) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_TYTUL_WW] DEFAULT (''), [FILTER] [char] (150) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_FILTER] DEFAULT (''), [SK_TABELA] [bit] NOT NULL CONSTRAINT [DF_SL_VIEW_SK_TABELA] DEFAULT (1), [SK_WIECEJ] [bit] NOT NULL CONSTRAINT [DF_SL_VIEW_SK_WIECEJ] DEFAULT (1), [SL_DODAJ] [char] (70) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_DODAJ] DEFAULT (''), [SL_POPRAW] [char] (70) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_POPRAW] DEFAULT (''), [SL_USUN] [char] (70) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_USUN] DEFAULT (''), [SL_WARWYB] [char] (70) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_WARWYB] DEFAULT (''), [SL_WYDRUK] [char] (40) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_WYDRUK] DEFAULT (''), [SL_DRK_DOK] [char] (30) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_DRK_DOK] DEFAULT (''), [SL_Z_BUF] [char] (40) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_Z_BUF] DEFAULT (''), [SL_DO_BUF] [char] (90) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_DO_BUF] DEFAULT (''), [SK_DODAJ] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_DODAJ] DEFAULT ('.T.'), [SK_POPRAW] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_POPRAW] DEFAULT ('.T.'), [SK_USUN] [char] (60) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_USUN] DEFAULT ('.T.'), [SK_PRZ_TR] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_PRZ_TR] DEFAULT ('.T.'), [SK_WYBOR] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_WYBOR] DEFAULT ('.T.'), [SK_ZNAJDZ] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_ZNAJDZ] DEFAULT ('.T.'), [SK_PORZADE] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_PORZADE] DEFAULT ('.T.'), [SK_FABR] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_FABR] DEFAULT ('.T.'), [SK_WARWYB] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_WARWYB] DEFAULT ('.T.'), [SK_WYDRUK] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_WYDRUK] DEFAULT ('.T.'), [SK_OBLICZ] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_OBLICZ] DEFAULT ('.T.'), [SK_EKSPORT] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_EKSPORT] DEFAULT ('.T.'), [SK_DRK_DOK] [char] (50) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_DRK_DOK] DEFAULT ('.T.'), [SK_Z_BUF] [char] (100) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_Z_BUF] DEFAULT ('.T.'), [SK_DO_BUF] [char] (100) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SK_DO_BUF] DEFAULT ('.T.'), [NRWERSJIBR] [numeric](10, 0) NOT NULL CONSTRAINT [DF_SL_VIEW_NRWERSJIBR] DEFAULT (0), [SL_OPIS] [text] COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_SL_OPIS] DEFAULT (''), [FORM_PARAM] [text] COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_FORM_PARAM] DEFAULT (''), [SK_SUM] [bit] NOT NULL CONSTRAINT [DF_SL_VIEW_SK_SUM] DEFAULT (1), [PROPERTIES] [text] COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_PROPERTIES] DEFAULT (''), [JOIN_TABLE] [char] (30) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_VIEW_JOIN_TABLE] DEFAULT (''), CONSTRAINT [PK_SL_VIEW] PRIMARY KEY CLUSTERED ( [WIDOK] ) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
b) sl_widok
CREATE TABLE [SL_WIDOK] ( [ID_WIDOK] [int] IDENTITY (1, 1) NOT NULL , [WIDOK] [char] (10) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_WIDOK_WIDOK] DEFAULT (''), [NAZWA] [char] (30) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_WIDOK_NAZWA] DEFAULT (''), [ID_ZAP] [int] NOT NULL CONSTRAINT [DF_SL_WIDOK_ID_ZAP] DEFAULT (0), [SYMBOL_WZR] [char] (10) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_WIDOK_SYMBOL_WZR] DEFAULT (''), [FORM_PARAM] [text] COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_WIDOK_FORM_PARAM] DEFAULT (''), [PROPERTIES] [text] COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_WIDOK_PROPERTIES] DEFAULT (''), [JOIN_TABLE] [char] (30) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_WIDOK_JOIN_TABLE] DEFAULT (''), CONSTRAINT [PK_SL_WIDOK] PRIMARY KEY CLUSTERED ( [ID_WIDOK] ) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
c) sl_zap
CREATE TABLE [SL_ZAP] ( [ID_ZAP] [int] IDENTITY (1, 1) NOT NULL , [WIDOK] [char] (10) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_ZAP_WIDOK] DEFAULT (''), [NAZWA] [char] (30) COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_ZAP_NAZWA] DEFAULT (''), CONSTRAINT [PK_SL_ZAP] PRIMARY KEY CLUSTERED ( [ID_ZAP] ) ON [PRIMARY] ) ON [PRIMARY]
d) sl_def_v
CREATE TABLE [SL_DEF_V] ( [widok] [char] (10) COLLATE Polish_CI_AS NOT NULL , [objecttype] [char] (10) COLLATE Polish_CI_AS NOT NULL , [objectname] [char] (10) COLLATE Polish_CI_AS NOT NULL , [expr] [text] COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_DEF_V_EXPR] DEFAULT (''), [id] [int] IDENTITY (1, 1) NOT NULL , [id_zap] [int] NOT NULL CONSTRAINT [DF_SL_DEF_V_id_zap] DEFAULT (0), CONSTRAINT [PK_SL_DEF_V] PRIMARY KEY CLUSTERED ( [id] ) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
e) sl_colmn
CREATE TABLE [SL_COLMN] ( [widok] [char] (10) COLLATE Polish_CI_AS NOT NULL , [kolumna] [char] (10) COLLATE Polish_CI_AS NOT NULL , [properties] [text] COLLATE Polish_CI_AS NOT NULL CONSTRAINT [DF_SL_COLMN_properties] DEFAULT (''), [column_ord] [int] NOT NULL CONSTRAINT [DF_SL_COLMN_column_ord] DEFAULT (1), [id_widok] [int] NOT NULL CONSTRAINT [DF_SL_COLMN_id_widok] DEFAULT (0), [id] [int] IDENTITY (1, 1) NOT NULL , CONSTRAINT [PK_SL_COLMN] PRIMARY KEY CLUSTERED ( [id] ) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
2) Utworzenie i modyfikowanie widoków fabrycznych
Aby dodać widok fabryczny modułu należy:
– ręcznie dodać rekord w tabeli sl_view w bazie modułu,
– w katalogu programu utworzyć pusty plik pm.mod (programowanie modułu),
– uruchomić programu – powinna się pojawić dodatkowa pozycja _xmprojekt w menu System,
– włączenie pozycji _xmprojekt spowoduje, że wszelkie informacje odnośnie widoku będą zapisywane w tabelach słowników modułu (tabele: sl_view, sl_widok, sl_zap, sl_def_v, sl_colmn w bazie modułu),
– uruchomić grida dla tego widoku (np. wywołać polecenie browse dla modułu) – spowoduje to dodanie odpowiednich pozycji do tabel słownikowych,
– zaprojektować widok za pomocą opcji Zarządzanie widokami oraz Zarządzanie zapytaniami SQL, dodać odpowiednie kolumny, sformatować wygląd,
– zapisać wygląd tabeli – gdy była włączona opcja _xmprojekt, to wygląd zostanie zapisany w tabelach słowników modułu,
– wyłączyć opcje _xmprojekt,
– skasować plik pm.mod (gdyby użytkownik końcowy posiadał taki plik mógłby on nadpisać tabele słownikowe modułu co zniszczyłoby fabryczne widoki modułu).
3) Znaczenie wybranych pól w tabeli sl_view:
[WIDOK] [char] (10) – nazwa widoku modułu pisana dużymi literami zaczynająca się od M_ , np. M_TEST,
[TABELA] [char] (10) – nazwa tabeli z danymi, np. M_TABELA,
[SL_TYTUL] [char] (70) – tytuł widoku, np. Tabela testowa,
[TYTUL_FORM] [char] (70) – tytuł widoku dla formularza browse, zazwyczaj zawiera to samo co kolumna sl_tytul, np. Tabela testowa,
[TYTUL_WW] [char] (70) – tytuł dla formularza z filtrami, np. Tabela testowa – filtry,
[SK_TABELA] [bit] – czy ma pojawić się przycisk Narzędzia (F11) z narzędziami dotyczącymi tabeli (menu pod prawym przyciskiem myszki); 0 – tak, 1 – nie (menu pod prawym przyciskiem myszki pozostanie nadal),
[SK_WIECEJ] [bit] – czy ma pojawić się przycisk z dodatkowymi narzędziami dla danego widoku (F12); 0 – tak, 1 – nie,
[SK_DODAJ] [char] (50) – czy ma pojawić się przycisk Dodaj; jest to wyrażenie Foxa, które przyjmuje wartość .T. lub .F.; .T. – brak przycisku, .F. – jest przycisk, np. .F., !zmienna,
[SK_POPRAW] [char] (50) – czy ma pojawić się przycisk Popraw; reszta jak wyżej,
[SK_USUN] [char] (60) – czy ma pojawić się przycisk Usuń; reszta jak wyżej,
[SK_PRZ_TR] [char] (50) – czy ma pojawić się przycisk Przenoszenie treści; reszta jak wyżej,
[SK_ZNAJDZ] [char] (50) – czy ma pojawić się przycisk Szukaj w całej tabeli (Ctrl – F); reszta jak wyżej,
[SK_WARWYB] [char] (50) – czy ma pojawić się przycisk Filtry (F8); reszta jak wyżej,
[SK_WYDRUK] [char] (50) – czy ma pojawić się przycisk Drukuj; reszta jak wyżej,
[SK_OBLICZ] [char] (50) – czy ma pojawić się przycisk Podsumowania; reszta jak wyżej,
[SK_WYBOR] [char] (50) – czy ma być aktywny przycisk Wybierz dla widoku wybranego jako lista browse; reszta jak wyżej,
[SL_DODAJ] [char] (70) – polecenie wykonywane po naciśnięciu przycisku Dodaj,
[SL_POPRAW] [char] (70) – polecenie wykonywane po naciśnięciu przycisku Popraw,
[SL_USUN] [char] (70) – polecenie wykonywane po naciśnięciu przycisku Usun,
[SL_WARWYB] [char] (70) – polecenie wykonywane po naciśnięciu przycisku Filtry,
[SL_WYDRUK] [char] (40) – polecenie wykonywane po naciśnięciu przycisku Drukuj.
4) Wywołanie browse dla modułu
browse(widok, alias, where, wherelb, listaBrowse, typ, porzadek, modul)
gdzie:
- widok – nazwa widoku,
- alias – alias pod którym widok ma być otwarty (pozostawienie tego pola pustego spowoduje otwarcie widoku pod aliasem o nazwie widoku),
- listaBrowse – .T. jeśli ma to być lista browse (na której można wybrać element) lub .F. jeśli nie,
- modul – 1 jeśli jest to widok modułu lub 0 jeśli nie.
Przykładowe wywołanie browse:
browse (‘M_TEST’,,,,,,,1) – otworzenie z modułu widoku M_TEST w formularzu browse programu
browse (‘M_TEST’,,,,.T.,,,1) – otworzenie z modułu widoku M_TEST jako listy browse programu SQL
browse (‘M_ART’) – otworzenie widoku ART (widok będzie szukany w słownikach programu SQL, a nie w słownikach modułu)
5) Tabele modułu, które mają służyć jako tabele dla widoków, muszą posiadać kolumnę row_dtime (wg tej kolumny ustalany jest porządek domyślny)
[row_dtime] [datetime] NOT NULL CONSTRAINT [DF_M_TEST_row_dtime] DEFAULT (getdate())
6) Zmienne globalne w programie dotyczące modułu:
zmienne można wykorzystać przy definiowaniu poleceń wykonywanych dla danego przycisku (Dodaj, Popraw itd.)
_xbaza_mod – nazwa bazy modułu odczytana z tabeli firmy w bazie Hermes
_xapp_path – ścieżka modułu
_xapp_mod – plik wykonywalny modułu razem z jego pełną ścieżką (ujęty w znaki ‘’)
Przykłady:
– akcja wywoływana po naciśnięciu przycisku Dodaj:
do test_dodaj in &_xapp_mod with ‘D’
– akcja wywoływana po naciśnięciu przycisku Popraw:
do test_dodaj in &_xapp_mod with ‘P’
– akcja wywoływana po naciśnięciu przycisku Usuń:
This.DeleteRecord()- metoda grida do usuwania bieżącego rekordu
UWAGA!
Zgodnie z wcześniejszymi informacjami, aby procedura test_dodaj była widoczna w pliku wykonywalnym modułu musi się ona znajdować w pliku głównym modułu.
7) Za podstawę okienek dialogowych modułu można używać klasy basedataform.
Należy wypełnić poniższe właściwości:
- csl_colmn ->msl_colmn (zamiastsl_colmn)
- csl_def_v ->msl_def_v (zamiastsl_def_v)
- csl_view ->msl_view (zamiastsl_view)
- c_view ->=”widok”gdzie widok jest nazwą widoku modułu
Przykład:
Po wypełnieniu tych właściwości formularz wie, z których słowników ma wziąć definicję wybranego widoku (ze słowników programu czy ze słowników modułu).
Właściwość oData wskazuje na cursoradapter z polami widoku i danymi modyfikowanego rekordu (dla trybu ‘P’ – popraw).
Formularz na bazie tej klasy może mieć jako parametr:
- ‘D’ czyli dodaj,
- ‘P’ czyli popraw.
Przenoszenie treści trzeba obsłużyć we własnym zakresie – funkcją przen_tr() można sprawdzić, czy był wciśnięty przycisk Przenoszenie treści.
8) Klasa listabr (lista browse) służy do wybierania pozycji wykorzystując dany widok. Należy w tym przypadku pamiętać o ustawieniu wartości .T. w polu sk_wybor w tabeli słownikowej sl_view.
Najważniejsze właściwości:
- cview – nazwa widoku,
- calias– alias (domyślnie tabela widoku),
- cpole– pole z widoku,
- csl_view– słownik fabryczny programu lub modułu (sl_view– programu, msl_view– modułu)
6.3. Wzorce wydruku modułu
9) W bazie modułu powinny być założone dwie tabele (WZR_FRX, PLIKI_WZR) zgodnie z poniższymi poleceniami SQL:
a) wzr_frx
CREATE TABLE [WZR_FRX] ( [dlugstr] [decimal](3, 0) NULL CONSTRAINT [DF_WZR_FRX_dlugstr] DEFAULT (0), [domysl_wzr] [bit] NULL CONSTRAINT [DF_WZR_FRX_domysl_wzr] DEFAULT (0), [fabr] [bit] NULL CONSTRAINT [DF_WZR_FRX_fabr] DEFAULT (0), [nazwa_wzr] [char] (52) COLLATE Polish_CI_AS NULL CONSTRAINT [DF_WZR_FRX_nazwa_wzr] DEFAULT (''), [rodz_wzr] [char] (8) COLLATE Polish_CI_AS NOT NULL , [symbol_wzr] [char] (8) COLLATE Polish_CI_AS NOT NULL , [tytul_wzr] [text] COLLATE Polish_CI_AS NULL CONSTRAINT [DF_WZR_FRX_tytul_wzr] DEFAULT (''), [szerstr] [decimal](3, 0) NULL CONSTRAINT [DF_WZR_FRX_szerstr] DEFAULT (0), [parametr] [char] (10) COLLATE Polish_CI_AS NOT NULL , [prolog] [text] COLLATE Polish_CI_AS NULL CONSTRAINT [DF_WZR_FRX_prolog] DEFAULT (''), [epilog] [text] COLLATE Polish_CI_AS NULL CONSTRAINT [DF_WZR_FRX_epilog] DEFAULT (''), [symbol_std] [char] (3) COLLATE Polish_CI_AS NULL CONSTRAINT [DF_WZR_FRX_symbol_std] DEFAULT (''), [putf] [char] (50) COLLATE Polish_CI_AS NULL , [il_kopii] [decimal](3, 0) NULL CONSTRAINT [DF_WZR_FRX_il_kopii] DEFAULT (1), [graf_txt] [decimal](1, 0) NULL CONSTRAINT [DF_WZR_FRX_graf_txt] DEFAULT (0), [pytaj_druk] [bit] NULL CONSTRAINT [DF_WZR_FRX_pytaj_druk] DEFAULT (0), [fabr_txt] [bit] NULL CONSTRAINT [DF_WZR_FRX_fabr_txt] DEFAULT (0), [printerwin] [char] (32) COLLATE Polish_CI_AS NULL CONSTRAINT [DF_WZR_FRX_printerwin] DEFAULT (''), [orientacja] [decimal](1, 0) NULL CONSTRAINT [DF_WZR_FRX_orientacja] DEFAULT (0), [ID_FRX] [int] NULL CONSTRAINT [DF_WZR_FRX_ID_FRX] DEFAULT (0), [ID_FRT] [int] NULL CONSTRAINT [DF_WZR_FRX_ID_FRT] DEFAULT (0), [row_dtime] [datetime] NOT NULL CONSTRAINT [DF_WZR_FRX_row_dtime] DEFAULT (getdate()), CONSTRAINT [PK_WZR_FRX] PRIMARY KEY CLUSTERED ( [rodz_wzr], [symbol_wzr], [parametr] ) ON [PRIMARY] ) ON [PRIMARY]
b) pliki_wzr
CREATE TABLE [PLIKI_WZR] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [NAZWA] [char] (16) COLLATE Polish_CI_AS NULL , [TYP] [char] (3) COLLATE Polish_CI_AS NULL , [PLIK] [text] COLLATE Polish_CI_AS NULL , [CRC] [char] (10) COLLATE Polish_CI_AS NULL , [row_dtime] [datetime] NOT NULL CONSTRAINT [DF_PLIKI_WZR_row_dtime] DEFAULT (getdate()), CONSTRAINT [PK_PLIKI_WZR] PRIMARY KEY CLUSTERED ( [ID] ) ON [PRIMARY] ) ON [PRIMARY]
10) Ogólna zasada dla wzorców wydruku z modułu.
Wzorce fabryczne modułu zapisywane są w tabelach wzr_frxi pliki_wzr w bazie modułu. Wzorce użytkownika są zapisywane w bazie danej firmy. Wzorce modułu, zarówno te fabryczne jak i użytkownika, można eksportować i importować w taki sam sposób jak wzorce programu. Wzorców fabrycznych modułu nie można eksportować ani modyfikować w normalnym trybie, można to zrobić jedynie w trybie projektowania modułu, po włączeniu opcji _xmprojfrx (projektowanie wzorców fabrycznych modułu). Rodzaj wzorca musi się zaczynać na m_ , natomiast symbol wzorca może być już dowolny (symbol wzorca unikalny dla danego rodzaju wzorca).
11) Polecenia drukujące
druk_tbl (rodz_wzr, tytul, TlModul)
drukuj tabelę, pokazuje okienko dialogowe DRUKUJ dla wzorców z rodzaju rodz_wzri nadaje tytuł wydruku; jeśli TlModul jest równy 1 to wzorce czerpane są z modułu (wzorce fabryczne modułu z bazy modułu, a wzorce użytkownika z bazy danej firmy)
Przykład użycia:
DO druk_tbl (“M_TEST”, , 1)
Pokazuje okienko dialogowe DRUKUJ dla wzorców wydruku rodzajuM_TESTpochodzących z modułu.
druk (rodz_wzr, symbol_wzr, param_wzr, tytul, nr_start, druk_ok, niekoncz, tlModul)
gdzie:
rodz_wzr – rodzaj wzorców,
symbol_wzr – symbol wzorca, który ma być wybrany (domyślnie wybierany jest wzorzec domyślny),
param_wzr – parametr wzorca, który ma być wybrany,
tytul – tytuł wydruku,
tlModul – czy wzorce z modułu, 1 jeśli tak.
Przykłady użycia:
DO druk (“M_TEST”, , , , , , , 1)
Pokazuje okienko dialogowe DRUKUJ dla wzorców wydruku rodzaju M_TEST pochodzących z modułu – polecenie identyczne w skutkach do polecenia:
DO druk_tbl WITH “M_TEST”, , 1
DO druk WITH “M_TEST”, “FGH”, , , , , , 1
Pokazuje okienko dialogowe DRUKUJ dla wzorców wydruku rodzaju M_TEST pochodzących z modułu; wybrany będzie wzorzec o symbolu FGH.
DO druk (“M_TEST”, “FGH”,”A”, , , , , 1)
Pokazuje okienko dialogowe DRUKUJ dla wzorców wydruku rodzaju M_TEST pochodzących z modułu; wybrany będzie wzorzec o symbolu FGH i parametrze A.
UWAGA!
Oczywiście można naprzemiennie używać druk() lub konstrukcji z WITH.
12) Tworzenie i modyfikacja fabrycznych wzorców wydruku
Aby dodać fabryczny wzorzec wydruku modułu należy:
– w katalogu programu utworzyć pusty plik pm.mod (programowanie modułu),
– uruchomić programu – powinna się pojawić dodatkowa pozycja _xmprojfrx w menu System,
– włączenie pozycji _xmprojfrx spowoduje, że będziemy projektować wzorzec fabryczny dla modułu (będzie on zapisany w bazie modułu),
– wywołać odpowiednie polecenie drukujące (np. wywołane po naciśnięciu przycisku Drukuj z grida), w okienku DRUKUJ zaprojektować odpowiedni wzorzec (czyli dodać wzorzec, zaprojektować go i zapisać),
– wyłączyć opcje _xmprojfrx,
– skasować plik pm.mod .
13) Import, eksport wzorców wydruku pochodzących z modułu.
Eksport wzorców użytkownika przebiega dokładnie w taki sam sposób jak wzorców programu. Aby wyeksportować wzorce fabryczne modułu należy włączyć opcję _xmprojfrx. Import wzorców modułu przebiega dokładnie w taki sam sposób jak wzorców programu; wzorce fabryczne modułu będą wkopiowane do bazy modułu (oczywiście przy włączonej opcji _xmprojfrx).
6.4. Procedura M_AUTORUN
W module branżowym możemy również umieścić kod, który wykona się przy logowaniu się operatorów do systemu. Wystarczy taki kod umieścić w programie głównym modułu w procedurze, którą należy nazwać M_AUTORUN. Program przy logowaniu sprawdza, czy taka procedura istnieje i wykonuje jej kod.
Funkcjonalność taka daje możliwość np. tworzenia systemu altertowania określonych zdarzeń.