Базова інформація

Движок виразів 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') {Складний вираз}

Приклади некоректних виразів

Incorrect expression 12 / target_file_name(1) {Некоректне використання рядкової функції в арифметичному виразі (неспівпадіння типів)}

Incorrect expression concat(cos(dataset_field_val(1, 'FuncParam')), ' is larger') {Некоректне використання дійсного числа в якості аргумента для функції конкатенації рядків. Тут повинно бути явне приведення типів за допомогою функції to_string.}

Incorrect expression 5 <> False {Некоректне порівняння числової та булевської констант}

Incorrect expression power(4) {Не вистачає другого аргументу для функції power}

Incorrect expression 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