Ajuda para resolver um problema de duplicação de chave
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
Curtidas 0
Respostas
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
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
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
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
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
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
17/07/2009
Ok no aguardo.
GOSTEI 0
Wesley Yamazack
17/07/2009
Olá,
Você fez as dicas que te falei ? Chegou a implementar ?
Att,
Wesley Y
Você fez as dicas que te falei ? Chegou a implementar ?
Att,
Wesley Y
GOSTEI 0
Andre Freitas
17/07/2009
Ola amigo, vou fazer agora de tarde.
Andre Freitas.
GOSTEI 0
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
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
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
17/07/2009
Não, tô usando apenas o tables IB, IBTransaction, TIBQuery, TIBDatabase.
Andre
GOSTEI 0
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
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
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
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
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
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.
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
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
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
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
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
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
17/07/2009
Andre,
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
a resposta do consultor foi suficiente? Podemos encerrar o chamado?
GOSTEI 0
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
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
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
17/07/2009
Olá meu amigo, e ai consegui ver o código para me mandar ? Estamos no aguardo.
Um abraço
Wesley Y
Um abraço
Wesley Y
GOSTEI 0
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
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
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
17/07/2009
Ok amigo voi ver...
abraço.
Andre
GOSTEI 0
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
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
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