公式引用 V2

当前

可以在 Vault 中创建公式来完成各种任务。Vault 使用类似 Excel™ 的公式语言,包括函数和运算符,来计算日期、文本字符串以及数字。

Expression Engine 版本:以下内容引用了于 2019 年 4 月随 19R1 发布的更新版公式语法(Expression Engine V2)。如需为 19R1 之前创建的研究编写规则表达式,请参阅公式参考(V1)

概念

请回顾以下概念,以熟悉 Vault 中公式的工作原理。

什么是公式

公式是一组用于创建期望结果的指令。例如,化学公式(两个 H 和一个 O 构成 H2O)。这并不是方程式的概念,因为氢和氧并不“等于”水,但可以用它们制造水。在某些情况下,公式是一种特殊类型的方程式,显示不同变量之间的关系。在这种情况下,公式是通过替换变量的值来进行评估(而非求解)的。

评估公式后,Vault 返回一个值或 True/False。

公式在哪里使用

公式在 Vault CDMS 中的多个地方使用:

  • 数据验证规则
  • 衍生条目
  • 单位转换
  • 视图中的衍生列
  • 公式字段
  • 字段默认值

公式的组成元素

公式由一个或多个表达式和参数组成。每个表达式包含值、函数、运算符、引用和变量,用于计算结果。参数是运算符或函数对表达式结果的操作。

术语 定义
表达式 表达式是方程式或公式中的单个部分,由值、变量、运算符和/或函数组成。公式可能包含一个或多个表达式。
函数 函数是公式中的执行者。它们可以对公式中的表达式和值执行任务,以输出结果。
运算符 运算符是公式中的执行者。它们可以对公式中的表达式和值执行任务,以输出结果。
参数 参数是表达式用于函数时,函数对表达式结果进行操作的部分。
变量 变量是公式中的占位符值,在评估时 Vault 会将其替换为实际值。例如,如果在规则公式中引用数据收集条目的值,该数据收集条目的值就是变量。当 Vault 评估该条目的规则时,会用已收集的数据替换条目变量。
参考 引用是公式中的占位符值,指向与评估公式的对象相关的对象字段。
评估 当 Vault 评估公式时,意味着 Vault 已将所有变量替换为它们的执行值,并计算了公式中的表达式和参数结果。评估公式后,Vault 返回一个值、True 或 False。
True 当公式返回 true 时,意味着 Vault 在公式中填入变量值后,结果成功通过了公式中的操作。例如,如果检查 Field 1 是否小于 10($field1.value__v < 10),当 Field 1 的值为 6 时,公式返回 true。
False 当公式返回 false 时,意味着 Vault 在公式中填入变量值后,结果未能通过公式中的操作。例如,如果检查 Field 1 是否小于 10($field1.value__v < 10),当 Field 1 的值为 15 时,公式返回 false。

运算符与函数&

运算符和函数是公式中的执行者。它们可以对公式中的表达式和值执行任务,以输出结果。

“运算符”和“函数”有什么区别?

所有运算符都是函数,但并非所有函数都是运算符。运算符仅返回与输入相同的数据类型,而函数则可以返回不同的数据类型。例如,考虑运算符 Add() 和函数 Value()。这两者都被视为数学函数。当将两个数字相加时,公式返回一个数字。Add(2, 2) 返回 4。当使用 Value() 函数时,输入文本,公式输出数字。Value(Right(“Veeofen 20”, 2) 返回数字 20,而不是文本字符串。

此参考中包含 Vault 当前支持的所有运算符函数列表。

变量与引用&

可以在公式中使用变量和引用作为执行数据的占位符。当系统评估公式时,Vault 会将变量和引用替换为它们的实际执行值。每当在 Studio 中编写数据验证规则时,每次使用标识符调用数据收集条目时,都在使用变量。在 Vault 公式的上下文中,引用是指向相关对象值的变量,而不是指向对象值。例如,在使用 $site__vr.status__v 时,Vault 会将该引用替换为研究中心对象的状态值。

运算符

在构建公式时,使用以下运算符。除非另有说明,所有运算符在任何可以包含公式的地方都可用。

数学运算符

数学运算符在表达式中执行数学运算。

运算符 描述
Add 计算两个值的和
Subtract 计算两个值的差
Multiply 计算两个值的乘积
Divide 计算两个值的商
Remainder 计算一个值除以另一个值的余数
Parenthesis 优先计算括号内的表达式

Add

计算两个值的和

语法

+

用途

value1 + value2

数据类型

Add 运算符接受以下数据类型:

  • 数字

  • 日期时间与数字(将数字解释为天数)

  • 日期与数字(将数字解释为天数)

  • 日期时间与时间

  • 日期与间隔

  • 日期时间与间隔

示例
表达式 说明
Lesion_measurement_1 + Lesion_measurement_2 将两个输入的测量值相加
First_injection + 15 在首次注射日期上加 15 天,以确定第二次注射日期

Subtract

计算两个值的差

语法

-

用途

value1 - value2

数据类型

Subtract 运算符接受以下数据类型:

  • 数字

  • 日期

  • 日期时间

  • 日期时间与数字(将数字解释为天数)

  • 日期与数字(将数字解释为天数)

  • 日期与日期时间(将日期时间转换为日期)

  • 日期与间隔

  • 日期时间与间隔

  • 时间与时间(返回分钟差)

示例
表达式 说明
Second_injection_date - First_injection_date 计算两次注射日期之间的天数

Multiply

计算两个值的乘积

语法

*

用途

value1 * value2

数据类型

Multiply 运算符接受以下数据类型:

  • 数字
示例
表达式 说明
$value__v * 2.205 将重量从千克转换为磅

Divide

计算两个值的商

语法

/

用途

value1 / value2

数据类型

Divide 运算符接受以下数据类型:

  • 数字
示例
表达式 说明
(Weight / (Height * Height)) * 703 计算受试者的 BMI(使用英制单位)

Remainder

计算一个值除以另一个值的余数

语法

%

用途

value1 % value2

数据类型

Remainder 运算符接受以下数据类型:

  • 数字
示例
表达式 说明
@EventGroup.sequence__v % 2 如果当前事件组的序列号是偶数,返回 0;如果是奇数,返回 1

Parenthesis

优先计算括号内的表达式

语法

()

用途

(expression1)expression2

数据类型

Parenthesis 运算符接受以下数据类型:

示例
表达式 说明
(Lesion_measurement_1 + Lesion_measurement_2)/2 返回 2 次测量的平均值

逻辑运算符

逻辑运算符在表达式中执行逻辑运算。

运算符 描述
等于 计算两个值是否相等
不等于 计算两个值是否不相等
小于 计算一个值是否小于另一个值
小于等于 计算一个值是否小于等于另一个值
大于 计算一个值是否大于另一个值
大于等于 计算一个值是否大于等于另一个值
And 计算两个值或表达式是否均为 true
Or 计算两个值或表达式中的至少一个是否为 true

等于

计算两个值是否相等

语法

=

用途

value1 = value2

数据类型

等于运算符接受以下数据类型:

  • 数字

  • 文本

  • 日期

  • 日期时间

  • 日期时间与日期(将日期时间转换为日期)

  • 是/否

  • 选项列表(两个选项列表必须都是单值选项)

  • 选项列表与文本

示例
表达式 说明
Assessment_taken = "No" 如果针对“Assessment Taken”选择的值为“No”,则返回 true
备注
  • 当日期与日期时间进行比较时,Vault 会将日期时间转换为日期,并使用 Vault 的时区。

  • 选项列表公式和运算符会评估值名称,而不是值标签。例如,一个选项列表 Level (level__v) 有三个值,分别命名为 study_level__vcountry_level__vsite_level__v,标签分别为 StudyCountrySite。要评估选项列表的值,需使用名称定义公式,例如 level__v = "country_level__v",而不是使用标签。


不等于

计算两个值是否不相等

语法

!=

用途

value1 != value2

数据类型

不等于运算符接受以下数据类型:

  • 数字

  • 文本

  • 日期

  • 日期时间

  • 日期时间与日期(将日期时间转换为日期)

  • 是/否

  • 选项列表(两个选项列表必须都是单值选项)

  • 选项列表与文本

示例
表达式 说明
Assessment_date != Visit_date 如果评估日期与访问日期不相同,则返回 true
Severity != "Severe" 如果选择的 Severity 值与“Severe”不同,则返回 true
备注
  • 当日期与日期时间进行比较时,Vault 会将日期时间转换为日期,并使用 Vault 的时区。

  • 选项列表公式和运算符会评估值名称,而不是值标签。例如,一个选项列表 Level (level__v) 有三个值,分别命名为 study_level__v、country_level__v 和 site_level__v,标签分别为 Study、Country 和 Site。要评估选项列表的值,需使用名称定义公式,例如 level__v = “country_level__v”,而不是使用标签。


小于

计算一个值是否小于另一个值

语法

<

用途

value1 < value2

数据类型

小于运算符接受以下数据类型:

  • 数字

  • 日期

  • 日期时间

  • 日期与日期时间(将日期时间转换为日期)

示例
表达式 说明
Informed_consent_date < Birth_date 如果受试者的出生日期晚于知情同意日期,则返回 true
Tumor_size_1 < Tumor_size_2 如果第一个肿瘤的大小小于第二个肿瘤的大小,则返回 true
备注
  • 当日期与日期时间进行比较时,Vault 会将日期时间转换为日期。


小于等于

计算一个值是否小于等于另一个值

语法

<=

用途

value1 <= value2

数据类型

小于等于运算符接受以下数据类型:

  • 数字

  • 日期

  • 日期时间

  • 日期与日期时间(将日期时间转换为日期)

示例
表达式 说明
Informed_consent_date <= Birth_date 如果受试者的出生日期晚于或等于知情同意日期,则返回 true
Tumor_size_1 <= Tumor_size_2 如果第一个肿瘤的大小小于或等于第二个肿瘤的大小,则返回 true
备注
  • 当日期与日期时间进行比较时,Vault 会将日期时间转换为日期。


大于

计算一个值是否大于另一个值

语法

>

用途

value1 > value2

数据类型

大于运算符接受以下数据类型:

  • 数字

  • 日期

  • 日期时间

  • 日期与日期时间(将日期时间转换为日期)

示例
表达式 说明
Tumor_size_1 > Tumor_size_2 如果第一个肿瘤的大小大于第二个肿瘤的大小,则返回 true
Informed_consent_date > Birth_date 如果受试者的出生日期早于知情同意日期,则返回 true
备注
  • 当日期与日期时间进行比较时,Vault 会将日期时间转换为日期。


大于等于

计算一个值是否大于等于另一个值

语法

>=

用途

value1 >= value2

数据类型

大于等于运算符接受以下数据类型:

  • 数字

  • 日期

  • 日期时间

  • 日期与日期时间(将日期时间转换为日期)

示例
表达式 说明
Tumor_size_1 > Tumor_size_2 如果第一个肿瘤的大小大于或等于第二个肿瘤的大小,则返回 true
Informed_consent_date > Birth_date 如果受试者的出生日期早于或等于知情同意日期,则返回 true
备注
  • 当日期与日期时间进行比较时,Vault 会将日期时间转换为日期。


And

计算两个值或表达式是否均为 true

语法

&&

也可以使用 And() 来代替 &&

用途

(expression) && (expression)

数据类型

And 运算符接受以下数据类型:

示例
表达式 说明
Adverse_Event = "Other" && IsBlank(Other_Specify) 如果选择的不良事件是“Other”且“Other specify”为空,则返回 true

Or

计算两个值或表达式中的至少一个是否为 true

语法

||

也可以使用 Or() 来代替 ||

用途

(expression) || (expression)

数据类型

Or 运算符接受以下数据类型:

示例
表达式 说明
100 > Weight || Weight > 200 如果受试者体重小于 100 或大于 200,返回 true

文本运算符

文本运算符在表达式中执行文本操作。

运算符 描述
连接 连接两个或多个文本字符串

连接

连接两个或多个文本字符串

语法

&

也可以使用 Concat() 来代替 &

用途

text & text

数据类型

连接运算符接受以下数据类型:

示例
表达式 说明
"Study: " & @Study.name__v 返回文本字符串 "Study: ",与当前研究的名称结合

函数

在构建公式时,使用以下函数。除非另有说明,所有函数在任何可以包含公式的地方都可用。

数学函数

数学函数在表达式中执行数学运算。

函数 描述
Abs

计算数字的绝对值

Average

计算提供数字的平均值

Ceiling

返回大于该值的下一个整数

Floor

返回小于该值的下一个整数

Max

返回集合中的最大值

Median

计算其参数的中位数。此函数接受数字数据类型的参数。

Min

返回集合中的最小值

Power

计算一个数的幂(指数)

Round

将值四舍五入到定义的小数位数

Sqrt

返回数字的平方根

Sum

计算提供数字的总和

Value

将文本字符串作为数字返回

Abs

计算数字的绝对值

语法

Abs()

用途

Abs(number)

示例
表达式 说明
Abs(Lesion_measurement_1 - Lesion_measurement_2)

返回第一个病灶与第二个病灶的测量差值作为正值,无论哪个测量值更大


Average

计算提供数字的平均值

语法

Average()

用途

Average(number, number, number...)

示例
表达式 说明
Average(lesion_measurement_1, lesion_measurement_2, legion_measurement_3)

返回三次病灶测量的平均值作为数字


Ceiling

返回大于该值的下一个整数

语法

Ceiling()

用途

Ceiling(number)

示例
表达式 说明
Ceiling(14.2)

返回 15(14.2 四舍五入到最接近的整数)

Ceiling(-14.2)

返回 -14(-14.2 四舍五入到最接近的整数)


Floor

返回小于该值的下一个整数

语法

Floor()

用途

Floor(number)

示例
表达式 说明
Floor(14.2)

返回 14(14.2 向下四舍五入到最接近的整数)

Ceiling(-14.2)

返回 -15(-14.2 向下四舍五入到最接近的整数)


Max

返回集合中的最大值

语法

Max()

用途

Max(number, number...)

示例
表达式 说明
Max(Lesion_measurement_1, Lesion_measurement_2) > 5

如果两个病灶测量值之间的最大值大于 5,则返回 true

备注
  • 可以将此函数与数字、日期和日期时间数据类型一起使用。不能在单个 Max() 请求中混合数据类型。如果需要混合日期和日期时间,请使用 DateValue 将日期时间转换为日期。

Median

计算其参数的中位数。此函数接受数字数据类型的参数。

语法

Median()

用途

Median(number, number...)

示例
表达式 说明
Median(@EventGroup[*].e_visit.measurements.ig_measurements.lesion_size)

返回治疗访视重复事件组中所有病灶大小条目的中位数值。


Min

返回集合中的最小值

语法

Min()

用途

Min(number, number...)

示例
表达式 说明
Min(Lesion_measurement_1, Lesion_measurement_2) < 5

如果两个病灶测量值之间的最小值大于 5,则返回 true

备注
  • 可以将此函数与数字、日期和日期时间数据类型一起使用。不能在单个 Min() 请求中混合数据类型。如果需要混合日期和日期时间,请使用 DateValue 将日期时间转换为日期。

Power

计算一个数的幂(指数)

语法

Power()

用途

Power(number, number)

示例
表达式 说明
(8.22 * Power(pulse_period, 0.3558)) > 440

当受试者的 QT 间期(通过 pulse_period 项计算得出)大于 440 时,返回 true

QT / (Power(RR, 1/3))

Power 函数在 CDMS 中的一个常见用途是使用 Fridericia (QTcF) 公式计算 QTcF 间期值,QTcF = QT / (RR^1/3)


Round

将值四舍五入到定义的小数位数

语法

Round()

用途

Round(number, number of decimal places)

示例
表达式 说明
Round(5.5, 0)

返回 6(5.5 四舍五入到 0 位小数)

Round(5.54, 1)

返回 5.5(5.54 四舍五入到 1 位小数)

Round(-5.5, 0)

返回 -6(-5.5 四舍五入到 0 位小数)

备注
  • Vault 根据小数点右侧的数字对数字进行四舍五入。如果该数字大于 5,Vault 向上四舍五入或远离零。如果该数字小于 5,Vault 向下四舍五入或朝向零。

Sqrt

返回数字的平方根

语法

Sqrt()

用途

Sqrt(number)

示例
表达式 说明
Sqrt(25)

返回数字 5

备注
  • 数字必须为正。

Sum

计算提供数字的总和

语法

Sum()

用途

Sum(number, number, number...)

示例
表达式 说明
Sum(morning_dose_amount, evening_dose_amount)

返回早晨和晚间剂量的总和


Value

将文本字符串作为数字返回

语法

Value()

用途

Value(text)

示例
表达式 说明
Value(Right("S1234", 4))

返回数字 1234

备注
  • 如果在 Value 函数中输入的文本无法解析为数字,则会收到错误提示。

逻辑函数

逻辑函数在表达式中执行逻辑运算。

函数 描述
And

当所有表达式都为真时,返回 true

Case

将表达式的值与每个情况值进行比较,并返回对应的结果。如果没有值匹配,则返回最后一个参数。

If

确定表达式是 true 还是 false。如果为 true,则返回给定的值;如果为 false,则返回另一个值。

Includes

当选项列表包含与定义字符串或单值选项列表匹配的名称时,返回 true

IsBlank

如果值为空,返回 true

IsNumber

当值为数字时,返回 true

Not

当表达式为假时,返回 true;当表达式为真时,返回 false

Or

如果任意条件为真,则返回 true

And

当所有表达式都为真时,返回 true

语法

And()

也可以使用 && 来代替 And()

用途

And(expression, expression)

示例
表达式 说明
And(Adverse_Event = "Other", IsBlank(Other_Specify))

如果选择的不良事件是“Other”且“Other specify”字段为空,则返回 true


Case

将表达式的值与每个情况值进行比较,并返回对应的结果。如果没有值匹配,则返回最后一个参数。

语法

Case()

用途

Case(expression1, value1, result1, value2, result2, else_result)

数据类型

Case 函数接受以下数据类型:

  • 数字

  • 文本

  • 是/否

  • 选项列表

示例
表达式 说明
Case(Severity, "MILD", "No need to check", "MODERATE", "Random checks needed", "SEVERE", "Check mandatory", "No answer")

根据输入的严重程度,返回是否需要进行强制检查

备注
  • 在处理选项列表字段时,例如 picklist__c,字段返回值的名称(study__v),而不是值的标签(Study)。

If

确定表达式是 true 还是 false。如果为 true,则返回给定的值;如果为 false,则返回另一个值。

语法

If()

用途

If(expression1, value1, value2)

示例
表达式 说明
If(Diabetes = "Type 2", Measurement_1 * 2, Measurement_2 *2)

如果糖尿病类型选择为“Type 2”,则返回测量值 1 乘以 2,否则返回测量值 2 乘以 2


Includes

当选项列表包含与定义字符串或单值选项列表匹配的名称时,返回 true

语法

Includes()

用途

Includes(string/picklist value)

示例
表达式 说明
Includes(cl_colors, 'RED')

如果“Colors”字段中选择的值之一是 Red,则返回 true

备注
  • Vault Platform 支持多值选项列表。对于 CDMS,使用 FindValue() 函数查找从选项列表中选定的值。

IsBlank

如果值为空,返回 true

语法

IsBlank()

用途

IsBlank(expression)

示例
表达式 说明
IsBlank(Assessment_taken) && IsBlank(Assessment_date)

如果“Assessment Taken”和“Assessment Date”都没有输入值,则返回 true


IsNumber

当值为数字时,返回 true

语法

IsNumber()

用途

IsNumber(text)

示例
表达式 说明
If(IsNumber(Measurement_1), Measurement_1/100, 0)

如果测量值 1 是数字,则返回测量值 1 除以 100


Not

当表达式为假时,返回 true;当表达式为真时,返回 false

语法

Not()

用途

Not(expression)

示例
表达式 说明
Not(IsBlank(Assessment_date))

如果评估日期不为空,返回 true


Or

如果任意条件为真,则返回 true

语法

Or()

用途

Or(expression, expression)

示例
表达式 说明
Or(100 > Weight, Weight > 200)

如果受试者体重小于 100 或大于 200,返回 true


文本函数

逻辑函数在表达式中执行逻辑运算。

函数 描述
Concat

连接两个或多个文本字符串

Find

返回字符串在文本字符串中的位置

Left

返回从文本字符串开头算起的指定数量字符

长度

返回指定文本字符串的字符数

Lower

将指定字符串中的所有字母转换为小写

Middle

返回两个指定位置之间的指定数量文本字符

Right

返回从文本字符串末尾算起的指定数量文本字符

Substitute

将字符串中的旧文本替换为新文本

Text

根据指定格式将值转换为文本

Trim

删除文本字符串开头和结尾的空格和制表符

Upper

将指定字符串中的所有字母转换为大写

Concat

连接两个或多个文本字符串

语法

Concat()

也可以使用 & 来代替 Concat()

用途

Concat(text, text...)

示例
表达式 说明
Concat("Study: ", @Study.name__v)

返回文本字符串 "Study: ",与当前研究的名称结合


Find

返回字符串在文本字符串中的位置

语法

Find()

用途

Find(find_text, within_text)

示例
表达式 说明
Find(" ", "4280 Hacienda Dr, Pleasanton, CA")

返回 5,这是地址中的第一个空格的位置


Left

返回从文本字符串开头算起的指定数量字符

语法

Left()

用途

Left(text, number)

示例
表达式 说明
Left(name__v, 5) & "-" & abbvreviation__v

返回产品名称的前 5 个字符,并与其缩写组合


长度

返回指定文本字符串的字符数

语法

Length()

用途

Length(text)


Lower

将指定字符串中的所有字母转换为小写

语法

Lower()

用途

Lower(text)

示例
表达式 说明
Lower("Company A")

返回文本字符串“company a”


Middle

返回两个指定位置之间的指定数量文本字符

语法

Middle()

用途

Middle(text, start_position, count)

示例
表达式 说明
Middle("4280 Hacienda Dr, Pleasanton, CA", 6, 13)

返回文本字符串“Hacienda”,其为所提供文本的第 6 个到第 13 个字符


返回从文本字符串末尾算起的指定数量文本字符

语法

Right()

用途

Right(text, number)

示例
表达式 说明
Value(Right("S1234", 4))

返回数字 1234


Substitute

将字符串中的旧文本替换为新文本

语法

Substitute()

用途

Substitute(text, old_text, new_text)

示例
表达式 说明
Substitute(ConMed_date, "UN", "15")

将未知日期中的“UN”部分替换为“15”


Text

根据指定格式将值转换为文本

语法

Text()

用途

Text(value, "format")

示例
表达式 说明
"The minimum Screening Date is " & Text(MinDate(Screening_Date), "yyyy-mm-dd")

返回文本“The minimum Screening Date is ”,后跟以 yyyy-mm-dd 格式显示的筛查日期

备注
  • d 1(某月中的第几日,1 位数)

  • dd 01(某月中的第几日,2 位数)

  • ddd Thu(星期几,3 个字母缩写)

  • dddd Thursday(星期几,全拼)

  • mm 03(月份,2 位数)

  • mmm Mar(月份,3 个字母缩写)

  • mmmm March(月份,全拼)

  • yy 17(年份,2 位数)

  • yyyy 2017(年份,4 位数)

  • dd-mm-yyyy 31-03-2017

  • yyyymmdd 20170331

  • dd.mmm.yyyy 30.Mar.2017

  • yyyy-mm-dd 2017-03-30

  • mmmm yyyy March 2017

  • dddd dd/mm/yy Thursday 31/03/17


Trim

删除文本字符串开头和结尾的空格和制表符

语法

Trim()

用途

Trim(text)

示例
表达式 说明
Trim(" Phase III ")

返回文本字符串“Phase III”,并删除了字符串前后的空格


Upper

将指定字符串中的所有字母转换为大写

语法

Upper()

用途

Upper(text)

示例
表达式 说明
Upper("Company A")

返回文本字符串“COMPANY A”


聚合函数

聚合函数在表达式中对聚合标识符的值进行操作。其中一些聚合函数也可用于任何标识符类型,但在此列出是为了提供聚合标识符可用的完整函数列表。

函数 描述
AllEqual

检查所有聚合标识符的值是否相等。如果值相等,则返回 true,否则返回 false。

Average

返回聚合标识符的所有值的平均值。

Count

返回聚合标识符实例的数量(例如,指定重复表单的实例数量)。

CountIf

返回指定值在所有指定标识符中的出现次数。

FindValue

检查表达式中的标识符值中是否至少存在一个给定值。

First

返回聚合标识符的第一个值(按最低序列号排序)。

GetAllMatches

返回第三个参数中的数组,这些数组的值与第二个参数中与第一个参数匹配的实例中的值相匹配。传递的两个标识符必须具有相同的值数量,因此必须使用相同的聚合路径。

HasDuplicates

如果任何 2 个或更多数组的所有标识符值相等,则返回 true。如果重复项是 null 或为空值,则不返回 true。默认情况下忽略空值或 null 值。

IsBlank

如果数组为空,则返回 true。如果数组中至少有一个值,即使该值为 null,也返回 false。

IsAnyBlank

检查标识符中的任何值是否为空。如果有任何空值,返回 true。

Last

返回聚合标识符的最后一个值(按最高序列号排序)。

Max

返回聚合标识符中值的最大值(最高、最大)。

Median

计算其参数的中位数。此函数接受数字数据类型的参数。

Min

返回聚合标识符中值的最小值(最低、最小)。

NoBlanks

返回删除所有 null 值后的值数组,保留传递值的原始顺序。

Sum

返回聚合标识符值的总和。

AllEqual

检查所有聚合标识符的值是否相等。如果值相等,则返回 true,否则返回 false。

语法

AllEqual()

用途

AllEqual(Identifier, Identifier, ...)

示例
表达式 说明
AllEqual(@EventGroup[*].e_visit.measurements.ig_measurements.lesion_size)

如果治疗访视重复事件组中的所有实例的病灶大小相等,则返回 true。


Average

返回聚合标识符的所有值的平均值。

语法

Average()

用途

Average(Identifier), Average(Identifier, Identifier)

示例
表达式 说明
Average($Visit1.Visit1.Measurements[*].Lesion.LesionSize)

返回重复测量表单中所有病灶大小条目的平均值。


Count

返回聚合标识符实例的数量(例如,指定重复表单的实例数量)。

语法

Count()

用途

Count(Identifier, Identifier, ...)

示例
表达式 说明
Count($eg_common.e_common.adverse_event[*].AE.AETERM)

返回病例手册中重复不良事件表单的 AETERM 条目的实例数量。

备注
  • 此函数包括空(或 null)值。如果某条目为空或标记为特意留空,它也会包含在计数中。使用 NoBlanks 函数移除所有 null 值。

CountIf

返回指定值在所有指定标识符中的出现次数。

语法

CountIf()

用途

CountIf(Value, Identifier, Identifier)

示例
表达式 说明
CountIf("Y", $eg_common.e_common.adverse_event[*].ig_ae.AESER)

返回病例手册中所有不良事件表单中 Is the Adverse Event serious 条目设置为“”(“Y”)的次数。


FindValue

检查表达式中的标识符值中是否至少存在一个给定值。

语法

FindValue()

用途

FindValue(value, identifier)

示例
表达式 说明
FindValue("SERIOUS", $Logs.Logs.Adverse_event[*].AE_Details.AESER)

如果在不良事件表单的任何实例中的 AE Seriousness 条目内找到值“SERIOUS”,则返回 true


First

返回聚合标识符的第一个值(按最低序列号排序)。

语法

First()

用途

First(Identifier)

示例
表达式 说明
First($Visit1.Visit1.Measurements.Lesion[*].LesionSize) > Last($Visit1.Visit1.Measurements.Lesion[*].LesionSize)

比较第 1 次访视中重复条目组病灶中的第一个病灶大小输入与最后一个病灶大小


GetAllMatches

返回第三个参数中的数组,这些数组的值与第二个参数中与第一个参数匹配的实例中的值相匹配。传递的两个标识符必须具有相同的值数量,因此必须使用相同的聚合路径。

语法

GetAllMatches()

用途

GetAllMatches(Value, Identifier, Identifier)

示例
表达式 说明
GetAllMatches(10, @Form.measurement[*].lesion_size, @Form.measurement[*].date

返回测量条目组中病灶大小为 10 的所有实例的日期条目值。

备注
  • 聚合路径:
    • 如果第一个标识符是 $EG[*].EV.F.IG.IT,则第二个标识符应以 $EG[*] 开头。
    • 如果第一个标识符是 $EG.EV.F[*].IG.IT,则第二个标识符应以 $EG.EV.F[*] 开头。
    • 如果第一个标识符是 $EG.EV.F.IG[*].IT,则第二个标识符应以 $EG.EV.F.IG[*] 开头。
    • 如果第一个标识符是 $EG[*].EV.F[*].IG[*].IT,则第二个标识符应以 $EG[*].EV.F[*].IG[*] 开头。
    • 如果第一个标识符是 $EG[*].EV.F[*].IG.IT,则第二个标识符应以 $EG[*].EV.F[*] 开头。
    • 如果第一个标识符是 $EG[*].EV.F.IG[*].IT,则第二个标识符应以 $EG[*].EV.F.IG[*] 开头。
    • 如果第一个标识符是 $EG.EV.F[*].IG[*].IT,则第二个标识符应以 $EG.EV.F[*].IG[*] 开头。

HasDuplicates

如果任何 2 个或更多数组的所有标识符值相等,则返回 true。如果重复项是 null 或为空值,则不返回 true。默认情况下忽略空值或 null 值。

语法

HasDuplicates()

用途

HasDuplicates(Identifier1, Identifier2, Identifier3)

示例
表达式 说明
HasDuplicates($EG.EV.AE[*].AEIG.AEITEM)

如果不良事件条目的值在所有不良事件表单中相等,则返回 true。

HasDuplicates($EG.EV.AE[*].AEIG.AEITEM, $EG.EV.AE[*].AEIG.AESTARTDATE)

如果不良事件条目不良事件开始日期的值在所有不良事件表单中相等,则返回 true。

HasDuplicates($EG.EV.AE[*].AEIG.AEITEM, $EG.EV.AE[*].AEIG.AESTARTDATE, $EG.EV.AE[*].AEIG.AEENDDATE, $EG.EV.AE[*].AEIG.SERIOUS)

如果不良事件条目不良事件开始日期不良事件结束日期的值相等且该事件在不良事件表单中为 Serious,则返回 true。


IsBlank

如果数组为空,则返回 true。如果数组中至少有一个值,即使该值为 null,也返回 false。

语法

IsAnyBlank()

用途

IsBlank(expression)

示例
表达式 说明
IsBlank(@Form.ig_physexam[*].specify_abnormalities)

如果 Specify Abnormalities 条目在所有体检重复条目组的实例中为空,则返回 true。


IsAnyBlank

检查标识符中的任何值是否为空。如果有任何空值,返回 true。

语法

IsAnyBlank()

用途

IsAnyBlank(Identifier, Identifier, ...)

示例
表达式 说明
IsAnyBlank(@Form.ig_phsexam[*].specify_abnormalities)

如果 Specify Abnormalities 条目的任何实例在所有体检重复条目组的实例中为空,则返回 true。


Last

返回聚合标识符的最后一个值(按最高序列号排序)。

语法

Last()

用途

Last(Identifier)

示例
表达式 说明
Last($Visit1.Visit1.Measurements.Lesion[*].DATE) > First($Visit1.Visit1.Measurements.Lesion[*].DATE)

比较第 1 次访视中重复条目组病灶的最后一个病灶大小输入与第 1 次访视的第一个病灶大小


Max

返回聚合标识符中值的最大值(最高、最大)。

语法

Max()

用途

Max(Identifier), Max(Identifier, Identifier)

示例
表达式 说明
Max($Visit1.Visit1.Measurements[*].Lesion.LesionSize) $Screening.Screening.InitialMeasurement.Lesion.InitialLesionSize)

返回初次测量表单和所有测量表单实例中病灶大小条目的最大值。


Median

计算其参数的中位数。此函数接受数字数据类型的参数。

语法

Median()

用途

Median(number, number...)

示例
表达式 说明
Median(@EventGroup[*].e_visit.measurements.ig_measurements.lesion_size)

返回治疗访视重复事件组中所有病灶大小条目的中位数值。


Min

返回聚合标识符中值的最小值(最低、最小)。

语法

Min()

用途

Min(Identifier), Min(Identifier, Identifier)

示例
表达式 说明
Min($Visit1.Visit1.Measurements[*].Lesion.LesionSize, $Screening.Screening.InitialMeasurement.Lesion.InitialLesionSize)

返回初次测量表单和所有测量表单实例中病灶大小条目的最小值。


NoBlanks

返回删除所有 null 值后的值数组,保留传递值的原始顺序。

语法

NoBlanks()

用途

NoBlanks(Identifier, Identifier, ....)

示例
表达式 说明
NoBlanks(@Form.ig_physexam[*].specify_abnormalities)

返回所有体检重复条目组的实例中 Specify Abnormalities 条目的非空值。


Sum

返回聚合标识符值的总和。

语法

Sum()

用途

Sum(Identifier)

示例
表达式 说明
Sum($Screening.Screening.Measurements[*].Lesion.LesionSize)

返回重复测量表单所有实例中所有病灶大小条目的总和。


日期和日期时间函数&

日期和日期时间函数在表达式中执行日期和日期时间的计算。

函数 描述
日期

从年、月、日值返回日期值

DateValue

返回日期时间的日期部分

Day

返回某月中的第几日

Days

以时间间隔的形式返回指定的天数

Hour

返回当前小时,范围为 0 到 23

Hours

以时间间隔的形式返回指定的小时数

Minute

返回当前分钟,范围为 0 到 59

Minutes

以时间间隔的形式返回指定的分钟数

Month

返回日期中的月份

Months

以时间间隔的形式返回指定的月数

NetWorkdays

返回两(2)个日期/日期时间之间的工作日天数。该函数支持混合使用日期和日期时间。使用日期时间时,请注意时区。此函数还接受用于周末和节假日时间表的可选参数。管理员可以通过业务管理 > 节假日时间表(Business Admin > Holiday Schedules)配置节假日。

Now

返回当前日期和时间

Second

返回当前秒数,范围为 0 到 59

StartOfDay

返回在指定时区当天开始的 UTC 日期时间

Time

根据指定的小时、分钟和秒数返回时间

Today

返回用户的当前日期。可以使用可选参数“timezone”返回特定时区的当前日期。

Weekday

根据日期或日期时间返回星期几,结果为 1 到 7 的数字

Workday

返回一个日期,该日期是排除周末和可选节假日后的未来几天。此函数还接受用于周末和节假日时间表的可选参数。管理员可以通过业务管理 > 节假日时间表(Business Admin > Holiday Schedules)配置节假日。

Year

返回指定日期或日期时间的年份。如果未提供日期或日期时间,则返回当前年份。

Years

以时间间隔的形式返回指定的年数

MaxDate

将日期的未知部分替换为可能的最大值

MinDate

将日期的未知部分替换为可能的最小值

MaxDateTime

将日期时间的未知部分替换为可能的最大值

MinDateTime

将日期时间的未知部分替换为可能的最小值

InWindow

如果日期在指定的时间窗内(基于参考日期),则返回 true

SiteDateTime

根据研究中心时区,自动从日期条目和时间条目创建日期时间

SiteDateValue

返回日期时间条目中的日期,并自动转换为研究中心时区

日期

从年、月、日值返回日期值

语法

Date()

用途

Date(year, month, day)

示例
表达式 说明
Date(2018, 3, 14)

返回日期 2018-03-14

Date(year(today), month(today())+1, day(today()))

返回距离当前日期一个月的日期

Date(year(today()), month(today()), day(today())) + Time(12,0,0)

返回今天中午的日期和时间


DateValue

返回日期时间的日期部分

语法

DateValue()

用途

DateValue(datetime)

示例
表达式 说明
DateValue(Vitals_exam_date)

返回生命体征检查的日期部分,不包括时间,同时适应 Vault 的时区转换

If(Right(VSDTC , 4) = "UNKZ", DateValue(MinDateTime(VSDTC), UTC), DateValue(MinDateTime(VSDTC), @Site.timezone__v))

此示例显示了使用 SiteDateValue() 的表达式,用于不允许未知的日期时间条目


Day

返回某月中的第几日

语法

Day()

用途

Day(date)

示例
表达式 说明
Day(Injection_date)

返回注射日期月份中的第几日


Days

以时间间隔的形式返回指定的天数

语法

Days()

用途

Days(number)

示例
表达式 说明
Injection_date + Days(10)

返回注射日期后 10 天的日期


Hour

返回当前小时,范围为 0 到 23

语法

Hour()

用途

Hour()

示例
表达式 说明
Hour()

返回用户的当前小时


Hours

以时间间隔的形式返回指定的小时数

语法

Hours()

用途

Hours(number)

示例
表达式 说明
InWindow(Vitals_time, Injection_time, Hours(2), Hours(5), false, false)

如果生命体征收集时间在注射时间后的 2 到 5 小时之间,则返回 true

备注
  • 在当前版本中,此函数仅可用于定义 InWindow() 函数中的时间间隔。

  • 此函数不返回日期时间或时间条目中的小时数。

  • 不要使用此函数与小数点配合使用。相反,使用 Minutes() 函数与等效的分钟数,例如 Minutes(30) 代替 Hours(0.5)


Minute

返回当前分钟,范围为 0 到 59

语法

Minute()

用途

Minute()

示例
表达式 说明
Minute()

返回用户的当前分钟


Minutes

以时间间隔的形式返回指定的分钟数

语法

Minutes()

用途

Minutes(number)

示例
表达式 说明
InWindow(Vitals_time, Injection_time, Minutes(30), Minutes(45), false, false)

如果生命体征收集时间在注射时间后的 30 到 45 分钟之间,则返回 true

备注
  • 在当前版本中,此函数仅可用于定义 InWindow() 函数中的时间间隔。

Month

返回日期中的月份

语法

Month()

用途

Month(date), Month(datetime)

示例
表达式 说明
Month(Injection_date)

返回注射日期所在的月份,结果为数字


Months

以时间间隔的形式返回指定的月数

语法

Months()

用途

Months(number)

示例
表达式 说明
Injection_date + Months(2)

返回审计开始日期后 6 个月的日期


NetWorkdays

返回两(2)个日期/日期时间之间的工作日天数。该函数支持混合使用日期和日期时间。使用日期时间时,请注意时区。此函数还接受用于周末和节假日时间表的可选参数。管理员可以通过业务管理 > 节假日时间表(Business Admin > Holiday Schedules)配置节假日。

语法

NetWorkdays()

用途

NetWorkdays(start_date/datetime, number_of_days, weekend_number, holiday_schedule)

示例
表达式 说明
NetWorkdays($screening.screening_visit.event_date__v, $baseline.baseline_visit.event_date__v,1, "United States")

返回基于美国节假日的筛查访视日期($screening.screening_visit.event_date__v)和基线访视日期($baseline.baseline_visit.event_date__v)之间的工作日天数


Now

返回当前日期和时间

语法

Now()

用途

Now(), Now(Timezone)

示例
表达式 说明
Round((Now() - Birth_Date)/365, 0)

返回当前日期的受试者年龄

备注
  • Now() 不带时区参数时返回当前的 UTC 日期时间。

  • 使用时区参数可以指定返回当前日期时间的时区。请参阅输入格式列表。

  • 要返回研究中心时区的当前日期,可以使用 DateValue(Now(), @Site.timezone__v)


Second

返回当前秒数,范围为 0 到 59

语法

Second()

用途

Second()

示例
表达式 说明
Second()

返回用户的当前秒数


StartOfDay

返回在指定时区当天开始的 UTC 日期时间

语法

StartOfDay()

用途

StartOfDay(day, "Timezone")

示例
表达式 说明
StartOfDay(event_date, "Europe/Oslo")

返回事件日期在欧洲/奥斯陆时区的当天开始时的 UTC 日期时间


Time

根据指定的小时、分钟和秒数返回时间

语法

Time()

用途

Time(hour, minute, second)

示例
表达式 说明
Time(hour(now()), minute(now()), second(now()) - Time(12,30,0)

返回两个时间之间的分钟差

Date(year(today()), month(today()), day(today())) + Time(12,0,0)

返回代表今天中午的日期时间


Today

返回用户的当前日期。可以使用可选参数“timezone”返回特定时区的当前日期。

语法

Today()

用途

Today(), Today("timezone")

示例
表达式 说明
Today() = Sample_collection_date

如果样本采集日期等于用户时区的当前日期,返回 true


Weekday

根据日期或日期时间返回星期几,结果为 1 到 7 的数字

语法

Weekday()

用途

Weekday(date), Weekday(datetime)

示例
表达式 说明
If((Weekday(@Event.event_date__v) = 1) || (Weekday(@Event.event_date__v) = 7)), “Weekend Event Date”, “Not a weekend event date”)

Workday

返回一个日期,该日期是排除周末和可选节假日后的未来几天。此函数还接受用于周末和节假日时间表的可选参数。管理员可以通过业务管理 > 节假日时间表(Business Admin > Holiday Schedules)配置节假日。

语法

Workday()

用途

Workday(start_date/datetime, number_of_days, weekend_number, holiday_schedule)

示例
表达式 说明
Workday($Screening, Screening_visit.event_date__v,1,"United States")

返回筛查访视日期后未来 10 个工作日(无周末和美国节假日)的日期。


Year

返回指定日期或日期时间的年份。如果未提供日期或日期时间,则返回当前年份。

语法

Year()

用途

Year(date)

示例
表达式 说明
Year($Screening.Screening_Visit.Demographics.Creation_Criteria.DOB)

从出生日期条目中返回年份。


Years

以时间间隔的形式返回指定的年数

语法

Years()

用途

Years(number)

示例
表达式 说明
Today() + Years(1)

返回明年同一天的日期


MaxDate

将日期的未知部分替换为可能的最大值

语法

MaxDate()

用途

MaxDate(unknown date), MaxDate(unknown date, timezone)

示例
表达式 说明
MaxDate(2018-07-UN)

返回 2018-07-31

MaxDate(2018-UN-UN)

返回 2018-12-31

备注
  • 使用 MaxDate() 包装带有未知部分的日期用于表达式。

  • 对不带未知部分的日期使用 MaxDate(),只返回原始日期。

  • 使用时区参数可以指定返回当前日期的时区。请参阅输入格式列表。


MinDate

将日期的未知部分替换为可能的最小值

语法

MinDate()

用途

MinDate(unknown date), , MinDate(unknown date, timezone)

示例
表达式 说明
MinDate(2018-07-UN)

返回 2018-07-01

MinDate(2018-UN-UN)

返回 2018-01-01

备注
  • 使用 MinDate() 包装带有未知部分的日期用于表达式。

  • 对不带未知部分的日期使用 MinDate(),只返回原始日期。

  • 使用时区参数可以指定返回当前日期的时区。请参阅输入格式列表。


MaxDateTime

将日期时间的未知部分替换为可能的最大值

语法

MaxDateTime()

用途

MaxDateTime(unknown date), MaxDateTime(unknown date, timezone)

示例
表达式 说明
MaxDateTime(2018-07-UNT14:00)

返回 2018-07-31T14:00

MaxDateTime(2018-12-UNTUN:UN)

返回 2018-12-31T23:59

备注
  • 对不带未知部分的日期时间使用 MaxDateTime(),只返回原始日期时间。

  • 对于未知时间,Vault 返回小时数 23,分钟数 59,即 23:59。

  • MaxDateTime() 不应单独用作设置某个条目值的函数,因为转换为 UTC 时间以获取标准化值会影响此函数。相反,应该使用此函数来执行需要已知日期时间进行评估的计算和比较。

  • 使用时区参数可以指定返回当前日期时间的时区。请参阅输入格式列表。


MinDateTime

将日期时间的未知部分替换为可能的最小值

语法

MinDateTime()

用途

MinDateTime(unknown date), MinDateTime(unknown date, timezone)

示例
表达式 说明
MinDateTime(2018-07-UNT14:00)

返回 2018-07-01T14:00

MinDateTime(2018-12-UNTUN:UN)

返回 2018-12-01T00:00

备注
  • 对不带未知部分的日期时间使用 MinDateTime(),只返回原始日期时间。

  • 对于未知时间,Vault 返回小时数 00,分钟数 00,即 00:00。

  • MinDateTime() 不应单独用作设置某个条目值的函数,因为转换为 UTC 时间以获取标准化值会影响此函数。相反,应该使用此函数来执行需要已知日期时间进行评估的计算和比较。

  • 使用时区参数可以指定返回当前日期时间的时区。请参阅输入格式列表。


InWindow

如果日期在指定的时间窗内(基于参考日期),则返回 true

语法

InWindow()

用途

InWindow(date, date, interval, interval, boolean, boolean)

数据类型

InWindow 函数接受以下数据类型:

  • 日期

  • 日期时间

  • 时间

示例
表达式 说明
InWindow(TestTime, ProcedureTime, Hours(1), Hours(3), false, false)

如果测试时间在程序时间后的 1 到 3 小时之间,则返回 true

InWindow(ControlDate, TestDate, Days(3), Days(7), true, false)

如果控制日期在测试日期后的 4 到 7 天之间,则返回 true

备注
  • 只能比较相同数据类型的对象(日期与日期比较,日期时间与日期时间比较,时间与时间比较)。

  • 时间间隔可以使用以下函数定义:Minutes()、Hours()、Days()、Months()、Years()。

  • 两个布尔参数用于指示是否包含整体时间窗的下限(第一个参数)和上限(第二个参数)。true 表示排除边界时间,false 表示包含边界时间。


SiteDateTime

根据研究中心时区,自动从日期条目和时间条目创建日期时间

语法

SiteDateTime()

用途

SiteDateTime(date, time)

数据类型

SiteDateTime 函数接受以下数据类型:

  • 日期

  • 时间

示例
表达式 说明
SiteDateTime(VSDate, VSTime)

返回生命体征的日期和时间。


SiteDateValue

返回日期时间条目中的日期,并自动转换为研究中心时区

语法

SiteDateValue()

用途

SiteDateValue(datetime)

数据类型

SiteDateValue 函数接受以下数据类型:

  • 日期时间
示例
表达式 说明
SiteDateValue(2021, 6, 15, Injection_time)

返回 2021 年 6 月 15 日在研究中心时区的注射时间

备注
  • 当日期部分未知时,MinDateTime 和 MaxDateTime 不支持此函数。

弃用函数

以下函数在新表达式语法中不再可用。

连接

连接两个或多个文本字符串。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

Concatenate(text, text)

替代函数

Concat()&


DateAdd

返回一个日期,该日期基于从起始日期(date)的偏移(interval)。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

DateAdd(date, interval)

替代函数

date + number and date + interval


DateDiff

返回两个日期之间的天数差。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

DateDiff(end, start)

替代函数

date - date


DateTimeAdd

返回一个日期时间值,该日期时间基于从起始日期时间(datetime)的偏移(interval)。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

DateTimeAdd(datetime, interval)

替代函数

dateTime + number and dateTime + interval


DateTimeDiff

返回两个日期时间值之间的天数、小时数和分钟数差。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

DateTimeDiff(end, start)

替代函数

dateTime - dateTime


IfBlank

如果第一个参数为空,则返回第二个参数。如果不为空,则返回第一个参数。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

IfBlank(expression, expression)

替代函数

If(IsBlank())


IfNull

如果第一个参数为 null,则返回第二个参数。如果不为 null,则返回第一个参数。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

IfNull(expression, expression)

替代函数

If(IsBlank())


IsNull

当值为 null 时,返回 true。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

IsNull(expression, expression)

替代函数

If(IsBlank())


NumberEquals

如果两个数字参数相等,则返回 true。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

NumberEquals(number, number)

替代函数

=


PicklistEquals

将选项列表值的基础标签与现有全局选项列表值的基础标签进行比较,并返回 true 或 false。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

PicklistEquals(<picklist_field>, picklist_value__v)

替代函数

=


TextEquals

如果两个文本字符串相等,则返回 true。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

TextEquals(text, text)

替代函数

=


TimeDiff

返回两个时间之间的分钟差。此函数将结束时间(end)与起始时间(start)相减。此函数仅适用于使用 Expression Engine V1 的研究。请参阅使用 V2 时的替代函数。

语法

TimeDiff(end, start)

替代函数

Time - Time


日期格式

可用的日期格式列于下表:

格式 示例 说明
HH:ii 11:30 小时和分钟
d 1 某月中的第几日,1 位数
dd 1 某月中的第几日,2 位数
ddd Thu 星期几,3 个字母缩写
dddd Thursday 星期几,全拼
mm 3 月份,2 位数
mmm Mar 月份,3 个字母缩写
mmmm March 月份,全拼
yy 17 年份,2 位数
yyyy 2017 年份,4 位数
dd-mm-yyyy 31-03-2017 第几日(2 位数),月份(2 位数),年份(4 位数)
yyyymmdd 20170331 年份(4 位数),月份(2 位数),第几日(2 位数),无空格
dd.mm.yyyy 30.03.2017 第几日(2 位数),月份(2 位数),年份(4 位数),以句点(.)分隔
yyyy-mm-dd 2017-03-30 年份(4 位数),月份(2 位数),第几日(2 位数)
mmmm yy March 2017 月份(全拼),年份(4 位数)
dddd dd/mm/yy Thursday 31/03/2017 星期几(全拼),第几日(2 位数),月份(2 位数),年份(4 位数),以斜杠(/)分隔

数字格式

可用的数字格式列于下表:

格式 示例输入 示例输出 说明
0 10.1 10 数字,不带小数
# 10.10 10 数字,不带小数,省略零
0.00 10.2531 10.25 数字,保留两位小数
#.## 10.2501 10.25 数字,保留两位小数,省略零
$# 100 $100 数字,以货币形式显示
#,### 1104 1,104 数字,从左边起每 3 位用逗号分隔(可多次使用逗号)
- 10 -10 给表达式添加负号
% 9 %90 数字乘以 10 并显示为百分比
E 12345 1.234E4 将尾数(即有效数字的数量)与指数分离,并使用科学记数法表示

系统变量

系统变量是系统定义用于存储值的动态对象,供一个或多个 Vault 应用程序引用。它们是动态的,因为它们的值会根据使用上下文变化。例如,@User 是一个系统变量,指向当前登录用户的配置文件,并允许访问多个属性,如用户的状态或电子邮件。

Vault Platform 系统变量

在当前版本中,Vault EDC 支持一个 Vault Platform 系统变量 @User。在编写规则时,可以引用此变量。

变量 描述
@User 引用当前登录的用户

@User

引用当前登录的用户

示例属性
  • @User.name__v:返回当前用户的姓名

  • @User.status__v:返回当前用户的状态

  • @User.email__v:返回当前用户的电子邮件

  • @User.securityProfile__v:返回当前用户的安全配置文件

  • @User.language__v:返回当前用户的语言

  • @User.timezone__v:返回当前用户的时区

示例用法
表达式 说明
Case(@User.department__c, "Human Resources", "hr@sponsor.com", "Clinical Programming", "clinical_programming@company.com", "other@company.com") 根据当前用户的部门返回电子邮件地址

Vault EDC 系统变量

EDC 有多个特定的系统变量,可在编写规则时使用。这些变量允许快速访问研究或病例手册层次结构中的对象。

以下对象和字段可在 Vault EDC 中用于系统变量:

研究

以下字段在研究study__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
locked__v 已锁定 返回研究的已锁定状态 @Study.locked__v
name__v 名称 返回研究的名称 @Study.name__v
oid__v 外部 ID 返回研究的外部 ID @Study.oid__v

Study Country(研究国家/地区)

以下字段在研究国家/地区study_country__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
name__v 名称 返回与研究中心关联的研究国家/地区 @StudyCountry.name__v
country_abbreviation__v 国家/地区缩写 返回研究国家/地区的国家/地区缩写 @StudyCountry.country_abbreviation__v

研究中心

以下字段在研究中心site__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
locked__v 已锁定 返回研究中心的已锁定状态 @Site.locked__v
name__v 名称 返回该研究中心的研究中心编号 @Site.name__v
oid__v 外部 ID 返回研究中心的外部 ID @Site.oid__v
principal_investigator__v 主要研究者 返回研究中心的主要研究者 @Site.principal_investigator__v
status__v 状态 返回研究中心的状态 @Site.status__v
timezone__v 时区 返回研究中心的时区 @Site.timezone__v
备注
  • 对于研究中心,name__v 返回该研究中心记录的研究中心编号字段值。研究中心编号是 name__v 字段的标签。

病例手册

以下字段在病例手册casebook__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
version__v 版本 返回病例手册的版本 @Casebook.version__v
subject_status__v 受试者状态 返回病例手册中的受试者状态(基于病例手册定义) @Casebook.subject_status__v
current_sdv_plan__v 当前 SDV 计划 返回当前分配给受试者(病例手册)的 SDV 审查计划 @Casebook.current_sdv_plan__v
current_dmr_plan__v 当前 DMR 计划 返回当前分配给受试者(病例手册)的 DMR 审查计划 @Casebook.current_dmr_plan__v
subject_name__v 受试者 ID 返回该病例手册中受试者的受试者 ID @Casebook.subject_name__v
var 变量 可以用作标识符来表示为研究定义的病例手册变量 @Var.enrolled_date

事件组

以下字段在事件组event_group__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
name__v 名称 返回事件组的名称 @EventGroup.name__v
sequence__v 顺序 返回事件组的序列号(适用于重复事件组) @EventGroup.sequence__v

事件

以下字段在事件event__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
change_reason__v 更改原因 返回事件的更改原因 @Event.change_reason__v
did_not_occur__v 没有发生 如果事件未发生,返回 true @Event.did_not_occur__v
event_date__v 事件日期 返回事件的事件日期 请参阅备注
name__v 名称 返回事件的名称 @Event.name__v
sequence__v 顺序 返回事件的序列号(适用于重复事件组中的事件) @Event.sequence__v
备注
  • 在引用事件日期时,请始终定义事件。不要使用 @Event.event_date__v。对于完全限定的标识符,请使用 $EG.EVENT.event_date__v。

表单

以下字段在表单form__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
change_reason__v 更改原因 返回表单的更改原因 @Form.change_reason__v
form_status__v 表单状态 返回表单的状态。选项包括:submitted__v、planned__v、blank__v、in_progress__v、in_progress_post_submit__v @Form.form_status__v
intentionally_left_blank__v 特意留空 如果表单被标记为特意留空,返回 true @Form.intentionally_left_blank__v
name__v 名称 返回表单的名称 @Form.name__v
sequence__v 顺序 返回表单的序列号(适用于重复表单) @Form.sequence__v
submit_counter__v 提交计数器 返回表单已提交的次数 @Form.submit_counter__v
备注
  • 使用 $EG.EVENT.FORM.intentionally_left_blank 作为完全限定标识符的示例格式。

  • 在 24R2 版本中,in_progress_post_submit__v 表单状态的标签从“提交后进行中”(In Progress Post Submit)更改为“编辑中”(In Edit)。变量未更改,仍然是 in_progress_post_submit__v。

条目

以下字段在条目item__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述 规则表达式示例
change_reason__v 更改原因 返回条目的更改原因 @Item.change_reason__v
has_value_changed__v 值是否更改 如果自上次规则运行以来,值已更改,则返回 true。仅在使用 @Form 标识符用于发送电子邮件规则时可用 @Item.has_value_changed__v
intentionally_left_blank__v 特意留空 如果条目被标记为特意留空,返回 true @Item.intentionally_left_blank__v
lab_modifier__v 实验室修改器 返回该条目的实验室修改器 @Item.lab_modifier__v
previous_submit_value__v 先前提交值 返回上次表单提交时的条目值 @Item.previous_submit_value__v
translated_unit__v 已转换的单位 返回分配给单位类型条目中的单位的标准单位名称 @Item.translated_unit__v
unit__v 单位 返回分配给类型条目的单位名称 @Item.unit__v
value__v 返回该条目的值 @Item.value__v
value_normalized__v 归一化的值 返回该条目的归一化的值 Item.value_normalized__v
value_translated__v 已转换的值 将该值转换为标准单位 Item.value_translated__v
备注
  • 不要对日期数据类型的条目使用 value__v。默认情况下,日期类型条目在任何计算中使用 value_normalized__v,强制使用 value__v 会导致执行错误。

  • 使用 $EG.EVENT.FORM.IG.ITEM.change_reason__v 作为完全限定标识符的示例格式。

  • 数学函数可以用于单位条目类型。

  • Vault 自动将单位条目的标识符值转换为标准单位。例如,@Form.IG.UNITITEM.value_translated__v。可以使用 {{@Form.IG.UNITITEM.value__v}} 返回无单位的数值。

请注意,部分定义的路径也支持规则表达式。例如,@EventGroup.EVENT.field__v、@EventGroup.EVENT.FORM.field__v、@EventGroup.EVENT.FORM.IG.ITEM.field__v、@Event.FORM.field__v、@Event.FORM.IG.ITEM.field__v

系统引用

在 Vault 公式的上下文中,引用是指向相关对象值的变量,而不是指向对象值。例如,在使用 $study__vr.phase__v 时,Vault 会将该引用替换为与当前研究中心关联的研究对象的阶段值。

Vault Platform 系统引用

以下系统引用可作为 Vault Platform 的一部分使用,因此可以在应用程序中提供公式的任何地方使用这些引用:

允许公式访问与当前上下文对象相关的对象的属性。

用途

relationship__vr.name__vr

示例

principal_investigator__vr.research_and_focus_areas__v = "Macular Degeneration"

如果当前研究中心(对象)的主要研究者黄斑变性方面有研究重点,则返回 True。

Vault EDC 系统引用

以下系统引用作为 Vault EDC 的一部分提供,因此只能在 EDC(数据验证规则、单位转换等)接受公式的应用程序区域中使用。

EDC 研究层次结构中的对象遵循以下顺序:

研究 → 研究中心 → 病例手册 → 事件组 → 事件 → 表单 → 条目组 → 条目

EDC 表达式可以引用研究层次结构中的多个不同对象及其属性。要引用这些对象,它们在研究层次结构中的访问路径必须使用特定语法编写。

每个引用必须以 $ 符号或 @ 符号开头,并且对象和属性之间必须用句点(.)分隔。

以下对象和字段可在 Vault EDC 中用于系统引用与变量:&

研究

以下字段在研究study__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
locked__v 已锁定 返回研究的已锁定状态
name__v 名称 返回研究的名称
oid__v 外部 ID 返回研究的外部 ID

Study Country(研究国家/地区)

以下字段在研究国家/地区study_country__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
name__v 名称 返回与研究中心关联的研究国家/地区
country_abbreviation__v 国家/地区缩写 返回研究国家/地区的国家/地区缩写

研究中心

以下字段在研究中心site__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
locked__v 已锁定 返回研究中心的已锁定状态
name__v 名称 返回该研究中心的研究中心编号
oid__v 外部 ID 返回研究中心的外部 ID
principal_investigator__v 主要研究者 返回研究中心的主要研究者
status__v 状态 返回研究中心的状态
timezone__v 时区 返回研究中心的时区
备注
  • 对于研究中心,name__v 返回该研究中心记录的研究中心编号字段值。研究中心编号是 name__v 字段的标签。

病例手册

以下字段在病例手册casebook__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
version__v 版本 返回病例手册的版本
subject_status__v 受试者状态 返回病例手册中的受试者状态(基于病例手册定义)
current_sdv_plan__v 当前 SDV 计划 返回当前分配给受试者(病例手册)的 SDV 审查计划
current_dmr_plan__v 当前 DMR 计划 返回当前分配给受试者(病例手册)的 DMR 审查计划
subject_name__v 受试者 ID 返回该病例手册中受试者的受试者 ID
var 变量 可以用作标识符来表示为研究定义的病例手册变量

事件组

以下字段在事件组event_group__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
name__v 名称 返回事件组的名称
sequence__v 顺序 返回事件组的序列号(适用于重复事件组)

事件

以下字段在事件event__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
change_reason__v 更改原因 返回事件的更改原因
did_not_occur__v 没有发生 如果事件未发生,返回 true
event_date__v 事件日期 返回事件的事件日期
name__v 名称 返回事件的名称
sequence__v 顺序 返回事件的序列号(适用于重复事件组中的事件)
备注
  • 在引用事件日期时,请始终定义事件。不要使用 @Event.event_date__v。对于完全限定的标识符,请使用 $EG.EVENT.event_date__v。

表单

以下字段在表单form__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
change_reason__v 更改原因 返回表单的更改原因
form_status__v 表单状态 返回表单的状态。选项包括:submitted__v、planned__v、blank__v、in_progress__v、in_progress_post_submit__v
intentionally_left_blank__v 特意留空 如果表单被标记为特意留空,返回 true
name__v 名称 返回表单的名称
sequence__v 顺序 返回表单的序列号(适用于重复表单)
submit_counter__v 提交计数器 返回表单已提交的次数
备注
  • 使用 $EG.EVENT.FORM.intentionally_left_blank 作为完全限定标识符的示例格式。

  • 在 24R2 版本中,in_progress_post_submit__v 表单状态的标签从“提交后进行中”(In Progress Post Submit)更改为“编辑中”(In Edit)。变量未更改,仍然是 in_progress_post_submit__v。

条目

以下字段在条目item__v)对象中可用于系统引用和变量:

