Delphi

14/12/2003

2

Estou com uma dúvida cruel...
Tenho uma validação q foi feita para um campo que não deve ser auto incremento, porém essa validação não está sendo correta. alguém poderia me ajudar? Uso o paradox.

Não consigo corrigir o erro, da primeira vez ele roda corretamente, da segunda vez em diante não.


Esse é o código do btn inserir

procedure Tfrmfuncionario.btninserirfClick(Sender: TObject);

begin
if (mskdrt.Text=´´) and (txtnomef.Text=´´) then
begin
Application.MessageBox(´Favor Preencher corretamnete os campos´,´Erro de Dados´,mb_ok+mb_Iconerror);
mskdrt.SetFocus;
end;
{********************************************************************************************
Início de Validação de Funcionário evitando key violation
********************************************************************************************}
dmcarrefour.tbfunc.First;
while not dm.tbfunc.eof do
begin
if mskdrt.Text=dm.tbfunc[´Cod_Funcionario´] then
begin
application.MessageBox(´Usuário já Cadastrado!!´,´Erro de Dados´,mb_ok+mb_iconerror);
mskdrt.text:=´´;
txtnomef.text:=´´;
mskdrt.setfocus;
end;

dm.tbfunc.Next;
end;
{******************************************************************************************
Fim da Validação dos Funcionários
*******************************************************************************************}
if mskdrt.text<>dm.tbfunc[´Cod_Funcionario´] then
begin
dm.tbfunc.Open;
dm.tbfunc.Append;
dm.tbfunc[´Cod_Funcionario´]:=mskdrt.Text;
dm.tbfunc[´Nome_Funcionario´]:=txtnomef.Text;
application.MessageBox(´Usuário Cadastrado com Sucesso!!!´,´Confirmação´,mb_ok+MB_ICONINFORMATION);
mskdrt.Text:=´´;
txtnomef.Text:=´´;
mskdrt.SetFocus;
end;
end;

Agradeço pela ajuda
Roberto 8)


Responder

Posts

14/12/2003

Wagsilvasilva

CAra, to com o mesmo problema que tu. To tentando fazer isto de duas maneiras. Digo tentando pq ainda to encontrando problemas pra que funcione. As duas maneiras que estou tentando fazer pra contornar o problema do keyviolation são as seguintes:


Quando clico no botao incluir:
If not tbdadosfunc.locate (´Codfunc´,dbedit1.text,[]) then begin
tbdadosfunc.append;
...
else showmessage(´Registro duplicado´);

Porém eu este método acima não esta funcionando, mas pela informação que tive a minha ttable nao pode estar filtrada.

Outra maneira é colocar no evento onposterror da tabela o seguinte código

procedure TUdmdados.tbdadosfuncPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
Var
ErroMens :String;
begin
ErroMens := E.Message;
if ErroMens = ´Key violation.´
then begin
edatabaseerror.Create(´Codigo já existe´);// showmessage (´Código já existe!´);
action := daAbort;
end;
end;

Não sei pq o método showmessage no codigo acima não funciona. Quando mando compilar o projeto ele diz ´undeclared identifier´, e já olhei a clausa uses e messages está la...

Espero ter ajudado um pouco


Responder

14/12/2003

Fórum Vini

O erro foi o seguinte, na linha:
 dmcarrefour.tbfunc.First;

você usou dmCarrefour, e nas outras linhas, você usou somente dm; assim, quando você executa a primeira vez, o cursor já está no início, então não ocorre erro, na segunda vez, o cursor está no fim, e como você posicionou o cursor da tabela dmcarrefour.tbFunc e não da dm.tbFunc, a dm.tbFunc vai continuar no fim...
Você apenas tem que trocar dmcarrefour por dm!
 dm.tbfunc.First;


Espero que você tenha entendido, :?:
Vinicius


Responder

14/12/2003

Fórum Vini

Para o problema do key violation, apenas coloquem um try..except para manipular a exceção:
try
  dm.tbfunc.Open;
  dm.tbfunc.Append;
  dm.tbfunc[´Cod_Funcionario´]:=mskdrt.Text;
  dm.tbfunc[´Nome_Funcionario´]:=txtnomef.Text; 
except
  Application.MessageBox(´O código já existe!´, ´Violação de registro´, MB_ICONERROR);
  dm.tbFunc.Cancel;
end;


Quando estiverem rodando o programa pelo Delphi, as duas exceções aparecerão, mas quando o programa for rodado sozinho, fora do Delphi, aparecerá somente a sua mensagem.

Espero ter ajudado.
Vinicius.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira