QBS >> Elementy standardowe >> Q-Line 3000 dane i wersje

Q-Line 3000
dane i wersje

Bardzo ważnym zagadnieniem dla osób, które modyfikują programy Q-Line 3000 jest kwestia "bezbolesnego" przerzucania danych ze starszych wersji do nowszych (tak zwana konwersja tabel lub danych).

Problem konwersji struktur

W praktyce programistycznej bardzo częstym i zarazem kłopotliwym zjawiskiem jest zmiana struktur danych programu. Szczególnie dużo kłopotów przysparza podczas produkcji programów wielkonakładowych:
programy są stale rozwijane, struktury się zmieniają a klienci chcą otrzymywać coraz to nowe wersje ale nie chcą mieć żadnych kłopotów przy wciaganiu starych danych do nowych wersji programu. Co więcej nie można mieć pretensji do klienta o to, że chce wciągnąć dane z wersji numer trzy do wersji numer osiem, i że wcale nie chce kupować niejako "po drodze" wersji cztery, pięć, sześć i siedem.

Q-Line 3000 pozwala na pamiętanie wszystkich zmian struktur baz danych pomiędzy poszczególnymi wersjami programu. Opracowaliśmy specjalny system zapisu tych zmian, o którym piszemy poniżej:

Metoda przerzucanie danych pomiędzy wersjami programów

Ponieważ programy Q-Line 3000 mogą być modyfikowane przez użytkowników często zachodzi porzeba przerzucenia danych pomiędzy starą wersją programu a nową, która ma na przykład zmienione struktury danych.

W innych systemach tego typu stosuje się konwertery tabel - które zmieniają dane do nowej struktury. To rozwiązanie jest dobre do zastosowań lokalnych natomiast zupełnie się nie sprawdza "na odległość" wówczas gdy musimy dosłać klientowi nową wersję programu - użytkownik z reguły nie ma pojęcia jak wykonać taka konwersję i co więcej nie ma ku temu potrzebnych narzędzi programowych.

Q-Line 3000 rozwiązuje ten problem prosty sposób - konwersji dokonuje się poprzez:

  1. Wykonanie kopii bezpieczeństwa w starej wersji programu
  2. Instalację nowej wersji programu na komputerze
  3. Wciągnięcie kopii do nowej wersji programu
A sama konwersja realizowana jest automatycznie na podstawie dodanego do nowej wersji programu tak zwanego pliku wersji. W pliku data_versions.cfg zapisana jest cała historia modyfikowania struktur danych programu. Przykładowy plik może wyglądać następujaco:

VERSIONNO=2

VERSIONS=
{
   VER_2 = 
   {
      TABLE VOC_WIERZ { ADD LK STRING; }
      TABLE VOC_BANK  { ADD LK STRING; } 
   }
}
Tu podajemy numer aktualnej wersji

Blok wszystkich wersji

Blok opisujący zmiany jakich dokonano w wersji 2 w 
stosunku do wersji poprzedniej
informacja, że do tabeli VOC_WIERZ dodano pole LK typu string
informacja, że do tabeli VOC_BANK dodano pole LK typu string

Proszę zauważyć, że LK jest komendą języka zmian struktur danych. Komend tych jest kilka a opisane są w jednym z kolejnych podrozdziałów: "komendy języka zmian struktur danych".

Składnia:

TABLE table
{
  command;
  .
  .
  .
  command;
}
gdzie:
table - nazwa tabeli, której dotyczy konwersja
command - jedna z komend:
ADD field type Dodaje do rekordu pole o nazwie field  i typie type.
REM field Usuwa z rekordu pole o nazwie field.
TPE field type Zmienia typ pola field na type.
Uwaga! Zmiana ta nie powoduje żadnej automatycznej konwersji wartości w polu field - trzeba to zrobić samemu (patrz przykład).
LEN field length Zmienia długość pola field na length.
Komenda ta dotyczy tylko pola typu STRING i ma sens jedynie wtedy, gdy nowa długość jest mniejsza niż stara.
LET field := expression Przypisuje polu field wartość wyliczoną z wyrażenia expression.
TMP variable := expression Tworzy tymczasową zmienną variable i przypisuje jej wartość wyliczoną z wyrażenia expression.
field - identyfikator
type - INT | STRING | DOUBLE
length - liczba całkowita
variable - identyfikator
expression - wyrażenie AUTFUN, w którym można używać nazw pól i tymczasowych zmiennych

Podręczna tabela komend języka zmian struktur danych

Komenda Objaśnienie Przykład (wytłuszczono nazwy pól i tabel)
REMTAB Usunięcie całej tabeli TABLE VOC_WIERZ { REMTAB; }
CHGTAB Zmiana nazwy całej tabeli TABLE VOC_WIERZ { CHGTAB NEW_NAME; }
ADD Dodano pole TABLE VOC_WIERZ { ADD LK STRING; }
LEN Zmieniono długość pola LEN PRACTEL 25;
LET Przypisanie wartości LET CZYPRACOWNIKASP := (c = "T") ? 1 : ((c = "N") ? 2 : 0);
REM Usunieto pole REM DATAURPRE;
TMP deklaracja zmiennej tymczasowej TMP c := CZYPRACOWNIKASP;
TPE Zmieniono typ pola na TPE CZYPRACOWNIKASP INT;
ADDTAB W wersji Q-Line 3000 Swing SQL w pliku upgrade_XXX.sql
wypisuje się skrypt utworzenia tabeli
TABLE NOWA_TABELA {ADDTAB;}

Przykład:

Dana jest tabela zdefiniowana następująco:

TAB OSOBA
{
ID         TYPE     LEN     NAME;
ID         INT      8       "Id";
IMIE       STRING   30      "Imię";
NAZWISKO   STRING   50      "Nazwisko";
PLEC       STRING   1       "Płeć";     // "M" - mężczyzna, "K" - kobieta,
                                        // "" - brak informacji o płci
}

Chcemy dokonać zmian:

i w efekcie uzyskać tabelę:
TAB OSOBA
{
ID             TYPE      LEN     NAME;
ID             INT       8       "Id";
IMIE_NAZW      STRING    80      "Imię i nazwisko";
PLEC           INT       1       "Płeć";
DATA_UR        INT       8       "Data urodzenia";
}

Konwersji takiej można dokonać tak:

TABLE OSOBA
{
  ADD DATA_UR INT; // daty trzymane są na typie INT

  TPE PLEC INT;  // sama zmiana typu nie wystarczy, trzeba jeszcze zmienić wartość
  TMP p := PLEC; // można obejść się bez tej zmiennej, ale tak będzie wygodniej
  LET PLEC := (p = "M") ? 1 : ((p = "K") ? 2 : 0);

  ADD IMIE_NAZW STRING;
  LET IMIE_NAZW := IMIE + " " + NAZWISKO;
  REM IMIE;
  REM NAZWISKO;
}

Przykładowy zbiór data_versions.cfg

VERSIONNO=3

VERSIONS=
{

   VER_2 =
   {  TABLE ARTYSTA
      {
        LEN PRACTEL 25;
        REM DATAURPRE;
        REM DATAZGONUPRE;
        TPE DATAWPROW       INT;
        //  LET DATAWPROW := DATAWPROW;
        TPE CZYPRACOWNIKASP INT;
        TMP c := CZYPRACOWNIKASP;
        LET CZYPRACOWNIKASP := (c = "T") ? 1 : ((c = "N") ? 2 : 0);
      }
   }
   
   VER_3 = 
   {
        TABLE VOC_WIERZ { ADD LK STRING; }
        TABLE VOC_BANK  { ADD LK STRING; } 
   }
}
Numer wersji aktualnej



Sposób przejścia z wersji pierwszej do drugiej
w tabeli ARTYSTA

zmieniono długość pola PRACTEL na 25
usunięto pole DATAURPRE