Určitě jste si již všimli, že dotazy ORDA jsou nejen lehké a čitelné, ale také umožňují snadnou navigaci v celém datovém modelu pomocí objektově orientovaných konceptů! V tomto příspěvku na blogu jsme si ukázali, jak psát výkonné a snadno udržovatelné dotazy. Jednou z doporučených metod bylo oddělené poskytování dotazu a hodnot pomocí zástupných znaků. 4D v17 R5 posouvá zástupné symboly o krok dál tím, že umožňuje psát obecné dotazy ORDA: pozdravte pojmenované zástupné symboly pro hodnoty!
HDI: Příklad pojmenovaných zástupných symbolů pro hodnoty v dotazech ORDA
Tyto nové zástupné znaky jsou poskytovány jako parametry objektů v nastavení dotazu. Vzhledem k tomu, že objekt je mapou klíč/hodnota, je velmi snadné je v dotazech používat.
Příklad vydá za tisíc slov
Zde je dotaz pro získání klienta jménem Charlie s Loyal client jako komentářem. Říká vám to něco? Pokud ne, měli byste se podívat na tento příspěvek, abyste si osvěžili paměť.
C_OBJECT($clients)
$clients :=ds.Clients.query("name = :1 and comment = :2"; "Charlie@"; "Loyal client")
Dotaz lze také zapsat jako:
C_OBJECT($settings;$clients)
$settings :=New object
$settings .parameters:=New object("givenName"; "Charlie@"; "givenComment"; "Loyal client")
$clients :=ds.Clients.query("name = :givenName and comment = :givenComment";$settings)
Stačí použít zástupný symbol s jeho jménem s předponou „:“ .
Váš kód je snadno čitelný a udržovatelný, ještě větší výhodou je však možnost psát obecné dotazy, jejichž hodnotové parametry mohou pocházet z různých zdrojů (uživatelské rozhraní nebo požadavek).
Co třeba takovýto vzor?
Uživatelům můžete poskytnout rozhraní dotazu, kde si mohou zvolit kritéria vyhledávání a hodnoty, které se mají použít.
Níže uvedený kód je určen pro rozhraní, které umožňuje prodejci procházet seznam svých klientů. Vrátí filtrovaný obsah podle ID prodejce.
C_OBJECT$settingsparameters($formData;$settings;$clients)
C_TEXT ($queryString)
$formData :=New object
DIALOG ("QueryEditor";$formData)
CLOSE WINDOW
if (OK=1)
//The logged sales person can only browse their clients
$queryString :="salesPersonUserId = :givenUserId"
//The $formData object comes from the user's interface with search criteria filled
//It contains the sales person's user id and some additional search criterias (name and city)
$settings :=New object
$settings .parameters:=$formData
If ( xml-ph-0034@deepl.ingivenName#Null)
$queryString :=$queryString+" and name = :givenName"
End if
If ($settings.parameters.givenCity#Null)
$queryString :=$queryString+" and city.name = :givenCity"
End if
$clients :=ds.Clients.query($queryString;$settings)
end if
Výše uvedené příklady se dotazují na dataClass, ale pokud se podíváte do dokumentace, zjistíte, že je to použitelné i na kolekce!
Jak vidíte, dynamické sestavování dotazů je hračka. Stáhněte si a spusťte HDI a dozvíte se více!