FilterValuesInvert. Исключение значений из другого списка значений

Автор Аркадий Перла.

В FileMaker есть знакомая всем разработчика функция FilterValues, которая позволяет получить список значений на основе другого списка. Чаще всего, эта функция используется для проверки — входит ли заданное значение в заданный список.  Например, вызов FilterValues со списком значений с 1 по 5, и проверяемым  значением 3 вернет нам 3, что будет означать, что значение входит в список (иначе FilterValues вернет «»)

FilterValuesInvert_1

Однако иногда нам нужно решить обратную задачу — исключить из списка значений, значения второго списка. То есть в нашем примере вызов функции с параметрами  ( «1¶2¶3¶4¶5» ; «3» ) должен вернуть «1¶2¶4¶5».

К сожалению такой функции, обратной FilterValues, в стандартный набор функций FileMaker не входит. Подобная функция BE_Values_FilterOut входит в состав плагина BaseElement,  однако если вы не используете другие функции этого плагина, то ставить ради одной этой функции, скорее, не целесообразно.

Задача решается созданием своей собственной custom-функции. Функция FilterValuesInvert перебирает переданный в качестве параметра список значений, сравнивая каждое значений со списком исключаемых значений. Поскольку список значений может быть любого размера, то функция используется рекурсивный алгоритм, то есть вызывает саму себя, до тех пор пока список значений не будет обработан полностью.

Помимо исключения значений функция «подчищает» обрабатываемый список удаляя пустые значения — если в списке пустые строки, то они будут удалены.

FilterValuesInvert ( text_list ; values_list )

Let ([
  L = LeftValues ( text_list ; 1 );
  LT = Case ( 
            L= ""; "";
            L= "¶"; "";
            FilterValues ( values_list ; L ) = "" ; L ; 
            "" 
           )
  ];
  If (text_list = ""; 
       "";
        LT & FilterValuesInvert ( RightValues ( text_list ; ValueCount ( text_list ) - 1 ) ; values_list )
       )
  )

Пример использования:

FilterValuesInvert_2

 

 

 

 

 

 

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

45 − = 42