字段名称 字段标签 描述
change_reason__v 更改原因 返回条目的更改原因
has_value_changed__v 值是否更改 如果自上次规则运行以来,值已更改,则返回 true。仅在使用 @Form 标识符用于发送电子邮件规则时可用
intentionally_left_blank__v 特意留空 如果条目被标记为特意留空,返回 true
lab_modifier__v 实验室修改器 返回该条目的实验室修改器
previous_submit_value__v 先前提交值 返回上次表单提交时的条目值
translated_unit__v 已转换的单位 返回分配给单位类型条目中的单位的标准单位名称
unit__v 单位 返回分配给类型条目的单位名称
value__v 返回该条目的值
value_normalized__v 归一化的值 返回该条目的归一化的值
value_translated__v 已转换的值 将该值转换为标准单位
备注
  • 不要对日期数据类型的条目使用 value__v。默认情况下,日期类型条目在任何计算中使用 value_normalized__v,强制使用 value__v 会导致执行错误。

  • 使用 $EG.EVENT.FORM.IG.ITEM.change_reason__v 作为完全限定标识符的示例格式。

  • 数学函数可以用于单位条目类型。

  • Vault 自动将单位条目的标识符值转换为标准单位。例如,@Form.IG.UNITITEM.value_translated__v。可以使用 {{@Form.IG.UNITITEM.value__v}} 返回无单位的数值。

