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

Advertisements

3 thoughts on “Tipos BCD e FMTBCD no 10.3 Rio

  1. Pois é, senti na pratica a incompatibilidade com certos tipos, além dos *bcd, também o currency nos TFields e Firebird. Tive que adaptar meu codigo para não usar mais query1.ParambyName(‘xxx’).AsInteger porque se o tipo que envio for byte ou qualquer coisa que para o banco seja confundido com smallint,o Firedac manda uma exception para mim.
    Agora mudei tudo para .Value em detrimento de que havia aprendido que em Delphi sempre que possivel é bom ser deterministico ao invés de usar Variant(.Value ou .AsValue).
    Ótimo que seu artigo esclareceu algumas coisas, já estava achando que era o Delphi com birra apenas comigo.

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s