Ajuda para resolver um problema de duplicação de chave

17/07/2009

Boa noite prezado(s),   Estou tentando atualizar registros em um bando, só que está informando violação de chave. Estarei enviando o caminho do aplicativo no disco virtual.   ...Gostaria tambem de saber como criptar a senha no Firebird para que niguem saiba qual é a senha.       Andre Freitas
Andre Freitas

Andre Freitas

Curtidas 0

Respostas

Andre Freitas

Andre Freitas

17/07/2009

Segue caminho do disco virtual:   http://video.devmedia.com.br/discovirtual/216474/Arq/DbSysMac.rar.   Andre Freitas.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu caro, Andre.
  A violção de chave, vocë tem que ver qual dado esta sendo passado para a tabela, pois se for um registro unico, nao tem como voce inserir 2 iguais. Imagina o seguinte. Se meu registro unico for o Codigo,
  Codigo     Nome    Sexo
   1            wesley   m
   2            andre     m
   3            wesley   m // nao tem problema pois a chave nao se repete.

segundo exemplo.

  Codigo     Nome    Sexo
   1            wesley   m
   2            andre     m
   1            andreia   f // nao pode, pois o codigo é o identificador unico da tabela, e nao pode se repetir.

 Sacou ?

 Com relação a senha do firebird, seria a senha que você cadastra pra cada usuario, do teu sistema? vocë quer criptogra seria isso ?


att,

Wesley Y
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Boa tarde,   ...Isso eu não sei como criptografar para o firebird. ... e o inverso também.   Quanto a duplicação na chave de violação eu sei o que você explicou, mas sei porque está duplicando já que peço para ir para o ultimo registro e depois mandou inserir o registro.   ...não estou sabendo o porque da informação na violação chave se mando ir para o ultimo registro.   Andre Freitas. 
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu caro, segue abaixo uma rotina pronta, para criptografar, e descriptografar.
  Na hora que você for cadastrar a senha do teu usuário você vai afzer o seguinte.
     EdtSenha.Text := Cripto(Edt que tem a senha.Text, ou a query.campo); Dai você grava criptografada.

function Cripto(Texto: String): String;
var
Cont, Cod: Integer;
Retorna: String;
begin
for Cont := 1 to Length(Texto) do begin
Cod := ValorAsc(Copy(Texto, Cont, 1));
Retorna := Retorna + Chr(Cod + 57(*valor a ser adicionado - pode ser modificado*));
end;
Cripto := Retorna;
end;

Na hora de você logar,
   O usuaário vai digitar 123 no edit, porém quando for fazer a consulta no banco você vai ter que fazer o inverso,
   QryCampoSenha := Descritp(123);

function DesCripto(Texto: String): String;
var
Cont, Cod: integer;
Retorna: String;
begin
for Cont := 1 to Length(Texto) do begin
Cod := ValorAsc(Copy(Texto, Cont, 1));
Retorna := Retorna + Chr(Cod - 57);
end;
DesCripto := Retorna;
end;

Certo ? Tranquilo esta parte ?

Vamos para proxima. Violação de chave.
  Você usa ClientDataSet ?
  No FireBird, vc tem uma trigger, para gerar o proximo código desta tabela ?
  Pois a violação, o fato de você mandar o ponteiro para o ultimo registro não adianta muito não.
  Exemplo. o ClientDataSet tem dois metodos de inclusão.
  CDS.Insert; // Inclui o registro onde o ponteiro estiver;
  CDS.Append; //inclui o registro na ultima posição;
A violação, esta ocorrendo pois o novo código, não esta sendo gerado. Vou analisar teu codigo fonte. E retornarei, se puder dar mais informações da tua estrutura ficaria mais fácil.

Um abraço,

Att,

Wesley Y

GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Ok no aguardo.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá,
  Você fez as dicas que te falei ? Chegou a implementar ?

Att,

Wesley Y
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Ola amigo, vou fazer agora de tarde. Andre Freitas.
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

