Блог Александра Божко
Архивы
Рубрики

FireDAC

Сразу о двух новые книгах, посвящённых Delphi.

Первая – Delphi in Depth: FireDAC Керри Йенсена (Cary Jensen).

FireDAC_200  В свое время, когда я только начинал программировать и и, в принципе, еще не зарабатывал этим на жизнь, мне довелось сдавать допуск к экзамену по английскому. Те самые пресловутые тысячи. Выбор текста оставался за мной, и я решил совместить полезное с полезным ;). Интернета в его нынешнем виде тогда не было, но мне попалась подборка журналов Delphi Magazine. Несколько на мой взгляд наиболее интересных статей я прочел и перевел под запись. Среди них был и цикл статей, посвященных работе с наборами данных. Тогда для меня это послужило неким толчком. Фактически, я научился работать с БД.

Данная книга вполне может послужить чем-то подобным для начинающих разработчиков. Но и для тех, кто имеет опыт разработки DB-ориентированных приложений, она будет интересна. FireDAC – продукт достаточно мощный, и зачастую опыта использования других библиотек доступа к данным может быть не достаточно, что бы использовать весь спектр возможностей FireDAC. Тонкостей и нюансов хватает.

Ознакомиться с содержанием книги вы можете здесь: http://www.jensendatasystems.com/firedacbook/files/DelphiInDepth_FireDAC_CaryJensen_2017_TableOfContents.pdf.

Единственное, чего в книге не хватает, на мой взгляд – описание работы с DataSnap.

Книга относительно не дешевая. $44.99. Но на мой взгляд она стоит того, что бы ее купить.

Книга, как сейчас популярно, персонализирована. Т. е. после покупка она верстается в .pdf формате с вашими реквизитами.

Рекомендую.

 

Автор второй книги – Paweł Głowacki. Сотрудник Embarcadero, известный большим количеством технических статей, посвященных Delphi.

MasteringDelphi_200 Mastering Delphi – рабочее название. Вероятно, окончательный вариант названия будет другим. Что бы не возникало ассоциаций с книгами Marco Cantu. Выход книги ожидается в сентябре этого года.

Сейчас можно сделать предзаказ.

Акцент в книге, судя по аннотации, будет сделан на мультиплатформенную разработку.

Стоимость книги по предзаказу – $32,59.

Думаю, в качестве книги сомневаться не придётся. К слову, Павел как раз известен как автор целого ряда материалов, посвящённых DataSnap.

 

С тех пор как FireDAC стал частью RAD Studio, и в моём блоге появилось несколько постов, посвященных данному продукту, меня время от времени спрашивают как сделать с помощью FireDAC те или иные вещи. При чем, в большинстве случаев вопрошающие пытаются переложить свой опыт использования других компонентов доступа к данным (что вполне логично). К сожалению, описывать многочисленные нюансы работы с FireDAC просто не хватает времени. Да и опыт работы с FireDAC ограничен в основном созданием мобильных приложений.

Буквально вчера я наткнулся на весьма не плохой туториал от Дениса Симонова.

Создание приложений для СУБД Firebird с использованием различных компонент и драйверов: FireDac.

Рекомендую.

Часть #0

Создание клиентского приложения

Поскольку в нашем случае речь идёт о мобильном приложении, клиентской приложение будет создано с помощью FireMonkey.

  • Создаем новое Multi-Device приложение (настройки не критичны);

DataSnapClient000

Я создаю клиентское приложение в группе, что дает возможность параллельно отлаживать и серверное приложение.

Читать далее

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

Итак, имеется настольное приложение, работающее с БД MS Access (это не мой выбор и мы условились не обсуждать его здесь). Функционал приложения довольно обширный, но некоторая его часть связана с учетом рабочего времени. На ПК запускается таймер, по окончанию его работы в БД заносятся данные об отработанном времени, выполняемом проекте и т.д. Идея заключается в том, что бы этот таймер можно было запускать на мобильном устройстве, а информация с него попадала в базу на ПК.

Задачу я реализую с помощью FireDAC. И поскольку обилия русскоязычных руководств по данной теме не наблюдается, я решил в блоге описать всю процедуру пошагово. Естественно, в несколько упрощенном виде.

Создание сервера

Создаем новый проект.

  • Выбираем  File > New > Other из главного меню;
  • В ветке DataSnap Server выбираем DataSnap REST Application;

DataSnap00

Читать далее

Небольшая зарубка на память, касающаяся FireDAC в актуальной версии Delphi XE6. Но прежде, пару слов о том, где искать ответы на вопросы, касающиеся FireMonkey. Русскоязычные пользователи здесь оказались в привилегированном положении.

Fire-monkey.ru – русскоязычный форум, посвященный FireMonkey, администрируемый и модерируемый Ярославом Бровиным. Так что здесь вы сможете получить ответы, что называется, “из первых рук”. Еще один ресурс давно и хорошо известен – форум SQL.RU и тема, посвященная FireDAC. Здесь вы сможете получить ответы от Дмитрия Арефьева, автора данной библиотеки. И еще хочу порекомендовать блог Андрея Ефимова, в котором собраны ответы на наиболее популярные вопросы, касающиеся FireMonkey.

Собственно, теперь сама заметка.

Для соединения с БД используем FireDAC. База, похоже, значения не имеет. Тестировал на MSAccess и на SQLite. С помощью LiveBinding в XE6 подключаем ListBox. При перемещении по списку перемещение по DataSet’у не происходит. В XE5, однако, все работает нормально. Подключение с помощью dbGo, тоже работает.

Для разрешения данной проблемы следует установить значение FetchOptions.LiveWindowParanoic в True.

Узнать больше:

Читать далее

Некоторое время назад я уже писал о DataSnap и своих экспериментах связанных с этой технологией. Интересно, что тогда я немного затронул набор компонентов доступа к БД AnyDAC. Сейчас, похоже, появилась необходимость более плотно обратиться к данной теме, а в базовом арсенале Delphi разработчиков появился FireDAC. Вкратце обрисую задачу.

Имеется некоторое Windows приложение, работающее с СУБД MS Access (опционально с MS SQL). Необходимо создать для данного приложения клиентскую часть, работающую под Android и частично реализующую функционал основного приложения. При этом данные должны храниться автономно, но по запросу пользователя синхронизироваться. Здесь сразу оговорю два момента. Во-первых задача абсолютно реальная и решать ее мне так или иначе придется. Во-вторых, сама по себе задача, без учета специфики конкретных СУБД, довольно типичная, в той или иной интерпретации, встречающаяся часто. Поэтому, допускаю, что подробное  описание подобного примера будет интересно читателям.

Здесь можно выделить три условные функциональные задачи:

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

Естественно, что локально на Android устройстве данные целесообразно хранить в SQLite базе. Более интересен вопрос синхронизации разных баз. Если бы базовое приложение использовало в качестве СУБД Inrebase, Oracle  или MySQL, то можно было бы подключиться к базе напрямую. При этом, в первом случае для доступа к БД мы могли бы воспользоваться FireDAC, а в случае с Oracle или MySQLUniDAC, или специальными компонентами доступа от DevART (ODAC и MyDAC, соответственно). Однако, в данном случае использовать прямое подключение к базе данных MS Access с мобильного устройства в принципе не возможно. Поэтому в данном случае проще использовать многозвенную архитектуру, а именно DataSnap.

купить UniDACкупить ODAC

И здесь опять возникает вопрос выбора компонентов доступа к БД. Вариантов здесь три. DBExpress, FireDAC и UniDAC. В очередной раз распишусь в своей нелюбви к DBExpress, хотя, возможно, это и субъективно. При использовании FireDAC в “классической” схеме DataSnap никаких дополнительных телодвижений использовать не придется. UniDAC использовать “в лоб” не получится, однако, этот набор компонентов так же работает с DataSnap и внятные описания имеются. Коммерческую составляющую, которая может отразится на выборе, я оставлю “за бортом”, поскольку в моем случае она не имеет значения.

купить RAD Studioкупить Delphi

Что касается репликации данных, то здесь мне повезло. Имеющийся функционал Windows приложения предполагает возможность синхронизации данных из разных баз. Соответственно, структура базы оптимизирована для репликации. Для каждой из значимых таблиц имеются уникальные идентификаторы. Так же реализованы алгоритмы синхронизации.

Если оценивать уровень сложности субъективно, то в принципе, на уровне технологии приложение должно получиться не особо сложным. Естественно, многое зависит от логики самого приложения и сложности структуры БД.

На текущий момент я сделал небольшой тестовый пример подключения к мобильного Android приложения с БД MS Access с помощью FireDAC. Так же, думаю, будет целесообразно разобраться с тем как работает с DataSnap UniDAC. Эти примеры я планирую опубликовать в следующих постах. И, естественно, для полноты картины собираюсь сделать небольшой пример репликации данных.

Интересно узнать у читателей блога, приходилось ли им решать подобную задачу и какой подход вы при этом избрали.

Вышло обновление FireDAC для пользователей XE4. Данное обновление распространяется сразу в трех редакциях, в зависимости от того, какая используется редакция базового продукта.

FireDAC XE4 Update 2 for RAD Studio Pro & Delphi Pro w/ Mobile

Доступна только зарегистрированным пользователям  Professional редакции Delphi XE4 с Mobile Add-On Pack, Professional редакции RAD Studio XE4 или Embarcadero All-Access XE Bronze level.

