Strona ta przeznaczona jest dla programujących przy użyciu serii Q-Line 3000. Zamieszczamy na niej opis obiektów definiowanych w plikach konfiguracyjnych *.qcon.
1. Wstęp
Projektanci Q-Line 3000 stanęli przed problemem potrzeby szybkiego i efektywnego sposobu konstruowania baz danych. Tworzenie za każdym razem od początku do końca całego programu zupełnie mija się z celem, ponieważ klienci "nie lubią czekać na produkt". Wolą, by program był już gotowy i by, w miarę potrzeb, można było dokonać szybko zmian.
Dlatego powstał system, dzięki któremu możliwe jest tworzenie programów wykorzystując gotowe elementy standardowe takie jak np. moduły i klocki ("klocki" to wewnętrzne pojęcie naszej firmy - takie mniejsze moduły).
Programista wykorzystując gotowe elementy standardowe jest w stanie szybko stworzyć produkt odpowiadający klientowi. Do konfigurowania programów opracowaliśmy QCONL - język konstruowania programów.
Podstawą konstrukcyjna każdego programu serii 3000 są pliki konfiguracyjne *.qcon. Podstawę *.qcon'ów stanowią obiekty opisane poniżej. Dzięki całkowitej parametryzacji w wielu przypadkach programistom udaje się bez zbędnego głebokiego wnikania zaimplementować określone rzeczy. Na przykład do każdej tabeli w programie można podłączyć moduł wydruków etykietowych QM-Labels samego podłączenia dokonuje się poprzez wpisanie słowa kluczowego "LABELSARRANGER" w odpowiedniej rubryce.
Definiowane obiekty w plikach konfiguracyjnych mają swoje określone znaczenie w programie np. menu, okno przeglądu danych, czy też okno edycji rekordów. Obiekty te są ściśle opisane poprzez szereg parametrów i atrybutów.
2. Słowa kluczowe-rodzaje obiektów w pliku konfiguracyjnym *.qcon
W serii Q-Line 3000 występuje kilkanaście słów kluczowych, za pomocą których definiuje się obiekty. Obiekty to elementy standardowe, z których buduje się program.
Lista słów:
MENU - słowo to służy do definiowania postaci menu, które jest podstawą każdego programu z serii Q-Line 3000 . Ogólna struktura jaką się wykorzystuje do definiowania obiektów tego typu jest opisana tutaj. Wykorzystując własności tej struktury możemy zdefiniować poszczególne pozycje menu i pod każdą z tych pozycji podpiąć akcję jaka ma być wykonana po uruchomieniu. Dodatkowo szereg parametrów i atrybutów umożliwia opisanie własności samego menu, czyli np. pozycję wyświetlenia, help - co się pojawia po najechaniu myszką, klawisza skrótu, czy też ikony jaka ma być wyświetlona przy danej pozycji.
TAB - jest to bardzo uniwersalne słowo. Dzięki niemu możemy definiować wiele różnych obiektów. Definicja obiektu tego typu wygląda bardzo podobnie jak definicja menu, wykorzystuje się tą samą ogólną strukturę. Podstawowym obiektem jaki możemy zdefiniować jest tabela bazy danych. W ten sposób określamy rodzaj danych jakie chcemy przechowywać w naszej bazie i ich typ. Obiekty takiego typu posiadają zdolność dziedziczenia, czyli tworzenia podobnego obiektu(potomnego) - przy tworzeniu należy podać czym się różni od tabeli rodzica(polecenie "extends"). Dzięki tej własności możemy tworzyć inne obiekty. Następnym takim obiektem jest edycja rekordów, która bazuje na tabeli rodzicu(stąd wie jakie dane można wprowadzać) i służy, jak sama nazwa wskazuje, do edycji danych. Do przeglądania wprowadzonych danych stosuje się tzw. browser'y, które też są rozwinięciem tabel. Szereg atrybutów pozwala nam określić sposób edycji i prezentacji danych.Dodatkowo parametry określają np. rozłożenie pól edycji, rozmiar okna, pozycje wyświetlania okna, itp. .
Dodatkowo mamy jeszcze inne słowa kluczowe, jednak na tym poziomie dokumentacji nie będą opisywane dokładnie:
EXT - Służą one do tworzenia rozszerzeń do obiektów TAB i MENU
RSS - Służą one do definiowania związków relacyjnych między bazami
BSS - Służą one do definiowania zakresu wyświetlanych rekordów w browserze
EVH - Służą one do definiowania całego "zestawu" : BSS + RSS + pola kopiowane + inne atrybuty - dla pól, które korzystają z innych baz ( Słownik Historia Lookup itd )
LABELSARRANGER - Wywołanie modułu QM-Labels
3. Struktura definiowanych obiektów
Spośród wielu możliwych struktur projektanci Q-Line 3000 wybrali strukturę nazwaną przez nich ListoMacierz. Struktura taka posiada m.in. zalety:
czytelność - przy zachowaniu zwartego opisu zawiera bardzo dużo informacji
łatwość tworzenia i modyfikacji - jest to między innymi konsekwencją punktu poprzedniego
nieograniczone możliwości zapisania każdej informacji (elementem ListoMacierzy może być ListoMacierz)
łatwość nauki
Dzięki tak prostej strukturze możliwe jest stworzenie dowolnego obiektu programu w szybki sposób.
Poniżej przedstawiamy ListoMacierz w postaci ogólnej:
*Słowo kluczowe* < ident >
Ident linii_1
=
Wartość linii_1
Ident linii_2
=
Wartość linii_2
Ident linii...
=
Wartość linii...
Ident linii...
=
Wartość linii...
Ident linii...
=
Wartość linii...
Ident linii_k
=
Wartość linii_k
{
Ident kolumny_1
Ident kolumny_2
...
...
Ident kolumny_m
;
1
Wartość kolumny_11
Wartość kolumny_12
...
...
Wartość kolumny_1m
;
2
Wartość kolumny_21
Wartość kolumny_22
...
...
Wartość kolumny_2m
;
...
Wartość kolumny_...1
Wartość kolumny_...2
...
...
Wartość kolumny_...m
;
...
Wartość kolumny_...1
Wartość kolumny_...2
...
...
Wartość kolumny_...m
;
n
Wartość kolumny_n1
Wartość kolumny_n2
...
...
Wartość kolumny_nm
;
}
< ident > stanowi identyfikator tekstowy - nazwę danego obiektu.
Pierwsza tabela stanowi opis macierzowy parametrów danego obiektu. Każdy wiersz to oddzielny parametr wraz z przypisaniem wartości. I tak mamy :
Ident linii_1 = Wartość linii_1
gdzie Ident linii_1 jest identyfikatorem tekstowym(nazwą) parametru, a np.Wartość linii_1 jest wartością na przecięciu pierwszego wiersza i kolumny. Może być zarówno w postaci tekstu, liczb całkowitych lub też szeregu liczb. Takich parametrów możemy wpisać dowolną ilość - k, w zależności od potrzeb. Tę swobodę zapewnia nam interpreter struktury plików konfiguracyjnych. Przykład :
TITLE
=
"Dane osoby wprowadzanej do książki adresowej"
BASE
=
ADRESY
BASETYPE
=
SEP
POS
=
50 50
SIZE
=
120 100
BROWSER_ACTIONS
=
+FULL_SET +F10MENU
RECEDIT
=
ADRESY_EDIT
Wyjaśnienie : Okno BROWSER'a będzie miało tytuł "Dane adresowe". Dane są przechowywane w pliku ADRESY, na serwerze SEP. Okno wyświetlone zostanie w pozycji X=50 Y=50 i będzie miało rozmiar X=120 Y=100. ADRESY_EDIT jest obiektem typu EDIREC. BROWSER_ACTIONS stanowi spis dostępnych w BROWSER'ze akcji, jakie możemy wykonać na danych, itp. .
Dalszą część stanowi ciało obiektu, które jest umieszczone między nawiasami klamrowymi {}. Podobnie jak w przypadku parametrów mamy tu opis macierzowy, jednak o wiele bardziej rozbudowany. Taka macierz może mieć wiele kolumn - m i może zawierać wiele wierszy - n. Nazwa każdej kolumny - Ident kolumny stanowi oddzielny atrybut. Atrybut może przyjmować wiele wartości lub tylko pojedyńczą Wartość kolumny. Przykład :
ID
NAME
VIS
;
IDENT
"Id"
HIDE
;
IMIE
"Imię"
SHOW
;
NAZWISKO
"Nazwisko"
SHOW
;
ULICA
"Ulica"
SHOW
;
MIASTO
"Miasto"
SHOW
;
KOD_POCZTOWY
"Kod pocztowy"
SHOW
;
Wartością parametrów i atrybutów mogą być także inne obiekty zdefiniowane w pliku konfiguracyjnym, tak jak w przykładzie parametr RECEDIT ma wartość TABELA_EDIT - obiekt TAB będący obiektem potomnym obiektu TABELA poszerzonym o edycję danych. Budowanie obiektów opiera się na zasadzie rozbudowywania. Rozpoczyna się od obiektu bazowego i poprzez rozszerzanie(dziedziczenie) buduje się nowe obiekty, dodając odpowiednie elementy i parametry.
2.1. Opis dodatkowych możliwości struktury definiowania obiektów
W momencie kiedy tworzymy określony obiekt musimy się zastanowić, które atrybuty występują we wszystkich wierszach. Jeśli w takim przypadku wybierzemy n atrybutów dla m wierszy, powstaje macierz n x m. Jednak interpreter struktury plików konfiguracyjnych umożliwia dodanie atrybutów do określonego wiersza, mimo iż nie występują w pozostałych. Daje nam to możliwość wstawiania dowolnej liczby atrybutów dla danego wiersza. I tak :
ID
NAME
;
IDENT
"Id"
VIS=HIDE
;
IMIE
"Imię"
;
NAZWISKO
"Nazwisko"
;
ULICA
"Ulica"
ATTRIB=(CAPITAL)
;
MIASTO
"Miasto"
;
KOD_POCZTOWY
"Kod pocztowy"
;
mamy macierz 6x2 z kolumnami ID i NAME, dodatkowo dla ID=IDENT mamy atrybut VIS=HIDE, a dla ID=ULICA mamy ATTRIB=(CAPITAL) - nawiasy oznaczają, że możemy wprowadzić więcej niż jedną wartość. W całości obiekt typu TAB może być zdefiniowany jak niżej:
HELP - wyświetla określony tekst po najechaniu myszką na daną pozycję menu
ACTION - słyży do podczepienia akcji pod daną pozycję menu.Dostępne akcje:
MENU - otwiera inne menu
BROWSER - otwiera BROWSER
LABELS_ARRANGER - otwiera LABELS ARRANGER
RECEDIT - okno edycji rekordu
LINE - wstawia linię
INSERT - powoduje wstawianie danych
ICON - ustawia ikonę wyświetlaną przy pozycji menu
PRINT -
EMAIL_SENDER - uruchamia moduł wysyłania emaili
THTML - otwiera dokument THTML
QTENBERG - otwiera moduł QTENBERG
PRZYKŁAD:
I KOD W PLIKU *.qcon:
MENU MainMenu
TITLE="To jest główne menu programu"
POS=75 20
{
ID ACTION NAME ;
POZYCJA_1 MENU Menu_1 "Pozycja pierwsza" ;
POZYCJA_2 BROWSER TABELA_BROW1; "Pozycja druga" ;
LINIA LINE "Linia" ;
POZYCJA_3 RECEDIT TAB=TABELA_EDIT; "Pozycja trzecia" ;
}
MENU Menu_1
TITLE="To jest rozwijane menu"
{
ID ACTION SHORTCUT NAME;
POZ1 BROWSER TABELA_BROW1; W "Pozycja pierwsza menu rozwijanego";
POZ2 BROWSER TABELA_BROW2; E "Pozycja druga menu rozwijanego" ;
POZ3 BROWSER TABELA_BROW3; R "Pozycja trzecia menu rozwijanego"
HELP="To jest pomoc wyświetlana po
najechaniu myszką" ;
}
Tabele TABELA_BROW1,TABELA_BROW2,TABELA_BROW3,TABELA_EDIT są przykładowe, ich definicje są nie istotne w tym przykładzie.
BASE - przypisuje się wartość w postaci tekstowej, jest to nazwa na serwerze, poprzez którą odwołujemy się do tabeli. BASE musi koniecznie posiadać wartość dla tabel bazowych, nie ma wartości domyślnej.
BASETYPE - określa czy dana tabela jest tabelą bazową. Może przyjmować tylko określone wartości:
DEFAULT - oznacza, że tabela jest tworzona na domyślnym serwerze, dane w pliku qline.txt
SEP - tabela tworzona na serwerze SEP
MEMORY - tabela istnieje tylko w pamięci
LOCAL - tabela tworzona lokalnie
POSTGRES - tabela tworzona na serwerze PostgresSQL
ORDERS - określa uporządkowanie na tabeli, format jak w ciele tabeli, mamy następujące kolumny:
ID - identyfikator tekstowy uporządkowania(nazwy inne niż w ciele tabeli)
FIELDS - lista identyfikatorów wierszy z tabeli wg. których następuje uporządkowanie
LABEL - nazwa uporządkowania
VIS - czy widoczny, wartości SHOW(tak) lub HIDE(nie), domyślnie SHOW
UNIQUE - ustawia czy klucz dany w atrybucie FIELDS ma być kluczem unikalnym, wartości YES i NO
ID - identyfikator tekstowy wiersza w ciele tabeli
LEN - liczba bajtów do przechowywania wartości danego pola, dla typów INT i DOUBLE ma być 8
TYPE - typ wartości, mamy 3 typy:
STRING - pole typu znakowego
INT - pole typu liczba całkowita
DOUBLE - pole typu zmiennoprzecinkowego
Tabela bazowa sama w sobie nie stanowi obiektu wizualnego, ale w rozszerzeniu jako BROWSER tak. W praktyce nie stosuje się samych tabel bazowych. Najczęściej tabela bazowa jest już uzupełniona o atrybuty BROWSER'a czy też EDIREC'a, a tabele BROWSER'a i EDIREC'a są tworzone przez dziedziczenie i dodanie BROWSER_ACTIONS dla BROWSER'a i LAYOUT dla EDIREC'a. Poniższy przykład pokazuje nam połączenie tabeli bazowej, BROWSER'a i EDIREC'a. Natomiast w punkcie 5.1 i 5.2 są opisane parametry i atrybuty obiektów BROWSER i EDIREC.
Przykład BROWSER'a:
Przykład EDIREC'a:
W kodzie wygląda to następująco :
TAB TABELA
TITLE="Przeglądanie danych osobowych"
BASE=TABELA
BASETYPE=SEP
POS=50 50
ORDERS=
{
ID FIELDS LABEL VIS ;
NAZW (NAZWISKO) "Porządkowanie po nazwisku" SHOW ;
}
{
ID TYPE LEN NAME ;
ID INT 8 "Id" VIS=HIDE;
DATA_WPR INT 8 "Data wprowadzenia" MASK=DATE AUTFUN=curr_date();
IMIE STRING 20 "Imię" ATTRIB=(FCAPITAL);
NAZWISKO STRING 40 "Nazwisko" ATTRIB=(FCAPITAL);
DATA_UR INT 8 "Data urodzin" MASK=DATE;
ULICA STRING 40 "Ulica" ATTRIB=(FCAPITAL);
KOD STRING 6 "Kod pocztowy" MASK=MASK("00\\-000");
MIASTO STRING 20 "Miasto" ATTRIB=(CAPITAL);
TELEFON STRING 15 "Telefon" ;
EMAIL STRING 30 "Adres email" ;
PRACA INT 3 "Czy pracuje?" MASK=LLIST("TAK" "NIE");
OPIS STRING 60 "Opis osoby" ;
}
TAB TABELA_BROW extends TABELA;
BROWSER_ACTIONS=+FULL_SET +F10MENU
RECEDIT=TABELA_EDIT
{;}
TAB TABELA_EDIT extends TABELA;
TITLE="Edycja danych osobowych"
LAYOUT=HPAN(GRP("Data wprowadzenia danych" TCP(DATA_WPR))
GRP("Imię i Nazwisko" TCP(IMIE NAZWISKO) )
GRP("Adres i kontakt" TCP(ULICA KOD MIASTO TELEFON EMAIL) )
GRP("Inne dane" TCP(DATA_UR PRACA OPIS) ) )
{;}
5.1. Przeglądanie danych jako rozszerzenie tabeli bazowej - BROWSER
TITLE - jest to nazwa wyświetlana na głównym pasku BROWSER'a.
POS - pozycja wyświetlenia BROWSER'a liczona w procentach, wartość 50 50 jest wartością domyślną i powoduje wyświetlenie okna na środku ekrany, przykład: POS = 75 30
SIZE - rozmiar wyświetlanego BROWSER'a w znakach dla X i w liniach dla Y, przykład: SIZE=100 25
RECEDIT - określa jaki obiekt będzie używany do edycji rekordów, przykład: RECEDIT=TABELA_EDIT, gdzie TABELA_EDIT jest edycją rekordów
BAROFF - wyłączanie paska narzędziowego, wartości TRUE i FALSE, domyślnie FALSE
BROWSER_ACTIONS - określa nam jakie akcje są dostępne na pasku narzędziowym.Wartość tego parametru definiujemy jako listę wartości odpowiednio dodając znak "+" przed wartością gdy chcemy dodać akcję lub znak "-" zabierając ją. Lista dostępnych akcji:
VIEW - przeglądanie rekordu : ENTER
CHANGE - zmiana uporządkowania : F3
SEARCH - wyszukiwanie : F6
FILTER - filtrowanie : f/F
F2MENU - menu pod F2 : F2
LINEPRINT - wydruk wierszowy : F8
INSERT - dodanie rekordu : INS
MODIFY - modyfikacja rekordu : m
DELETE - usuwanie rekordu : DEL
F10MENU - operacje na zaznaczonych pozycjach : F10
COUNT - zliczanie pozycji : F7
SELMODE - wyświetlenie tylko zaznaczonych : F4
ALLMODE - wyświetlenie wszystkich : F5
INVERTALL - odwrócenie zaznaczonych : *
SELALL - zaznaczenie wszystkich : +
UNSELALL - odznaczanie wszystkich : -
SELECT - zaznaczenie bieżącej pozycji : SPACE
SELUP - zaznaczenie wszystkich pozycji powyżej bieżącej : u
SELDOWN - zaznaczenie wszystkich pozycji poniżej bieżącej : d
UNSELUP - odznaczenie wszystkich pozycji powyżej bieżącej : U
UNSELDOWN - odznaczenie wszystkich pozycji poniżej bieżącej : D
AUTFUN - służy do wyliczenia dynamicznie kolumny, której nie ma zdefiniowanej w tabeli, jako wartość możemy ustawiać to co zwracają, następujące funkcje:
filedata(expr_filename) - odczytuje plik o określonej nazwie
money2words(expr_amount) - zamienia kwotę na postać słowną
copy(expr_string,long,long) - wycina w ciagu znaków od określonego indeksu określoną liczbę znaków
curr_date() - zwraca bieżącą datę
curr_time() - zwraca bieżący czas
edit_mode() - zwraca status edycji pola : 0 NULL 1 VIEW 2 INSERT 3 MODIFY
isNULL() - zwraca czy pole jest Null
length(expr_string,expr_long1,expr_long2) - zwraca długość ciągu znaków
login_name() - zwraca identyfikator użytkownika
login_group_name() - zwraca identyfikator grupy użytkownika
sysfield(expr_tabname,expr_fieldname) - zwraca wartość pola fieldname z tabeli tabname
trim(expr_string) - wycina białe znaki
weekday() - zwraca dzień tygodnia(0-PO,1-WT)
internalDate(expr_date) - zamienia datę na string w formacie YYYY.MM.DD
min(expr_num1,expr_num2) - zwraca minimum dwóch liczb
max(expr_num1,expr_num2) - zwraca maximum dwóch liczb
parentVal(expr_fieldId) - zwraca wartość pola głowy
color(color) - zwraca kolor
parse() - ???
zero_number(expr_num,expr_len) - zamienia liczbę na string dopełniony zerami na określonej długości
JoinAutFun(tab1,tab2,tab3,...) - zwraca (String-ową) sumę elementów z tabel tab1,tab2,tab3,... (formatowanie można ustalić za pomocą JOINTAB. Domyślnie wszystko jest formatowane "do Lewej")
Dodatkowo atrybut służy do wyliczeń gdzie jako wartość ustawiany jest wynik operacji numerycznej na polach tabeli. Przykład:
Jeśli w tabeli mamy zdefiniowane pola PO1,PO2,PO3,PO4 to może być AUTFUN=(PO1-PO2)*PO3/PO4
ATTRIB - atrybut ten służy do ustawiania różnego rodzaju właściwości. Dla samego BROWSER'a dostępna jest tylko jedna właściwość:
BGCOLOR - służy do ustawiania tła, kolory możemy ustawiać w następujący sposób:
RGB(red,green,blue) - podaje się składowe koloru
INT(int) - podaje się wartość int zwracaną przez RGB
SIMPLE(identifier) - podaje się jeden ze standardowych kolorów
JOINTAB - służy to ustalenia formatowania odpowiednio tab1,tab2,... przez funkcję JoinAutFun(tab1,tab2,...). Możliwe opcje:
TAB1 będzie formatowana do prawej, TAB2 będzie centrowa, TAB3 (domyślnie, bo nie podano) będzie formatowana do lewej.
EDILEN - pełni tą samą funkcję co LEN w tabeli bazowej
LOOK - służy do wyciągania danych z innych baz, jako wartość ustawia się makro EVH. Możemy dodać do browsera pola wyciągane w locie z innej bazy. Lookupy są realizowane przez serwer (SEP), w związku z tym narzut czasowy jest mały ale zauważalny. Jeden lookup definijue tylko sposób wypełninia pól (nie zaś kolumny), kolumny trzeba jawnie zadeklarować jako kolumny tabelki BROWSER. Co więcej jeden Lookup może wypełniać kilka kolumn za jednym zamachem. (np wyciągane z innej bazy imię i nazwisko). Takie łączenie jest zalecane efektywnościowo, gdyż serwer wykonuje wtedy jedną operację wyszukania dla kilku pól. Zmniejsza to niestety czytelność tabelki. Dlatego jeżeli nie jest to wymagane, lepiej by każde pole lookup było definiowane oddzielnym makrem lookup zdefiniowanym przy tym właśnie polu.
MASK - Sposób wyświetlania kolumny w browserze jest definiowany przez tą kolumnę, zaś jeżeli tej kolumny brak, to wtedy wartość domyślna brana z kolumny TYPE. Wszystkie wartości numeryczne zostaną wyrównane do prawej strony, pozostałe do lewej.
Maski są zdefiniowane tutaj
NAME - nazwa pola w BROWSER'ze
5.2. Okno edycji rekordu jako rozszerzenie tabeli bazowej - EDIREC
AER_CONDITION - opisuje warunki zatwierdzenia rekordu, tutaj możemy wymusić wypełnienie pewnych pól lub też zadać warunek na wzajemną zależność pół np A > B
Jako wartość podaje się listę : <condition_element> .... <condition_element> gdzie każdy condition_element to jeden z tych :
MBF(fieldId,....,fieldId) - (Must Be Filled) - musi być wypełnione, określa pola , które muszą być wypełnione
COND(cond) - podany warunek musi być prawdziwy
AER_WARNING - działanie podobne do AER_CONDITION, lecz w przypadku AER_WARNING użytkownik może powrócić do edycji rekordu lub zaakceptować zmiany mimo niespełnienia podanych warunków. Składnia taka sama jak AER_CONDITION.
ASCESC - Ustawiając ten parametr na wartość YES przy każdej próbie porzucenia edycji rekordu (ESC) program się zapyta czy na pewno chcemy wyjść. Jest to szczególnie pożądane dla rekordów z historiami. Domyślna wartość to NO.
BUTTONS - Tu podajemy zawartość paska (belki) z guzikami pojawiającej się na dole pod edycją rekordu.
Możemy wprowadzić następujące wartości:
DEFAULT - standardowy pasek z przyciskami OK i CANCEL
NONE - wyłaczony pasek z guzikami
EXPLICITE(buttonid,...,buttonid) - podaje się listę przycisków np. OK, CANCEL lub identyfikator pola, w którym musi być zdefiniowana maska BUTTON z podaną akcją "ButtonFieldAction"
COPY2HIST_FIELDS - Tu możemy określić dla jakich historii wykonywane będzie kopiowanie do historii. Podajemy rodzaj kopiowania a następnie w nawiasach listę pól, do których mamy podpięte historie z kopiowaniem do historii czyli w makrze musi być BROWSER_INS_. Pola które nie są wyszczególnione, a mają takie makra nie będą kopiowane. Kopiowanie do historii wykonane jest po F10 po sprawdzeniu poprawności i po Triggerze. Dla serwerów SQL można to mocno przyśpieszyć. Jako wartość podajemy listę c2h_element,...,c2h_element; gdzie każdy z c2h_element to jeden z poniższych:
HARD(fieldId,...,fieldId)- twarde kopiowanie, czyli zawsze
SOFT(fieldId,...,fieldId)- miękkie kopiowanie, czyli tylko w puste pola
F10LOOKUPS - służy do liczenia lookup'ów, jeśli ustawimy ten atrybut na TRUE to lookup'y zostaną ponownie policzone po F10. Można dzięki temu wyciągać do głowy jakieś wartości np. z historii.
LAYOUT - Tym parametrem budujemy opis wyglądu karty edycji, podając layout_element, najprostszym ułożeniem jest TCP czyli ułożenie pól jedno pod drugim. Można też składać elementy z innych elementów.
Opis wszystkich elementów wraz z przykładami tutaj.
ATTRIB - ustawia się tu różne atrybuty pola edycji. Dostępne wartości:
CAPITAL - wymuszenie wszystkich dużych liter
FCAPITAL - wymuszenie tylko pierwszej dużej litery
COLOR - kolor czcionki, określany tak jak w ATTRIB
FONTNAME - nazwa czcionki
FONTSIZE - wielkość czcionki
FONTSTYLE - styl czcionki: BOLD - wytłuszczona, PLAIN -zwykła, ITALIC-pochyła
SUFFLE - włączenie dopełniaczki słownikowej (tylko dla słów słownikowych)
BASEFUN - Możemy zdefiniować pole które sumuje jakieś wyrażenie przeglądając bazę zewnętrzną oraz jest na bieżąco uaktualniane (również w trakcie dopisywania rekordów). Pola te są bardzo wygodne to obliczania sum jakiegoś pola w historii lub ilości rekordów itp.... Jako wartość sumowaną dla każdego rekordu podajemy wyrażenie UWAGA!!!! Na razie pole to przelicza się za każdym razem jak otwieramy kartę rekordu (docelowo będzie to opcja).Możliwości :
SUM(<fieldid>,<expression>) - Sumuje wartość gdzie <fieldid> to identyfikator pola z podpiętym makrem historii,
zaś <expression> to wyrażenie typu AutFun liczone dla REKORDU HISTORII i sumowane.
COUNT(<fieldid>) - liczy ilość pozycji gdzie <fieldid> to identyfikator pola z podpiętym makrem historii.Jest to samo co
SUM(<fieldid>,1), ale ponieważ jest często używane to zostało wydzielone.
DEFVALUE - Dzięki temu pole możemy zdefiniować wartości domyślne, podając czym pole ma się wypełnić, przy dodawaniu nowej pozycji. Ta kolumna może być też użyta do innych celów. Np. możemy wstawić identyfikator użytkownika wporwadzającego pozycję, albo jakąś wartość z par. systemowych... i pewnie jest jeszcze parę innych zastosowań. Jako wartość można wstawiać wyrażenia te same co są w AUTFUN.
ENABLED - Można tu określić warunkiem kiedy pole ma być do edycji, a kiedy nie. Warunek ten możemy uzależnić od wartości innych pól tego samego rekordu, w trakcie edycji włączając i wyłączając pola. Warunek, który podajemy (jeśli jest prawdziwy to pole jest do edycji) jest wyrażeniem typu AutFun, więc zastosowań tego jest dużo. UWAGA!!! Wyrażenia w tej kolumnie przeliczają się na podstawie tzw. parametrów kontrolek. Jeśli chcemy reagować dopiero po wyjściu z pola to przed Autfun'em trzeba podać modyfikator REC_PARAMS. Dlatego można przełączyć wyrażenie w tej kolumnie na parametry rekordu pisząc przed wyrażeniem identyfikator REC_PARAMS. Przydaje się to jeśli chcemy np. uzależnić pole od BASEFUN'a.