...você pode me tirar também esta duvida? ...Porque o firebird nao esta atualizando os registros?   ...Quando eu acesso os dados direto ele atualiza, mas ao entrar com login e senha quando vou acessar um form para atualizar dados, não acontece não, acredito também que esta também seja a causa da duplicação de chaves, mas o botão salvar que criei está certo (acredito eu), usei só o "post", dento de uma condicinal if, mas quando tiro também a condicional acontece a mesma coisa, ou seja não salva nada.   Andre Freitas.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá.
  Você ta usando ClientDataSet ? Se for so o post não funciona ! O que falta é você botar ClientDataSet.ApplyUpdates(-1), pra ele confirmar a gravação.

  Senao usar CDS. me explica como você grava os dados.


Att.

Wesley Y
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Não, tô usando apenas o tables IB,  IBTransaction, TIBQuery, TIBDatabase.   Andre
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu caro,
  Me manda ai o método que você usa pra gravar, para poder analistar, assim fica mais fácil.


Att,

Wesley Y
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Bom dia meu amigo,   segue o caminho do disoc virtual http://video.devmedia.com.br/discovirtual/216474/DbSysMac.rar.   Atte,   Andre Freitas.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu caro,
  Você mandou o sistema. Mas assim fica complicado, qual form ? Seria mais fácil você botar somente o código fonte do botão, para poder analisar.
  Fico no aguardo.

Att,

Wesley Y
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Ok, segue o cógido.   //CODIGO DO BOTÃO INCLUIR procedure TFrmContrEstoq.BtnEnviTalaoClick(Sender: TObject);
Var
ProxCodEstoq:integer;
ProxNRD: integer;
BaixaTalao : Integer;
TalaoEnviado : String;
Qtdtal :Integer;
begin
   BaixaTalao:=0;
   TalaoEnviado:= '1';
   Qtdtal:= 1;
  
   DMSysMac.IBTblContrEstoq.Open;
   DMSysMac.IBTblContrEstoq.last;
  
   DBEdtDtEnvio.Enabled := true;
   DBECodEstoq.Enabled:=false;
   DBERD.Enabled:=False;
   DBCmbEnviapara.Enabled:=true;
   DBLCBoxTalIni.Enabled:=true;
   BtnConfirmaEnvio.Enabled:=true;
   BtnEnviTalao.Enabled:=false;
   BtnModifEnvio.Enabled:=true;
   BtnFecharEnvio.Enabled:=true;
   BtnImprRelEnvio.Enabled :=true;
   DBEdtHora.Enabled :=true;    DBCmbEnviapara.DataSource:= DSUContrEstoq;
   DBGTalEnviados.DataSource:=  DSUContrEstoq;
   DBECodEstoq.DataSource :=DSUContrEstoq;
   DBERD.DataSource :=DSUContrEstoq ;
   DBEdtHora.DataSource :=DSUContrEstoq ;
   ProxNRD:= DMSysMac.IBTblContrEstoq.FieldByName('RD').AsInteger + 1;
   ProxCodEstoq:= DMSysMac.IBTblContrEstoq.FieldByName('CodContr').AsInteger + 1;      DMSysMac.IBTblContrEstoq.append;
   DMSysMac.IBTblContrEstoq.FieldByName('RD').AsInteger:= ProxNRD;
   DMSysMac.IBTblContrEstoq.FieldByName('CodContr').AsInteger:= ProxCodEstoq;
   DMSysMac.IBTblContrEstoq.FieldByName('Estado').AsInteger := BaixaTalao;
   DMSysMac.IBTblContrEstoq.FieldByName('Situacao').AsString:= TalaoEnviado;
   DMSysMac.IBTblContrEstoq.FieldByName('Qtde').AsString:= TalaoEnviado;
   DBEdtDtEnvio.SetFocus; end;   //CODIGO DO BOTÃO SALVAR procedure TFrmContrEstoq.BtnConfirmaEnvioClick(Sender: TObject);
Var
BaixaTalao : Integer;
TalaoEnviado : String;
TotTal : Integer;
begin
    if (Application.MessageBox('Deseja salvar talões enviados?','Confirmação',
    MB_OKCANCEL + MB_ICONINFORMATION ))= idOK then
    begin
      BaixaTalao:=0;
      TalaoEnviado:= 'S';
      TotTal :=0;
     
      BtnConfirmaEnvio.Enabled:=false;
      DBECodEstoq.DataSource :=nil;
      DBERD.DataSource :=nil;       DBECodEstoq.Enabled:=false;
      DBERD.Enabled:=False;
      BtnEnviTalao.Enabled:=true;
      BtnModifEnvio.Enabled:=false;
      BtnFecharEnvio.Enabled:=true;
      BtnConfirmaEnvio.Enabled :=false;
      BtnImprRelEnvio.Enabled:=false;
      DBEdtDtEnvio.Enabled := true;
      DMSysMac.IBTblContrEstoq.Edit;       DMSysMac.IBTblContrEstoq.FieldByName('NomeAg').Value:= DBCmbEnviapara.text ;
      DMSysMac.IBTblContrEstoq.FieldByName('NIniTal').AsString:= DBLCBoxTalIni.Text ;
      DMSysMac.IBTblContrEstoq.FieldByName('DtEnvio').AsString:= (DBEdtDtEnvio.Text);       DMSysMac.IBTblContrEstoq.first;
      While not DMSysMac.IBTblContrEstoq.Eof Do
      begin
      TotTal:= TotTal + DMSysMac.IBTblContrEstoq.FieldByName('Qtde').AsInteger;
      DMSysMac.IBTblContrEstoq.Next;
      end;         DMSysMac.IBTblContrEstoq.edit ;
      EdtQtdTalEnvia.Text := IntToStr(TotTal);       //DMSysMac.IBTblTalao.Delete;
      DMSysMac.IBTblContrEstoq.Post;
      BtnEnviTalao.SetFocus;
   end;
   end;     ANDRE FREITAS.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu amigo.. vamos lá;


procedure TFrmContrEstoq.BtnEnviTalaoClick(Sender: TObject);
Var
ProxCodEstoq:integer;
ProxNRD: integer;
BaixaTalao : Integer;
TalaoEnviado : String;
Qtdtal :Integer;
begin
   BaixaTalao:=0;
   TalaoEnviado:= '1';
   Qtdtal:= 1;
  
   DMSysMac.IBTblContrEstoq.Open;
   DMSysMac.IBTblContrEstoq.last;
  
   DBEdtDtEnvio.Enabled := true;
   DBECodEstoq.Enabled:=false;
   DBERD.Enabled:=False;
   DBCmbEnviapara.Enabled:=true;
   DBLCBoxTalIni.Enabled:=true;
   BtnConfirmaEnvio.Enabled:=true;
   BtnEnviTalao.Enabled:=false;
   BtnModifEnvio.Enabled:=true;
   BtnFecharEnvio.Enabled:=true;
   BtnImprRelEnvio.Enabled :=true;
   DBEdtHora.Enabled :=true;    DBCmbEnviapara.DataSource:= DSUContrEstoq;
   DBGTalEnviados.DataSource:=  DSUContrEstoq;
   DBECodEstoq.DataSource :=DSUContrEstoq;
   DBERD.DataSource :=DSUContrEstoq ;
   DBEdtHora.DataSource :=DSUContrEstoq ;
   ProxNRD:= DMSysMac.IBTblContrEstoq.FieldByName('RD').AsInteger + 1;
   ProxCodEstoq:= DMSysMac.IBTblContrEstoq.FieldByName('CodContr').AsInteger + 1;      DMSysMac.IBTblContrEstoq.append;
   DMSysMac.IBTblContrEstoq.FieldByName('RD').AsInteger:= ProxNRD;
   DMSysMac.IBTblContrEstoq.FieldByName('CodContr').AsInteger:= ProxCodEstoq;
   DMSysMac.IBTblContrEstoq.FieldByName('Estado').AsInteger := BaixaTalao;
   DMSysMac.IBTblContrEstoq.FieldByName('Situacao').AsString:= TalaoEnviado;
   DMSysMac.IBTblContrEstoq.FieldByName('Qtde').AsString:= TalaoEnviado;
   DBEdtDtEnvio.SetFocus; end;   //CODIGO DO BOTÃO SALVAR procedure TFrmContrEstoq.BtnConfirmaEnvioClick(Sender: TObject);