FireDAC XE4 Update 2 for RAD Studio/Delphi/C++ Ent/Ult/Arch

Доступна только зарегистрированным пользователям Enterprise, Ultimate или Architect редакций  Delphi XE4, C++Builder XE4 или RAD Studio XE4 или Embarcadero All-Access XE Silver level и выше.

Напоминаю, что до 28 июня вы можете воспользоваться скидкой на продукты Embarcadero редакции XE4, а также получить дополнительные продукты на сумму $300. В том числе вы можете приобрести:

Ознакомиться с ценами для всех редакций и купить Delphi XE4 и RAD Studio XE4.

Создание FireMonkey приложения с использованием FireDAC. #0

Создание FireMonkey приложения с использованием FireDAC. #0.5

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

Простой редактор данных в таблице, обычно является частью комплексного приложения. Для редактирования таблиц я обычно использую отдельную форму. Начнем со списка продуктов.  Прежде всего, нам необходимо создать DataSet для доступа к данным таблицы. В нашем случае вполне можно воспользоваться компонентом TADTable. Поместим его в DataModule и укажем значение свойства Connection. В редакторе свойства TableName появится список таблиц, из которого выбираем таблицу Products. Если вы все сделали правильно, то сможете присвоить свойству Active значение True. Компонент лучше сразу переименовать (например, ADTProduct). После этого я, обычно, создаю для DataSet’а набор полей. Вызываем редактор полей (двойное нажатие мыши на компоненте) и в контекстном меню выбираем пункт Add All Fields.

(в настоящее время ссылка не доступна)

Для тех, кто не в курсе поясню суть данной операции. Здесь мы создаем предустановленный набор полей DataSet’a. Если мы этого не сделаем вручную в режиме проектирования, то, в принципе, ничего страшного не произойдет. В RunTime этот набор будет создан автоматически. Но я, все же, предпочитаю создавать его вручную. Причин тому несколько. Во-первых, так удобнее управлять набором полей, ведь мы можем создавать дополнительные (вычисляемые или lookUp) поля самостоятельно в режиме проектирования. Можем так же менять свойства самих полей. А кроме того, мы получаем возможность обращаться в коде к полям по имени компонента TField, что, на мой взгляд, существенно упрощает написание кода.

Как и в случае с VCL приложением, подключим к набору данных компонент TDataSource. Этот компонент обеспечит связь между набором данных и визуальными элементами управления. Свойство DataSet компонента должно ссылаться на наш набор данных (ADTProduct). Ниже я привожу фрагмент DFM файла

 

  object ADTProduct: TADTable
    IndexFieldNames = 'ID'
    Connection = ADConnection
    UpdateOptions.UpdateTableName = 'Product'
    TableName = 'Product'
    Left = 64
    Top = 192
    object ADTProductID: TADAutoIncField
      FieldName = 'ID'
      Origin = 'ID'
      ProviderFlags = [pfInWhere, pfInKey]
      ReadOnly = True
    end
    object ADTProductTitle: TStringField
      FieldName = 'Title'
      Origin = 'Title'
      Size = 50
    end

  object dsProduct: TDataSource
    DataSet = ADTProduct
    Left = 120
    Top = 192
  end

Обратите внимание на одну любопытную особенность, файл формы DataModule сохраняется не в формате FMX, как обычная FireMonkey форма, а в формате DFM, как и в VCL.

Следующим шагом будет создание процедуры открытия набора данных, которую мы должны будем вызывать в RunTime при запуске программы. Создадим ее в том же DataModul’е. Код процедуры предельно прост:

procedure TDM.ConnectToDB;
begin
  ADConnection.Open();
  ADTProduct.Open();
end;

Вызов процедуры разместим в обработчике события OnCreate для DataModule. Читать далее

Вдогонку к предыдущему посту. Вопрос об именах таблиц.

Попытаюсь объяснить логику.

Если соблюдать все рекомендации по разработке приложений, то начинать следует с модели предметной области. Существует несколько разных подходов к моделированию и разных видов моделей. Остановимся на одном из самых популярных видов – ER модели, предполагающей определение сущностей и связей между ними. Обычно имена сущностей выражаются существительным в единственном числе.

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

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

Очевидно, что первой сущностью будет сам ПРОДУКТ. Ведь набор наименований продуктов, в принципе, конечен. Да и при автоматизации процесса их удобно выбирать из предустановленного списка.

Я берусь утверждать, что сам листок с записями так же следует выделить в качестве сущности. Я завел машину и тут мне позвонил сосед. Ты, мол в супермаркет? Купи мне пиво и хлеб (с)… И я беру второй лист бумаги и пишу: “Продукты для соседа”. Ставлю дату (вот уже два атрибута у сущности!) и записываю чего он там хочет… Как означить эту сущность? СПИСОК ПРОДУКТОВ – плохая идея. Хотя бы потому, что набор экземпляров сущности ПРОДУКТ тоже а некотором смысле список продуктов. Поэтому более удачным названием будет СПИСОК ПОКУПОК (насколько может быть удачным имя сущности, содержащее слово СПИСОК).

Но нам потребуется и третья сущность. По идее, две первые сущности связаны отношением много-много, и на уровне логической модели ничего добавлять не надо. Но, у нас завис такой атрибут как количество покупаемого продукта. Поэтому вводим сущность, соответствующую записи в списке покупок. И опять логично бы было назвать эту сущность СПИСОК ПРОДУКТОВ и опять это не совсем хорошая идея. Я просто решил обозначить эту сущность комбинацией имен связанных сущностей – СПИСОК ПОКУПОК – ПРОДУКТ. А, поскольку это не совсем удобочитаемо, то просто – СПИСОК-ПРОДУКТ.

Возможно, название ПУНКТ СПИСКА ПРОДУКТОВ (Shoping List Item) тоже имеет право на существование.

ERModel

Теперь на основе полученной модели надо создать таблицы. Естественно, что их имена должны либо транслитерироваться, либо переводиться. Я выбрал последний вариант.

Product, ShopingList, List_Product.

По сути, все “правила” именования сущностей и таблиц носят исключительно рекомендательный характер. И говорить о том, что они названы правильно или не правильно, не совсем корректно. Основной критерий здесь, на мой взгляд, удобство.

Ну, и в контексте данного поста напомню о DB Meta Studio – утилите, которая позволяет вставлять в код элементы структуры БД по заранее заданному шаблону. Читатели моего блога могут получить утилиту в подарок.

Отдельное спасибо Николаю Звереву за присланный отзыв о DB Meta Studio.

Очередной небольшой пост-шпаргалка.

Как и большинство компонентов доступа к БД, FireDAC позволяет получить списки имен таблиц и полей. Однако, отличительной особенностью FireDAC является то, что при получении этих списков, в случае, если имя поля совпадает с ключевыми словами SQL, оно заключается в квадратные скобки. Это можно использовать для анализа структуры БД и поиска “проблемных имен полей”. К слову, если структура БД составлена не достаточно аккуратно, такие поля могут доставить массу неприятностей при отладке SQL запросов.

Все действительно довольно просто. Я покажу как решить задачу на примере СУБД MS Access. Принципиальных отличий при работе с другими СУБД быть не должно. Поместим на форму три компонента:

ADConnection: TADConnection;
ADPhysMSAccessDriverLink1: TADPhysMSAccessDriverLink;
ADGUIxWaitCursor1: TADGUIxWaitCursor;

Настроим подключение ADConnection с помощью редактора. Так же расположим на форме кнопку и компонент Memo. Обработаем нажатие кнопки следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
var
Lst, fldLst: TStrings;
tblName, fldName: string;
begin
try
  Lst:= TStringList.Create;
  ADConnection.Connected:= True;
  ADConnection.GetTableNames(  '', '', '', Lst, [osMy],[tkTable, tkTempTable, tkLocalTable]);
  for tblName in Lst do
  begin
   try
   FldLst:= TStringList.Create;
   ADConnection.GetFieldNames('', '', tblName, '', FldLst);
   for fldName in fldLst do
   begin
     if Pos('[', fldName)=1 then
     begin
       Memo1.Lines.Add(tblName+ ' --> '+fldName);
     end;
   end;

   finally
    FreeAndNil(fldLst);
   end;
  end;

finally
  FreeAndNil(Lst);
end;
end;

Как видно из кода, списки имен таблиц и полей формируются при помощи двух методов (GetTableNames и GetFieldNames). Если имя поля заключено в квадратные скобки, оно выводится в Memo.  Результат выполнения данного кода может вас изрядно удивить.

tblCompanies –> [Currency]
tblCompanies_PDA –> [Password]
tblDeleted –> [Unique]
tblEmployee_tblVariables –> [Value]
tblEmployees –> [Password]
tblModifications –> [Unique]
tblProjects_PDA –> [Password]
tblSchedule –> [Unique]
tblTiming –> [Unique]
tblTiming_PDA –> [Unique]
tblTiming_PDA –> [Password]
tblVariables –> [Value]

А самое интересное, что попытка обратиться к этим полям непосредственно из MS Access без использования квадратных скобок вызывает ошибку.

В заключение хочу напомнить, что 22 мая 2013 г. заканчивается время действия вводной скидки на Delphi, C++Builder и RAD Studio XE4.

Купить сейчас и сэкономить 10%.

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика