Tipos BCD y FMTBCD en 10.3 Río

Aspectos teóricos

La versión 10.3 de Delphi y C++ trajo una serie de optimizaciones en RTL y también en el área de acceso a datos. Muchos drivers han sido actualizados y / o optimizados, como podemos observar en la lista de novedades de esta versión.

Entre ellas, se realizó un ajuste en la asignación de los campos de tipo BCD y FMTBCD. Podemos decir que a partir del 10.3, la definición entre BCD y FMTBCD sigue los estándares definidos para este dos tipos de datos, lo que no ocurría en versiones anteriores de acuerdo con la base de datos utilizada.

Haciendo un resumen, el BCD (binary-coded decimal) proporciona mayor precisión y exactitud que los números de punto flotante. Su empleo se determinará en función del tipo de datos y de la precisión definidos en la base de datos.

La diferencia entre BCD (técnicamente TBCDField) y FMTBCD (técnicamente TFMTBCDField) está directamente relacionada con el número de decimales y dígitos significativos empleados.

Un BCD soportará números con hasta 20 dígitos significativos y 4 decimales. Además, se utilizará un FMTBCD. En la práctica, internamente, el BCD será tratado como un “Currency” por cuestiones de rendimiento, y un FMTBCD será efectivamente un binary-coded decimal en el aspecto estricto de su definición.

Posibles impactos en su proyecto

Si por ventura, en una migración de versión para el 10.3 Río, su aplicación “reclamar” de que los campos anteriormente asignados como BCD ahora deberían ser FMTBCD, eso se debe a las optimizaciones antes mencionadas.

Para mantener todo lo que estaba, es decir, que Delphi y C ++ continúen asignando los campos como BCD, y no traten de llevarlos a FMTBCD, puede ajustar las siguientes configuraciones en FireDAC:

1) ajuste la propiedad FDQuery.FormatOptions.MaxBcdPrecision a un valor superior al predeterminado, como 20 por ejemplo.

2) ajuste la propiedad FDQuery.FieldOptions.UpdatePersistent a True

En teoría, todo lo que estaba funcionando correctamente así permanecerá, sin perjuicio para su proyecto. Para nuevos proyectos o adiciones de nuevos conjuntos de datos, es recomendable adoptar el mapeo por defecto generado por la herramienta.

screen shot 2019-01-12 at 20.51.44

 

Tipos BCD e FMTBCD no 10.3 Rio

Aspectos Teóricos

A versão 10.3 do Delphi e C++ trouxe uma série de otimizações na RTL e também na área de acesso a dados. Muitos drivers foram atualizados e/ou otimizados, como podemos observar na lista de novidades desta versão.

Entre elas, ocorreu um ajuste no mapeamento dos campos de tipo BCD e FMTBCD. Podemos dizer que a partir do 10.3, a definição entre BCD e FMTBCD segue a risca os padrões definidos para este dois tipos de dados, o que não ocorria em versões anteriores de acordo com o banco de dados utilizado.

Fazendo um resumo, o BCD (binary-coded decimal) fornece maior precisão e acuracidade do que os números de ponto flutuante. Seu emprego será determinado em função do tipo de dado e da precisão definidas no banco de dados.

A diferença entre BCD (tecnicamente TBCDField) e FMTBCD (tecnicamente TFMTBCDField) está diretamente relacionada ao número de casas decimais e dígitos significativos empregados.

Um BCD suportará números com até 20 dígitos significativos e 4 casas decimais. Para além disso, um FMTBCD será empregado. Na prática, internamente, o BCD será tratado como um “Currency” por questões de performance, e um FMTBCD será efetivamente um binary-coded decimal  no aspecto estrito de sua definição.

Possíveis impactos em seu projeto

Se por ventura, em uma migração de versão para o 10.3 Rio, sua aplicação “reclamar” de que os campos anteriormente mapeados como BCD agora deveriam ser FMTBCD, isso se deve as otimizações acima mencionadas.

Para manter tudo como estava, ou seja, fazer com que o Delphi e o C++ continuem a mapear os campos como BCD, e não tentem levá-los para FMTBCD, você poderá ajustar as seguintes configurações no FireDAC:

1) ajuste a propriedade FDQuery.FormatOptions.MaxBcdPrecision para um valor superior ao default, como 20 por exemplo.

2) ajuste a propriedade FDQuery.FieldOptions.UpdatePersistent para True

Em teoria, tudo o que estava funcionando corretamente assim permanecerá, sem prejuízo para seu projeto. Para novos projetos ou adições de novos conjuntos de dados, é recomendável adotar o mapeamento default gerado pela ferramenta.

screen shot 2019-01-12 at 20.51.44

Um Mecanismo de Cache de Dados para DataSnap

Hoje pela manhã, durante o Delphi Academy, discutimos sobre cache de dados para DataSnap. Basicamente o cenário onde você tem tabelas que sofrem nenhuma ou poucas alterações ao longo do período, as quais você não precisa refazer a consulta a todo tempo, para todos os usuários.

Estou disponibilizando o exemplo abaixo, mas em um resumo, temos o seguinte:

  • Em uma aplicação DataSnap REST, adicionar um DataModule e configurar seu LifeCycle para Server, no ServerContainer. Com isso, ele terá uma única instância durante o ciclo de vida da aplicação
  • Neste DataModule, coloque um MemTable (ou Clientdataset se preferir) para cada tabela que deseja manter em cache
  • Defina uma conexão ao banco, e métodos (ou componentes para a execução das queries) para executar as consultas e carregar as tabelas em memória
  • Adicione um TFDEventAlerter e faça as devidas configurações: http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.Client.TFDEventAlerter
  • Crie triggers de INSERT/UPDATE/DELETE que fará o “POST_EVENT” com o nome do evento alertando que a tabela sofreu alguma alteração. Este mesmo mecanismo está disponível para a maioria dos banco de dados: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Database_Alerts_(FireDAC)
  • No evento do OnAlert do  TFDEventAlerter, faça o refresh das tabelas e atualização dos datasets em memória

Com isso, você tem um mecanismo seguro e prático para manter as tabelas em memória sempre atualizadas.

Screen Shot 2017-05-30 at 17.34.14Screen Shot 2017-05-30 at 17.34.21

Os exemplos atualizados estão nestes links:

 

Traga suas aplicações para o Futuro!!!

Recentemente tivemos um Webinar sobre migração de aplicações Delphi para o XE5.

Caso o tenha perdido, já é possível acessar o replay através deste link:

http://forms.embarcadero.com/LA14Q1BRBDEApplicationstotheFuture

Também estão disponíveis os exemplos apresentados aqui:

http://cc.embarcadero.com/item/29777

Abraços e até o próximo!

FireDAC: Multi-Device data access for Delphi, C++Builder and RAD Studio

Estamos muito felizes em anunciar  a disponibilidade imediata do FireDAC para Delphi, C++ Builder e RAD Studio: http://www.embarcadero.com/products/rad-studio/firedac.

Mas o que é FireDAC?

FireDAC é uma biblioteca de acesso universal de dados para o desenvolvimento de aplicativos para múltiplos dispositivos, conectados a bancos de dados corporativos. Com sua poderosa arquitetura universal, FireDAC permite o acesso de alta velocidade nativa direto do Delphi e C++ Builder a uma grande variedade de plataformas de banco de dados, incluindo Oracle, Microsoft SQL Server, IBM DB2, SAP, DataSnap, Sybase SQL Anywhere, InterBase, Advantage Database, PostgreSQL, SQLite, MySQL, Firebird e Microsoft Access.

FireDAC é poderoso e simples de usar, fornecendo todos os recursos necessários para a construção de aplicações de alta performance e disponibilidade. FireDAC oferece uma API comum para acessar banco de dados diferente back-ends, permitindo também acesso a recursos específicos do banco de dados, sem comprometer o desempenho.

As capacidades de conectividade de dados de nível empresarial do Delphi e C++ Builder foi reforçada com FireDAC, oferecendo o desempenho mais rápido disponível, uma seleção ampla de plataformas de banco de dados, maior facilidade de utilização, API universal de acesso a dados, recursos específicos de cada fornecedor de banco de dados e mais. FireDAC suporta múltiplos dispositivos, incluindo clientes Windows e Mac desktop, iOS e Android em 2013.

Principais Recursos

Acesso Nativo

Enterprise
•    Oracle Database
•    Microsoft SQL Server
•    IBM DB2 Server

Workgroup
•    InterBase
•    MySQL Server
•    PostgreSQL
•    Sybase SQL Anywhere
•    Advantage Database
•    Firebird

Cloud
•    Microsoft SQL Azure

Desktop
•    SQLite database
•    Microsoft Access database

Embedded
•    InterBase ToGo
•    SQLite database
•    MySQL Embedded
•    Firebird Embedded

Multi-Tier
•    DataSnap server

Acesso Genérico

Permite conexões de ponte para:
•    dbExpress data sources
•    ODBC data sources

Enterprise
•    Informix Dynamic Server
•    Sybase Adaptive Server Everywhere
•    SAP MaxDB
•    Teradata
•    IBM AS/400

Workgroup
•    Ingres Database
•    Nexus Database

Desktop
•    Microsoft SQL Server CE
•    Embarcadero Blackfish SQL Server
•    Microsoft Excel

Legado
•    MicroFocus Cobol
•    DBase
•    FoxPro
•    Paradox
•    Clarion

Cross Platform
•    Delphi Win32, Win64, Mac OS X x86, iOS
•    C++Builder Win32, Mac OS X    API
•    Fast and Powerful Delphi DataSets
•    ADO.NET-like data engine
•    50 Delphi VCL Components

Unificação
•    Data Types
•    SQL Dialects
•    SQL Script Dialects
•    Data Editing
•    Auto-Incrementing Fields
•    Error Reporting
•    Quoted Identifiers
•    Transaction Support
•    Login and Password Changing
•    Database Event Support
•    Data Moving, Exporting and Importing
•    Metadata Retrieval
•    Records Paging and Counting
•    Master-Detail Relationship

Performance
•    Rowset Fetching
•    Array DML Execution
•    Live Data Window
•    Command Batches
•    Asynchronous Command Execution
•    Command Execution Canceling
•    Metadata Caching
•    Update Commands Caching
•    Connection Pooling
•    DataAbstract Direct mode
•    Faster than dbGo and dbExpress

Avançado
•    Options Inheritance System
•    Automatic Connection Recovery
•    Disconnected Mode
•    Centralized Cached Updates
•    Dataset Persistence
•    International applications
•    DB services (backup, restore, etc)
•    Local SQL Engine

Outros
•    BDE Migration
•    Debugging Support
•    Design Time Support
•    Utilities

Recursos
•    100% source code
•    Help (1500+ topics)
•    FAQ (100+ answers)
•    Demos (80+ projects)