Var
BaixaTalao : Integer;
TalaoEnviado : String;
TotTal : Integer;
begin
    if (Application.MessageBox('Deseja salvar talões enviados?','Confirmação',
    MB_OKCANCEL + MB_ICONINFORMATION ))= idOK then
    begin
      BaixaTalao:=0;
      TalaoEnviado:= 'S';
      TotTal :=0;
     
      BtnConfirmaEnvio.Enabled:=false;
      DBECodEstoq.DataSource :=nil;
      DBERD.DataSource :=nil;       DBECodEstoq.Enabled:=false;
      DBERD.Enabled:=False;
      BtnEnviTalao.Enabled:=true;
      BtnModifEnvio.Enabled:=false;
      BtnFecharEnvio.Enabled:=true;
      BtnConfirmaEnvio.Enabled :=false;
      BtnImprRelEnvio.Enabled:=false;
      DBEdtDtEnvio.Enabled := true;      // Ate este momento o DMSysMac.IBTblContrEstoq.append, logo abaixo você vai dar um edit, sendo assim o Append, já é cancelado.

      DMSysMac.IBTblContrEstoq.Edit; //
      DMSysMac.IBTblContrEstoq.FieldByName('NomeAg').Value:= DBCmbEnviapara.text ;
      DMSysMac.IBTblContrEstoq.FieldByName('NIniTal').AsString:= DBLCBoxTalIni.Text ;
      DMSysMac.IBTblContrEstoq.FieldByName('DtEnvio').AsString:= (DBEdtDtEnvio.Text);
//Aqui seu DMSysMac.IBTblContrEstoq.Edit, depois de passar os valores acima, voce vai e joga o ponteiro para o primeiro registro, para que isso ?
      DMSysMac.IBTblContrEstoq.first;
      While not DMSysMac.IBTblContrEstoq.Eof Do
      begin
      TotTal:= TotTal + DMSysMac.IBTblContrEstoq.FieldByName('Qtde').AsInteger;
      DMSysMac.IBTblContrEstoq.Next;
      //Aqui você ta fazendo um loop pra somar as quantidades, sem problemas, porém sua operação de Append, já não serve mais de nada aqui.
      end;         DMSysMac.IBTblContrEstoq.edit ;
      //Este edit funciona legal, porém ele vai editar o ultimo registro somente.
      EdtQtdTalEnvia.Text := IntToStr(TotTal);       //DMSysMac.IBTblTalao.Delete;
     // Este post, não serve de nada, pois o edit a cima foi disparado, porém nada foi alterado.
      DMSysMac.IBTblContrEstoq.Post;
      BtnEnviTalao.SetFocus;
   end;
   end;

   Pense primeiro o que você quer fazer, eu vi que você quer somar as Qtdes, porém no mesmo evento você executa edit, 2 vezes, bota o ponteiro no firs, depois da um post, sem nada. Repense um pouco mais neste problema que você quer solucionar, pois desta forma não esta correto.


   Me explica melhor o que você quer que eu te ajudo!
Um abraço

Wesley Y
  

GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Olá meu amigo,   Com código enviado eu quero incluir registros no banco e depois salvar os registros atualizando-os e exibindo em uma label a quantidade atual.   Atte,    Andre
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu amigo,
  Bom então precisa fazer modificações.
  Faça o seguinte crie uma procedure para fazer o calculo e jogar os valores no Edit, esta procedure será executada depois que você executar o comando post;

//CODIGO DO BOTÃO SALVAR procedure TFrmContrEstoq.BtnConfirmaEnvioClick(Sender: TObject);
begin
    if (Application.MessageBox('Deseja salvar talões enviados?','Confirmação',
    MB_OKCANCEL + MB_ICONINFORMATION ))= idOK then
    begin

     
     BtnConfirmaEnvio.Enabled:=false;
     DBECodEstoq.DataSource :=nil;
     DBERD.DataSource :=nil;      DBECodEstoq.Enabled:=false;
     DBERD.Enabled:=False;
     BtnEnviTalao.Enabled:=true;
     BtnModifEnvio.Enabled:=false;
     BtnFecharEnvio.Enabled:=true;
     BtnConfirmaEnvio.Enabled :=false;
     BtnImprRelEnvio.Enabled:=false;
     DBEdtDtEnvio.Enabled := true;       DMSysMac.IBTblContrEstoq.FieldByName('NomeAg').Value:= DBCmbEnviapara.text ;
      DMSysMac.IBTblContrEstoq.FieldByName('NIniTal').AsString:= DBLCBoxTalIni.Text ;
      DMSysMac.IBTblContrEstoq.FieldByName('DtEnvio').AsString:= (DBEdtDtEnvio.Text);           DMSysMac.IBTblContrEstoq.Post;
      Calcular;
     EdtQtdTalEnvia.Text := IntToStr(TotTal);
     BtnEnviTalao.SetFocus;    end;
end;

procedure TFrmContrEstoq.Calcular;
Var
  BaixaTalao : Integer;
  TalaoEnviado : String;
  TotTal : Integer;
begin
      BaixaTalao:=0;
      TalaoEnviado:= 'S';
      TotTal :=0;
      { isso aqui que você tem que jogar pra procedure para fazer os calculos depois que terminar
       Dentro desta procedure vocÊ faz toda a parte de calcluos, e exibição dos labels;
      While not DMSysMac.IBTblContrEstoq.Eof Do
      begin
      TotTal:= TotTal + DMSysMac.IBTblContrEstoq.FieldByName('Qtde').AsInteger;
      DMSysMac.IBTblContrEstoq.Next;
      end;
      }
end;

   Adpte este exemplo pra tua necessidade, meu amigo e assim irá funcionar, tente nunca trabalhar com metodos tipo, edit, post, append, no mesmo lugar, senão você pode acabar perdendo alguns dados nesta mudança de Estado do teu componente. blz ?


Um abraço

Wesley Y
GOSTEI 0
Devmedia

Devmedia

17/07/2009

Andre,
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

O meu amigo,   Ainda está acorrendo errros, estou tentanto resolver mas não funciona. Não está atualizando e continua duplicando, depois gerar tipo um estou de memoria.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu amigo ,
  Me manda o código que você alterou, o clique do botão, para analisar como esta.
  Fico no aguardo.

Um abraco

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu amigo, e ai consegui ver o código para me mandar ? Estamos no aguardo.

Um abraço

Wesley Y
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Boa tarde amigo,   Ainda não consegui resolver o problemas de violação de chaves, separei os metodos como vc havia falado, mas continua o mesmo erro.   ...segue disco virtual - video com erro: http://video.devmedia.com.br/discovirtual/216474/LoginBloq_ComErro.rar ...Segue disco virtual com o aplicativo para teste: http://video.devmedia.com.br/discovirtual/216474/LoginBloq_ComErro.rar   O projeto está denro da pasta unit.   - quando incluo um registro está duplicando a chave não sei porque.   desde já obrigado.   Andre.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu amigo
  Você mandou os dois links iguais. E otura coisa, verifique o nome da tabela, pois eu fiz os testes aqui, e todos funcionaram sem prolbme algum, você deve estar com problema no nome da tabela, confira, pois as vezes o que menos desconfiamos nos surpreendem.
  Forte abraço

Wesley Y
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Ok amigo voi ver...   abraço.   Andre
GOSTEI 0
Andre Freitas

Andre Freitas

17/07/2009

Meu amigo boa tarde,   já conferi todo o codigo e continua o erro. Observei que no banco o codigo que é gerardo (que se repete) está todo aleatorio, tentei usar append, insert e a duplicação continua. abro em varias maquinas aqui na empresa e o erro continua. O que pode está acontecendo?   Andre Freitas.
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

17/07/2009

Olá meu amigo, o erro que você esta me mostrando na vídeo, é com relação a hora de Fazer o Update no status do teu usuário.
  O segundo erro, é causado devido a você quer jogar uma string de 11 caracteres, em um campo que só aceita 8.
  O que seria o erro de duplicidade ? Não entendi ?


Abraço

Wesley Y
GOSTEI 0
POSTAR