示例

备注:以下示例使用了对象和记录的示例名称。要使用这些引用,必须用您自己研究中的值替换名称。

例如,要访问研究结束时生命体征收集的日期,可使用以下表达式(具体取决于研究在 EDC Studio 中的构建方式和对象的名称):

$End_of_Study.End_of_Study_Visit.Vital_Signs.General_Information.Date.value__v

该引用访问的是研究结束时生命体征收集的日期(日期条目在生命体征表单的常规信息条目组中,位于研究结束访视事件中,属于研究结束事件)。

这种引用对象的方式同样适用于系统变量。

例如,如果表达式是在生命体征表单上评估的(此时该表单被视为当前表单),可以使用:
@Form.General_Information.Date.value__v

还可以访问其他级别的属性,例如事件表单

$Cohort_A.Visit_1.event_date__v

该引用访问的是队列 A 事件组中的第一次访视(访视 1 事件)的事件日期

定义简短路径

指定访问表达式中所有对象的完整路径可能很长且繁琐,因此您可能希望使用 #define 语句定义简短路径,以引用表达式中经常使用的表单条目组(或任何其他对象)。

可以在 #define 语句中同时使用系统引用和系统变量。

定义简短路径的语法是:

#define vitals_info “$End_of_Study.Vital_Signs.General_Information”

