Pesquisar se a duplicidade de dados antes de salvar
Olá amigos... estou desenvolvendo um programinha para cadastro de funcionarios e separação de mercadorias,o problema é que nao consigo criar um codigo para que na hora q o botão salvar é precionado haja uma pesquisa se ja existe uma matricula igual cadastrada no banco e retorne uma mensagem avisando. Quanto ao codigo que é chave primaria o proprio banco se encarega de encrementar. se alguem puder me ajudar mando as fontes para uma avaliação obrigado.....
Rogerio Sena
Curtidas 0
Respostas
Agricola Ltda
04/04/2011
Opa.. boa tarde,
Primeiro, vc nao vai poder fazer essa pesquisa no proprio dataset que esta utilizando pra gravar.Sugiro a seguinte rotina:
Primeiro, vc nao vai poder fazer essa pesquisa no proprio dataset que esta utilizando pra gravar.Sugiro a seguinte rotina:
procedure BotaoGravarClienteClick(Sender: TObject);
function Valida: Boolean; begin With TSQLQuery.Create(nil) do begin SQLConnection := SeuSQLConection; SQL.Add('select null from clientes '+ ' where matricula = ' + string(Matriculasendogravada) ); Open; result := IsEmpty; Close; Free; end; end;
begin inherited; if valida then begin dataSetdoCliente.post; end else showMessage(Matricula ja existe);end;GOSTEI 0
Rogerio Sena
04/04/2011
Muito obrigado por me responderem eu pensei que nao haveria retorno... Bem sera que eu posso enviar os fontes junto com o banco para que possa ser analisado assim fica mais facil de poderem me ajudar.
GOSTEI 0
Agricola Ltda
04/04/2011
Coloca aki o codigo completo da unit q vc precisa implementar isso que ja da pra montar algo pra vc.
GOSTEI 0
Rogerio Sena
04/04/2011
procedure TFrmFuncionario.btnNovoClick(Sender: TObject);
begin
inherited;
DBEDit2.SetFocus;
end; procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
inherited; btnAlterar.Enabled:=True; end; esse formulario é de erança de um form cadastro padrao,vou colocar como esta o botão novo e salvar do mesmo. procedure TFrmCadastro.btnNovoClick(Sender: TObject);
begin
DataSource1.DataSet.append;
end; procedure TFrmCadastro.btnSalvarClick(Sender: TObject);
var novo,alteracao:boolean;
begin
novo:=(DataSource1.State = dsInsert);
DataSource1.DataSet.Post;
if DataSource1.DataSet is TClientDataSet then
begin
if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)
and novo then
begin
DataSource1.DataSet.Refresh;
if DataSource1.DataSet.RecordCount > 1 then
DataSource1.DataSet.Last;
end;
end;
end;
begin
inherited;
DBEDit2.SetFocus;
end; procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
inherited; btnAlterar.Enabled:=True; end; esse formulario é de erança de um form cadastro padrao,vou colocar como esta o botão novo e salvar do mesmo. procedure TFrmCadastro.btnNovoClick(Sender: TObject);
begin
DataSource1.DataSet.append;
end; procedure TFrmCadastro.btnSalvarClick(Sender: TObject);
var novo,alteracao:boolean;
begin
novo:=(DataSource1.State = dsInsert);
DataSource1.DataSet.Post;
if DataSource1.DataSet is TClientDataSet then
begin
if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)
and novo then
begin
DataSource1.DataSet.Refresh;
if DataSource1.DataSet.RecordCount > 1 then
DataSource1.DataSet.Last;
end;
end;
end;
GOSTEI 0
Rogerio Sena
04/04/2011
Coloca aki o codigo completo da unit q vc precisa implementar isso que ja da pra montar algo pra vc.
[
procedure TFrmFuncionario.btnNovoClick(Sender: TObject);begin
inherited;
DBEDit2.SetFocus;
end; procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
inherited; btnAlterar.Enabled:=True; end; esse formulario é de erança de um form cadastro padrao,vou colocar como esta o botão novo e salvar do mesmo. procedure TFrmCadastro.btnNovoClick(Sender: TObject);
begin
DataSource1.DataSet.append;
end; procedure TFrmCadastro.btnSalvarClick(Sender: TObject);
var novo,alteracao:boolean;
begin
novo:=(DataSource1.State = dsInsert);
DataSource1.DataSet.Post;
if DataSource1.DataSet is TClientDataSet then
begin
if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)
and novo then
begin
DataSource1.DataSet.Refresh;
if DataSource1.DataSet.RecordCount > 1 then
DataSource1.DataSet.Last;
end;
end;
end;
GOSTEI 0
Rogerio Sena
04/04/2011
Coloca aki o codigo completo da unit q vc precisa implementar isso que ja da pra montar algo pra vc.
Amigo eu ainda estou no vazio qt a minha duvida,ja tentei o codigo que sujeriu e nada. sera que tem como fazer de outra maneira?
GOSTEI 0
Dirceu Morais
04/04/2011
Rógerio tente assim:
Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = r True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
Begin
if DMClient.cdsFuncionario.LOCATE('MATRICULA',DBEDIT.text,[]) Then
Begin
Application.MessageBox( ('Matricula já existe no banco de dados!!!'), 'Aviso do sistema', MB_OK + MB_ICONINFORMATION );
btnAlterar.Enabled:=False;
Exit;
end
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
end;
inherited;
btnAlterar.Enabled:=True;
end;Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
GOSTEI 0
Rogerio Sena
04/04/2011
Rógerio tente assim:
Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
amigo vou tentar e retorno obrigado por sua grande ajuda
procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = r True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
Begin
if DMClient.cdsFuncionario.LOCATE('MATRICULA',DBEDIT.text,[]) Then
Begin
Application.MessageBox( ('Matricula já existe no banco de dados!!!'), 'Aviso do sistema', MB_OK + MB_ICONINFORMATION );
btnAlterar.Enabled:=False;
Exit;
end
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
end;
inherited;
btnAlterar.Enabled:=True;
end;Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
GOSTEI 0
Rogerio Sena
04/04/2011
Rógerio tente assim:
Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
amigo vou tentar e retorno obrigado por sua grande ajuda
procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = r True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
Begin
if DMClient.cdsFuncionario.LOCATE('MATRICULA',DBEDIT.text,[]) Then
Begin
Application.MessageBox( ('Matricula já existe no banco de dados!!!'), 'Aviso do sistema', MB_OK + MB_ICONINFORMATION );
btnAlterar.Enabled:=False;
Exit;
end
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
end;
inherited;
btnAlterar.Enabled:=True;
end;Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
GOSTEI 0
Rogerio Sena
04/04/2011
Rógerio tente assim:
Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
amigo vou tentar e retorno obrigado por sua grande ajuda
procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = r True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
Begin
if DMClient.cdsFuncionario.LOCATE('MATRICULA',DBEDIT.text,[]) Then
Begin
Application.MessageBox( ('Matricula já existe no banco de dados!!!'), 'Aviso do sistema', MB_OK + MB_ICONINFORMATION );
btnAlterar.Enabled:=False;
Exit;
end
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
end;
inherited;
btnAlterar.Enabled:=True;
end;Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
GOSTEI 0
Dirceu Morais
04/04/2011
Oque acha de eu enviar os projetinho assim fica melhor para vc me ajudar
Ué se vc quiser me mandar.
Dirceu Morais
GOSTEI 0
Rogerio Sena
04/04/2011
Oque acha de eu enviar os projetinho assim fica melhor para vc me ajudar
Ué se vc quiser me mandar.
Dirceu Morais
GOSTEI 0
Dirceu Morais
04/04/2011
digitosistemas@yahoo.com.br
GOSTEI 0
Rogerio Sena
04/04/2011
digitosistemas@yahoo.com.br
Olá ja enviei o conteudo para que posa dar uma olhada e ver se tem uma solução para o problema obrigado.
GOSTEI 0
Rogerio Sena
04/04/2011
Rógerio tente assim:
Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
amigo vou tentar e retorno obrigado por sua grande ajuda
procedure TFrmFuncionario.btnSalvarClick(Sender: TObject);
begin
if RadioButton1.Checked = r True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
Begin
if DMClient.cdsFuncionario.LOCATE('MATRICULA',DBEDIT.text,[]) Then
Begin
Application.MessageBox( ('Matricula já existe no banco de dados!!!'), 'Aviso do sistema', MB_OK + MB_ICONINFORMATION );
btnAlterar.Enabled:=False;
Exit;
end
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
end;
inherited;
btnAlterar.Enabled:=True;
end;Ps: O DBEDIT.text é o valor do campo onde é digitado o valor da matricula.
Espero ter ajudado.
Dirceu Morais
GOSTEI 0
Eduardo Marcolongo
04/04/2011
vc pode tentar assim:
simpledataset1 = se vc estiver usando dbexpress ou substitua por algum outro componente com a mesma função.
if datasource1.state in [dsinsert] then begin dm.simpledataset1.active := false; dm.simpledataset1.dataset.commandtext := 'select matricula from TABELA where matricula = :par1'; dm.simpledataset1.dataset.params.parambyname('par1').text := dbedit1.text; dm.simpledataset1.active := true; if dm.simples.dataset1.recordcount > 0 then begin application.messagebox('Erro! Já existe um registro com esta matricula','Sistema',mb_iconerror+mb_ok); dm.simpledataset1.active := false; abort; end; dm.simpledataset1.active := false; end;simpledataset1 = se vc estiver usando dbexpress ou substitua por algum outro componente com a mesma função.
GOSTEI 0
Rogerio Sena
04/04/2011
vc pode tentar assim:
simpledataset1 = se vc estiver usando dbexpress ou substitua por algum outro componente com a mesma função.
nao deu certo pois estou usando clientdataset conectado a um SQLDataSet.
mas obrigado por sua atenção vou lutando aqui uma hora dara certo.
Quer que eu envie o s fontes junto com o bd?
if datasource1.state in [dsinsert] then
begin
dm.simpledataset1.active := false;
dm.simpledataset1.dataset.commandtext := 'select matricula from TABELA where matricula = :par1';
dm.simpledataset1.dataset.params.parambyname('par1').text := dbedit1.text;
dm.simpledataset1.active := true;
if dm.simples.dataset1.recordcount > 0 then
begin
application.messagebox('Erro! Já existe um registro com esta matricula','Sistema',mb_iconerror+mb_ok);
dm.simpledataset1.active := false;
abort;
end;
dm.simpledataset1.active := false;
end;
simpledataset1 = se vc estiver usando dbexpress ou substitua por algum outro componente com a mesma função.
GOSTEI 0
Eduardo Marcolongo
04/04/2011
Mas vc pode colocar em seu Data Module um SimpleDataSet e configura-lo sem problemas.Inclusive vc podera utilizar este mesmo componente em outros forms que vc tiver.
GOSTEI 0
Dirceu Morais
04/04/2011
Bom Dia,
Não tive muito tempo de olhar seu todo seu projeto. Mas vi que:
Vc está usando um DBEDIT para verificar se a matricula já existe.
Sempre vai existir!!!! Por que vc grava no banco e depois procura se já existe. Então a resposta sempre vai ser SIM.
Solução:
Ao invés de usar um DBEDIT use um EDIT;
Para procurar se já existe vc usa assim:
if DataSource1.State = dsInsert then
Begin
if DMClient.cdsFuncionario.LOCATE('MATRICULA;TIPOFUNCI', VarArrayOf([EDIT_MATRICULA.text,DBedit4.text]),[]) Then
Begin
Application.MessageBox( ('Matricula já existe no banco de dados!!!'), 'Aviso do sistema', MB_OK + MB_ICONINFORMATION );
btnAlterar.Enabled:=False;
Exit;
end;
DMClient.cdsFuncionario.Params [0].Text:= edit_matricula.text;
end;
Atenciosamente,
Dirceu Morais
Não tive muito tempo de olhar seu todo seu projeto. Mas vi que:
Vc está usando um DBEDIT para verificar se a matricula já existe.
Sempre vai existir!!!! Por que vc grava no banco e depois procura se já existe. Então a resposta sempre vai ser SIM.
Solução:
Ao invés de usar um DBEDIT use um EDIT;
Para procurar se já existe vc usa assim:
if DataSource1.State = dsInsert then
Begin
if DMClient.cdsFuncionario.LOCATE('MATRICULA;TIPOFUNCI', VarArrayOf([EDIT_MATRICULA.text,DBedit4.text]),[]) Then
Begin
Application.MessageBox( ('Matricula já existe no banco de dados!!!'), 'Aviso do sistema', MB_OK + MB_ICONINFORMATION );
btnAlterar.Enabled:=False;
Exit;
end;
DMClient.cdsFuncionario.Params [0].Text:= edit_matricula.text;
end;
Atenciosamente,
Dirceu Morais
GOSTEI 0
Daniel Qualhato
04/04/2011
olá a todos bem não é necessário usar um edit e sim uma tabela auxiliar.
ex:
procedure TfrmClientes.BotaoSalvarClick(Sender: TObject);
begin
if dmdados.tbl_cliente.state in [dsInsert] then
begin
tbl_auxiliar.close;
tbl_auxiliar.paranByName('matricula').asString := dbeditMatricula.text;
tbl_auxiliar.open;
if tbl_auxiliar.recordCaut > 0 then
begin
showMessage('Este Registro já está Cadastrado');
dbeditMatricula.setFocus;
end
else
dmdados.tbl_cliente.post;
end;
end;
bom essa é só um exemplo de como tem que ser feito e só lembrando que na tabela auxiliar deve add na sql o seguinte código
select * from TBL_CLIENTE
where cli_matricula = :matricula
ex:
procedure TfrmClientes.BotaoSalvarClick(Sender: TObject);
begin
if dmdados.tbl_cliente.state in [dsInsert] then
begin
tbl_auxiliar.close;
tbl_auxiliar.paranByName('matricula').asString := dbeditMatricula.text;
tbl_auxiliar.open;
if tbl_auxiliar.recordCaut > 0 then
begin
showMessage('Este Registro já está Cadastrado');
dbeditMatricula.setFocus;
end
else
dmdados.tbl_cliente.post;
end;
end;
bom essa é só um exemplo de como tem que ser feito e só lembrando que na tabela auxiliar deve add na sql o seguinte código
select * from TBL_CLIENTE
where cli_matricula = :matricula
GOSTEI 0
Rogerio Sena
04/04/2011
Olá amigos que tentaram me ajudar agradeço a todos vcs pela colaboração todos os códigos passados para eu tentar foram de grande aprendizagem pois testei e digitei muito e pude notar as diferencias das prorpiedades de cada componente.
Abraço para todos e obrigado!!!!!!
Um professor da escola tecnica de palmas no tocantins me deu a solução.
if RadioButton1.Checked = True then
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
Edtmatricula.Text:= DBEdit3.Text;
Edttipo.Text:= DBEdit4.Text;
SQLQuery1.Close; qlQuery1.Sql.Text:= 'Select MATRICULA from FUNCIONARIO where MATRICULA = ' + QuotedStr(edtmatricula.text) + ' and TIPOFUNCI = ' + QuotedStr(edttipofunci.text); if not SQLQuery1.IsEmpty then
begin
ShowMessage('A matrícula informada já está cadastrada.');
//EdtMatricula.SetFocus;
DBEdit3.SetFocus;
exit;
end
else
SQLQuery1.Close; inherited;
btnAlterar.Enabled:=True;
begin
DBEdit4.Text:='ATACADÃO';
end;
Label6.Enabled := False;
DBEdit4.Enabled := False;
if DataSource1.State = dsInsert then
DMClient.cdsFuncionario.Params [0].Text:=
DMClient.cdsFuncionarioMATRICULA.Text;
Edtmatricula.Text:= DBEdit3.Text;
Edttipo.Text:= DBEdit4.Text;
SQLQuery1.Close; qlQuery1.Sql.Text:= 'Select MATRICULA from FUNCIONARIO where MATRICULA = ' + QuotedStr(edtmatricula.text) + ' and TIPOFUNCI = ' + QuotedStr(edttipofunci.text); if not SQLQuery1.IsEmpty then
begin
ShowMessage('A matrícula informada já está cadastrada.');
//EdtMatricula.SetFocus;
DBEdit3.SetFocus;
exit;
end
else
SQLQuery1.Close; inherited;
btnAlterar.Enabled:=True;
GOSTEI 0
Rogerio Sena
04/04/2011
|Amigos eu consegui achar a solução para esta post muito abrigado pela ajuda de todos valeu amigos !!!!!
GOSTEI 0
José
04/04/2011
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0