S mazáním dat je třeba zacházet opatrně. Abychom předešli problémům, můžeme použít transakce nebo se spolehnout na zálohy a protokoly.
Ve verzi 4D 20 R4 byla provedena některá vylepšení, aby byl výběr záznamů stabilní a konzistentní, pokud jde o případné mazání záznamů v tomto výběru.
Čtěte dále a dozvíte se, jak bude váš kód 4D tak bezpečný po vybalení z krabice.
Vnitřní chování 4D
Jak již možná víte, 4D interně zpracovává tabulku adres, která ukazuje na fyzické bloky dat na disku. Pokud jde o zacházení s touto adresní tabulkou v interní architektuře 4D, mohlo by to vést k problémům, o kterých se zde hovoří, při postupu výběru záznamů.
Když je záznam odstraněn, je v tabulce adres odstraněn jeho odkaz na fyzická data.
Aby se zabránilo vzniku děr a optimalizovalo se využití paměti pro tabulku adres, využívá 4D při vytváření nového záznamu volná místa v této tabulce adres.
Po vytvoření výběru záznamů (například pomocí dotazu), pokud je poté záznam patřící do tohoto výběru odstraněn a je vytvořen nový záznam, může být na něj odkazováno prostřednictvím stejného čísla předchozího záznamu v tabulce adres.
V minulosti jste tedy mohli ve svém výběru najít některé údaje, které vůbec neočekáváte.
konkrétní příklad
Zaměstnanec má k vyřízení hromadu úkolů. Při vytvoření je úkol ovlivněn stavem TO DO.
Pravidelně je zaměstnanci zasílán mail s jeho úkoly TO DO. Vytvoří se výběr těchto úkolů a u každého z nich je smyčka, která v e-mailu uvede podrobnosti.
Správce má však právo některé úkoly smazat. Pokud správce omylem smaže úkol ve výše uvedeném výběru a hned poté se vytvoří nový úkol pro jiného zaměstnance… co se stane?
Před 4D 20 R4
Nově vytvořený úkol byl nalezen ve smyčce, a protože se jedná o úkol pro jiného zaměstnance, je zcela mimo rozsah!
Po 4D 20 R4
Nově vytvořený úkol se ve smyčce nenachází a výběr dat je vždy konzistentní a můžete se na něj bezpečně spolehnout.
Výše uvedený případ použití není tak častý, protože většinou u záznamu měníme stav, místo abychom jej přímo mazali.
Nebo jste možná byli zvyklí znovu kontrolovat konzistenci záznamu / entity (s ohledem na kritéria výběru) před jeho pokračováním.
Každopádně vám to již nemusí vadit.
Podívejme se na to v akci v nějakém kódu
V následujícím příkladu sestavíme výběr entit $target.
Poté vymažeme entitu patřící do tohoto výběru entit (pro rychlé pochopení to děláme ve stejném kusu kódu, ale můžeme si představit, že to dělá jiný uživatel v jiném procesu).
Smyčka zpracovává pouze dvě entity, které nám zbyly (internalID 10 a 12).
var $target; $customers : cs.CustomersSelection
var $customer : cs.CustomersEntity
var $newCustomer : cs.CustomersEntity
var $status : Object
// Three customers are retrieved with internal ID 10, 11, 12
$target:=ds.Customers.query("internalID >= 10 and internalID <= 12")
ASSERT($target.length=3)
// We delete the customer with internalID = 11
$customers:=ds.Customers.query("internalID = :1"; 11).drop()
// We create a new customer with internalID = 99
$newCustomer:=ds.Customers.new()
$newCustomer.internalID:=99
$status:=$newCustomer.save()
// We loop on the $target entity selection
// got before the creation of the new customer
For each ($customer; $target)
// The new customer is not in the entity selection ...
ASSERT($customer.internalID#99)
End for each
Důležité: Tato funkce platí pro data zpracovávaná klasickými standardními příkazy QUERY a ORDA 4D.
Pokračujte v bezpečné práci s 4D, protože vaše oblíbená vývojová platforma přebírá mnoho starostí, abyste se mohli soustředit na obchodní logiku!