6.3.3. Использование формул RPTwin
Рассмотрим построение отчета RPTwin по модели процессов, изображенной на рис. 6.11. Модель описывает процесс изготовления изделия и имеет три уровня декомпозиции. В ней описаны следующие свойства, определяемые пользователем (UDP):
уровень декомпозиции ( Integer List, допустимые значения в модели;
потребление электроэнергии, кВт-ч ( Real Number);
потребление воды, т ( Real Number).
Контекстной работе ("Изготовление изделия") присвоено значение UDP "Уровень декомпозиции", равное 0, работам на диаграмме декомпозиции контекста -1 и работам на диаграммах декомпозиции нижнего уровня -2. Значения свойств "Потребление электроэнергии, кВт-ч" и "Потребление воды, т" присвоены только работам на диаграммах декомпозиции нижнего уровня.
Создание UDP в BPwin и присвоение значений работам подробно описано в 1.4.
Рис. 6.11. Дерево узлов модели процессов
Непосредственно в среде BPwin невозможно оценить количество ресурсов (электроэнергия и вода), необходимых для производства изделия, поскольку невозможно производить арифметические операции с UDP. В отчете Diagram Object Report, фрагмент которого приведен на рис. 6.12, можно получить только список работ с указанием их UDP, но невозможно отфильтровать работы и произвести расчеты суммарных значений необходимых для производства изделия ресурсов.
Рис. 6.12. Отчет по UDP (Diagram Object Report), полученный средствами BPwin
Создать отчет со сложной обработкой данных возможно только средствами- RPTwin. Для создания такого отчета необходимо в диалоге настройки отчета Diagram Object Report (см. рис. 1.48) в качестве формата отчета указать RPTwin, после чего щелкнуть по кнопке Report. В появившемся диалоге сохранения файла следует указать имя файла данных отчета (.LWD). После этого автоматически запускается RPTwin и появляется диалог New Report. В диалоге New Report в качестве типа создаваемого отчета следует указать Columnar. Создается шаблон отчета, включающий в себя все колонки файла набора данных отчета (рис. 6.13).
Рис. 6.13. Шаблон отчета "Ресурсы, необходимые для изготовления изделия "
Фрагмент отчета (режим предварительного просмотра) представлен на рис. 6.14.
Ресурсы, необходимые для изготовления изделия
Рис. 6.14. Отчет "Ресурсы, необходимые для изготовления изделия"
Этот отчет не включает суммирующие данные и несет ту же информацию, что и отчет на рис. 6.12. Для того, чтобы он действительно помог анализировать необходимые ресурсы, его следует модифицировать.
Поскольку UDP, определяющие потребление ресурсов, заданы только для работ нижнего уровня декомпозиции, можно оставить в отчете только эти работы. Для установки фильтра в среде RPTwin нужно выбрать пункт меню Options/Filter. В диалоге Filter (рис. 6.15) следует выбрать опцию Include и щелкнуть по кнопке Formula Editor.
Рис. 6.15. Диалог Filter
В диалоге Formula Editor нужно создать формулу
{Уровень декомпозиции}=2
В результате в отчет войдут только работы с уровнем декомпозиции 2, т.е. только те работы, для которых заданы значения UDP "Потребление электроэнергии, кВт-ч" и "Потребление воды, т".
Теперь можно удалить из отчета поле и заголовок "Уровень декомпозиции".
Сгруппируем работы по уровню энергопотребления. Для этого следует выбрать пункт меню Layout/Sorting and Grouping. Будем считать, что работы, имеющие значение UDP "Потребление электроэнергии, кВт-ч" больше 10, относятся к высокому уровню энергопотребления, от 5 до 10 - к среднему и менее 5 - к низкому. В файле данных отчета нет колонки, непосредственно указывающей на уровень энергопотребления, поэтому следует провести группировку по вычисляемому значению. Для создания вычисляемого значения в диалоге Sorting/Grouping следует щелкнуть по кнопке Sort/Group on Calculated Value и в появившемся диалоге Formula Editor набрать текст формулы:
If {Потребление электроэнергии, кВт-ч} >10 Then "Высокие энергозатраты" Else If {Потребление электроэнергии, кВт-ч}< 5
Then "Низкие энергозатраты" Else "Средние энергозатраты"
В шаблоне отчета создаются две новые секции - Group Header и Group Footer.
В секцию Group Header поместим формулу
If {Потребление электроэнергии, квт-ч.) >10 Then "Высокие энергозатраты" Else If {Потребление электроэнергии, квт-ч.} <5 Then "Низкие энергозатраты" Else "Средние энергозатраты"
В секцию Group Footer поместим формулы с агрегативными функциями:
"Итоговое потребление воды работ с " & (If (Потребление электроэнергии, квт-ч.1 >10 Then "высоким" Else If {Потребление электроэнергии, квт-ч.) <5 Then "низким" Else "средним") &" энергопотреблением - " &GroupSum ({Потребление воды, т.})&", т."
и
"Итоговое потребление электроэнергии работе " & (If (Потребление электроэнергии, квт-ч.1 >10 Then "высоким" Else If (Потребление электроэнергии, квт-ч.) <5 Then "низким" Else "средним") & энергопотреблением - " &GroupSum ({Потребление электроэнергии, квт-ч.})&", квт-ч."
В секции Report Footer расположим формулы
"Итоговое потребление электроэнергии " SReportSum ((Потребление электроэнергии, квт-ч.})&", квт-ч."
и
"Итоговое потребление воды " &ReportSum ({Потребление воды, т.})&", т."
На рис. 6.16 представлен результат - итоговый отчет по потреблению ресурсов, который содержит суммирующую информацию по UDP и сложную группировку по вычисляемому полю. Суммирующие показатели потребления ресурсов вычисляются как по всему отчету, так и по категориям работ.
Рис. 6.16. Итоговый отчет по потреблению ресурсов
Приложение Список макрокоманд ERwin
Макропеременные, используемые в таблице:
, , - определяемый пользователем текст или числовое значение, применяемое при генерации;
- SQL-команда, например INSERT, UPDATE или DELETE;
- фрагмент макрокода;
- булево выражение, которое может возвращать значение FALSE или TRUE;
, , - фрагмент текста или числовое выражение, которое добавляется перед именем таблицы или колонки при генерации;
- разделитель, который вставляется в текст триггера или процедуры при генерации (заключается в двойные кавычки);
, , , - имя таблицы, значения по умолчанию, домена и правила валидации;
- переменная, использующаяся в триггере.
Макрокоманда
| Описание
| СУБД
| %!=(, )
| Оператор сравнения, !=, возвращает TRUE, если аргументы macro code1 и macro code 2 равны
| Все
| %%
| Два символа % необходимо использовать, если расширенный текст триггера должен содержать один символ %
| Все
| %"(<тасго code1>, )
| Перемножает аргументы macro code1 и macro code 2
| Все
| %+(, )
| Складывает аргументы macro code1 и macro code 2
| Все
| %-(, )
| Вычитает один аргумент из другого (macro code1 и macro code 2)
| Все
| %/(, )
| Делит один аргумент на другой (macro code1 и macrocode2)
| Все
| %:
| Возвращает значение
| Все
| %<(, )
| Оператор сравнения, <, возвращает TRUE, если аргумент macro code1 меньше, чем macro code 2
| Все
| %<=(,
| Оператор сравнения, <=, возвращает TRUE, если аргумент macro code1 меньше или равен macro code 2
| Все
| %=(,)
| Присваивает аргумент переменной
| Все
| %=(,
| Оператор сравнения, = =, возвращает TRUE, если аргумент macro code1 равен macro code 2
| Все
| %>(, )
| Оператор сравнения, >, возвращает TRUE, если аргумент macro code1 больше, чем macro code 2
| Все
| %>=(, )
| Оператор сравнения, >=, возвращает TRUE, если аргумент macro code1 больше или равен macro code 2
| Все
| %Action
| Возвращает имя команды, до или после которой срабатывает триггер, например INSERT, UPDATE,DELETE
| Все
| %Actions()
| Возвращает список команд, до или после которых срабатывает триггер, например INSERT or UPDATE
| Все
| %And (,)
| Выполняет операцию "логическое И" над булевыми предикатами, заданными
в
| Все
| %A(tDatatype
| Возвращает тип данных текущего атрибута
| Все
| %AttDef
| Возвращает определение атрибута
| Все
| %AttDefault
| Возвращает имя значения по умолчанию, связанное с атрибутом
| Все
| %AttDomain
| Возвращает имя домена, связанное с атрибутом
| Все
| %AttFieldname
| Возвращает имя колонки, соответствующей атрибуту
| Все
| %AttFieldWidth
| Возвращает целое число, представляющее длину типа данных текущего атрибута, например varchar(50) –>50)
| Все
| " %AttlD
| Возвращает ID атрибута
| Все
| %AttlsFK
| Булев предикат, который может быть использован как условие в выражении %If. Он определяет, входит ли текущий атрибут в состав внешнего ключа
| Все
| %AttlsRolenamed
| Булев предикат, который может быть использован как условие в выражении %If. Он определяет, является ли текущий атрибут именем роли
| Все
| %AttlsPK
| Булев предикат, который может быть В использован как условие в выражении
атрибут в состав первичного ключа
| Все
| %AltName
| атрибута
| Все
| %AttNullOption
| Возвращает строку, представляющую режим нулевых значений для текущего атрибута (NULL /NOT NULL)
| Все
| %AttPhysDatatype
| Возвращает физический тип данных текущего атрибута независимо от того, является ли этот тип данных типом данных, определенным пользователем
| Все
| %Atts(,, )
| Выдает список всех атрибутов сущности для каждого элемента
| Все
| %AttValidation
| Возвращает имя правила валидации, связанного с данным атрибутом; может быть использован в ForEachAtt или ForEachFKAtt
| Все
| %Cardinality
| Возвращает мощность (кардинальность) связи
| Все
| %Child
| Возвращает физическое имя таблицы дочерней сущности в связи
| Все
| %ChildAtts(, , )
| Возвращает список всех атрибутов дочерней сущности в связи, выполняя заданную функцию для каждого элемента
| Все
| %ChildFK(, )
| Возвращает список внешних ключей дочерней сущности в связи, выполняя заданную функцию для каждого элемента
| Все
| %ChildFKDecl(, ,)
| Возвращает список внешних ключей дочерней сущности в связи с их типами данных (см. %ParamDecl)
| Все
| %ChildNK(, , )
| Генерирует разделенный список функций для всех неключевых атрибутов дочерней сущности в связи, выполняя заданную функцию для каждого элемента
| Все
| %ChildNKDecl(,
| Возвращает список неключевых атрибутов дочерней сущности связи с их типами данных
| Все
| %ChildParamDecl(, ,)
| Возвращает список атрибутов дочерней сущности связи с их типами данных (см. %ParamDecl)
| Все
| %ChildPK, , )
| Генерирует разделенный список функций для каждого элемента первичного ключа дочерней сущности, выполняя заданную функцию для каждого элемента (например, iipdate(customernumber) or update(customername) or....)
| Все
| %ChildPKDecl(, ,)
| Возвращает список атрибутов первичного ключа дочерней сущности связи с их типами данных (см. %ParamDecl)
| Все
| %Concat(,)
| Производит конкатенацию и . Возвращает результат
| Все
| %CurrentDatabase
| Возвращает имя БД, которое используется в диалоге LOGIN при генерации скрипта
| Все
| %CurrentFile
| Возвращает имя файла модели (.ER1), на основе которой генерируется скрипт
| Все
| %CurrentServer
| Возвращает имя сервера, для которого генерируется скрипт
| Все
| %CurrentUser
| Возвращает имя пользователя, которое используется в диалоге LOGIN при генерации скрипта
| Все
| %CustomTriggerDefaultBody
| Часть триггера, определенного пользователем - default body, которая содержится в diagram-wide-сегменте шаблона CUSTOM TRIGGER FOOTER
| Все
| %CustomTriggerDefaultFooter
| Часть триггера, определенного пользователем - default footer, которая содержится в diagram-wide-сегменте шаблона CUSTOM TRIGGER FOOTER
| Все
| %CustomTriggerDefaultHeader
| Часть триггера, определенного пользователем - default header, которая содержится в diagram-wide-сегменте шаблона CUSTOM TRIGGER HEADER
| Все
| %DalatypeName()
| Возвращает тип данных
| Все
| %DatatypeScale() Дл
| Для десятичных типов данных возвращает разряд числа
| Все
| %DatatypeWidth() В
| Возвращает ширину поля
| Все
| %Datelime • В т
| Возвращает строку, представляющую В текущую дату и время
| Все
| %DBMS
| Возвращает имя СУБД
| Все
| %DBMSDelim В
| Возвращает разделитель операторов
СУБД
| Все
| %Decl(,) 0
| Объявляет как переменную и, если В это задано, присваивает ей значение
| Все
| %DefaultName
| Возвращает имя по умолчанию В
| Все
| %DefaultValue
| Возвращает значение по умолчанию
| Все
| %DomainDatatype()
| Возвращает физический тип данных домена
| Все
| %DomainDef()
| Возвращает определение домена
| Все
| %DomainName
| Возвращает имя домена
| Все
| %DomainNullOption()
| Возвращает режим нулевых значений для домена (NULL /NOT NULL)
| Все
| %DomainValidation()
| Возвращает имя правила валидации, связанное с доменом
| Все
| %Entityld()
| Возвращает ID сущности или таблицы
| Все
| %EntityName()
| Возвращает имя сущности или таблицы
| Все
| %File(, )
| Макрокод записывается в файл
| Все
| %Fire
| Задает, когда срабатывает триггер, например BEFORE или AFTER
| INFORMIX
Ingres ORACLE 7 Rdb
| %ForEachAtt(, ) (i Расширяет макрокод для каждого из атрибутов заданной таблицы
| Все
| %ForEachChildRel () t)
| связи, в которой сущность триггера является дочерней
| Все
| %ForEachDefault() ( ] )
| Расширяет макрокод для каждого значения по умолчанию
| Все
| %ForEachDomain() ( )
| Расширяет макрокод для каждого домена
| Все
| %ForEachEntity() { <[nacro code>)
| Расширяет макрокод для каждой сущности
| Все
| %ForEachFKAtt())
| атрибутов внешнего ключа, мигрировавших через текущую связь
| Все
| %ForEachlndex([],[],[ ],[]) Расширяет макрокод для каждого индекса в подмножестве модели
| Все
| %ForEachlndexMem(), []) l
| Расширяет макрокод для каждого члена индекса в подмножестве модели
| Все
| %ForEachKey([],[], []) ) Расширяет макрокод для всех инвертированных входов и альтернативных ключей в подмножестве модели
| Все
| %ForEachKeyMem(!, []) [
| Расширяет макрокод для всех членов ключей
| Все
| %ForEachParentRel () ()
| Расширяет для каждой связи, в которой сущность триггера является родительской
| Все
| %ForEachValidValue )
| Расширяет макрокод для всех значений правила валидации
| Все
| %ForEachValidation() )
| Расширяет макрокод для всех правил валидации
| Все
| %lf ( ) {} %Else {}
| В зависимости от условия, расширяет макрокод if или else. Часть else не является обязательной
| Все
| %include("path name")
| Позволяет включать макрокоды триггера в файлы
| Все
| %lndexName
| Возвращает имя индекса
| Все
| %lndexType
| Возвращает тип индекса
| Все
| JoinFKPK(, , comparison op>,)
| Часть условия поиска оператора Where, присоединяющая внешний ключ дочерней сущности к первичному ключу родительской сущности связи
| Все
| JoinPKPK(, , comparison op>,) Часть условия поиска оператора Where, соединяющая первичные ключи двух корреляций или таблицы и корреляции
| Все
| %KeyName
| Возвращает имя ключа
| Все
| %Len()
| Возвращает длину строки
| Все
| %Lower()
| Преобразует аргумент в нижний регистр
| Все
| %Max(,)
| Возвращает максимальное значение -
<уа1ие1>или
| Все
| %Min(,)
| Возвращает минимальное значение -
<уа1ие1>или
| Все
| %NK(,, )
| Выдает список всех неключевых атрибутов сущности триггера, выполняя заданную функцию для каждого элемента
| Все
| %NKDecl(,)
| Выдает список неключевых атрибутов сущности триггера с их типами данных (см. %ParamDecl)
| Все
| %Not() В
| н Выполняет операцию "логическое НЕ"
над булевым предикатом, определенным в
| Все
| %NotnullFK(, , ,)
| Часть условия поиска оператора Where, сравнивающая внешний ключ дочерней сущности связи с null. Эта макрокоманда расширяется тогда и только тогда, когда связь является неидентифицирующей, nulls allowed
| Все
| %0r(,)
| Выполняет операцию "логическое ИЛИ" над булевыми предикатами, определенными в и
| Все
| %ParamOecl(, ,)
| Выдает список всех атрибутов сущности триггера с их типами данных. Имя каждого атрибута имеет формат: . Если заданы и старый и новый префикс, то длина списка удваивается. В первой половине списка содержится , во второй -< new prefix>
| Все
| %ParamPass(, , ,
| Присваивает значения параметрам процедур, заданным в и/или в для всех атрибутов сущности триггера
| Ingres
| %Parent
| Физическое имя таблицы родительской сущности связи
| Все
| %ParentAtt ()
| Расширяет любую макрокоманду атрибута (например, %AttFieldName, %AltDatatype) для атрибута родительского первичного ключа, который, мигрировав, сформировал текущий атрибут
| Все
| %ParentAtts(, , )
| Выдает список всех атрибутов родительской сущности связи, выполняя заданную функцию для каждого элемента
| Все
| %ParentNK(, , )
| Выдает список всех неключевых атрибутов родительской сущности связи, выполняя заданную функцию для каждого элемента
| Все
| %ParentNKDecl(, ,)
| Выдает список неключевых атрибутов родительской сущности связи с их типами данных (см. %ParamDecl)
| Все
| %ParentParamDecl(,
| Выдает список неключевых атрибутов родительской сущности связи с их типами данных (см. %ParamDecl)
| Все
| %ParentPK(,)
| Выдает список всех атрибутов первичного ключа родительской сущности связи, выполняя заданную функцию для каждого элемента
| Все
| %ParentPKDecl(, ,)
%PnysRelName
| Выдает список атрибутов первичного ключа родительской сущности связи с их типами данных (см. %ParamDecl)
| Все
| %PK(, )
| Возвращает физическое имя связи
Выдает список первичных ключей сущности триггера, выполняя заданную функцию для каждого элемента
| Все
| %PKDecl(, ,)
| Выдает список атрибутов первичного ключа сущности триггера с их типами данных (см. %ParamDecl)
| Все
| %RefClause %Relld
| Оператор ссылок; генерирует: REFERENCES OLD as new as
Возвращает ID связи
| INFORMIX Ingres ORACLE7 Rdb
| %RellsNonull
| Проверяет null-выражение для связи и возвращает TRUE, если NULL не разрешены
| Все Все
| %RelRI(, )
| Возвращает правило ссылочной целостности
| Все
| %RelTemplate %RelType
| Расширяет код шаблона, присоединенного к текущей связи. Если нет присоединенного кода, то расширяется соответствующий шаблон ссылочной целостности
Возвращает тип связи
| Все
| %Scope
| Задает, каким образом будет выполняться триггер (например, один раз для всей таблицы, для каждой строки и т. д.)
| Все ORACLE7
| %SetFK(,)
| Выдает список атрибутов внешнего ключа дочерней сущности связи, в котором каждому элементу присвоено заданное значение
| Все
| %SetPK(,) к
3 Выдает список атрибутов первичного ключа заданной таблицы, в котором каждому элементу присвоено заданное значение
| Все
| %Substitute(, , 3 ) с
| вменяет строку в строке на В троку
| Все
| %Substr(, С ,) д
| Создает подстроку для расширения заданного
| Все
| %Switcli() {%Choose(%Default {macro code n}}
| Позволяет расширить макрокод по условию
| Все
| %Table Name В с
| Возвращает физическое имя таблицы В сущности триггера
| Все
| %Template Name
| Возвращает имя шаблона триггера, хранимой процедуры или скрипта; может быть использовано в редакторе Entity Trigger
| Все
| %Trigger Name
| Возвращает физическое имя триггера
| Все
| %TriggerRelRI(, ,)
| Булев предикат, принимающий значение TRUE, если заданный триггер и связь относятся к заданному действию
(Child/Parent) и целостности (Cascade/Restrict/Set Null/Set Default)
| Все
| %UpdateChildFK()
| Вьщает список внешнего ключа дочерней сущности связи, выполняя функцию update для каждого элемента
| ORACLE7, SQL Server SYBASE
| %UpdateParentPK()
| Выдает список первичного ключа родительской сущности связи, выполняя функцию update для каждого элемента
| ORACLE7, SQL Server SYBASE
| %UpdatePK()
| Вьщает список первичного ключа сущности триггера, выполняя функцию update для каждого элемента
| ORACLE7, SQL Server SYBASE
| %Upper()
| Преобразует аргумент в нижний регистр
| Все
| %ValidationHasValidValues()
| валидации <агд> имеет допустимые значения, иначе - FALSE
| Все
| %ValidalionName
| Возвращает имя правила валидации
| Все
| %ValidationRule() или %ValidationRule
| Возвращает правило валидации для сервера; может быть использовано в любом месте с аргументом validation name> или в рамках действия правила, без аргументов
| Все
| %ValidValue
| Возвращает значение допустимого значения; используется в рамках действия допустимого значения
| Все
| %ValidValueDef
| Возвращает определение допустимого значения; используется в рамках действия допустимого значения
| Все
| %VerbPhrase
| Возвращает глагольную фразу связи
| Все
| | | | | | 5>5>5> |