Pesquisar se a duplicidade de dados antes de salvar

Delphi

04/04/2011

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

Rogerio Sena

Curtidas 0

Respostas

Agricola Ltda

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:
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

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

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

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;
GOSTEI 0
Rogerio Sena

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

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

Dirceu Morais

04/04/2011

Rógerio tente assim:

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

Rogerio Sena

04/04/2011

Rógerio tente assim:


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
amigo vou tentar e retorno obrigado por sua grande ajuda
GOSTEI 0
Rogerio Sena

Rogerio Sena

04/04/2011

Rógerio tente assim:


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
amigo vou tentar e retorno obrigado por sua grande ajuda
Testei o código com o banco vazio sem nada cadastrado e mesmo sem nenhuma matricula gravada da a mensagem de Matricula já existe no banco de dados.
GOSTEI 0
Rogerio Sena

Rogerio Sena

04/04/2011

Rógerio tente assim:


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
amigo vou tentar e retorno obrigado por sua grande ajuda
Testei o código com o banco vazio sem nada cadastrado e mesmo sem nenhuma matricula gravada da a mensagem de Matricula já existe no banco de dados.
Oque acha de eu enviar os projetinho assim fica melhor para vc me ajudar
GOSTEI 0
Dirceu Morais

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

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



me passa um enredeço de email pra eu te enviar
GOSTEI 0
Dirceu Morais

Dirceu Morais

04/04/2011

digitosistemas@yahoo.com.br
GOSTEI 0
Rogerio Sena

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

Rogerio Sena

04/04/2011

Rógerio tente assim:


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
amigo vou tentar e retorno obrigado por sua grande ajuda
Testei o código com o banco vazio sem nada cadastrado e mesmo sem nenhuma matricula gravada da a mensagem de Matricula já existe no banco de dados.
Oque acha de eu enviar os projetinho assim fica melhor para vc me ajudar
com o codigo do jeito que esta sempre retorna a mensagem de matricula existente e os dados nao sao gravados no banco embora apareçam em um grid.
GOSTEI 0
Eduardo Marcolongo

Eduardo Marcolongo

04/04/2011

vc pode tentar assim:
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

Rogerio Sena

04/04/2011

vc pode tentar assim:
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.
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?
GOSTEI 0
Eduardo Marcolongo

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

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
GOSTEI 0
Daniel Qualhato

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
GOSTEI 0
Rogerio Sena

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;
 
GOSTEI 0
Rogerio Sena

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é

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
POSTAR