ORMBr Fórum - Seja bem vindo
Erro instanciando TContainerClientDataSet com coluna > 31 caracteres e valor default - Versão de Impressão

+- ORMBr Fórum - Seja bem vindo (https://www.ormbr.com.br/forum)
+-- Fórum: Fórum ORMBr - Aberto (https://www.ormbr.com.br/forum/forumdisplay.php?fid=1)
+--- Fórum: Usando DataSet (https://www.ormbr.com.br/forum/forumdisplay.php?fid=9)
+--- Tópico: Erro instanciando TContainerClientDataSet com coluna > 31 caracteres e valor default (/showthread.php?tid=71)



Erro instanciando TContainerClientDataSet com coluna > 31 caracteres e valor default - Odlawso - 29-03-2019

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?


RE: Erro instanciando TContainerClientDataSet com coluna > 31 caracteres e valor default - Isaque Pinheiro - 29-03-2019

(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)]


RE: Erro instanciando TContainerClientDataSet com coluna > 31 caracteres e valor default - Odlawso - 29-03-2019

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.jspa?threadID=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.


RE: Erro instanciando TContainerClientDataSet com coluna > 31 caracteres e valor default - juliomar - 04-04-2019

lembre que isso é limitador também em bancos de dados