ORMBr Fórum - Seja bem vindo
Erro em ormbr.dataset.bind - 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 em ormbr.dataset.bind (/showthread.php?tid=51)



Erro em ormbr.dataset.bind - Osiel Gomes - 24-05-2018

Pessoal tenho o seguinte código:

  containerContaPagar := TContainerFDMemTable<TModelContaPagar>.Create(Fconn.Conn, AQuery);
  containerTipoConta  := TContainerFDMemTable<TModelTIPOCONTA>.Create(Fconn.Conn, AQueryTipoConta, containerContaPagar.This);

O detalhe é que no meu Model do TModelContaPagar tem a seguinte Association:

 [Association(OneToOne,'ID_TIPO_CONTA','TIPO_CONTA','ID')]
 property TIPO_CONTA: TModelTIPOCONTA read FTIPOCONTA write FTIPOCONTA;

Acontece que se eu deixar essa duas linhas descomentadas ele dá erro de access violation que eu ainda não entendi o porque, o erro dá dentro da classe ormbr.dataset.bind
linhha 330 dentro da procedure TBindDataSet.SetFieldToProperty(ADataSet: TDataSet; AObject: TObject); exatamente em   LColumns := TMappingExplorer.GetInstance.GetMappingColumn(AObject.ClassType);
o engraçado que se eu habilitar as duas linhas ele fica passando várias vezes até dar o erro.


Banco Firebird 3.0
Alguma luz?


RE: Erro em ormbr.dataset.bind - Isaque Pinheiro - 24-05-2018

(24-05-2018, 12:51 AM)Osiel Gomes Escreveu: Pessoal tenho o seguinte código:

  containerContaPagar := TContainerFDMemTable<TModelContaPagar>.Create(Fconn.Conn, AQuery);
  containerTipoConta  := TContainerFDMemTable<TModelTIPOCONTA>.Create(Fconn.Conn, AQueryTipoConta, containerContaPagar.This);

O detalhe é que no meu Model do TModelContaPagar tem a seguinte Association:

 [Association(OneToOne,'ID_TIPO_CONTA','TIPO_CONTA','ID')]
 property TIPO_CONTA: TModelTIPOCONTA read FTIPOCONTA write FTIPOCONTA;

Acontece que se eu deixar essa duas linhas descomentadas ele dá erro de access violation que eu ainda não entendi o porque, o erro dá dentro da classe ormbr.dataset.bind
linhha 330 dentro da procedure TBindDataSet.SetFieldToProperty(ADataSet: TDataSet; AObject: TObject); exatamente em   LColumns := TMappingExplorer.GetInstance.GetMappingColumn(AObject.ClassType);
o engraçado que se eu habilitar as duas linhas ele fica passando várias vezes até dar o erro.


Banco Firebird 3.0
Alguma luz?

Osiel, a extração de metadata do Firebird 3.0 é diferente das versões anteriores, na unit ormbr.metadata.firebird.pas tem os comandos SQL para extração, para o Firebird 3.0 tem que se criar uma unit ormbr.metadata.firebird3.pas  herdando a classe da seguinte forma TCatalogMetadataFirebird3  = class(TCatalogMetadataFirebird) e testar cada comando para analisar onde mudou


RE: Erro em ormbr.dataset.bind - Osiel Gomes - 25-10-2018

(24-05-2018, 08:13 AM)Isaque Pinheiro Escreveu:
(24-05-2018, 12:51 AM)Osiel Gomes Escreveu: Pessoal tenho o seguinte código:

  containerContaPagar := TContainerFDMemTable<TModelContaPagar>.Create(Fconn.Conn, AQuery);
  containerTipoConta  := TContainerFDMemTable<TModelTIPOCONTA>.Create(Fconn.Conn, AQueryTipoConta, containerContaPagar.This);

O detalhe é que no meu Model do TModelContaPagar tem a seguinte Association:

 [Association(OneToOne,'ID_TIPO_CONTA','TIPO_CONTA','ID')]
 property TIPO_CONTA: TModelTIPOCONTA read FTIPOCONTA write FTIPOCONTA;

Acontece que se eu deixar essa duas linhas descomentadas ele dá erro de access violation que eu ainda não entendi o porque, o erro dá dentro da classe ormbr.dataset.bind
linhha 330 dentro da procedure TBindDataSet.SetFieldToProperty(ADataSet: TDataSet; AObject: TObject); exatamente em   LColumns := TMappingExplorer.GetInstance.GetMappingColumn(AObject.ClassType);
o engraçado que se eu habilitar as duas linhas ele fica passando várias vezes até dar o erro.


Banco Firebird 3.0
Alguma luz?

Osiel, a extração de metadata do Firebird 3.0 é diferente das versões anteriores, na unit ormbr.metadata.firebird.pas tem os comandos SQL para extração, para o Firebird 3.0 tem que se criar uma unit ormbr.metadata.firebird3.pas  herdando a classe da seguinte forma TCatalogMetadataFirebird3  = class(TCatalogMetadataFirebird) e testar cada comando para analisar onde mudou


Boa noite!!!

Isaque eu ainda encontro esse problema e agora na versão Firebird 2.5 e baixei os fontes mais atuais do GIT.


RE: Erro em ormbr.dataset.bind - Isaque Pinheiro - 26-10-2018

(25-10-2018, 08:37 PM)Osiel Gomes Escreveu:
(24-05-2018, 08:13 AM)Isaque Pinheiro Escreveu:
(24-05-2018, 12:51 AM)Osiel Gomes Escreveu: Pessoal tenho o seguinte código:

  containerContaPagar := TContainerFDMemTable<TModelContaPagar>.Create(Fconn.Conn, AQuery);
  containerTipoConta  := TContainerFDMemTable<TModelTIPOCONTA>.Create(Fconn.Conn, AQueryTipoConta, containerContaPagar.This);

O detalhe é que no meu Model do TModelContaPagar tem a seguinte Association:

 [Association(OneToOne,'ID_TIPO_CONTA','TIPO_CONTA','ID')]
 property TIPO_CONTA: TModelTIPOCONTA read FTIPOCONTA write FTIPOCONTA;

Acontece que se eu deixar essa duas linhas descomentadas ele dá erro de access violation que eu ainda não entendi o porque, o erro dá dentro da classe ormbr.dataset.bind
linhha 330 dentro da procedure TBindDataSet.SetFieldToProperty(ADataSet: TDataSet; AObject: TObject); exatamente em   LColumns := TMappingExplorer.GetInstance.GetMappingColumn(AObject.ClassType);
o engraçado que se eu habilitar as duas linhas ele fica passando várias vezes até dar o erro.


Banco Firebird 3.0
Alguma luz?

Osiel, a extração de metadata do Firebird 3.0 é diferente das versões anteriores, na unit ormbr.metadata.firebird.pas tem os comandos SQL para extração, para o Firebird 3.0 tem que se criar uma unit ormbr.metadata.firebird3.pas  herdando a classe da seguinte forma TCatalogMetadataFirebird3  = class(TCatalogMetadataFirebird) e testar cada comando para analisar onde mudou


Boa noite!!!

Isaque eu ainda encontro esse problema e agora na versão Firebird 2.5 e baixei os fontes mais atuais do GIT.

Vamos lá

Você tem a Classe TModelContasPagar certo e tem a TModelTIPOCONTA que é uma filha dela blz. Agora vc criou o método construtor "Create()" em TModelContasPagar e nele instanciou TModelTIPOCONTA?

Assim:

constructor Create()
begin
   FTIPOCONTA := TModelTIPOCONTA.Create;
end;

dstructor Destroy()
begin
   FTIPOCONTA.Free;
end;



RE: Erro em ormbr.dataset.bind - Osiel Gomes - 19-11-2018

Exatamente isso Isaque...

E agora eu refiz vários testes e peguei o exemplo do Firedac e ainda continuo com erro, agora olha que estranho se eu edito um registro ele só grava ou seja só da o comando UPDATE se eu colocar essas linhas no fonte:

oContainerMaster.DataSet.Post;
oContainerMaster.ApplyUpdates(0);

Em seguida se eu eu dar um oContainerMaster.Append preencho dois edit e dou
oContainerMaster.DataSet.Post;
oContainerMaster.ApplyUpdates(0);

Ele dá acess violation, minha configuração do banco esta assim
Código:
{Teste}
   // Instância da class de conexão via FireDAC
  oConn := TFactoryFireDAC.Create(Connection, dnFirebird);
  oConn.SetCommandMonitor(TFSQLMonitor.GetInstance);
  TFSQLMonitor.GetInstance.Show;
  // Master
  oContainerMaster := TContainerFDMemTable<TModelContaPagar>.Create(oConn, CDSFDMaster, 3);
  // Client
  oContainerClient := TContainerFDMemTable<TModelTipoConta>.Create(oConn, CDSFDClient, oContainerMaster.This);
  oContainerMaster.Open;
  {Fim}

Minha entidade (create) TModelContaPagar
constructor TModelContaPagar.Create(AQuery, AQueryTipoConta: TFDMemTable);
begin
  FTIPOCONTA := TModelTIPOCONTA.Create;
end;


Relacionamentos da entidade
Declaração variáveis
  private
    { Private declarations }
    FID: Integer;
    FDATA_CONTA: Nullable<TDateTime>;
    FVALOR_CONTA: Nullable<Double>;
    FID_TIPO_CONTA: Integer;
    FTIPOCONTA: TModelTIPOCONTA;

Meu public

[Column('ID_TIPO_CONTA', ftInteger)]
//    [ForeignKey('FK_CONTA_PAGAR_1', 'ID_TIPO_CONTA', 'TIPO_CONTA', 'ID')]
    [Dictionary('Tipo Conta', 'Mensagem de validação', '', '', '', taCenter)]
    property ID_TIPO_CONTA: Integer read FID_TIPO_CONTA write FID_TIPO_CONTA;


    [Restrictions([NoInsert, NoUpdate])]
    [Column('DESCRICAO', ftString, 60)]
    [JoinColumn('id_tipo_conta', 'TIPO_CONTA', 'ID', 'DESCRICAO', InnerJoin)]
    [Dictionary('Descrição Conta')]
    property TipoConta_Descricao: string read GETFTIPOCONTA_DESCRICAO ;

    [Association(OneToOne,'ID_TIPO_CONTA','TIPO_CONTA','ID')]
    property TIPO_CONTA: TModelTIPOCONTA read FTIPOCONTA write FTIPOCONTA;
Banco Firebird 2.5 - Tokyo 10.2.3 - Fontes do dia 20/10/2018

Alguma ideia?


RE: Erro em ormbr.dataset.bind - Isaque Pinheiro - 01-03-2019

(19-11-2018, 10:15 PM)Osiel Gomes Escreveu: Exatamente isso Isaque...

E agora eu refiz vários testes e peguei o exemplo do Firedac e ainda continuo com erro, agora olha que estranho se eu edito um registro ele só grava ou seja só da o comando UPDATE se eu colocar essas linhas no fonte:

 oContainerMaster.DataSet.Post;
 oContainerMaster.ApplyUpdates(0);

Em seguida se eu eu dar um   oContainerMaster.Append preencho dois edit e dou  
 oContainerMaster.DataSet.Post;
 oContainerMaster.ApplyUpdates(0);

Ele dá acess violation, minha configuração do banco esta assim
Código:
{Teste}
  // Instância da class de conexão via FireDAC
 oConn := TFactoryFireDAC.Create(Connection, dnFirebird);
 oConn.SetCommandMonitor(TFSQLMonitor.GetInstance);
 TFSQLMonitor.GetInstance.Show;
 // Master
 oContainerMaster := TContainerFDMemTable<TModelContaPagar>.Create(oConn, CDSFDMaster, 3);
 // Client
 oContainerClient := TContainerFDMemTable<TModelTipoConta>.Create(oConn, CDSFDClient, oContainerMaster.This);
 oContainerMaster.Open;
 {Fim}

Minha entidade (create) TModelContaPagar
constructor TModelContaPagar.Create(AQuery, AQueryTipoConta: TFDMemTable);
begin
 FTIPOCONTA := TModelTIPOCONTA.Create;
end;


Relacionamentos da entidade
Declaração variáveis
 private
   { Private declarations }
   FID: Integer;
   FDATA_CONTA: Nullable<TDateTime>;
   FVALOR_CONTA: Nullable<Double>;
   FID_TIPO_CONTA: Integer;
   FTIPOCONTA: TModelTIPOCONTA;

Meu public

[Column('ID_TIPO_CONTA', ftInteger)]
//    [ForeignKey('FK_CONTA_PAGAR_1', 'ID_TIPO_CONTA', 'TIPO_CONTA', 'ID')]
   [Dictionary('Tipo Conta', 'Mensagem de validação', '', '', '', taCenter)]
   property ID_TIPO_CONTA: Integer read FID_TIPO_CONTA write FID_TIPO_CONTA;


   [Restrictions([NoInsert, NoUpdate])]
   [Column('DESCRICAO', ftString, 60)]
   [JoinColumn('id_tipo_conta', 'TIPO_CONTA', 'ID', 'DESCRICAO', InnerJoin)]
   [Dictionary('Descrição Conta')]
   property TipoConta_Descricao: string read GETFTIPOCONTA_DESCRICAO ;

   [Association(OneToOne,'ID_TIPO_CONTA','TIPO_CONTA','ID')]
   property TIPO_CONTA: TModelTIPOCONTA read FTIPOCONTA write FTIPOCONTA;
Banco Firebird 2.5 - Tokyo 10.2.3 - Fontes do dia 20/10/2018

Alguma ideia?
Depois de algum tempo, descobri que acontece AV quando no seu modelo não foi definido um PK, mas foi definido como AutoInc, essa situação foi tratada.