Pequenas duvidas referentes ao desenvolvimento de um sistema

Delphi

02/12/2003

Já sou um assiduo frequentador desta pagina, mas é a primeira vez que peço ajuda. Nunca respondi nada pq ainda tenho poucos conhecimentos sobre programacao.

Bom, se alguem quiser me ajudar vou contar a estorinha...
Estou tentando fazer um cadastro simples de funcionario em delphi 6 utilizando paradox e bde. Estou utilizando dbedit´s para inserir os dados.
quando vou inserir um novo funcionario, tenho que digitar o código. O problema está que quando digito um código já existente e mando salvar o sistema dá um erro de keyviolation. Já tentei fazer uma consulta utilizando o locate mas não consegui fazer funcionar. Se alguem poder me ajudar, agradeço

Um abraço

Wagner

Gravatai/RS
icq 95434868


Wagsilvasilva

Wagsilvasilva

Curtidas 0

Respostas

Luineumann

Luineumann

02/12/2003

coloque o seguinte comando no evento onposterror da sua tabela

Procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;var Action: TDataAction);
Var
ErroMens :String;
begin
ErroMens := E.Message;
if ErroMens = ´Key violation.´
then begin
ShowMessage(´Código já existe!´);
action := daAbort;
end;
end;


GOSTEI 0
Rafael Heise

Rafael Heise

02/12/2003

Você tem como sua chave o campo CAMPO.
Então, quando você for salvar, faça o seguinte:

Se você não estiver filtrando a tabela, você pode usar o locate. Caso esteja filtrando, você deve usar uma outra Table sem filtro.
O melhor mesmo seria usar SQL talvez.
Então ai vão as alteranativas:

Table sem filter:
Isso você coloca no botão salvar, bem no começo
  if Table.Locate(´CAMPO´,DBEdit1.Text,[]) then
  begin
    ShowMessage(´Chave Duplicada´);
  end
  else
  begin
    { ... } // Seu código
  end;


SQL:
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add(´SELECT CAMPO FROM TABELA WHERE CAMPO = ´ + DBedit1.Text);
  Query.Open;
  if not Query.IsEmpty then
  begin
    ShowMessage(´Registro Duplicado´)
  end
  else
  begin
    {...} //Seu código
  end;


Agora se você está filtrando a table, então você deve ter uma outra table para efetuar o locate.

beleza?
eu sou meio contra fazer no PostError pois você não está tratando o erro e sim caso de algum erro então faça isso. O tratar erro que digo é fazer código para que evite que o banco ou o próprio programa dê um erro. (try except).
é isso ae, espero ter sido claro...
valeu!


GOSTEI 0
Cinh0

Cinh0

02/12/2003

Manow, eu acho melhor você utilizar esse campo como auto-incremento, só assim vc despreocupa e tudo funciona sem problema.


GOSTEI 0
Wagsilvasilva

Wagsilvasilva

02/12/2003

Quero agradecer a todos as dicas. Vou tentar implementa-las e dou retorno a todos pra dizer se funcionou. Vou deixar aqui uma mostra de como eu estava tentando fazer a consulta do registro se existia ou nao.
If udmdados.tbdadosfunc.Locate(´Codfunc´,dbedit1.Text,[])
then...

O Zerneo falou algo referente ao filtro utilizado na tabela. Eu utilizo filtros em outra tela (tabsheet) para exibição dos dados na Dbgrid. Deve ser isso então que está ocasionando o erro.


GOSTEI 0
POSTAR