Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Советы

Главная   Библиотека   Советы

Язык @-формул: Per aspera ad astra. Часть вторая

Николай Норкин,
Вятские Информационные Технологии, Киров
В предыдущей части >>> автор разобрал несколько "азбучных истин" по использованию @-формул для оперирования многозначными (списковыми) переменными. Завершавшие материал примеры последовательно усложняли задачу и ее решение, в соответствии с заглавием проводя читателя через тернии все дальше и дальше. К сожалению, автору пока не удалось подготовить кульминацию, за которой бы сквозь дебри прописных истин внезапно блеснула путеводная звезда. И, вопреки законам жанра, сокровищница откроется читателю намного раньше, чем того бы хотелось автору, да и, возможно, самому читателю. Вместе с тем, автор надеется, что впоследствии ему снова удастся вернуть читателя в непроходимые дебри "школы программирования @-формул"
А пока читателю предоставляется возможность оценить блеск шедевров и миниатюр, собранных в настоящей публикации

Выбор из списка элементов с соответствующих позиций, указанных во втором списке
Есть список list, содержащий произвольные элементы
Есть список index, содержащий целые натуральные числа
Задача: из списка list выбрать элементы с номерами из index?
Например:
list=Петя:Леша:Вася:Лена:Вова
index=2:4:5
получить второй, четвертый и 5 элементы: Леша:Лена:Вова
Автор решения: Иван Цыбаненко >>>
Для решения потребуется список N элементов от 1 до N (N - число элементов list - @Elements(list)).
После получения этого списка (List_1_to_N) задача становится задачей в одно действие:

@Replace(@Text(index); @Text(List_1_to_N); list)

Похожая задача
Удаление элементов, соответствующих повторяющимся элементам второго списка
Имеется 2 текстовых списка с одинаковым (но заранее неизвестным) количеством элементов. Требуется удалить из 1-го списка повторяющиеся элементы, и удалить соответствующие им (имеющие тот же "порядковый номер") элементы из 2-го списка
Например:
Исходно:
list1 := ААА:БББ:БББ:БББ:ВВВ
list2 := 111:222:333:444:555
В результате требуется получить:
res_list1 = ААА:БББ:ВВВ
res_list2 = 111:222:555
Автор решения: Егор Иванов >>>

res_list1 := @Unique (list1);
res_list2 := @Replace (res_list1; list1; list2)

Удаление элементов, включающих "запрещенные" подстроки
Удалить из строкового списка list1 элементы, которые содержат подстроки, являющиеся элементами списка list2
Автор решения: Егор Иванов >>>

@Trim (@Replace (list1; @Replace (list1; @ReplaceSubstring (list1; list2; @Char(127)); ""); ""))

Примечание. Вместо символа backspace - @Char(127) может быть использован любой другой символ (последовательность символов), заведомо не встречающийся в списке list1
Примечание автора. Хочется заострить внимание читателя на различии в обработке функциями @Replace и @ReplaceSubstring ситуаций, связанных с несоответствием длины второго и третьего аргументов функций. Так, для функции @ReplaceSubstring, если список заменяемых значений (второй аргумент) длиннее третьего аргумента, все совпадения с "лишними" элементами заменяются на последний элемент третьего списка. Для функции @Replace все элементы исходного списка, совпадающие с "лишними" элементами второго списка заменяются пустой строкой. "Лишние" элементы третьего аргумента в обеих формулах игнорируются

Найти последнее вхождение

Два решения приводимого ниже примера наглядно иллюстрируют, что для рождения Решения с большой буквы не обязательно мастерски владеть языком @-формул, достаточно лишь до того, как садиться за написание кода, посмотреть на задачу под иным углом зрения, "перевернуть" ее формулировку, как это удалось Александру Чудилину

Найти последнее вхождение элемента value в список List0
Например,
для списка "тест1":"тест2":"тест3":"тест1":"тест4":"тест1":"тест5"
и элемента "тест1" в результате получить 6, а не 1 и не 4

Автор решения: Николай Норкин >>>

Получить OrdList как массив строк от 00 до N - 1 (способы обсуждались в первой части материала >>>)

List1 := @Replace(List0; value; "");

List2 := List0 + "~" + OrdList;

