Como fazer a consistência de dados com componentes dataware ?
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
Curtidas 0
Melhor post
Fabricio Kawata
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!
GOSTEI 1
Mais Respostas
Adalberto Brasaca
28/03/2018
Bom dia, Fabricio. Muito obrigado pela contribuição. Ajudou e muito ! Grande abraço.
GOSTEI 0