Zahájili jsme sérii příspěvků na blogu o nastavení kompatibility a tajných možnostech, které vám mohou výrazně pomoci zlepšit výkon a chování vašich aplikací. První příspěvek se týkal stránky QUERY BY FORMULA.
Druhý díl seriálu o kompatibilitě se věnuje mezinárodnímu použití vašich podnikových aplikací. Může jít o prodej do jiných zemí – nebo o to, že spolupracovníci z jiných zemí přijedou na chvíli pracovat, ale budou používat své místní systémy.
Pokud jste někdy viděli nebo dostali hlášení typu „čísla se zobrazují jako >>>>>>>>>“, je tento příspěvek určen právě vám.
Nejste si jisti, jak se budou vaše čísla zobrazovat? Zkontrolujte nastavení své databáze:
Pokud je výše uvedená možnost již povolena nebo se nezobrazuje vůbec (aplikace vytvořené s 4D v11 nebo novější), je vše v pořádku a není třeba číst dále.
Jak by to mělo fungovat
Vývojář 4D navrhuje pro mezinárodní použití, zatímco koncový uživatel může použít libovolné regionální nastavení, dokonce i smíšené nastavení v režimu klient/server.
Příklad: „###,##0.00“ se v Německu zobrazí jako „1.234,56“, v USA jako „1,234.56“, ve Švýcarsku jako „1’234.56“.
Jak to fungovalo dříve (režim kompatibility)
Vývojář 4D navrhl pro dané regionální nastavení (obvykle místní) a koncový uživatel musel mít přesně stejné nastavení.
Příklad: „###,##0.00“ se v Německu zobrazovalo jako „>>>>>>>>“, v USA jako „1,234.56“, ve Švýcarsku jako „>>>>>>>>>“.
Jak to funguje nyní (Vývoj mezinárodně)
V posledních verzích 4D je vše v metodách 4D v mezinárodním formátu:
- Konstantní číselná hodnota je definována pomocí tečky jako mezinárodního desetinného oddělovače (například 5,3).
- Data jsou definována v mezinárodním formátu „rrrr-mm-dd“ (2018-07-31). Všimněte si znaku „-“ použitého jako oddělovač a pořadí rok/měsíc/den.
- Časy jsou definovány ve 24hodinovém formátu.
Jakmile se hodnota zobrazí (nebo naformátuje), použije se aktuální regionální nastavení.
Například píšu tento příspěvek na německém systému, takže výsledkem String(!2018-07-31!) je „31.07.2018“ a výsledkem String(5.3) je 5,3. Různé výsledky při různých regionálních nastaveních – pro stejnou aplikaci.
To vyžaduje od dlouholetých vývojářů změnu myšlení, ale ve výsledku získáte mezinárodní funkční aplikace bez dalšího úsilí.
Tipy pro migraci
Chcete-li změnit chování regionálního nastavení, musíte změnit každé místo, kde je natvrdo zakódováno místní nastavení. To může být téměř nemožná mise. Proto existuje možnost kompatibility a ve výchozím nastavení je nastavena na „kompatibilní“.
Je toho ale hodně, co je třeba zasloužit, takže se podívejme, jak obtížné to ve skutečnosti je.
Pevně zakódované konstanty v metodách
Dobrá zpráva! Nemusíte s tím nic dělat. Když vytvoříte metodu 4D ve verzi v2004 a napíšete do ní $i:=5,3 (německý systém) a otevřete tuto metodu ve verzi 4D v16 nebo novější, uvidíte $i:=5.3.
Stejné je to u dat a časů. Problém vyřešen!
Použití číselných formátů – filtrů.
Ačkoli 4D povoluje pevné kódování formátů (tj. ,,###.##0,00„) v metodách nebo formulářích, nedoporučujeme to již více než 20 let.
Pokud jste všude používali filtry, bude jejich změna velmi snadná. Možná máte 5 nebo 10 filtrů, ale pravděpodobně ne více než 20. Budete tedy muset upravit své filtry z místního formátu na mezinárodní formát(tj. , používat tečky („.“) pro desetinná místa a čárky („,“) pro oddělovač tisíců).
Jakmile to dokončíte, povolte zaškrtávací políčko kompatibility a je hotovo!
Jak najít pevně zakódované filtry v metodách
Tento krok není tak snadný jako výše uvedené. I když jste možná ve svých aplikacích použili filtry, možná si nejste jisti, zda jste v některých případech filtry (občas) nevynechali a nevytvořili „rychlý a špinavý“ kód.
Příkladem může být např:
$text:= String(5300; "### ##0") // to be used in Sweden with a space for thousands
Jak je najít?
Vzhledem k tomu, že neexistuje tolik různých formátů, je to jednoduché!
##0 ^^^0 0,00 ***0 jsou typické formáty. Potřebujete pouze část (pokud možno jedinečnou) formátu. Pokud ve svých metodách najdete některý z těchto textových fragmentů, je dost velká šance, že jsou pevně zakódovány. Pomocí nástroje Najít v režimu návrhu tyto kousky kódu vyhledejte a projděte si výsledky.
Pokud jich najdete jen několik, projděte je ručně a nahraďte je filtry, jako např:
$text:= String(5300;"|mynumberformat") // vertical line before filter name
Pokud jich najdete hodně, projděte je ručně a ověřte, zda byla podmínka vyhledávání správná. V případě potřeby ji dolaďte.
Možná to dá trochu práce, ale budete schopni definovat některé vzory, které zvládnou většinu případů. Tyto vzory by měly umožnit automatickou operaci „hledat a nahradit“.
V závislosti na množství potřebného úsilí byste mohli dokonce napsat metodu, která by procházela váš kód a vyhledávala za vás pomocí METHOD GET CODE a . METHOD SET CODE příkazů.
Jak najít všechny pevně zadané filtry ve formulářích
4D neposkytuje možnost vyhledávání ve formulářích, takže v nich nemůžete automaticky zkontrolovat natvrdo zakódované formáty. Ale protože jsme vývojáři, můžeme to udělat sami …
Nejprve budeme muset získat seznam všech formulářů pro všechny tabulky a projít je ve smyčce. Pak pro každý formulář získáme seznam všech objektů a také je projdeme ve smyčce. A nakonec pro každý objekt zkontrolujeme, zda používá číselný formát, a pokud ano, zjistíme, zda je pevně zadán. Pokud ano, nahlásíme to.
Dobrá zpráva: tento kód poskytne seznam podobný možnosti Najít v režimu návrhu metod. Špatná zpráva: budete muset otevřít každý výsledek a ručně přiřadit formát, takže to může chvíli trvat.
$report:=""
For ($table;0;Get last table number)
ARRAY TEXT ($arr_Names;0)
If ($table=0) // project forms
FORM GET NAMES ($arr_Names)
Else
If (Is table number valid($table))
FORM GET NAMES (Table($table)->;$arr_Names).
End if
End if
For ($forms;1;Size of array($arr_Names))
If ($table=0)
FORM LOAD ($arr_Names{$forms})
Else
FORM LOAD (Table($table)->;$arr_Names{$forms})
End if
FORM GET OBJECTS (arrObjNames;arrObjPtrs;arrPages;Form all pages)
For ($i;1;Size of array(arrObjNames))
$type :=OBJECT Get type(*;arrObjNames{$i})
If (($type=Object type text input) | ($type=Object type listbox column) \
| ($type=Object type listbox footer) | ($type=Object type static text))
$format :=OBJECT Get format(*;arrObjNames{$i})
If (($format#"") & (($format#"|@"))
If (($format="@,@")|($format="@.@"))
$report :=$report+$arr_Names{$forms}+char(9)+"název objektu: "+arrObjNames{$i}+char(9)+"formát: "+$format+char(13)
End if
End if
End if
End for
FORM UNLOAD
End for
End for
If ($report="")
$report :="Vše je v pořádku!"
End if
ALERT (
$report)
SET TEXT TO PASTEBOARD (
$report)
pořadí operací
V aktuální aplikaci:
- Zkontrolujte své filtry a vytvořte nové (pokud je to nutné).
- Nechte všechny filtry nadále používat regionální nastavení… zatím žádné změny!
- Změňte všechny metody a formuláře tak, aby používaly filtry
- Nasadit
Současně s kopií vaší aplikace:
- Buď interně, nebo pro vybrané beta testery:
- Změňte filtry tak, aby používaly mezinárodní formát
- Povolte zaškrtávací políčko Kompatibilita
- Zkompilujte a nasaďte pro testery na několik týdnů
- Jakmile je vše otestováno a ověřeno, nasaďte pro všechny (nahraďte stávající).
Související příkazy
Přestože téměř ve všech případech budete chtít, aby se čísla formátovala podle regionálních nastavení, existují výjimky. Například při importu nebo exportu dat můžete použít jiná pravidla. Záleží na tom, kdo bude data používat nebo kdo je poskytl. Dalším příkladem jsou data ve formátu XML nebo JSON, kde se jako oddělovač desetinných míst vždy používá tečka („.“).
Vaším úkolem je pouze ošetřit tyto výjimky, nikoli běžné chování.
Chcete-li kdekoli na světě převést číslo na řetězec s použitím tečky jako desetinného oddělovače nezávisle na regionálním nastavení uživatele, použijte následující příkaz:
String($mynumber; "&xml"
)
Poznámka: I formát se jmenuje XML, takže jej lze použít pro jakýkoli případ použití, pokud chcete použít tečku jako desetinný oddělovač.
Na druhou stranu, pokud chcete analyzovat řetězec a víte, že řetězec používá tečku jako desetinný oddělovač( protože jste jej importovali z dokumentu XML nebo JSON), použijte:
Num($mystring;"."
)
Závěr
U starších, zavedených aplikací to může vyžadovat určitou práci, ale výsledkem jsou aplikace, které můžete kdekoli nasadit se správnými číselnými formáty. Odlehčíte tak své technické podpoře a pomůžete i svým zákazníkům. Je to výhra pro všechny!