Главная » Статьи » Разработка баз данных FileMaker |
Пользовательские функции, операторы Let и Evaluate. Напомню, что для рассмотрения вопросов применения СУБД FileMaker, а также в целях дальнейшего изучения материала создана небольшая база данных Test.fp7. (Статья "Порталы в системе FileMaker. Возможности использования").
В предыдущих статьях мы рассмотрели достаточно большой перечень встроенных функций, используемых при разработке баз данных FileMaker. Логично предположить, что весь набор функций разработчики FileMaker чисто физически написать не могли. Очень часто возникает необходимость иметь какие-то специализированные функции для успешной разработки системы. Поэтому сегодня мы остановимся на разработке пользовательских функций, обсудим алгоритм их создания на конкретных примерах.
1. Создание пользовательских функций
Исходные данные – фамилия, имя, отчество. Задача – иметь результат в виде фамилия и инициалы.
Для создания пользовательской функции (Custom Function) используется меню File – Manage – Custom Functions… При этом открывается окно Manage Custom Functions for "Test”. В нем отображаются имеющиеся в базе пользовательские функции и кнопки управления. Кнопки управления достаточно понятны и стандартны. Поэтому, укажу только их наименования: - New… - Создание новой функции - Edit… - Редактирование - Duplicate – Дублировать функцию - Delete – Удаление - Import – Импорт пользовательских функций из другой базы данных - Ok и Cancel – Подтверждение и Отмена соответственно.
Итак, создаем нашу новую функцию, нажав на кнопку New… Открывается новое окно Edit Custom Function. - В раздел Function Name записываем имя создаваемой функции. Пусть для нашей задачи будет Small_Name. - В раздел Function Parameters поочередно вводим аргументы функции. Ввод производится путем набора имени аргумента и нажатия на значок «+». Введем аргумент с именем text. - Нижний справа раздел для ввода математического описания функции принял значение Small_Name(text). - В этом разделе необходимо записать вычисление нашей пользовательской функции с помощью встроенных функций FileMaker. Для решения поставленной задачи мы должны взять первое слово, добавить пробел, добавить первую букву имени с точкой и первую букву отчества с точкой.
С помощью стандартных функций это записывается так:
MiddleWords ( text ;1 ;1) & " " & Left (MiddleWords ( text ;2 ; 1 ) ; 1 ) & "." & Left (MiddleWords ( text ;3 ; 1 ) ; 1 ) & "."
Нажимаем кнопку OK. Основные этапы создания пользовательской функции представлены на рисунках:
Теперь мы можем использовать созданную функцию при разработке полей и скриптов базы данных. Расположена она в категории Custom Function.
Если поле Персонал::ФИО содержит Петров Александр Иванович, то значение поля Small_ФИО = Small_Name(Персонал::ФИО) будет Петров А.И. Созданная пользовательская функция может в свою очередь использоваться для разработки других пользовательских функций.
2. Применение оператора Let
Рассмотрим необычный оператор Let. В чем же его необычность? Он позволяет в одном вычисляемом поле разместить целый вычислительный алгоритм.
Общий формат функции имеет вид: Let({[}var1=expression1{;var2=expression2...]};calculation) , где var1, var2 – имена переменных (локальных или глобальных) expression1, expression2 – вычисляемое значение, значение поля или константы; calculation - вычисляемое значение, значение поля или константы
Значение calculation – это и есть значение функции. При расчете значения вычисляемого поля с применением операции Let операции присвоения var1=expression1, var2=expression2, и т.д. выполняются последовательно, результат выводится в поле calculation.
Рассмотрим пример применения оператора Let на основе текста функции расчета разности между двумя датами (источник http://www.briandunning.com/cf/518 ).
age( date1 ; date2 )
Let ( [ neg = Case ( date1 > date2 ; -1 ; 1 ) ; d1 = Case ( neg < 0 ; date2 ; date1 ) ; d2 = Case ( neg < 0 ; date1 ; date2 ) ; d = mod ( Day ( d2 ) - Day ( d1 ) ; Day (Date ( Month ( d1 ) + 1 ; 0; year ( d1 ) ) ) ) ; m = mod ( Month ( d2 ) - Month ( d1 ) - ( Day ( d2 ) < Day ( d1 ) ) ; 12 ) ; y = Year ( d2 ) - Year ( d1 ) - ( ( Month ( d2 ) - ( Day ( d2 ) < Day ( d1 ) ) ) < Month ( d1 ) ) ]; y * neg & ¶ & m * neg & ¶ & d * neg & ¶ & y & " years, " & m & " months, and " & d & " days" & ¶ ) В этом операторе Let применено шесть действий расчета, седьмое – вывод результата. Попутно отметим, что расчетные действия заключаются в квадратные скобки, если их больше одного. Подробно распишем представленный оператор по действиям:
1. neg = Case ( date1 > date2 ; -1 ; 1 ) ; - вычисление признака, какая дата больше первая или вторая 2. d1 = Case ( neg < 0 ; date2 ; date1 ) ; - вычисление меньшей даты 3. d2 = Case ( neg < 0 ; date1 ; date2 ) ; - вычисление большей даты 4. d = mod ( Day ( d2 ) - Day ( d1 ) ; Day (Date ( Month ( d1 ) + 1 ; 0; year ( d1 ) ) ) ) ; - вычисление количества дней 5. m = mod ( Month ( d2 ) - Month ( d1 ) - ( Day ( d2 ) < Day ( d1 ) ) ; 12 ) ; - вычисление количества месяцев 6. y = Year ( d2 ) - Year ( d1 ) - ( ( Month ( d2 ) - ( Day ( d2 ) < Day ( d1 ) ) ) < Month ( d1 ) ) - вычисление количества лет
Вывод результата: y * neg & ¶ & m * neg & ¶ & d * neg & ¶ & y & " years, " & m & " months, and " & d & " days" & ¶ Цветом выделены переменные, вычисленные в первой части оператора.
Пример: age ("27.07.1980" ; "26.07.2006" ) Результат: 25
3. Применение оператора Evaluate
В этой статье мы рассмотрим применение ещё одного необычного оператора – Evaluate. Этот оператор позволяет произвести вычисление выражения на основе текста введенной формулы.
Общий формат оператора имеет вид: Evaluate (expression{;[field1; field2; field3; ...]})
где expression – текст или текстовое поле, содержащее выражение для вычисления. field1; field2; field3, … - поля, которые используются в вычислениях первой части оператора.
Например, Evaluate(TextField) возвратит 4, если поле TextField содержит текст 2 + 2. Evaluate(TextField;[Amount]) возвратит 0,80 если TextField содержит текст 0,08 * Amount и поле Amount содержит число 10.
Применение этого оператора совместно с оператором Let рассмотрим на примере функции подсчета числовых значений из листа значений (источник http://www.briandunning.com/cf/1309 ).
ListSum( myList )
Let( it = Substitute( myList ; ¶ ; ";" ) ; Evaluate( "Sum(" & it & ")" ) )
Работает эта функция следующим образом. Сначала в листе значений myList знаки перевода строки меняются на знак ; (точка с запятой), а затем полученное текстовое значение подставляется в формулу суммы ( Sum(field{;field...} )
Пример: Входные данные myList: 1 2 3 4 Значение ListSum( myList ) 10
Отмечу, что по адресу http://www.briandunning.com/filemaker-custom-functions/list.php можно найти большой перечень разнообразных функций для дальнейшего применения.
| |
Просмотров: 2149 | |
Всего комментариев: 0 | |