Базова інформація
Движок виразів Database Tour Pro дозволяє виконувати Pascal-подібні вирази, які можуть бути вбудовані в динамічні елементи при експорті даних (наприклад, в налаштуваннях відповідності полів або при експорті до формату HTML з використанням шаблону HTML), а також у звітах.
Вирази можуть складатися з функцій (дозволяються вкладення будь-якої глибини), арифметичних і логічних операторів та літералів (числових, строчкових або булевських). Вираз повертає одне значення числового, строчкового або булевського типу.
Зауваження
Неправильно
dataset_field_val(1, Cust_Name)
Правильно
dataset_field_val(1, 'Cust_Name')
Пояснення: В цьому прикладі назва поля бази даних має тип String (текст), тому має братися в одинарні лапки.
Неправильно
Назва книги: dataset_field_val(1, 'TITLE')
Правильно
'Назва книги: ' + dataset_field_val(1, 'TITLE')
Назва книги: <<<dataset_field_val(1, 'TITLE')>>>
Пояснення: Щоб вираз дав одне значення, потрібно, щоб число операндів у виразі типу String (текст) повинно дорівнювати числу операторів плюс один. Іншими словами, потрібно, щоб у виразі типу String між кожними двома операндами був один оператор.
Іншим рішенням є виділення динамічних частин виразу. В контексті звітів динамічні частини починаються трійкою відкритих трикутних дужок (<<<) і закриваються трійкою закритих трикутних дужок (>>>).
В деяких функціях є параметр StepNo (крок експорту). Його значення залежить від контексту, в якому функція використовується:
Контекст експорту до HTML з використанням шаблону. Шаблон HTML може бути заповнений динамічними даними за більше ніж один крок. Напр., якщо ваш документ HTML містить кілька таблиць, які повинні бути заповнені даними з різних наборів даних, його можна заповнити лише за кілька кроків експорту (зазвичай один набір даних за один крок). Тому функції, пов'язані із базами даних, та деякі інші функції мають парметр StepNo. При експорті набору даних до HTML з використанням шаблону HTML також можливо вказати номер кроку експорту (по замовчанню це 1). Під час процедури експорту лише ті вирази будуть розраховані, де параметр StepNo функцій відсутній або співпадає з тим, що вказаний в опціях експорту. Наприклад, вираз database_field_val(2, 'payment_sum')/100 буде розрахований лише під час другого кроку експорту.
Контекст звітів. Параметр StepNo вказує крок (етап), на якому функція має бути розрахована. Можливі значення: 1 або 2. Якщо 1, то відповідна функція буде розрахована безпосередньо при опрацюванні виразу. Якщо 2, звіт буде запущено в подвійному проході і функція буде розраховани лише при другому проході опрацювання звіту, тобто після того, як набір даних досягне останнього запису. Використання функцій баз даних в подвійному проході корисно, напр., якщо потрібно підсумки звіту вивести в секції заголовку звіту або групи.
Інші контексти. Повинен дорівнювати 1.
Поєднання різних StepNo в одному виразі (наприклад, database_field_val(1, 'total_sum') + database_field_val(2, 'payment_sum')) можливе, але вираз повинен бути написаний таким чином, щоб функції з меншим StepNo розраховувалися раніше.
Приклади коректних виразів
12 + abs(sqrt(5) - 2)/3 {Арифметичний вираз}
25 - 5 >= 14 {Логічний вираз}
'File name: ' + dataset_field_val(1, 'FileName') {Рядковий вираз}
date + 4 {Вираз додає чотири дні до поточної дати. Коректний, оскільки дати внутрішньо є числами.}
iif(length(Target_File_Name(1)) > 25, 'yes', 'no') {Складний вираз}
Приклади некоректних виразів
12 / target_file_name(1) {Некоректне використання рядкової функції в арифметичному виразі (неспівпадіння типів)}
concat(cos(dataset_field_val(1, 'FuncParam')), ' is larger') {Некоректне використання дійсного числа в якості аргумента для функції конкатенації рядків. Тут повинно бути явне приведення типів за допомогою функції to_string.}
5 <> False {Некоректне порівняння числової та булевської констант}
power(4) {Не вистачає другого аргументу для функції power}
iif(length(Target_File_Name(1) > 25, 'yes', 'no') {Не вистачає правої дужки для функції length}
Оператори
Арифметичні
Працюють з числами та повертають числа (окрім оператора +, котрий може також використовуватися для конкатенації строчок).
+ | Додавання чисел. Також може використовуватися для конкатенації строчокових операндів (як альтернатива функції concat). |
- | Віднімання чисел |
* | Множення чисел |
/ | Ділення чисел |
^ | Піднесення лівого операнда до степеня, вказаного правим операндом (як альтернатива функції power) |
div | Цілочисельне ділення. Це ділення, в якому дрібна частина відкидається. |
mod | Остача від ділення |
Логічні
Працюють з булевськими константами та виразами, які повертають булевські значення, і повертають булевські True або False.
not | Логічне НІ. Повертає False, якщо його єдиний операнд може бути перетворений до True; інакше повертає True. |
and | Логічне І. Повертає True, якщо обидва операнди True; інакше повертає False. |
or | Логічне АБО. Повертає True, якщо хоча б один операнд True; якщо обидва операнди False, повертає False. |
xor | Виключне АБО. Повертає True, якщо один операнд True,а інший False; інакше повертає False. |
= | Рівність |
<> | Нерівність |
> | Більше ніж |
>= | Більше ніж або дорівнює |
< | Менше ніж |
<= | Менше ніж або дорівнює |
Функції
Використовуйте функції для обрахунку значень. Кожна функція повертає одне значення. Параметрами функцій можуть бути як константи, так і вирази (виключаючи рекурсивні виклики функцій), якщо інше не зазначено в описі функції.
Пов'язані з базою даних
Загальні
dataset_row_number( StepNo Integer, GroupLevel Integer ): Integer
dataset_group_number( StepNo Integer, GroupLevel Integer ): Integer
dataset_field_val( StepNo Integer, FieldName String | FieldIndex Integer ): <FieldType>
dataset_field_hex_val( StepNo Integer, FieldName String | FieldIndex Integer ): <FieldType>
dataset_field_is_null( StepNo Integer, FieldName String | FieldIndex Integer ): Boolean
dataset_nvl( StepNo Integer, FieldName String | FieldIndex Integer, SubstVal <FieldType> ): <FieldType>
dataset_field_exists( StepNo Integer, FieldName String ): Boolean
dataset_param_val( StepNo Integer, ParamName String ): <ParamType>
query_res( StepNo Integer, SqlText String ): <FieldType>
dbnull: Unknown
Статистичні (агрегатні)
Ці функції виконують розрахунки на даних поточного набору даних. На відміну від інших функцій, статистичні функції акумулюють дані з кожного запису набору даних, тому вони вимагають більше ресурсів і їх використання (особливо в умовних функціях) може уповілнювати обробку великих наборів даних.
Настійно рекомендується використовувати ці функції лише всередині або після циклів по записам набору даних, інакше вони повернуть неадекватні значення.Стандартні (подібні до агрегатних функцій SQL)
dataset_row_count( StepNo Integer, GroupLevel Integer ): Integer
dataset_min( StepNo Integer, GroupLevel Integer, FieldName String ): Numeric
dataset_max( StepNo Integer, GroupLevel Integer, FieldName String ): Numeric
dataset_sum( StepNo Integer, GroupLevel Integer, FieldName String ): Numeric
dataset_avg( StepNo Integer, GroupLevel Integer, FieldName String ): Numeric
dataset_count( StepNo Integer, GroupLevel Integer, FieldName String ): Integer
Умовні
Ці функції роблять те ж саме, що і стандартні статистичні функції, але з однієї суттєвою відмінністю: вони перевіряють умову Condition для кожного запису, і розраховують своє значення лише якщо ця умова повертає True. Параметри цих функцій повинні бути або константами, або детерміністичними виразами (тобто повертати один і той же результат кожного разу при передачі одних і тих же параметрів). Параметр Condition може використовувати не детерміністичні вирази, але повинен бути записаний як рядковий літерал або як детерміністичний рядковий вираз.
У звіті functions.dtt можна побачити багато прикладів використання умовних статистичних функцій.
dataset_row_count_ex( StepNo Integer, GroupLevel Integer, Condition String ): Integer
dataset_min_ex( StepNo Integer, GroupLevel Integer, FieldName String, Condition String ): Numeric
dataset_max_ex( StepNo Integer, GroupLevel Integer, FieldName String, Condition String ): Numeric
dataset_sum_ex( StepNo Integer, GroupLevel Integer, FieldName String, Condition String ): Numeric
dataset_avg_ex( StepNo Integer, GroupLevel Integer, FieldName String, Condition String ): Numeric
dataset_count_ex( StepNo Integer, GroupLevel Integer, FieldName String, Condition String ): Integer
Не рекомендується робити вкладені виклики статистичних функцій (тобто коли умова Condition містить виклик статистичної функції), оскільки в такому випадку програма не може гарантувати коректний результат. Якщо ж все-таки робите таке, то уникайте циклічних посилань в цих функціях, оскільки це може призвести до неочікуваних результатів виразів. Наприклад, використання поля FieldName всередині Condition є циклічним посиланням і не повинно застосовуватися.Приклади коректних вживань умовних статистичних функцій:
dataset_sum_ex(1, 0, 'PaymentSum', 'dataset_field_val(1, ''CustNo'') > 1000')
(цей вираз буде підсумовувати значення поля PaymentSum, якщо значення поля CustNo більше від 1000)
dataset_count_ex(1, 0, 'CustNo', 'dataset_field_val(1, ''Paid'')')
(цей вираз поверне кількість значень поля CustNo, де значення булевського поля Paid дорівнює True)
dataset_sum_ex(1, 0, 'BillSum', 'dataset_sum_ex(1, 0, ''OldBillSum'', ''dataset_field_val(1, ''''CustNo'''') > 0'') > 0')
(цей вираз поверне суму значень поля BillSum, де умовна сума поля OldBillSum більша від 0)
Приклади некоректних вживань умовних статистичних функцій:
dataset_count_ex(1, 0, 'CustNo', 'yes')
(помилка: небулевська константа не може використовуватися як умова)
dataset_sum_ex(1, 0, 'BillSum', 'dataset_sum_ex(1, 0, ''OldBillSum'', ''dataset_sum_ex(1, 0, ''''BillSum'''', True) > 0'') > 0')
(помилка: циклічне посилання на поле BillSum)
Математичні
abs( x Numeric ): Numeric
frac( x Numeric ): Numeric
int( x Numeric ): Numeric
round( x Numeric ): Integer
sqrt( x Numeric ): Numeric
power( x Numeric, y Numeric ): Numeric
exp( x Numeric ): Numeric
ln( x Numeric ): Numeric
cos( x Numeric ): Numeric
sin( x Numeric ): Numeric
tan( x Numeric ): Numeric
atan( x Numeric ): Numeric
Дата і час
date: DateTime
time: DateTime
date_time: DateTime
add_date_time( x DateTime, y Numeric ): DateTime
compare_date_time( Date1 DateTime, Date2 DateTime ): Integer
date_time_diff( Date1 DateTime, Date2 DateTime ): Numeric
format_date_time( x DateTime, Mask String ): String
Пов'язані з експортом (працюють в контексті експорту даних)
target_file_name( StepNo Integer ): String
Пов'язані з експортом до HTML
doc_title: String
Пов'язані з файлами
file_created( FileName String ): DateTime
file_last_modified( FileName String ): DateTime
file_last_accessed( FileName String ): DateTime
file_size( FileName String ): Numeric
file_version( FileName String ): String
extract_file_ext( FileName String ): String
extract_file_name( FileName String ): String
extract_file_dir( FileName String ): String
extract_file_path( FileName String ): String
extract_file_text( FileName String ): String
file_exists( FileName String ): Boolean
dir_exists( DirectoryName String ): Boolean
Різне
to_number( <AnyType> String ): Numeric
to_string( <AnyType> String ): String
format_float( x Numeric, Mask String ): String
lpad( Str String, Count Numeric, Char String ): String
rpad( Str String, Count Numeric, Char String ): String
iif( Condition Boolean, x <AnyType>, y <AnyType> ): <AnyType>
upper( Str String, ): String
lower( Str String, ): String
capitalize( Str String, ): String
pretty( Str String, ): String
length( Str String, ): Integer
pos( SubStr String, Str String ): Integer
substr( Str String, Index Integer, Count Integer ): String
substr_count( Str String, SubStr String ): Integer
trim( Str String, ): String
trim_left( Str String, ): String
trim_right( Str String, ): String
string_replace( Str String, SubStr String, NewSubStr String ): String
concat( Str1 String, Str2 String ): String
rgb( Red Integer, Green Integer, Blue Integer ): String
ordinal_number( x Integer, Language String, Case String, Gender String ): String
quantitative_numeral( x Integer, Language String, Case String, Gender String ): String
number_to_words( x Numeric, Language String, Options String ): String
parse( x <AnyType> ): <AnyType>
char( x Integer ): String
Пов'язані зі звітами (працюють у контексті звітів)
report_author: String
report_changed_by: String
report_database_name: String
report_dataset_name: String
report_description: String
report_file_name: String
page_left_margin: Integer
page_right_margin: Integer
page_top_margin: Integer
page_bottom_margin: Integer
page_number: Integer
page_count: Integer
page_height: Integer
page_width: Integer
internal_property( PropertyName String ): String
Застарілі функції для звітів
GROUPRECORDNUMBER Ця функція більше не підтримується. Замість цієї функції використовуйте dataset_row_number NUMTOWORDS Ця функція більше не підтримується. Замість цієї функції використовуйте number_to_words DATASETNAME Замість цієї функції використовуйте report_dataset_name DATABASENAME Замість цієї функції використовуйте report_database_name FILENAME Замість цієї функції використовуйте report_file_name PAGEHEIGHT Замість цієї функції використовуйте page_height PAGEWIDTH Замість цієї функції використовуйте page_width LEFTMARGIN Замість цієї функції використовуйте page_left_margin RIGHTMARGIN Замість цієї функції використовуйте page_right_margin TOPMARGIN Замість цієї функції використовуйте page_top_margin BOTTOMMARGIN Замість цієї функції використовуйте page_bottom_margin PAGENUMBER Замість цієї функції використовуйте page_number RECORDNUMBER Замість цієї функції використовуйте dataset_row_number PAGERECORDNUMBER Замість цієї функції використовуйте dataset_row_number GROUP1RECORDNUMBER Замість цієї функції використовуйте dataset_row_number GROUP2RECORDNUMBER Замість цієї функції використовуйте dataset_row_number GROUP3RECORDNUMBER Замість цієї функції використовуйте dataset_row_number RECORDCOUNT Замість цієї функції використовуйте record_count REPORTDESCRIPTION Замість цієї функції використовуйте report_description REPORTAUTHOR Замість цієї функції використовуйте report_author PAGECOUNT Замість цієї функції використовуйте page_count MIN Замість цієї функції використовуйте dataset_min MAX Замість цієї функції використовуйте dataset_max SUM Замість цієї функції використовуйте dataset_sum AVERAGE Замість цієї функції використовуйте dataset_avg COUNT Замість цієї функції використовуйте dataset_count MINEX Замість цієї функції використовуйте dataset_min_ex MAXEX Замість цієї функції використовуйте dataset_max_ex SUMEX Замість цієї функції використовуйте dataset_sum_ex AVERAGEEX Замість цієї функції використовуйте dataset_avg_ex COUNTEX Замість цієї функції використовуйте dataset_count_ex FILESIZE Замість цієї функції використовуйте file_size FIELDVAL Замість цієї функції використовуйте dataset_field_val PARAMVAL Замість цієї функції використовуйте dataset_param_val ISNULL Замість цієї функції використовуйте dataset_is_null FIELDEXISTS Замість цієї функції використовуйте dataset_field_exists NVL Замість цієї функції використовуйте dataset_nvl QUERYRES Замість цієї функції використовуйте query_res STR Замість цієї функції використовуйте to_string TRIMLEFT Замість цієї функції використовуйте trim_left TRIMRIGHT Замість цієї функції використовуйте trim_right ORDINALNUMBER Замість цієї функції використовуйте ordinal_number QUANTITATIVENUMERAL Замість цієї функції використовуйте quantitative_numeral FILECREATED Замість цієї функції використовуйте file_created FILELASTMODIFIED Замість цієї функції використовуйте file_last_modified FILELASTACCESSED Замість цієї функції використовуйте file_last_accessed EXTRACTFILENAME Замість цієї функції використовуйте extract_file_name EXTRACTFILEEXT Замість цієї функції використовуйте extract_file_ext EXTRACTFILEDIR Замість цієї функції використовуйте extract_file_dir EXTRACTFILEPATH Замість цієї функції використовуйте extract_file_path REPLACE Замість цієї функції використовуйте string_replace ADDDATETIME Замість цієї функції використовуйте add_date_time COMPAREDATETIME Замість цієї функції використовуйте compare_date_time DATETIMEDIFF Замість цієї функції використовуйте date_time_diff FORMATDATETIME Замість цієї функції використовуйте format_date_time SUBSTRCOUNT Замість цієї функції використовуйте substr_count