МакЦентр: Apple компьютеры, iPod, полиграфическое оборудование, новости, обзоры, новинки мира Mac
FileMaker. Часть 4 [ 21 апреля, 2008 г ]
Создание программы ведения домашней бухгалтерии

Продолжение цикла статей, посвященных изучению FileMaker. На этот раз будет описан процесс создания программы для ведения домашней бухгалтерии.

В прошлых статьях о Filemaker основное внимание уделялось теоретическим основам работы. Теперь попробуем перейти к делу: создать что-то пусть несложное, но свое. В недавно опубликованной на MacCentre.Ru статье "Финансы в порядке" описывались программы для ведения домашней бухгалтерии. В этой статье мы постараемся создать аналогичную систему и показать, что решение подобной задачи в Filemaker доступно даже имеющим смутное представление о программировании людям.

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

Как и весь цикл, статья ориентирована на пользователей, достаточно "продвинутых", чтобы заинтересоваться самостоятельной разработкой систем баз данных, но не на профессиональных разработчиков. Поэтому некоторые аспекты профессионального программирования, такие, как, например, "защита от дурака", в статье рассматриваться не будут.

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

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

Использование такого подхода в данном случае оправдано, хотя может вызвать у профессионалов определенный скепсис. Но, во-первых, такой метод демонстрирует гибкость Filemaker, позволяющего без особого ущерба возвращаться к исходным точкам, вносить изменения в структуры и формат данных и изменять способы их отображения и редактирования. Во-вторых, Filemaker, в первую очередь, предназначен для быстрого и современного способа решить различные задачи, связанные с хранением и обработкой данных, без знаний и навыков профессионального программиста.

Приступаем к работе

В Filemaker в качестве примера (Solution) уже входит система учета домашних финансов. Желающие могут изучить ее, создав новый файл (команда New Database) и выбрав из списка примеров файл Home Budgets.

Мы же создадим свою собственную систему, несколько отличающуюся по функциональности и принципам работы. Однако, чтобы не концентрироваться на таком аспекте, как оформление и интерфейс, за основу возьмем данный пример из Filemaker.

Переключившись в режим Layout Mode, можно копировать все нужные элементы интерфейса (кнопки, линии и прочее). Это совершенно законно - ведь примеры поставляются c Filemaker, во многом, именно для этого. Впрочем, ничто не мешает разработать свой собственный интерфейс. Как было рассказано в предыдущих статьях, в Filemaker представление (Layout) данных отделено от самих данных, их структуры и функциональности системы.

Принципы работы программ домашнего учета финансов в статье "Финансы в порядке" освещены достаточно подробно. Напомним, что основными понятиями в этих системах являются понятия транзакции (проводки), аккаунта (счета) и категорий. От этого и оттолкнемся.

Начинаем

Создадим новый файл. Командой New Database в окне Filemaker Quick Start укажем опцию Create empty database (создать пустую базу данных), указав расположение и имя рабочего файла. Теперь перейдем к формированию таблиц. Основную таблицу так и назовем - Transactions, и опишем в ней следующие поля:

date - здесь будет храниться дата создания транзакции (формат Date)

type - тип транзакции: Расход/Доход (формат Text)

category - категория к которой относится транзакция (формат Text)

split - (формат Number [11]) - именно в это поле пользователь будет заносить сумму транзакций. Но почему мы назвали его split? Дело в том, что мы хотим дать возможность пользователю вводить сумму не одним числом, а разбив ее на несколько сумм.

Поясним на примере. Допустим, пользователь хочет занести транзакцию о ремонте автомобиля. Можно указать общую сумму затрат на ремонт, а можно подробно расписать стоимость деталей и работы. Конечно, для этого можно создать несколько транзакций, но гораздо удобнее разбить одну транзакцию на части. Такую схему можно реализовать разными способами, но мы воспользуемся самым простым и наглядным, используя механизм FilemakerRepetions.

Repetions (повторения) - это возможность сохранять несколько значений в одном поле таблицы. Количество этих значений указывается в процессе формирования таблицы. (Окно Options, закладка Storage, поле Maximum number of repetions). Для нашего случая мы укажем значение - 11, хотя можем указать любое, какое нам кажется более целесообразным.

