Článek: AN0001920Aktualizováno::
V některých případech potřebujeme vypočítat hodnotu na základě hodnot v jiných sloupcích nebo i jiných záznamech.
Příklad: Celková cena serveru
V níže uvedeném příkladu máme třídu server s několika základními konfiguračními parametry (vm_cpu, vm_ram a vm_hdd) a odkazem na ceník (pricelist), který obsahuje jednotkovou cenu těchto parametrů. Potřebujeme zajistit, aby ve sloupci total_price byla celková cena serveru podle jeho konfigurace a přiřazeného ceníku (ceník odráží například rozdílnou úroveň služeb, které na serveru poskytujeme).
Potřebujeme tedy zajistit, aby se při uložení záznamu (nového nebo existujícího) přepočítala celková cena serveru a uložila do sloupce total_price. Vytvoříme pravidlo typu Skript Před uložením záznamu.
Místo použití skriptu: Pravidlo třídy
var drPL = OGActualDataRow.GetDR('pricelist');
if ( drPL != null)
{
var vm_cpu = OGActualDataRow['vm_cpu'];
var vm_ram = OGActualDataRow['vm_ram'];
var vm_hdd = OGActualDataRow['vm_hdd'];
var pl_cpu = drPL['price_cpu'];
var pl_ram = drPL['price_ram'];
var pl_hdd = drPL['price_hdd'];
if ( vm_cpu == null) vm_cpu = 0;
if ( vm_ram == null) vm_ram = 0;
if ( vm_hdd == null) vm_hdd = 0;
if ( pl_cpu == null) pl_cpu = 0;
if ( pl_ram == null) pl_ram = 0;
if ( pl_hdd == null) pl_hdd = 0;
OGActualDataRow['total_price'] = vm_cpu * pl_cpu + vm_ram * pl_ram + vm_hdd * pl_hdd;
}
else
{
OGActualDataRow['total_price'] = null;
}
Pravidlo z výše uvedeného příkladu aktualizuje záznam před jeho uložení z webového formuláře. Pokud data aktualizujeme hromadně pomocí importu, musíme použít SQL aktualizaci.
Místo použití skriptu: Import - Skript po skončení importu
var m = OG.Model.GetByCode('it');
var clP = m.ClassDefs['server'];
var clPL = m.ClassDefs['pricelist'];
var colPvmcpu = clP.Columns['vm_cpu'];
var colPvmhdd = clP.Columns['vm_hdd'];
var colPvmram = clP.Columns['vm_ram'];
var colPtotal = clP.Columns['total_price'];
var colPprice = clP.Columns['pricelist'];
var colPLpricecpu = clPL.Columns['price_cpu'];
var colPLpricehdd = clPL.Columns['price_hdd'];
var colPLpriceram = clPL.Columns['price_ram'];
var sql = 'update ' + clP.DBTableName +
' set ' + colPtotal.DBColumnName + ' = isnull(p.' + colPvmcpu.DBColumnName + ',0)*isnull(pl.' + colPLpricecpu.DBColumnName + ',0) + isnull(p.' + colPvmram.DBColumnName + ',0)*isnull(pl.' + colPLpriceram.DBColumnName + ',0) +
isnull(p.' + colPvmhdd.DBColumnName + ',0)*isnull(pl.' + colPLpricehdd.DBColumnName + ',0)' +
' from ' + clPL.DBTableName + ' pl join ' + clP.DBTableName + ' p on p.' + colPprice.DBColumnName + ' = pl.id';
OG.Sql.RunSql(sql);