然后可以使用对象 vitals_info 访问相关对象和属性。

上一节中的示例:

$End_of_Study.End_of_Study_Visit.Vital_Signs.General_Information.Date.value__v

可以简化为:

vitals_info.Date.value__v

构建公式

可以使用的公式编辑器功能,该功能能否使用取决于在 Vault 中使用公式的具体位置。关于特定功能区域的公式详细信息,请参阅:

有效字段与数据类型&

定义公式时,请确保公式中的运算符、函数、字段和值与字段的数据类型匹配。例如,不能在公式中使用日期字段来更新文本字段,除非使用文本函数进行转换。

Vault 会在公式中自动转换以下数据类型:

  • 对象引用 → 文本
  • 选项列表 → 文本(在对象上的公式字段或字段默认值中除外)
  • 日期时间 → 日期(在对象上的公式字段或字段默认值中除外)

Vault 提供一些可用于转换数据类型的函数:

  • 日期 → 文本: Text(date, format)
  • 数字 → 时间间隔:Days(number)Months(number)Years(number)Hours(number)Minutes(number)
  • 文本 → 数字:Value(text)

标识符

构建用于规则或视图的公式时,可以使用标识符来引用研究数据,例如引用表单上的某个条目

可以按层次结构定义标识符,直到唯一为止,并用句点(.)分隔标识符:

