Fórum Ajuda para resolver um problema de duplicação de chave #7718
17/07/2009
0
Andre Freitas
Curtir tópico
+ 0Posts
17/07/2009
Andre Freitas
Gostei + 0
20/07/2009
Wesley Yamazack
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
21/07/2009
Andre Freitas
Gostei + 0
22/07/2009
Wesley Yamazack
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
23/07/2009
Andre Freitas
Gostei + 0
24/07/2009
Wesley Yamazack
Você fez as dicas que te falei ? Chegou a implementar ?
Att,
Wesley Y
Gostei + 0
24/07/2009
Andre Freitas
Gostei + 0
24/07/2009
Andre Freitas
Gostei + 0
24/07/2009
Wesley Yamazack
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
24/07/2009
Andre Freitas
Gostei + 0
25/07/2009
Wesley Yamazack
Me manda ai o método que você usa pra gravar, para poder analistar, assim fica mais fácil.
Att,
Wesley Y
Gostei + 0
27/07/2009
Andre Freitas
Gostei + 0
27/07/2009
Wesley Yamazack
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
27/07/2009
Andre Freitas
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
28/07/2009
Wesley Yamazack
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
Clique aqui para fazer login e interagir na Comunidade :)