Como fazer a consistência de dados com componentes dataware ?
28/03/2018
0
Oi pessoal...
Possuo um componente FDQuery (FireDAC) em um DataModule. A partir desse componente foi criado um formulário de CRUD. Gostaria de fazer a consistência de um dos DBEdits desse formulário, verificando se o conteúdo do mesmo já se encontra cadastrado na tabela, para impedir cadastro em duplicidade. Sei que dá para usar o evento OnBeforePost do FDQuery. Referenciei no DataModule o arquivo ".pas" dessa tela de CRUD e, mesmo assim, ao executar o método Locate do componente FDQuery estou obtendo MemoryLeak. Depurando o código verifiquei que a propriedade do componente está retornando "Inaccessible Value". Onde será que estou errando ? A parte do código segue abaixo:
procedure Tdm.qryConsultaBeforePost(DataSet: TDataSet);
var bLoc: Boolean;
sNome: String;
begin
sNome := Trim(frmCadNome.edtNome.Field.AsString); ===> AQUI OCORRE O ERRO - Tentando buscar o valor digitado no DBEdit pela propriedade Field.
bLoc := qryConsulta.Locate('Nome', sNome,[loCaseInsensitive]);
if bLoc then
raise Exception.Create('Nome já cadastrado !');
end;
Grato por qualquer ajuda.
Possuo um componente FDQuery (FireDAC) em um DataModule. A partir desse componente foi criado um formulário de CRUD. Gostaria de fazer a consistência de um dos DBEdits desse formulário, verificando se o conteúdo do mesmo já se encontra cadastrado na tabela, para impedir cadastro em duplicidade. Sei que dá para usar o evento OnBeforePost do FDQuery. Referenciei no DataModule o arquivo ".pas" dessa tela de CRUD e, mesmo assim, ao executar o método Locate do componente FDQuery estou obtendo MemoryLeak. Depurando o código verifiquei que a propriedade do componente está retornando "Inaccessible Value". Onde será que estou errando ? A parte do código segue abaixo:
procedure Tdm.qryConsultaBeforePost(DataSet: TDataSet);
var bLoc: Boolean;
sNome: String;
begin
sNome := Trim(frmCadNome.edtNome.Field.AsString); ===> AQUI OCORRE O ERRO - Tentando buscar o valor digitado no DBEdit pela propriedade Field.
bLoc := qryConsulta.Locate('Nome', sNome,[loCaseInsensitive]);
if bLoc then
raise Exception.Create('Nome já cadastrado !');
end;
Grato por qualquer ajuda.
Adalberto Brasaca
Curtir tópico
+ 0
Responder
Post mais votado
29/03/2018
Fala Adalberto, blz? Em casos de validação como esta, em que você está verificando dados da própria tabela que está sendo manipulada, o ideal é você, por exemplo, usar um FDQuery a parte, fazendo uma consulta SQL ao banco, e não utilizando Locate. O Locate faz uso dos dados em memória, logo, você teria que fazer um clone da Query que está sendo usada no CRUD para que funcionasse da forma ideal que você deseja.
Espero que tenha te ajudado.
Abraço!
Espero que tenha te ajudado.
Abraço!
Fabricio Kawata
Responder
Mais Posts
30/03/2018
Adalberto Brasaca
Bom dia, Fabricio. Muito obrigado pela contribuição. Ajudou e muito ! Grande abraço.
Responder
Clique aqui para fazer login e interagir na Comunidade :)