PRVNÍ ZÁZNAM, POSLEDNÍ ZÁZNAM, DALŠÍ ZÁZNAM, PŘEDCHOZÍ ZÁZNAM; říká vám to něco? Vsadím se, že ano. Už jste je používali k manipulaci s výběry! ORDA poskytuje užitečné a známé metody pro navigaci po entitách ve výběru entit – a samozřejmě i některé výhody!
Pro začátek můžete zpracovávat několik výběrů entit najednou a procházet jimi nezávisle na sobě, zatímco běžně můžete spravovat pouze jeden „aktuální výběr“ pro každou tabulku. Právě to si ukážeme v tomto příspěvku.
Již jsme viděli, že dotaz na datové úložiště vrací výběr entit. ORDA poskytuje prostředky pro velmi snadný přístup k entitám ve výběru entit.
ORDA: Zacházení s entitami ve výběrech entit
VYTVÁŘENÍ A VYPLŇOVÁNÍ VÝBĚRŮ ENTIT
Prázdný výběr entit je vytvořen pomocí příkazu newSelection() metodou. Můžete do něj také přidávat entity pomocí metody add() metodou.
PŘÍKLAD
C_OBJECT($employee;$es)
C_TEXT ($name)
//Create a new empty entity selection
$es :=ds.Employee.newSelection()
Repeat
$name :=Request("Který zaměstnanec?")
If (ok=1)
//Get the first employee whose last name is $name
$employee :=ds.Employee.query("lastName=:1";$name).first()
//Add the entity to the new entity selection $es
If ($employee#Null)
$es .add($employee)
End if
End if
Until (ok=0)
alert (String($es.length) + " zaměstnanci byli přidáni do výběru nového subjektu").
PŘÍSTUP K ENTITÁM VE VÝBĚRU ENTIT
Nezapomeňte, že entity ve výběru entit můžete iterovat pomocí metody for each smyčky. Zde je rychlý příklad, ale podívejte se také na tento blogpost.
C_OBJECT($employeesParis;$employee;$status)
// Get employees working in Paris
$employeesParis :=ds.Employee.query("city='Paris'")
//Iterate through each employee
For each ($employee;$employeesParis)
$employee.lastName:=Uppercase($employee.lastName)
$status:=$employee.save()
End for each
Do výběru entit můžete také načíst entitu s jejím indexem (index začíná od 0). Zde je příklad:
C_OBJECT($gamers)
.
//Get all the gamers sorted by rank
$gamers :=ds.Gamer.all().orderBy("rank")
if ($gamers.length >=3)
ALERT ("První tři jsou: "+Char(13) \
+$gamers[0].lastName+Char(13)+$gamers[1].lastName+Char(13)+$gamers[2]lastName)
End if
PRVNÍ A POSLEDNÍ ENTITY
Stránka first() a last() umožňují získat první nebo poslední entitu z výběru entit. Tyto metody mohou vrátit adresu Null, pokud je výběr entit prázdný.
V následujícím příkladu získáme první entitu z výběru entit $gamers:
C_OBJECT($gamers;$first)
// Get the gamers whose last name starts with "H"
$gamers :=ds.Gamer.query("lastName='H@'")
// Get the first entity of the $gamers entity selection
$first :=$gamers.first()
If ($first#Null)
ALERT ("První hráč byl nalezen")
Else
ALERT ("Výběr entit $gamers je prázdný")
End if
Předchozí a následující ENTITY
Entita může patřit do výběru entit. V takovém případě můžete iterovat přes entity výběru entit pomocí metody previous() a next() metodami.
V tomto příkladu používáme formulář pro zobrazení seznamu hráčů. Uživatel může procházet detaily jednotlivých hráčů pomocí tlačítek Předchozí a Další.
Tlačítko Další má následující objektovou metodu:
//Form.gamer is an entity, edited on the form. It belongs to an entity selection which is the entire list of gamers.
If ( . . ()# ) . := . . () FormgamernextNull
//Edit the next entity of the entity selection to which the Form.gamer entity belongs.
FormgamerFormgamernext
End if
informace o entitě
A to ještě není všechno! Pro jakoukoli danou entitu můžete získat výběr entity, ze které pochází. Ještě něco je dobré vědět, existují také metody pro získání kontextových informací o entitě, např. zjistit, zda patří do daného výběru entit, získat její pozici ve výběru entit atd.
Zde máme dva výběry entit ($employeesParis a $employeesNY). Metoda selectedEmployee vybere zaměstnance v jedné z nich. Poté můžeme určit, do kterého výběru entit tento zaměstnanec patří, pomocí metody contains() metodou:
C_OBJECT($employeesParis;$employeesNY;$employee)
// Get employees working in Paris
$employeesParis :=ds.Employee.query("city='Paris'")
// Get employees working in New York
$employeesNY :=ds.Employee.query("city='New York'")
// The method selectedEmployee returns an employee in one of the two given entity selections
$employee :=selectedEmployee($employeesParis;$employeesNY)
Case of
: ($employeesParis.contains($employee))
ALERT ("Zaměstnanec patří do výběru entit $employeesParis")
: ($employeesNY.contains($employee))
ALERT ("Zaměstnanec patří do výběru entit $employeesNY")
End case
Zde máme výběr entit ($employeesParis). Metoda selectedEmployee z něj vybere zaměstnance. Index zaměstnance ve výběru entit můžeme získat pomocí metody indexOf() metodou:
C_OBJECT($employeesParis;$employee)
// Get employees working in Paris
$employeesParis :=ds.Employee.query("city='Paris'")
// The method selectedEmployee returns an employee in the given entity selection
$employee :=selectedEmployee ($employeesParis)
ALERT ("Index vybraného zaměstnance je " + String($employee.indexOf()))
Podívejte se na příklad databáze a budete o tomto tématu vědět vše!