$Event_group.Event.Form.Item_group.Item

然后再可以使用条目对象上的字段来引用收集的值:

$Event_group.Event.Form.Item_group.Item.value__v

在 Studio 规则编辑器中,Vault 可以在您输入时尝试自动完成标识符、变量、运算符和函数。按下 Ctrl + 空格键可查看下拉列表中的自动完成选项。如果在开始键入标识符之前按下 Ctrl + 空格键,Vault 会在下拉列表中列出所有有效标识符。

如果在多个地方使用设计定义,例如,如果在多个表单中使用某个条目,可以使用 @ 指定要涵盖该定义的所有实例。

例如,要在多个表单中评估某个条目,可以使用 @Form.Item_group.Item。可以在事件组事件表单级别使用此功能。

禁用设置条目值规则中,只能使用 @Form 标识符(不能使用 @EventGroup@Event@ItemGroup)。

#Define 语句

可以使用 #define 语句为标识符定义变量,这样就不必每次在公式中引用标识符时还重新编写它们。

例如,要为舒张压(Diastolic Blood Pressure)条目定义简化名称:

#define diastolic @Form.Vitals.Diastolic_blood_pressure.value__v

现在,每次在公式中使用 diastolic 时,Vault 会自动将其读取为 #define 语句中的标识符。

  • 将 #define 语句放在公式的顶部,每行一个。
  • 必须在每个公式中都包含 #define 语句。这些变量是在规则的上下文中定义的,因此无法跨多个规则使用单个 #define 语句。

