Функции для работы со списками
@Elements( список )
Область применения: без ограничений.
Возвращает в формате числа количество текстовых, числовых или дата/время элементов (значений) в списке. Для пустой строки и значений типа не список функция возвратит число 0.
Пример 1. Возвращает 4, если поле SalesForce содержит список "Иванов": "Петров": "Сидоров": "Новиков".
@Elements( SalesForce )
Пример 2. Возвращает 2.
@Elements( "Новиков" : "Кузнецов" )
Пример 3. Возвращает 5.
3 + @Elements( "Суворов" : "Нахимов" )
J @Count( список )
Область применения: без ограничений.
Возвращает число элементов в списке, аналогично @Elements, однако, в отличие от последней, для пустой строки и для значений типа не список вернет значение 1, а не 0.
Пример 1. Возвращает 2.
@Count( "Новиков" : "Кузнецов" )
Пример 2. Возвращает 0 для @Elements, и 1 для @Count.
@Elements( "" );
@Count( "" );
@IsMember( строка; список_строк
)
@IsMember( список_строк_1; список_строк_2 )
Область применения: без ограничений.
Возвращает 1 (TRUE), если строка является элементом списка_строк; возвращает 0 (FALSE) в противном случае. Если оба параметра являются списками - возвращает 1, если все элементы списка_строк_1
содержатся в списке_строк_2. Функция учитывает регистр.
Пример 1. Возвращает 1.
@IsMember( "компьютер"; "принтер" : "компьютер" : "монитор" )
Пример 2. Возвращает 0.
@IsMember( "компьютер" : "Notes"; "Notes" : "принтер" : "монитор" )
Пример 3. Возвращает 1, если "Отдел разработок" содержится в списке в поле Department, или 0, если нет.
@IsMember( "Отдел разработок"; Department )
@IsNotMember( строка; список_строк
)
@IsNotMember( список_строк_1; список_строк_2 )
Область применения: без ограничений.
Возвращает 1 (TRUE), если строка не является элементом списка_строк; возвращает 0 (FALSE) в противном случае. Если оба параметра являются списками - возвращает 1, если ни один из элементов списка_строк_1
не содержится в списке_строк_2. Функция учитывает регистр. Обратите внимание, что @IsNotMember тождественно не равна отрицанию функции @IsMember в случае, если два аргумента есть списки.
Пример 1. Возвращает 0.
@IsNotMember( "компьютер"; "принтер" : "компьютер" : "монитор" )
Пример 2. Присваивает полю Dept значение "Маркетинг", если текущий пользователь не указан в списке в поле SalesDepartment; в противном случае присваивает полю Dept - "Сбыт".
FIELD Dept :=
@If( @IsNotMember( @UserName; SalesDepartment ); "Маркетинг"; "Сбыт" );
@Member( строка; список_строк
)
Область применения: без ограничений.
Возвращает 0, если строка не содержится в списке_строк; возвращает величину от 1 до N, если строка содержится в списке_строк, причем величина от 1 до N определяется местоположением указанной строки
в списке_строк.
Пример 1. Возвращает 0.
@Member( "Сбыт"; "Финансы" : "Сервис" : "Канцелярия" )
Пример 2. Если значение из поля ReportName содержится в списке из поля RequiredReading 12-м элементом, будет возвращено 12. Если значение из поля ReportName вообще не содержится в списке, возвращается 0.
@Member( ReportName; RequiredReading )
Пример 3. Если имя, возвращаемое функцией @Author, содержится 4-м элементом в поле-списке EditorialBoard, возвращает 4. Если имя не содержится в списке - возвращает 0.
@Member( @Author; EditorialBoard )
@Replace( список_строк; найти; заменить_на )
Область применения: без ограничений.
Ищет в списке_строк значения, указанные в списке найти. Заменяет каждое найденное значение соответствующим значением из списка заменить_на. Возвращает исходный список со всеми произведенными изменениями (если никаких значений из списка найти
в списке_строк не найдено, возвращает список_строк
без изменений).
Если список заменить_на короче списка найти, то элементы из списка найти, не имеющие соответствующих элементов в списке заменить_на, будут заменены в исходном списке на пустые строки. Это свойство может быть использовано для удаления элементов из списка. В этом случае список заменить_на задается пустым; сначала все элементы из списка найти заменяются на пустые, а затем функция @Trim() удаляет пустые элементы из полученного списка.
Пример 1. Domino просматривает исходный список и, как только значение в исходном списке содержится в списке "найти", он заменяет это значение соответствующим значением из списка "заменить_на". В этом примере только "Оранжевый" в исходном списке будет заменен на "Черный". Результат будет выглядеть следующим образом: "Красный" : "Черный" : "Желтый" : "Зеленый".
@Replace( "Красный" : "Оранжевый" : "Желтый" : "Зеленый";
"Оранжевый" : "Синий";
"Черный" : "Коричневый" )
Пример 2. Удаляет из списка в поле Categories все элементы, входящие во второй список. Если исходно в поле Categories был список "Брянск" : "Барнаул" : "Ростов" : "Смоленск", @Replace вернет "Брянск" : "" : "" : "Смоленск", а @Trim - "Брянск" : "Смоленск". Это результат присваивается полю Categories.
FIELD Categories := @Trim( @Replace( Categories;
"Ростов" : "Барнаул"; "" ));
@Subset( список; число )
Область применения: без ограничений.
Если число положительное, возвращает указанное число значений, считая от начала списка. Для положительного числа
большего, чем длина списка – возвращается исходный список. При нулевом значении числа генерируется ошибка «The second argument to @Subset must not be zero» (Второй аргумент @Subset не должен быть равен нулю). Если число
отрицательное, возвращает указанное число значений, считая от конца списка. Для отрицательного числа, модуль которого большего, чем длина списка
– возвращается исходный список. В любом случае результат возвращает в порядке, определенном в списке.
Пример 1. Возвращает "Краков" : "Новосибирск".
@Subset( "Краков" : "Новосибирск" : "Франкфурт" : "Токио"; 2 )
Пример 2. Возвращает "Новосибирск" : "Франкфурт" : "Токио".
@Subset( "Краков" : "Новосибирск" : "Франкфурт" : "Токио"; -3 )
Пример 3. Возвращает "Краков" : "Новосибирск" : "Франкфурт", если в поле BranchOffices находится список "Краков" : "Новосибирск" : "Франкфурт" : "Токио" : "Сингапур" : "Сидней".
@Subset( BranchOffices; 3 )
@Unique @Unique( список_строк )
Область применения: без ограничений.
При вызове функции без параметра возвращает случайным образом сгенерированную уникальную строку. При вызове с параметром список_строк, удаляет из него повторяющиеся значения. Учитывает регистр. В документации сказано, что функция не поддерживается в Web-приложениях. Однако как в первом, так и во втором варианте синтаксиса @Unique работает в Web (возможно не во всех контекстах).
Пример 1. Может возвратить строку типа "SERR-42VQRW".
@Unique
Пример 2. Возвращает "красный" : "зеленый" : "синий".
@Unique( "красный" : "зеленый" : "синий" : "зеленый" :
"красный" )
Пример 3. Возвращает "красный" : "зеленый" : "синий" : "Зеленый".
@Unique( "красный" : "зеленый" : "синий" : "Зеленый" :
"красный" )
@Keywords( список_строк_1; список_строк_2
)
@Keywords( список_строк_1; список_строк_2;
строка_разделитель
)
Область применения: без ограничений. При использовании с третьим параметром может возвращать некорректный результат.
Возвращает список, состоящий из всех тех элементов списка_строк_2, которые содержатся "в качестве слов" в списке_строк_1. Если ни один из элементов второго списка не содержится "в качестве слов" в первом, то возвращается пустая строка. Функция учитывает регистр.
Строка_разделитель содержит один или более символов, используемых для разделения слов в списке_строк_1. Например, " .," означает, что слова разделяются пробелом, запятой или точкой. В варианте с двумя параметрами для разделения слов используются символы из строки «?. ,!;:[](){}"<>» (символы: знак вопроса, точка, пробел, запятая, восклицательный знак, точка с запятой, двоеточие, открывающие и закрывающие квадратные, круглые и фигурные скобки, двойные кавычки и символы больше, меньше).
В случае, если искомое слово из списка_строк_2
стоит самым первым словом в любом элементе списка_строк_1, и задана строка_разделитель, то возвращается пустая строка. Для коррекции поведения функции в данном случае необходимо предварить ключевое слово в списке_строк_1 одним из символов из строки_разделителя
(см. примеры 4 и 5). Аналогичное поведение будет и если не указать третий параметр или использовать в качестве его пустую строку.
Пример 1. Возвращается "Harvard" : "Yale" : "UCLA".
@Keywords(
"EPA Head speaks at Harvard,Yale" :
"UCLA Chancellor Retires" :
"Ohio State wins big game" :
"Reed and University of Oregon share research facilities" ;
"Harvard" : "Brown" : "Stanford" : "Yale" : "Vassar" : "UCLA" )
Пример 2. Возвращается пустая строка.
@Keywords(
"EPA Head speaks at Harvard,Yale" :
"UCLA Chancellor Retires" :
"Ohio State wins big game" :
"Reed and University of Oregon share research facilities" ;
"harvard" : "brown" : "stanford" : "vassar" : "ucla2" )
Пример 3. Возвращается "Yale".
@Keywords(
"EPA Head speaks at Harvard,Yale" :
"UCLA Chancellor Retires" :
"Ohio State wins big game" :
"Reed and University of Oregon share research facilities";
"Harvard" : "Brown" : "Stanford" : "Yale" : "UCLA"; "," )
Пример 4. Возвращается пустая строка.
@Keywords(
" Mary Halen, Director of Sales" :
"Sally Hall, VP of Marketing":
"Joe Halzy, Order entry";
"Joe":"Sally";" ,")
Пример 5. Исправленный пример 4, возвращается "Joe".
@Keywords(
"Mary Halen, Director of Sales" :
"Sally Hall, VP of Marketing":
",Joe Halzy, Order entry";
"Joe":"Sally";" ,")
J @Compare( список_строк1; список_строк2
[; флаги] )
Область применения: нельзя использовать в формулах навигатора.
Осуществляет попарное сравнение двух текстовых списков в соответствии с флагами. Если один из списков короче другого, то он дополняется значением его последнего элемента. Возвращаемое значение есть числовой список, каждый элемент которого определяется по следующему алгоритму:
- 0 - если соответствующие элементы списков эквивалентны с точки зрения флагов;
- 1 – если элемент первого списка больше второго;
- (–1) – если второй список больше первого.
- [CASESENSITIVE] (значение по умолчанию) и [CASEINSENSITIVE] - сравнение идет, соответственно, в режиме "чувствительном" или безразличном к регистру. Не допускается совместное использование обеих флагов;
- [ACCENTSENSITIVE] (значение по умолчанию) и [ACCENTINSENSITIVE] - сравнение идет, соответственно, в режиме "чувствительном" или безразличном к диакритическим знакам (accent, диакритический знак - знак, который в ряде языков ставится над буквой, ниже буквы или “пересекает” букву для того, чтобы обозначить ее особое звучание). Не допускается совместное использование обеих флагов;
- [PITCHSENSITIVE]
(значение по умолчанию) и [PITCHINSENSITIVE] - сравнение идет, соответственно, в режиме "чувствительном" или безразличном к системе сортировки символов языка. Имеет смысл только для двухбайтовых кодировок восточных языков (таких как японский, корейский, упрощенный и классический китайский). Не допускается совместное использование обеих флагов. - [Ascending] (значение по умолчанию) и [Descending]
- для сортировки, соответственно, по возрастанию и убыванию. Не допускается совместное использование обеих флагов; - [CaseSensitive] (значение по умолчанию) и [CaseInsensitive]
для сортировки, соответственно, с учетом или без учета регистра. Не допускается совместное использование обеих флагов; - [AccentSensitive] (значение по умолчанию) и [AccentInsensitive]
для сортировки, соответственно, с учетом или без учета к диакритическим знакам. Не допускается совместное использование обеих флагов; - [PitchSensitive] (значение по умолчанию) и [PitchInsensitive]
для сортировки, соответственно, с учетом или без учета к системе сортировки символов языка. По поводу назначения предыдущих четырех флагов см. пояснения к функции @Compare стр. 107. Не допускается совместное использование обеих флагов; - [CustomSort] в этом случае порядок сортировки определяется третьим параметром. Перекрывает действие любого другого флага.
- [PITCHINSENSITIVE];
- [CASESENSITIVE] : [ACCENTINSENSITIVE].
Флаги также представляют собой список, элементы которого могут принимать следующие значения:
Не совсем ясно, почему нельзя использовать эту функцию в контексте формул навигатора. Из опыта – она в них работает (правде, возможно не во всех случаях).
Пример 1. Возвращается 0 : 0.
@Compare("One":"Two";"onE":"tWo";[CaseInsensitive])
Пример 2. Возвращается так же 0 : (-1), т. к. "One" < " Two ".
@Compare("One";"One":"Two"))
J @Sort( список; флаги; формула
)
Область применения: нельзя использовать в формулах навигатора.
Функция осуществляет сортировку списка и возвращает отсортированный список. Функция может быть применена текстовым, дата/время и числовым спискам. Возвращаемое значение зависит от типа первого параметра функции.
Флаги необязательный параметр, который задает порядок сортировки. Данный параметр может быть списком, элементы которого могут принимать одно из следующих значений:
При конфликте флагов, для определения действующего порядка сортировки будет использоваться последнее значение для взаимоисключающих значений. Например, если второй параметр функции определен как [Descending] : [PitchInsensitive] : [Ascending], то это реально соответствует флагу [PitchInsensitive] : [Ascending].
Параметр формула необязателен для всех случаев, за исключением использования флага [CustomSort]. В этом случае формула задает собственный порядок сортировки. В рамках формулы для генерации ссылок на сравниваемые элементы значений списка используются временные переменные $A и $B. Если по условиям сортировки необходимо чтобы элемент $A стоял в результирующем списке перед элементом $B, то формула должна вернуть 1 (True), для того чтобы $B стоял раньше $A формула должна вернуть 0 (False). Если формула вернет значение отличное от числового типа – генерируется сообщение об ошибке: «Incorrect data type for operator or @Function: Number expected» (Некорректный тип данных для оператора или @функции: ожидается число).
При сортировке значений элементов из списка типа дата-время, если элемент не содержит временную компоненту, то данный элемент эквивалентен любому элементу с той же датой и любым временным значением. Например, значения [12.12.2001], [12.12.2001 12:20:32] и [10.12.2001 – 01.01.2002] с точки зрения @Sort эквивалентны.
Если используется сортировка Unicode, то в рамках функции @Sort нельзя использовать следующие флаги и их комбинации:
Подробнее о сортировка Unicode можно прочитать по адресу: http://oss.software.ibm.com/icu/
Пример 1. Возвращает -15 : 4 : 6 : 12 : 21.
@Sort(21 : 6 : (-15) : 12 : 4);
Пример 2. Возвращает 21 : 12 : 6 : 4 : -15.
@Sort(21 : 6 : (-15) : 12 : 4; [Descending]);
Пример 3. Сортирует список следующим образом: сначала все нечетные числа в порядке возрастания, затем все четные числа в порядке возрастания. Возвращает окно с текстом «-15~7~7~21~4~6~6~12».
a := 21 : 7 : 6 : (-15) : 12 : 6 : 4 : 7;
b := @Sort(a; [CustomSort];
@If( @Modulo($A; 2) = 0;
@If( @Modulo($B; 2) = 0;
@If( $A >= $B ; 1; 0)
;1);
@If( @Modulo($B; 2) = 0; 0;
@if($A >= $B; 1; 0))
));
@Prompt([Ok]; "Sort list"; @Implode(@Text(b) ; "~"))