Delphi. Тестовое задание. Проект квартира

Ссылка на описание тестового задания

Проект сделан на Delphi Berlin+MySQL;

Реализация на VCL Forms Application

 

Проект на Delphi Berlin (скачать)

Код на gitHub

База данных

Для автоматического проставления даты в момент добавления записей использованы триггеры, например

Полный код SQL для создания базы данных

Приложение

Сделано под влиянием концепции MVC – используются модели, представления, контроллеры, и также смешанные модели, так называемые ViewModel.

Логгирование ошибок проводится при помощи многопоточного TLDSLogger.

Для уменьшения количества кода, уменьшения ошибок, в контроллере используются классовые методы.

Подключение к базе данных

При помощи библиотеки FireDAC, с обработкой ошибок, согласно документации.

Драйвер libmysql.dll лежит в c:\windows\SysWow64\

Модуль подключения выглядит следующим образом.

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

Просмотр списка всех квартир с показаниями, актуальными на сегодня. Будет плюсом применение фильтров (по дому/по улице).

В основе данной таблицы лежит следующий запрос

Сам DBGrid находится на фрэйме

Фрэйм подключается к соответствующей вкладке TPageControl на главной форме

 

После создания экземпляра TFlatsFrame происходит заполнение данными следующим образом

Поскольку списки улиц и номеров домов у нас взаимосвязаны, то в момент обновления списка улиц, нам нужно, чтобы обновлялись дома, сделаем это так

Фильтр оформим в виде такого же запроса, с добавлением фильтрующих параметров, а именно:

Соответственно фильтрацию на фрэйме проведем вот так

Ключевой момент в том, здесь, что мы просто подменяем датасеты.

Сбросим фильтр аналогично


Вывод списка счетчиков для выбранного дома, для которых требуется поверка.

Для того, чтобы выводить счетчики на поверку, нам нужно сначала просто их вывести целиком, сделаем это так…

В основе будет лежать следующий запрос

Соответственно, фильтрующий запрос будет аналогичным, но с дополнительными фильтрующими параметрами

Ключевой здесь является секция where посмотрим на нее более внимательно

Следующая дата поверки должна быть меньше либо равна текущему времени, а также соответствующие улица и номер дома.


Ввод показаний для счетчика в квартире (показания не должны убывать).

Показания должны не убывать.

Для этого создадим новую форму

Реализуем механизм добавления новых показаний следующим образом

Как видно, здесь используется классовый метод контроллера, посмотрим на него

Также используется методы из модуля uCommon, этот модуль создан для методов, которые используются больше, чем в одном модуле и являются общими.


Добавление нового счетчика и ассоциация с квартирой

Самым интересным здесь является метод AssociateFlatToCounter из контроллера, посмотрим на него более внимательно. Здесь у нас возможны 3 ситуации

// 1) В выбранной квартире есть свой ассоциированный счетчик,
// Текущий счетчик ассоциирован с квартирой
// поменять их местами

// 2) Текущий счетчик не ассоциирован с квартирой,
// В выбранной квартире уже есть счетчик, тогда предложить
// перезаписать

//3) Текущий счетчик не ассоциирован с квартирой,
//В выбранной квартире нет счетчика, тогда просто записываем

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


Посмотреть историю замен счетчиков для заданной квартиры.

История выглядит следующим образом

SQL код просмотра истории замен счетчиков для квартиры


Редактирование счетчика проводится аналогично

Код редактирования счетчика и его ассоциации с квартирой

Проект сделал примерно за 5 часов.  С уважением, Пантелеев Станислав.

This entry was posted in Delphi. Bookmark the permalink.