注释

可以使用注释在公式中做备注。例如,可能希望添加简短的表达式说明,以便日后提醒自己如何使用。

要在公式中添加注释,请在公式顶部(第一行)输入注释文本,并将其用 /**/ 括起来。

/* This is a comment.*/

公式指南

编写公式时,请遵循以下指南:

  • 小数点使用句点,而不考虑 Vault 区域设置。
  • 公式的最大表达式长度为 1,500 个字符。
  • 当公式包含多个表达式时,请使用括号 () 将表达式括起来。
  • Vault CDMS 将数字视为浮点数,并在公式评估结束时对其进行解析。

函数

在公式表达式中添加函数时,请遵循以下指南:

  • 函数名称区分大小写。
  • 函数可以有一个或多个参数。不同函数允许不同数量的参数。
  • Vault 从左到右处理公式。对于嵌套函数,Vault 先从左到右处理子函数,然后再处理父函数。

运算符

在公式表达式中添加运算符时,请遵循以下指南:

  • 标准的运算顺序适用:乘法和除法优先于加法和减法,除非使用括号进行分组覆盖。
  • 可以使用数学运算来添加数字和数字类型的字段。
  • 不能在数学运算中使用日期类型字段。使用上述的各种日期函数。

布尔字段

编写引用“是/否”类型对象字段或布尔类型条目(复选框)的公式时,使用 true 表示“”,使用 false 表示“”(未勾选的复选框)。

空值处理

这决定了 Vault 在公式中处理空字段值的方式:

  • 作为零:Vault 将空值替换为零,以继续完成公式计算。
  • 作为空:Vault 将空值视为 null,导致整个表达式返回 null/空值。

示例

此示例展示不同的空值处理选项对此公式结果的影响:

公式:

NUM1 + NUM2 
空值处理结果 “作为零”结果 “作为空”结果
两者均为空 0 + 0 = 0 null + null = null
NUM1 NUM1 + 0 = NUM1 NUM1 + null = null
NUM2 0 + NUM2 = NUM2 null + NUM2 = null

错误处理

任何语法错误都必须在创建或更新规则之前解决。操作从条件字段中点击移出时,如果公式语法不正确,Vault 会显示“表达式无效”(Expression is invalid)。以下是常见的语法错误:

  • 返回的数据类型不匹配。例如,如果返回类型为日期,但表达式返回一个数字,那么将收到错误。
  • 公式缺少结束括号,或者括号不匹配。
  • 函数中参数的数量不正确。例如,在 if(expression, value 1, value 2) 函数中使用了三个参数。
  • 函数具有不正确的参数值。

迁移(V1 到 V2)

Enhanced Vault Formulas 在使用公式的应用平台区域中自动可用,可供立即使用。

对于 EDC 特定的公式使用(规则和视图),必须在每个研究中启用 Enhanced Vault Formulas。

在 19R1 版本(2019 年 4 月发布)之前创建的研究无法升级到增强型公式语言。此类研究必须继续使用 V1 公式语言(请参阅此处的参考)来处理其规则和派生列映射。

如何为研究启用 Enhanced Vault Formulas

要在研究中启用 Enhanced Vault Formulas,需要:

  1. 验证研究中没有使用 V1 公式语言的任何公式。
  2. 导航到管理 > 业务管理(Admin > Business Admin)中的研究配置(Study Configuration)对象。
  3. 找到研究并点击打开它。
  4. 单击编辑
  5. Expression Engine 版本字段中,输入 2
  6. 点击保存

您的研究现在正在使用增强型公式语言。

将现有设计移动到启用 Enhanced Vault Formulas 的新研究中

还可以选择创建一个新研究(新研究默认启用 Enhanced Vault Formulas),并将现有设计导入该新研究中。Vault 会导入系统管理的规则(必填、范围和未来日期验证检查)以及单位转换(自动将 value__v 替换为 $value__v),但不导入自定义规则或派生列公式。

此方法会从设计中删除所有公式,包括自定义规则和派生列公式。

  1. 导出研究设计。详情请见此处
  2. 创建新研究
  3. 将研究设计导入新研究中。详情请见此处
  4. Vault 会删除任何自定义规则和派生列公式,然后导入研究

现在可以使用 Enhanced Vault Formulas 为规则派生和单位转换创建新的公式表达式。

其他资源

另有一些包含具体用例信息的帮助主题,详细说明了如何使用公式: