6.3. Вычисления и валидация
Теперь, когда у нас есть таксономия, позволяющая построить неплохой отчет, настало время приступить к решению ещё одного вопроса – валидация.
Как вы помните, в нашей компании работает один ‘одаренный’ математик. Несмотря на то, что отчет в целом выглядит хорошо, 27 мужчин и 15 женщин никак не могут дать общее количество сотрудников, равное 41.
К счастью, в XBRL есть решение на такой случай – базы ссылок вычислений (calculation linkbases).
6.3.1. Схема таксономии
Нам нужно внести несколько изменений в схему таксономии, чтобы начать использовать базу ссылок вычислений:
- Определить связь с базой ссылок;
- Разрешить использование необходимых ролей.
6.3.1.1. Связь с базой ссылок
Чтобы включить базу ссылок вычислений в DTS (связанный комплекс таксономий), необходимо определить связь с ней.
<link:linkbaseRef
xlink:type="simple"
xlink:href="sample-2006-01-03-calculation.xml"
xlink:role="http://www.xbrl.org/2003/role/calculationLinkbaseRef"
xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase" />
Мы ссылаемся на документ, содержащий базу ссылок вычислений, с помощью атрибута href
. Атрибуту role
присваивается значение calcLinkbaseRef
, указывающее на тип базы ссылок.
6.3.1.2. Роли вычислений
Есть два вычисления, которые мы можем сделать:
- Сумма детальных значений в гендерной иерархии должна давать корректное общее количество сотрудников;
- Сумма детальных значений в возрастной иерархии должна давать корректное общее количество сотрудников.
Поскольку у нас определен только один концепт для общего количества сотрудников, в каждом из вычислений должна использоваться своя роль. Забудь мы это, и получим задвоенное общее количество сотрудников – сложатся детальные значения обеих иерархий.
Ранее мы уже определяли роли для базы ссылок презентаций, давайте разрешим их использование также и для вычислений.
<link:roleType
roleURI="http://www.sample.com/genderDemographics" id="genderDemographics">
<link:definition>Gender related demographics on employees</link:definition>
<link:usedOn>link:presentationLink</link:usedOn>
<link:usedOn>link:calculationLink</link:usedOn>
</link:roleType>
<link:roleType
roleURI="http://www.sample.com/ageDemographics" id="ageDemographics">
<link:definition>Age related demographics on employees</link:definition>
<link:usedOn>link:presentationLink</link:usedOn>
<link:usedOn>link:calculationLink</link:usedOn>
</link:roleType>
Разрешить использование роли в базе ссылок вычислений – означает просто добавить в нее элемент usedOn
со значением calculationLink
.
6.3.2. База ссылок вычислений
Начало документа, содержащего базу ссылок, должно выглядеть знакомым для вас.
<?xml version="1.0" encoding="utf-8"?>
<linkbase
xmlns="http://www.xbrl.org/2003/linkbase"
xmlns:link="http://www.xbrl.org/2003/linkbase"
xmlns:xbrli="http://www.xbrl.org/2003/instance"
xsi:schemaLocation="http://www.xbrl.org/2003/instance
http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
</linkbase>
6.3.2.1. Связи с ролями
Как и в случае с базой ссылок презентаций, нам нужно определить связь с ролями из схемы таксономии.
<roleRef
xlink:type="simple"
xlink:href="sample-2006-01-03.xsd#genderDemographics"
roleURI="http://www.sample.com/genderDemographics" />
<roleRef
xlink:type="simple"
xlink:href="sample-2006-01-03.xsd#ageDemographics"
roleURI="http://www.sample.com/ageDemographics" />
Опять же, никаких сюрпризов для вас тут быть не должно.
6.3.2.2. Ссылки вычислений
Мы определяем элемент calculationLink
для каждого вычисления, используя роли, чтобы различать их.
<calculationLink
xlink:type="extended"
xlink:role="http://www.sample.com/genderDemographics" >
</calculationLink>
<calculationLink
xlink:type="extended"
xlink:role="http://www.sample.com/ageDemographics" >
</calculationLink>
6.3.2.3. Локаторы
Локаторы полностью аналогичны тем, что мы определяли в базах ссылок ярлыков и презентаций, поэтому не будем повторяться.
6.3.2.4. Дуги вычислений
Теперь мы наконец можем определить дуги вычислений, объединяющие концепты каждого из разделов отчета с общим количеством сотрудников.
<calculationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
xlink:from="concept_nr_employees_total"
xlink:to="concept_nr_employees_male"
weight="1.0"
order="1" />
<calculationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
xlink:from="concept_nr_employees_total"
xlink:to="concept_nr_employees_female"
weight="1.0"
order="2" />
<calculationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
xlink:from="concept_nr_employees_total"
xlink:to="concept_nr_employees_age_up_to_20"
weight="1.0"
order="1" />
<calculationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
xlink:from="concept_nr_employees_total"
xlink:to="concept_nr_employees_age_21_to_40"
weight="1.0"
order="2" />
<calculationArc
xlink:type="arc"
xlink:arcrole="http://www.xbrl.org/2003/arcrole/summation-item"
xlink:from="concept_nr_employees_total"
xlink:to="concept_nr_employees_age_41_and_up"
weight="1.0"
order="3" />
Для атрибута arcrole
указано значение summation-item
, означающее, что from-концепт является суммой to-концептов.
Здесь вы можете также увидеть полезный атрибут weight
– он определяет коэффициент, на который умножается to-концепт при расчете общей суммы. В нашем случае для простого суммирования мы везде используем коэффициенты ‘1.0’. А для вычитания to-концепта из общей суммы достаточно указать коэффициент ‘-1.0’.
6.3.3. Что в результате?
Когда мы построим отчет в нашем приложении, вот что мы увидим:
Расчет по гендерной демографии привел к ошибке валидации: указанное значение ‘41’ не соответствует рассчитанному значению ‘42’. Все как мы и ожидали.
Но здесь также видно и одно из ограничений базы вычислений: наше приложение для визуализации отчета не смогло определить, для какого факта показать ошибку. Факты по концепту 'Total number employees' (общее количество сотрудников) указаны в каждом разделе отчета, поэтому и ошибка выведена также в каждый раздел.
Возможно, какое-нибудь из более функциональных приложений для визуализации отчета обнаружит, что роль вычисления относится к разделу гендерной демографии, и покажет ошибку только в нем. Но это не лучшее решение, поскольку мы могли создать новые роли для базы вычислений и утратить связь с базой презентаций. В этом случае приложение не сможет определить, где показать ошибку.
По-видимому, на данный момент единственным решением является использование разных концептов для общего количества сотрудников в каждом из разделов отчета. Однако, это противоречит принципу однократной передачи каждого факта.
6.3.3.1. Корректировка
Если мы исправим данные отчета, изменив количество сотрудников-мужчин на 26, то при формировании отчета ошибки не будет.