split comments (формат Text [11]) - очевидно, что ввод сумм транзакции может сопровождаться комментариями, причем при разбивке на несколько сумм пользователь должен иметь возможность прокомментировать каждую сумму. Для нашего примера с авто-сервисом это "запчасти", "работа" и т.п. Соответственно, поле split comments должно иметь такое же количество repetions, что и поле split. Впоследствии, расположив эти поля рядом, мы фактически получим таблицу их двух столбцов и одиннадцати строк.

amount income - сумма дохода для данной транзакции

amount expenses - сумма расходов для данной транзакции

Дадим некоторые пояснения. Мы предполагаем, что каждая транзакция описывает либо доход, либо расход по счету, так как это гораздо удобнее для пользователя. Однако для подсчета баланса и наглядного представления доходов и расходов гораздо удобнее использовать два различных поля. В зависимости от того, какой тип транзакции указал пользователь (Расход или Доход), заполняться будет только нужное поле, а второе останется пустым.

Как это сделать прозрачным для пользователя при вводе данных, мы рассмотрим ниже. В любом случае, поле должно рассчитываться автоматически. Фактически это сумма чисел, введенных в таблицу split. Для того, чтобы реализовать автоматический подсчет, присвоим полям amount income и amount expenses специальный тип - Calculation.

Нажав кнопку Options, мы увидим классическое для Filemaker окно Specify Calculation, в котором можно указать, с помощью каких функций рассчитывается данное поле. С этим диалоговым окном мы столкнемся еще не раз, а сейчас в нижнем поле диалога для поля amount income введем следующее:

If ( type = "Доходы" ; Sum ( split ) ; "" )

а для поля amount expenses:

If ( type = "Расходы" ; Sum ( split ) ; "" )

Поясним написанное для поля amount income (для amount expenses все аналогично). Мы используем функцию if - для выяснения, к какому типу относится данная транзакция (type = "Доходы"), в случае положительного ответа, функция if присваивает полю amount income первое значение после знака "точка с запятой", в нашем случае, Sum ( split ), в случае отрицательного ответа - второе значение. В нашем случае двойные кавычки заставят Filemaker оставить поле пустым. Функция Sum ( split ), как следует из названия, просуммирует все значения repetions поля split.

Обратите внимание: использовав всего только две строчки кода, мы уже реализовали в нашей будущей системе разбивку суммы транзакции на части и автоматический подсчет ее суммы!

Пока остановимся на формировании таблицы (впоследствии еще придется добавить некоторые поля) и перейдем к следующему этапу.

После нажатия кнопки "ОК" в диалоге создания и редактирования таблиц FileMaker автоматически создаст одноименный с таблицей (в нашем случае Transactions) новый Layout. Поначалу он будет выглядеть более чем просто - поля таблицы и подписи (имена полей) к ним. Сейчас наша задача - сделать его более удобным для использования. В этой статье мы не будем подробно останавливаться на способах редактирования Layout, поскольку в предыдущих статьях это уже было подробно описано. Как уже отмечалось выше, наиболее простой способ - это взять за основу файлы-примеры из FileMaker. В этом случае, копируя из него элементы интерфейса, можно сделать что-то вроде приведенного на рисунке ниже.

Разберем повнимательней полученный результат. Пользователь уже сейчас может вносить данные о проводке (транзакции). Распишем подробно параметры полей. (Пустое пространство слева понадобится для дополнительных функциональных элементов)

Поле Date. Лучше всего указать в формате ввода даты из выпадающего календаря: в диалоге Filed/Control Setup в графе Control Style - Display as указываем Drop-down Calendar. Для того чтобы в правой части поля отображалась специальная иконка календаря, отметим соответствующий пункт Include icon to show and hide calendar.

Поля type и category. Оставим, как обычный Edit Box.

Поля split и split comments. Оставим, как обычный Edit Box, однако это - не обычные поля, а, благодаря механизму Repetions, по сути, таблицы значений. Для того, чтобы поля отображались так, как показано на нашем рисунке, в диалоге Filed/Control Setup в графе Repetions укажем, с какой по какую строчку требуется отображение (в нашем случае, с первой по одиннадцатую), а ориентацию укажем как вертикальную.

Поля Amount Income и Amount Expenses. Если вы заметили, оба этих поля я разместил одно на другом. Зачем это? Как мы помним, эти поля вычисляются автоматически с помощью механизма Calculation. В зависимости от того, что введет пользователь в графу type - "Расходы" или "Доходы", заполнится соответствующее поле, а второе окажется пустым. Таким образом у пользователя создается полная иллюзия, что поле, отмеченное на рисунке как "Всего", только одно, когда на самом деле наша система уже на этапе ввода данных разделяет доходы и расходы. Как мы увидим в дальнейшем, это очень пригодится, когда мы начнем считать баланс. Поскольку оба поля вычисляются сами, без участия пользователя, то имеет смысл заблокировать ручной ввод в эти поля. Для этого вызовем команду меню Format - Filed/Control - Behavior и в появившемся диалоге снимем все галочки (пункты).

Ну что ж, ввод данных, правда, пока еще не совершенный, мы реализовали. Теперь, чтобы система выглядела более работоспособной, заставим функционировать кнопки.

Кнопки

Кнопка "Новый". Кнопка Должна создавать новую запись. Выделив будущую кнопку, а пока еще только картинку, вызовем команду Format - Button Setup. В появившимся диалоговом окне в списке доступных функций найдем и отметим пункт New Record/Request. Последующее нажатие "ОК", превратит пиктограмму в кнопку, которая при нажатии заставит систему создать новую запись и сделать ее текущей для ввода данных. Напомним, что подобным образом FileMaker позволяет превратить в кнопку любой элемент управления.

Кнопка "Удалить". Создается аналогично. В диалоге Button Setup, отметим пункт Delete Record/Request. Обратите внимание, что у этого пункта есть опция: Perfom without dialog. Если ее включить, то FileMaker будет удалять записи без диалога-подтверждения.

Кнопка Find. Переводит FileMaker в режим поиска. В диалоге Button Setup отмечаем пункт Enter Find Mode. Визуально режим Find Mode, выглядит так же, как и обычный режим Browse Mode. Однако все вводимые в поля данные становятся критериями поиска. Для того чтобы запустить поиск, требуется нажать кнопку Find в панели Status Area.

Кнопка/закладка (четыре горизонтальных линии) переводит систему в режима отображения транзакций единым списком. В нашем случае этот режим может выглядеть примерно так, как показано на рисунке.

Как ясно из рисунка, это другой, новый Layout. И прежде, чем кнопка переключения режима заработает, этот Layout еще нужно создать. Чтобы немного упростить себе жизнь, создадим новый Layout из текущего. Для этого воспользуемся командой меню Layouts - Duplicate Layout (FileMaker должен в этот момент находится в режиме Layout Mode). Мы окажемся в новом Layout - копии предыдущего. Имя нового Layout будет совпадать с оригиналом плюс приставка "Copy". Сразу же вызовем команду Layouts - Layout Setup. И в графе Layout Name переименуем новый Layout, чтобы в дальнейшем не было путаницы, например, на Transactions list. Но это еще не все. Переключившись в текущем диалоге на закладку Views, снимем галочки с пунктов Form View и Table View, оставив включенным только List View. Теперь наш новый Layout Transactions list будет всегда отображаться только в режиме списка.

Оформление нового Layout

Теперь нам нужно оформить новый Layout. На рисунке ниже показан пример, как он может выглядеть в режиме разработки

Обратим внимание, что в прошлый раз, когда мы разрабатывали Layout Transactions, то не обращали большого внимания на так называемые части Layout - Header, Body и Footer. Действительно, в режиме Form View их назначение не очень наглядно, но все меняется, когда мы начинаем использовать режим List View, как для нашего нового Layout Transactions list. Дело в том, что последовательным списком будут отображаться только те элементы, которые попали в часть Body - тело Layout. А элементы, находящиеся в частях Header и Footer, будут отображены только один раз вверху и внизу экранной формы.

Поскольку мы хотим, чтобы транзакции в программе отображались последовательно одна под другой построчно, то часть Body, представляет из себя узкую полоску, на которой размещены требуемые поля. Менять размеры частей в FileMaker очень просто - достаточно "потянуть" мышкой пунктирную линию указывающую границу нужной части.

Поля Amount Income и Amount Expenses на этот раз мы расположили рядом. Теперь становится понятен и наш "коварный" замысел, ради которого мы проделывали с этими полями столько манипуляций. Доходы и расходы автоматически оказываются в разных колонках списка, что сильно увеличивает наглядность представления данных.

Слева у самого края рядом появился маленький синий треугольник. Это кнопка переключения в режим редактирования транзакции. Напомню, что в качестве кнопки в FileMaker можно использовать любой объект. В нашем случае я скопировал эту пиктограмму из файла примера FileMaker, как и другие изображения.

Для того, чтобы заставить нашу кнопку выполнять требуемую функцию, снова воспользуемся диалогом Button Setup. На этот раз выберем пункт Go to Layout. А в графе Options, пункт Specify укажем имя Layout, на который будем переправлена система при нажатии на кнопку. В нашем случае это Layout Transactions.

Кнопки "Новый", "Удалить" и "Поиск" работают так же, как и в предыдущем Layout - их можно просто скопировать оттуда. Но в таком случае при нажатии на кнопку создания транзакции новая запись будет создана, но FileMaker останется по-прежнему в режиме списка.

Но нам требуется, чтобы система автоматически переключалась в режим редактирования транзакции. Чтобы при нажатии кнопки "Новый" FileMaker выполнял не одну команду, как раньше было указано в диалоге Button Setup, а две подряд:

New Record/Request

Go to Layout Transactions

Для того, чтобы заставить FileMaker выполнить подряд несколько команд, служит специальный механизм FileMaker Script. По сути, это внутренний язык программирования. Но не стоит пугаться, ведь нам нужна просто возможность указать подряд две команды. Итак:

Из меню вызовем команду Script - Script Maker. Это редактор скриптов для FileMaker. Редактор представляет из себя окно, в котором перечислены сохраненные в текущем файле скрипты и кнопки их создания, удаления и редактирования. Кнопкой New создаем новый скрипт. В появившемся окне в верху диалога вводим имя нашего нового скрипта, например, new transactions. Как видно из рисунка, список доступных команд полностью идентичен списку диалога Button Setup. Последовательно, отмечая нужные пункты, мы формируем требуемую последовательность команд. Как показано на рисунке

Теперь нам осталось только "прикрутить" наш новый скрипт к кнопке "Новый". Снова вызываем диалог Button Setup, но на этот раз выбираем пункт Perfom Script, а в графе Options, нажав кнопку Specify укажем имя нужного скрипта.

Баланс

Если мы еще раз посмотрим на рисунок, где отображается работа нашей системы в режиме списка, то увидим, что внизу, в поле Footer, есть некое поле balance, которое отображает текущий баланс счета. Баланс - это сумма всех доходов минус сумма всех расходов. Нам нужно только заставить FileMaker вычислять его автоматически. Для этого вернемся к диалогу редактирования таблицы. Нам потребуется добавить несколько новых полей, а именно, три.

Первое поле - это сумма всех доходов. Назовем его Income All. В качестве формата поля укажем еще не использовавшийся формат Summary. Как ясно из названия, такой формат позволяет производить вычисления в автоматическом режиме. В появившимся диалоге выберем пункт Total of (сумма значений) и укажем поле, по которому надо производить суммирование. В нашем случае это - поле Amount Income. Аналогично создадим поле Expenses All - это поле будет суммировать все расходы.

Теперь создадим поле balance и укажем для него формат Calculation. Формула вычисления проста: Income All - Expenses All. Но есть и тонкость. Поле balance вычисляет значение баланса для всей таблицы, по сути, это - переменная. Если мы оставим все как есть, то в нашей таблице в каждой записи будет храниться поле balance с одинаковым значением. Это неправильно, так как, во-первых, это увеличивает объем хранимых данных, во-вторых, не совсем понятно, к какой конкретно записи мы должны обращаться, чтобы получить и отобразить значения баланса. Для разрешения подобного противоречия в FileMaker есть специальный механизм. В диалоговом окне Specify Calculation нажмем кнопку Storage Options и в появившемся окне отметим пункт Use global storage. Теперь полю присвоен признак Global. Это означает, что для хранения этого поля используется только одна ячейка памяти. А значение поля едино для всех записей таблицы. Поле превратилось в специальную переменную, "прикрученную" к таблице, что нам и требовалось.

***

Итак, используя только форматы представления полей и "грамотно" подойдя к этому вопросу, мы заставили FileMaker автоматически высчитывать баланс нашего счета, по сути, не написав не строчки кода. Конечно, созданная нами система не совершенна. Требуется добавить ряд функций, таких, как, например, работа с различными счетами и работа с категориями, но это уже тема следующей статьи.


Автор: А. Перла

Источники: МакЦентр