Fórum Ajuda para resolver um problema de duplicação de chave #7718

17/07/2009

0

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

Responder

Posts

17/07/2009

Andre Freitas

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

Gostei + 0

20/07/2009

Wesley Yamazack

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
Responder

Gostei + 0

21/07/2009

Andre Freitas

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. 
Responder

Gostei + 0

22/07/2009

Wesley Yamazack

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

Responder

Gostei + 0

23/07/2009

Andre Freitas

Ok no aguardo.
Responder

Gostei + 0

24/07/2009

Wesley Yamazack

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

Att,

Wesley Y
Responder

Gostei + 0

24/07/2009

Andre Freitas

Ola amigo, vou fazer agora de tarde. Andre Freitas.
Responder

Gostei + 0

24/07/2009

Andre Freitas

...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.
Responder

Gostei + 0

24/07/2009

Wesley Yamazack

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
Responder

Gostei + 0

24/07/2009

Andre Freitas

Não, tô usando apenas o tables IB,  IBTransaction, TIBQuery, TIBDatabase.   Andre
Responder

Gostei + 0

25/07/2009

Wesley Yamazack

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
Responder

Gostei + 0

27/07/2009

Andre Freitas

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

Gostei + 0

27/07/2009

Wesley Yamazack

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
Responder

Gostei + 0

27/07/2009

Andre Freitas

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.
Responder

Gostei + 0

28/07/2009

Wesley Yamazack

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
  

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar