QBS
>> Q-Line 3000 Szybki Start
>> Nowa tabela | Chcę zapytać |
|
Zdefiniuj podstawową strukturę danych | ||
|
Czas ćwiczenia: 1 godzina |
Cel: Stworzenie tabeli adresowej |
Kroki: Stworzenie karty Założenie tabeli Podpięcie tabeli do menu Pierwsze uruchomienie programu |
struct.qconponiższy tekst. Tekst należy wprowadzić tuż za definicją "Menu programu"
//---------------------------------------------------------------------------
// POCZĄTEK: Tabela ADRESSES
//---------------------------------------------------------------------------
TAB ADRESSES
TITLE="Spis adresów"
BASE=ADRESSES
BASETYPE=SEP
SIZE=0 50
BROWSER_ACTIONS=+FULL_SET +F10MENU
RECEDIT=ADRESS_EDIT
ORDERS=
{
ID FIELDS LABEL VIS ;
ID ( ID ) "Id" - ;
}
{
ID LEN TYPE NAME ;
ID 8 INT "Id" ;
NAME 30 STRING "Imię" ;
LASTNAME 40 STRING "Nazwisko" ;
ZIPCODE 8 STRING "Kod pocztowy";
CITY 30 STRING "Miasto" ;
STREET 40 STRING "Ulica" ;
}
//---------------------------------------------------------------------------
// KONIEC: Tabela ADRESSES
//---------------------------------------------------------------------------
|
Trzy wiersze formatujące plik struct.qcon pełnia rolę "szlaczków" znanych ze szkoły podstawowej. Znaczki "//" oznaczają, żeQ-Line 3000tych wierszy nie interpretuje. TAB słowo kluczowe; ADRESSES identyfikator tabeli i zarazem struktur danych TITLE - nazwa tabeli dla użytkownika programu BASE - nazwa zbioru dyskowego tu będzie to adresses.dat BASETYPE - rodzaj mechanizmu obsługującego bazy danych SIZE - rozmiar okna, w którym będzie wyświetlany spis BROWSER_ACTIONS - akcje dostępne na spisie RECEDIT - opis w jaki sposób będzie edytowany rekord adresowy ORDERS - zdefiniowanie uporządkowań spisu adresowego ID - identyfikator klucza uporządkowań FIELDS - w nawiasach lista pól tworząca klucz LABEL - nazwa uporządkowania dla użytkownika programu VIS - czy klucz jest widoczny dla użytkownika Blok-tabela definiująca rekord. W wierszu pierwszym nazwy atrybutów w kolejnych podawane są poszczególne wartości W pierwszej kolumnie identyfikator pola ID W drugiej jego długość LEN W trzeciej jego typ TYPE W czwartej nazwa dla użytkownika programu NAME Zdefiniowaliśmy pięć pól pierwsze to "Id" ostatnie to "Ulica" mówiąc językiem użytkownika. Stosując język programisty mówimy o polach ID .. STREET |
Po zdefiniowaniu tabeli głównej musimy określić w jaki sposób będziemy wprowadzać do niej dane. Posłużymy się kolejną tabelą, która zdefiniuje nam sposób i ekranowy wygląd formularza do wprowadzania danych.
//---------------------------------------------------------------------------
// POCZĄTEK: Tabela ADRESSES_EDIT
//---------------------------------------------------------------------------
TAB ADRESSES_EDIT extends ADRESSES;
TITLE="Edycja adresu"
LAYOUT = TCP(ID NAME LASTNAME ZIPCODE CITY STREET)
{;}
//---------------------------------------------------------------------------
// KONIEC: Tabela ADRESSES_EDIT
//---------------------------------------------------------------------------
|
TAB to słowo kluczowe ADRESSES_EDIT to identyfikator obiektu extends oznacza, że będzie rozszerzał obiekt ADRESSES w TITLE podajemy nazwę okna edycji Zapytacie "A skąd wiemy, że to będzie edycja?" o tym mówi atrybut LAYOUT, w którym określamy ułożenie pól na ekranie. |
Przed chwilą zdefiniowaliśmy tabelę. Tabela ta dla użytkownika nazywa się "Spis adresów"; dla nas programistów zarezerwowaliśmy nazwę-identyfikator ADRESSES. Dlaczego tak jest? Sprawa jest prosta: po to by zmiany w nazewnictwie przeznaczonym dla użytkowników programu nie miały żadnego znaczenia dla programu! Bez względu na to czy ADRESSES nazwiemy "Spis adresowy", "Lista dłużników", "Lista klientów", "Customers", "Les clients" czy "Die Kunden" to dla programu i dla nas zawsze pozostanie to ten sam spis ADRESSES.
Q-Szkielet 3000
ADRESSES BROWSER ADRESSES; "Spis adresów" ; |
Po całej operacji nasz struct.qcon
powinien wyglądać tak
//---------------------------------------------------------------------------
// POCZĄTEK: MainMenu
//---------------------------------------------------------------------------
MENU MainMenu
TITLE="Menu główne "
POS=75 20
{
ID ACTION NAME ;
PODR MENU PodrMenu "Komplet podręczników" ;
FunSys MENU SysMenu "Operacje systemowe" ;
MYDATA RECEDIT TAB=SYSED_MOJE_DANE; "Moje dane" ;
//---------------------------------------------------------------------------
ADRESSES BROWSER ADRESSES; "Spis adresów" ;
//---------------------------------------------------------------------------
}
//---------------------------------------------------------------------------
// KONIEC: MainMenu
//---------------------------------------------------------------------------
MENU PodrMenu
TITLE = "Menu dodatkowe"
POS = 50 50
{
ID ACTION SHORTCUT NAME ;
OGOLNY THTML SRC="podr/ogolny/index.html"
DST="podr/ogolny/dysk.html"; O "Podręcznik ogólny do programów serii 3000";
PRINT_ERROR THTML SRC="podr/print_error.html"; D "Problemy podczas drukowania" ;
}
|
Szlaczek podobnie jak ten poprzednio. Służy do lepszej orientacji w pliku
struct.qcon. Proponujemy byście umieścili menu główne na samym początku
pliku struct.qcon tak będzie czytelniej.
MENU słowo kluczowe informujące o rozpoczęciu bloku definiującego menu
identyfikator tego menu to MainMenu.
TITLE - jak nazywa się to menu dla użytkownika? Po prostu "Menu główne"
Blok-tabela definiowania poszczególnych wierszy menu.
Zdefiniowano jeden wiersz menu o identyfikatorze ADRESSES; Po wyborze tego
wiersza menu uruchomiona zostanie przeglądarka (bo BROWSER) a przeglądać będzie
już zdefiniowaną wcześniej tabelę ADRESSES. Wiersz menu dla użytkownika nazywał
się będzie "Spis adresów".
|
Zrobiliśmy pierwszy żmudny etap pracy! Zdefiniowaliśmy podstawową strukturę danych i menu główne, za pomocą którego będziemy się mogli do tych danych dostać. Jeżeli wasz plik struct.qcon
wygląda tak jak poniżej:
//---------------------------------------------------------------------------
// POCZĄTEK: MainMenu
//---------------------------------------------------------------------------
MENU MainMenu
TITLE="Menu główne "
POS=75 20
{
ID ACTION NAME ;
PODR MENU PodrMenu "Komplet podręczników" ;
FunSys MENU SysMenu "Operacje systemowe" ;
MYDATA RECEDIT TAB=SYSED_MOJE_DANE; "Moje dane" ;
ADRESSES BROWSER ADRESSES; "Spis adresów" ;
}
//---------------------------------------------------------------------------
// KONIEC: MainMenu
//---------------------------------------------------------------------------
MENU PodrMenu
TITLE = "Menu dodatkowe"
POS = 50 50
{
ID ACTION SHORTCUT NAME ;
OGOLNY THTML SRC="podr/ogolny/index.html"
DST="podr/ogolny/dysk.html"; O "Podręcznik ogólny do programów serii 3000";
PRINT_ERROR THTML SRC="podr/print_error.html"; D "Problemy podczas drukowania" ;
}
//---------------------------------------------------------------------------
// POCZĄTEK: Tabela ADRESSES
//---------------------------------------------------------------------------
TAB ADRESSES
TITLE="Spis adresów"
BASE=ADRESSES
BASETYPE=SEP
SIZE=0 50
BROWSER_ACTIONS=+FULL_SET +F10MENU
RECEDIT=ADRESSES_EDIT
ORDERS=
{
ID FIELDS LABEL VIS ;
ID ( ID ) "Id" - ;
}
{
ID LEN TYPE NAME ;
ID 8 INT "Id" ;
NAME 30 STRING "Imię" ;
LASTNAME 40 STRING "Nazwisko" ;
ZIPCODE 8 STRING "Kod pocztowy";
CITY 30 STRING "Miasto" ;
STREET 40 STRING "Ulica" ;
}
//---------------------------------------------------------------------------
// KONIEC: Tabela ADRESSES
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// POCZĄTEK: Tabela ADRESSES_EDIT
//---------------------------------------------------------------------------
TAB ADRESSES_EDIT extends ADRESSES;
TITLE="Edycja adresu"
LAYOUT = TCP(ID NAME LASTNAME ZIPCODE CITY STREET)
{;}
//---------------------------------------------------------------------------
// KONIEC: Tabela ADRESSES_EDIT
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// POCZĄTEK: Tabela Moje dane
//---------------------------------------------------------------------------
TAB SYSED_MOJE_DANE
TITLE="Moje dane"
LAYOUT= HPAN(
GRP("Dane osobiste" TCP(NAZWA ULICA PNA MIASTO NIP))
GRP("Logo użytkownika" VPAN(TCP(FILENAME) TCP(LOGO)))
)
{
ID LEN TYPE ATTRIB NAME ;
ID 8 INT - "Id" VIS=HIDE ;
NAZWA 30 STRING (FCAPITAL) "Nazwa" ;
ULICA 30 STRING (FCAPITAL) "Ulica" ;
PNA 6 STRING - "Kod pocztowy" MASK=MASK("00\\-000");
MIASTO 30 STRING (CAPITAL) "Miejscowość" ;
NIP 13 STRING (CAPITAL) "NIP" MASK=MASK("000\\-000\\-00\\-00");
LOGO 8 INT - " " MASK=IMAGE RESIZABLE(11 5) AUTFUN=filedata(FILENAME);
FILENAME 60 STRING - "Nazwa pliku"
MASK=FILE (APIC="Pliki graficzne (*.jpg; *.gif; *.png;)"
BALL="Wszystkie pliki (*.*;)")
EDILEN=15
ANCHOR="imageName";
}
//---------------------------------------------------------------------------
// KONIEC: Tabela Moje dane
//---------------------------------------------------------------------------
|
to możemy przejść do kolejnego etapu tworzenia własnego programu
w Q-Line 3000
.
Q-Line 3000a po chwili w tym oknie uruchomi się złowrogi komunikat:
A po nim kilka następnych (w razie czego proszę sprawdzić na belce zadań okienka "Error" itp) trzeba to wszystko pozamykać i niczym się nie przejmować. Program "Q-Line 3000
" wykonał w tym czasie bardzo pożyteczną pracę: przygotował struktury dla serwera baz danych. Zrobił to na podstawie przygotowanego przez nas zbioru struct.qcon.
Dlaczego się nie uruchomił? Nie udało mu się to ponieważ serwer baz danych nie wiedział z jakimi bazami będzie pracował. Zapytacie "Jak to? Przecież żmudnie tworzyliśmy struct.qcon'a. Zgadza się! Ale struct.qcon jest konfiguracją tabeli klienta a nie serwera. (Tabele na kliencie mogą się różnić od tych na serwerze!)
Tak jak mówiliśmy nic się nie udało, ale program coś sensownego zrobił. To "coś sensownego" to plik struct.qsr w katalogu głównym. Co macie zrobić? Tylko i wyłącznie skopiować ten zbiór do katalogu dat. Jeżeli katalog ten wygląda jak na obrazku poniżej:
To możemy przystąpić do wprowadzania danych.