QBS >> Q-Line 3000 Szybki Start >> Nowa tabela Chcę zapytać

Zdefiniuj podstawową strukturę danych
Q-Szkieletu

Czas ćwiczenia:
  1 godzina
Cel:
  Stworzenie tabeli adresowej
Kroki:
  Stworzenie karty
  Założenie tabeli
  Podpięcie tabeli do menu
  Pierwsze uruchomienie programu

Stworzenie karty adresowej.

W tej części zbudujemy rekord o kilku polach: Imię, Nazwisko, Kod Pocztowy, Miasto, Ulica. Aby to zrobić należy wpisać do struct.qcon poniż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ą, że
Q-Line 3000 tych 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

Stworzenie okna edycji karty adresowej.

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.

Modyfikacja menu

Tabele już mamy, ale jak możemy się z programu do niej dostać? Należy zmodyfikować menu główne - czyli to menu, które Q-Szkielet 3000 uruchamia bezpośrednio po odpaleniu programu.
Do menu które już mamy należy dopisać wywołanie wcześniej stworzonej tabeli

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.

Pierwsze uruchomienie. UWAGA nie uda się!

Uruchomienie się nie uda, ale proszę się nie przejmować za chwilę będzie już lepiej. Proszę wejść do katalogu głównego programu i uruchomić q.bat. Na ekranie pojawi się duże białe okno aplikacji Q-Line 3000 a 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.

Powrót