HermesSQL

  1. Strona główna
  2. Docs
  3. HermesSQL
  4. Środowisko rozszerzeń SQL
  5. Środowisko modułów branżowych

Środowisko modułów branżowych

Wydrukuj dokument

Ś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ń.