List3 := @Replace(List2; List1 + "~" + OrdList; "");

Result := @TextToNumber(@Subset(@Trim(@RightBack(List3; "~")); -1)) + 1

Автор решения: Александр Чудилин >>>

Получить список List0 в обратном порядке.

Тогда задача сводится к нахождению первого вхождения:

num:=@Member(value;InvList0);

Result := @If(num=0; 0; @Elements(List0) - num + 1)

Подсчет числа рабочих дней

Подсчитать количество дней между двумя датами StartDate и EndDate, исключая субботы и воскресенья:

Решение Дениса Самойловича (на списках >>>)

days := @Explode(@TextToTime(@Text(@Date(StartDate)) + "-" + @Text(@Date(EndDate))));
@Elements(@Trim(@Replace(@Text(@Weekday(days)); "1":"7"; NULL)))

Решение Егора Иванова >>>

t := (EndDate - StartDate) / 86400 + 1;
w := @Weekday (StartDate);
@Return (t - @Sum (@Integer ((t + @Modulo (w + 5:6; 7)) / 7)))

Кстати, Егор предложил еще одно более изящное но менее быстрое решение получения пересечения списков (о других решениях см >>> и в комментарий Константина Червоненко к первой части)

Пересечение списков

@Trim (@Replace (A; B : A; B))

Обсуждая с коллегами необходимость и полезность публикации материалов по языку @-формул в том виде, в котором он представлен читателю, автор пытался ответить на вопрос, что же им создается в свете появления в шестом релизе Lotus Domino @-функций для организации циклов типа @For: "музей под открытым небом" или "учебник жизни". Хочется надеяться, что приведенные выше решения будут востребованы и далее (поскольку изящны и эффективны)
Жаль, что ряд интересных решений при этом займет место в витрине музея. Два приводимых ниже решения от Егора Иванова глобальностью кода действительно напоминают гигантских мастодонтов. Хотя, с точки зрения автора, они просто обязаны быть упомянуты здесь

Получить максимальное значение числового списка

@-функции @Max и @Min для версий до 5-ой включительно возвращают наибольший (наименьший) из сравниваемых двух аргументов. Необходимо получить максимальное (минимальное) значение числового списка (взято >>>)

x := 0;
n := 0;

@Set ("x"; NumberList);
@If (
@Set ("n"; @Elements (x)) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;

@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;

@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;

@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
@Set ("n"; @Elements (@Set ("x"; @Max (@Subset (x; n/2); @Subset (x; -n/2))))) <= 1; x;
x)


Разбить строку на подстроки

Имеется длинная строка. Как после каждых n-символов вставить еще символ (или строку символов) (взято >>>)

REM "Declarations";
x := "";
s := "";
w := "";
y := "";
n := "";
p := "";
t := "";


REM "Parameters";
@Set ("x"; SourceString);
@Set ("s"; SeparatorString);
@Set ("w"; Width);


REM "Function body";
@Set ("t"; @Char (127));
@Set ("x"; @Left (@Subset (x; 1); w * @Power (2; 16)));
@Set ("n"; w * @Power (2; @If (@Set ("p"; @Ln (@Max (@Length (x); w) / w) / @Ln (2)) = @Set ("p"; @Integer (p)); p; p + 1)));
@Set ("y"; @Implode (@If (
w = n; x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;

@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;
@Do (@Set ("x"; @Explode (@Left (x; @Set ("n"; n / 2)) + @Replace (t + @RightBack (x; n); t; ""); t)); w = n); x;

x); s));

@Return (y)

Примечания
1. Вместо символа backspace - @Char (127) можно использовать любой другой символ (последовательность символов), заведомо не содержащийся в обрабатываемом тексте
2. Формула возвращает только первые 64К кусков, разделенных заданным символом или строкой

Читайте также на Notesnet.ru:
Язык @-формул: Per aspera ad astra. Часть первая >>>
Язык @-формул: Per aspera ad astra. Часть третья >>>

Несколько функций для операций с датами >>>

PS. Проект Notesnet.ru планирует в ближайшем будущем пополниться разделом Вопросы и Ответы. Свои вопросы (и ответы на них) коллеги могут выслать уже в настоящее время по адресу notesnet@notesnet.ru
 
  Опубликовано — 02/23/2004 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU