ORMBr Fórum - Seja bem vindo

Versão Completa: Erro instanciando TContainerClientDataSet com coluna > 31 caracteres e valor default
Esta é uma versão reduzida do nosso conteúdo. Ver versão completa com o formato adequado.
Saudações!

Está ocorrendo um erro quando instancio um TContainerClientDataSet<M> cuja entidade M contenha uma coluna com nome maior que 31 caracteres, conforme exemplo abaixo.
No Dictionary, além de ter o nome grande, a coluna precisa ter um valor default. Sem o valor default o erro não ocorre.

---- Início do exemplo

Classe TPedido:
----

type
  [Entity]
  [Table('pedido', '')]
  [PrimaryKey('codigo', NotInc, NoSort, False, 'Chave primária')]
  Tpedido = class(TInterfacedObject, Ipedido)
  private
    { Private declarations }
    Fcodigo: Integer;

...

    Fvalor_outras_despesas_acessorias: Currency;

...

  public
...

    [Column('valor_outras_despesas_acessorias', ftCurrency)]
    [Dictionary('valor_outras_despesas_acessorias', 'Mensagem de validação', '0', '', '', taRightJustify)]
    property valor_outras_despesas_acessorias: Currency read Fvalor_outras_despesas_acessorias write Fvalor_outras_despesas_acessorias;


Chamada onde ocorre o erro:
------

FContainerPedido := TContainerClientDataSet<TPedido>.Create(FConn.Conn, qryPedido);


Exception:
------

valor_outras_despesas_acessorias: Preparation of default expression failed with error "Violação de acesso ao endereço 009AE939 no módulo 'MeuServer.exe'. Leitura do endereço 00000034"

---- Fim do exemplo

Alguém já passou por esse problema e tem uma solução?
(29-03-2019, 04:02 PM)Odlawso Escreveu: [ -> ]Saudações!

Está ocorrendo um erro quando instancio um TContainerClientDataSet<M> cuja entidade M contenha uma coluna com nome maior que 31 caracteres, conforme exemplo abaixo.
No Dictionary, além de ter o nome grande, a coluna precisa ter um valor default. Sem o valor default o erro não ocorre.

---- Início do exemplo

Classe TPedido:
----

type
  [Entity]
  [Table('pedido', '')]
  [PrimaryKey('codigo', NotInc, NoSort, False, 'Chave primária')]
  Tpedido = class(TInterfacedObject, Ipedido)
  private
    { Private declarations }
    Fcodigo: Integer;

...

    Fvalor_outras_despesas_acessorias: Currency;

...

  public
...

    [Column('valor_outras_despesas_acessorias', ftCurrency)]
    [Dictionary('valor_outras_despesas_acessorias', 'Mensagem de validação', '0', '', '', taRightJustify)]
    property valor_outras_despesas_acessorias: Currency read Fvalor_outras_despesas_acessorias write Fvalor_outras_despesas_acessorias;


Chamada onde ocorre o erro:
------

FContainerPedido := TContainerClientDataSet<TPedido>.Create(FConn.Conn, qryPedido);


Exception:
------

valor_outras_despesas_acessorias: Preparation of default expression failed with error "Violação de acesso ao endereço 009AE939 no módulo 'MeuServer.exe'. Leitura do endereço 00000034"

---- Fim do exemplo

Alguém já passou por esse problema e tem uma solução?

Nunca passei, porque nunca fiz isso, mas veja que o erro é no DefaultExpression do TField, e o ORMBr cria os TFields com os nomes dos atributos Columns() é bem provavel que esse erro possa ser do delphi ao nome longo do TField

Tente mudar somente

[Column('valoroutrasdespesasacessorias', ftCurrency)]
[Dictionary('valoroutrasdespesasacessorias', 'Mensagem de validação', '0', '', '', taRightJustify)]
Obrigado por responder.
Se reduzir o tamanho do nome, não ocorre o problema.
Pesquisei um pouco mais e descobri que o ClientDataSet limita o tamanho máximo dos fields em 31 caracteres (https://forums.embarcadero.com/thread.js...dID=176332) e possivelmente esta é a causa do problema.
Estou contornando o problema usando o TFDMemTable e parece estar funcionando.
Confirmando esta solução volto a postar aqui.
lembre que isso é limitador também em bancos de dados