Konverze zákaznických úprav
Po převodu nových identifikátorů dochází k masivním změnám ve všech standardních i zákaznických skriptech, sestavách apod. Aby byl přechod na verzi K2 gaia co nejhladší, je připraveno několik nástrojů, které zajistí převod změn v těchto oblastech pro novou verzi. V následujícím textu jsou popsány nástroje, které slouží ke konverzi implementovaných úprav a formulářů k těmto úpravám.
Princip a spuštění konverze
Ke konverzi dochází při spuštění speciální funkce. Ta zajistí konverzi zákaznických úprav ve skriptech, sestavách, DFM formulářích, univerzálních formulářích a také rozšíření vytvořená v Návrháři objektů. Výstup se ukládá do adresáře \SupportedFiles\Convert2021\..., kde jsou soubory uloženy ve struktuře, v jaké byly nalezeny v IS K2. Tedy pokud se původní soubor nachází v databázi, pak je výstup v ~DB~\DBNAME\Special, pokud byl uložen v souborovém systému, je výstup v adresáři ~ABS~\.., kde … udává stejnou adresářovou strukturu, jako ve výchozím umístění.
Například pokud jsou sestavy a skripty uloženy v D:\OSTRA2020\SESTAVYW\SPECIAL\K2R“, pak je cesta ve tvaru „…\~ABS~\D \OSTRA2020\SESTAVYW\SPECIAL\K2R.
Vše, co bylo popsáno, pak funguje pouze za předpokladu, že je IS K2 spuštěna se speciálním parametrem, viz dále.
Spuštění konverze je možné provést dvěma způsoby. První způsob se dá pracovně označit jako testovací, druhý způsob je pak použit při reinstalaci na novou verzi.
Testovací konverze – manuální spuštění
Tento režim je určen spíše pro otestování konverze, případně k dodatečné konverzi. Je to z toho důvodu, že konverze probíhá na verzi K2 luna a výstupní soubory jsou určeny pro verzi K2 gaia. Pro ověření funkčnosti tedy uživatel potřebuje obě verze.
Pro aktivaci konverzního mechanismu je potřeba spustit K2 verze K2 luna s parametrem ConvertToNextVersion=2021. K2 si v tomto režimu načítá z adresáře SupportFiles soubor _metadata.xml, který popisuje všechny změny identifikátorů mezi verzí K2 luna a K2 gaia. Samotnou konverzi pak provede funkce Export speciálních skriptů přeložených pro následující verzi s číslem 791. Po ukončení konverze je celý výstup uložen do složky SupportedFiles\Convert2021\... dle textu výše.
Automatická konverze – přechod na novou verzi
Tento režim se využívá při samotné reinstalaci v automatickém režimu. Před výměnou souborů z verze K2 luna na verzi K2 gaia, spustí instalátor K2 výše zmíněnou funkci se všemi náležitostmi.
Po úspěšné konverzi následuje druhý krok, který se provádí již na nových souborech verze K2 gaia. Jedná se o spuštění funkce, která vrátí všechny zkonvertované položky zpět do původního umístění. Instalace K2 volá funkci Administrátor – Import konvertovaných zdrojů s číslem 790, která zajistí import. K tomu, aby se vše importovalo do původního místa, se využije vzniklá adresářová struktura ze složky SupportedFiles\Convert2021\.
Po tomto kroku jsou na verzi K2 gaia zkonvertovány skripty a sestavy včetně jejich importu zpět do úložiště IS K2.
Upozornění
Zkonvertované sestavy a skripty přestávají být na verzi K2 luna funkční. Již obsahují identifikátory, které jsou platné pro verzi K2 gaia.
Upozornění
Nutným předpokladem správné konverze některých objektů, je určení datového kontextu, na základě, kterého se objekt převede na nové identifikátory. O tomto pojednává kapitola Předinstalační příprava.
Upozornění
V případě, že dojde při reinstalaci k chybě, opakovaná reinstalace probíhá v režimu přebrání instalačního adresáře a zároveň v adresáři neexistuje spustitelná K2 verze K2 luna.05, nedojde ke konverzi zákaznických úprav pro verzi K2 gaia! Doporučujeme nejprve provést přebrání instalace formou reinstalace na verzi K2 luna.05 a až následně spustit reinstalaci na verzi K2 gaia.
Poznámka
V případě, že v průběhu konverze není potřeba objekt měnit, tento se neexportuje do výstupní složky.
V textu dále následuje popis jednotlivých částí konverze dle typů jednotlivých objektů – skript, sestava, formulář, Návrhář objektů.
Konverze zákaznických AM sestav a K2 skriptů
Při konverzi zákaznických skriptů a sestav dochází k nahrazení změněných identifikátorů přímo ve zdrojových souborech jednotlivých komponent. Konkrétně k tomu dochází při pokusu o kompilaci implementace sestavy nebo skriptu (soubor) v IS K2. Pokud je v pořádku a kompilace je úspěšná, pak se zároveň nahradí všechny identifikátory.
U skriptu se konvertují zdrojové soubory, v případě sestavy se jedná o konverzi tří oblastí, ve kterých se v sestavě může přistupovat k datům. První oblastí je zobrazovací část sestavy, která je napojena na pole datového modulu, dále přístup k datům sestavy pomocí vlastnosti AData a nakonec také skripty, které byly u sestavy implementovány, například v událostech.
Upozornění
Protože konverze skriptů a sestav se provádí při kompilaci jejich implementace, musí být objekt v dané verzi IS K2 přeložitelný. Pokud není, pak se ignoruje.
Co se automaticky konvertuje
Pokud projde K2 skript nebo sestava konverzí, převedou se změněné názvy databázových polí, tabulek, klíčů, property, procedur a funkcí.
Ukázka konvertovaných struktur
Ukázka konvertovaného K2 skriptu je na obrázku níže. Konkrétně použití standardních FM jednotek v uses.
Obr. Konvertovaný skript
Ukázka konverze K2 skriptu, který je součástí implementace AM sestavy. Konkrétně oprava použití konstanty s číslem pole ze standardu.
Obr. Konvertovaná sestava - skript
Ukázka konverze definice pole v datovém zdroji AM sestavy. Konkrétně oprava definice pole definovaná jako řetězec.
Obr. Konvertovaná sestava - DataField
Ukázka konverze přístupu k datovému zdroji AM sestavy. Konkrétně oprava přístupu k poli pomocí řetězce.
Obr. Konvertovaná sestava - AData
Částečně konvertované identifikátory
Některé části implementace, které pracují s identifikátory polí, neprochází kompilátorem kódu. Jedná se o výčet metod, které pracují s identifikátory jako s parametrem typu řetězec. Jedná se o následující výčet funkcí.
Seznam metod s názvem pole v argumentu
Název metody |
Alternativa |
Popis |
LinkFBit |
LinkFByNoBit |
vrátí hodnotu pole typu Bit z vazební cesty |
LinkFLong |
LinkFByNoLong |
vrátí hodnotu pole typu Int32 z vazební cesty |
LinkFBool |
LinkFByNoBool |
vrátí hodnotu pole typu Boolean z vazební cesty |
LinkFInt64 |
LinkFByNoInt64 |
vrátí hodnotu pole typu Int64 z vazební cesty |
LinkFFloat |
LinkFByNoFloat |
vrátí hodnotu pole typu Float z vazební cesty |
LinkFDateTime |
LinkFByNoDateTime |
vrátí hodnotu pole typu DateTime z vazební cesty |
LinkFStr |
LinkFByNoStr |
vrátí hodnotu pole typu String z vazební cesty |
LinkFStrTR |
LinkFByNoStrTR |
vrátí hodnotu pole typu String (bez mezer) z vazební cesty |
LinkFCurrency |
LinkFByNoCurrency |
vrátí hodnotu pole typu Currency z vazební cesty |
LinkF |
LinkFByNo |
vrátí instanci výstupního modulu z vazební cesty |
LinkFDMOut |
|
vyvolá zadanou metodu, do které předá instanci výstupního modulu z vazební cesty |
AsStringPn |
|
vrátí hodnotu pole typu String |
AsFloatPn |
|
vrátí hodnotu pole typu Float |
AsLongPn |
|
vrátí hodnotu pole typu Int32 |
AsInt64Pn |
|
vrátí hodnotu pole typu Int64 |
AsDateTimePn |
|
vrátí hodnotu pole typu DateTime |
AsCurrencyPn |
|
vrátí hodnotu pole typu Currency |
AsBitPn |
|
vrátí hodnotu pole typu Bit |
AsBoolPn |
|
vrátí hodnotu pole typu Boolean |
AsVariantPn |
|
vrátí hodnotu pole typu Variant |
AsHexaPn |
|
vrátí hodnotu pole typu Hexa string |
AsXHexaPn |
|
vrátí hodnotu pole typu Hexa string |
SetAsStringPn |
|
nastaví pole typu String na zadanou hodnotu |
SetAsFloatPn |
|
nastaví pole typu Float na zadanou hodnotu |
SetAsLongPn |
|
nastaví pole typu Int32 na zadanou hodnotu |
SetAsInt64Pn |
|
nastaví pole typu Int64 na zadanou hodnotu |
SetAsDateTimePn |
|
nastaví pole typu DateTime na zadanou hodnotu |
SetAsCurrencyPn |
|
nastaví pole typu Currency na zadanou hodnotu |
SetAsBitPn |
|
nastaví pole typu Bit na zadanou hodnotu |
SetAsBoolPn |
|
nastaví pole typu Boolean na zadanou hodnotu |
SetAsVariantPn |
|
nastaví pole typu Variant na zadanou hodnotu |
SetAsHexaPn |
|
nastaví pole typu Hexa string na zadanou hodnotu |
SetAsXHexaPn |
|
nastaví pole typu Hexa string na zadanou hodnotu |
FieldByProgName |
|
vrátí instanci TDataField pro pole |
U těchto metod provede kompilátor analýzu a pokusí se na základě zjištěných informací provést náhradu. V těchto případech již nahrazení není 100 %, protože existuje spousta situací, kdy náhradu nelze provést. Obecně lze říci, že záleží na kvalitě a způsobu implementace kódu.
Pokud kompilátor nedokáže nahradit identifikátory, doplní na daný řádek informaci s důvodem, proč se takto rozhodnul. Zároveň je do adresáře SupportFiles\Convert2021 zapíše soubor ScriptStatistics.txt, který obsahuje souhrnné informace o tom, co se nepovedlo vyřešit. V tomto souboru je také zapsán počet výskytů těchto metod včetně procentuální úspěšnosti náhrady.
Následující tabulka shrnuje všechny možné důvody nenahrazení:
Popis ve skriptu |
Význam |
{2021 NoEnglishName} |
field nemá anglický překlad |
{2021 NoFieldInfo} |
field v metadatech neexistuje |
{2021 BadPath} |
cesta nebyla v metadatech dohledatelná |
{2021 TMFile} |
jedná se o netypovou třídu TMFile, nejde poznat, zda je pole standardní nebo speciální |
{2021 TDataM} |
jedná se o netypovou třídu TDataM, nejde poznat, zda je pole standardní nebo speciální |
{2021 UnknownType} |
jedná se o jinou netypovou třídu, nejde poznat, zda je pole standardní nebo speciální |
{2021 NoClass} |
funkce/metoda nemá definovanou třídu, pole nelze vyhodnotit |
{2021 NoConstant} |
funkce/metoda obsahuje proměnou, kterou nelze při překladu vyhodnotit – například spuštění SQL dotazu |
Zmíněná statistika může vypadat následovně:
Počet úspěšně nahrazených výskytů je 2845 z celkového počtu 15905, což je 17,89 %.
Statistika, kde nebylo možné provést náhradu:
Počet výskytů v netypové třídě TDataM 9315.
Počet výskytů v netypové třídě TMFile 461.
Počet výskytů v netypové jiné třídě 2150.
Počet výskytů s nerozpoznatelnou cestou 298.
Počet výskytů, kde pole nemá definovanou lokalizaci 836.
Počet výskytů, kde pole nemá metadata 0.
Počet výskytů, kde nebyla rozpoznána třída 0.
Poznámka
Výše zmíněné komentáře lze projít v kódu a opravit ručně. O této části pojednávají poslední kapitoly.
Poznámka
Náhradu těchto identifikátorů jsme testovali na dvou množinách zákaznických úprav a na standardní množině. U zákaznických úprav se průměrná úspěšnost pohybovala kolem 49 % nahrazených identifikátorů. Konkrétně se analyzovalo průměrně 2200 výskytů. U standardu je úspěšnost 18 %, viz ukázka výše.
Co nelze automaticky konvertovat
Část, kterou není možné vůbec konvertovat, jsou SQL dotazy do databáze IS K2. U těchto textů nezná K2 datový kontext. Při pokusu o jejich nahrazení, by tak mohlo dojít k chybné náhradě a k poškození skriptu nebo sestavy. Jak může K2 pomoci s přepisem těchto částí je popsáno dále v textu v posledních kapitolách.
Konverze zákaznických standardních formulářů
Při konverzi zákaznických standardních formulářů dochází k nahrazení použitých identifikátorů, které byly změněny. Nutným předpokladem ke správné konverzi je přiřazení datového zdroje (datového modulu) ke každému formuláři, který potřebujeme zkonvertovat. Tato část je popsána v předinstalační přípravě. Zároveň platí, že se konvertují jen ty formuláře, které byly takto v předinstalační přípravě nachystány – mají nastaven datový modul.
Poznámka
Při konverzi se nahrazují všechny datové typy ftString na ftWideString, tak aby formuláře podporovaly unicode.
Co nelze automaticky konvertovat
Při konverzi nelze nahradit vazební pole do standardního modulu z vlastního modulu, který je vytvořen ve skriptu. Tento modul není zaregistrován, a tudíž nelze načíst jeho instance při konverzi.
Konverze zákaznických univerzálních formulářů a jejich modifikací
Při konverzi zákaznických univerzálních formulářů dochází k nahrazení použitých identifikátorů, které byly změněny. Mohou se nacházet na komponentách, které zobrazují data, případně v místech, kde se na základě dat vyhodnocuje například jejich zobrazení. Konverzí proběhnou všechny vlastní formuláře a také modifikace standardních formulářů.
Formuláře se také exportují do výše zmíněné složky a následným exportem se vrací zpět do IS K2.
Konverze zákaznických úprav v Návrháři objektů
Při konverzi rozšíření v Návrháři objektů dochází k nahrazení použitých identifikátorů, které byly změněny. Mohou se nacházet v samotné definici, v hodnotách vlastností jednotlivých datových modulů, nebo v samotném skriptu, který je v modulu implementován.
Konvertovaná definice rozšíření se ukládá do výše zmíněné složky do adresáře ServisW/NO/WaitingRoom.
Následným exportem se vrací zpět do IS K2, ale pouze jako definice rozšíření. Běhové soubory z adresáře extensions se zatím nekonvertují. Posledním krokem je instalace konvertovaných definic Návrháře objektů. Pokud proběhne úspěšně, vznikne adresář extensions, ve kterém budou nové běhové soubory Návrháře objektů pro IS K2. V případě, že dojde při instalaci k chybě, většinou se jedná o složitější projekty, které jsou na sobě závislé, je nutné instalaci postupně dořešit až po opravě nepřeložitelných skriptů, viz kapitola akce po reinstalaci.
Upozornění
V případě, že v IS K2 nejsou na sobě závislé projekty z Návrháře objektů, většinou instalace projde bez problémů. Pokud některé závislé rozšíření obsahuje nepřeložitelný skript, není možné instalaci rozšíření dokončit bez opravy tohoto skriptu.
Poznámka
Zde platí stejné pravidlo, co lze a nelze zkonvertovat, viz Konverze zákaznických AM sestav a K2 skriptů.