Ajuda - Busca - Membros - Calendário
Versão Completa: Impedir número já registrado
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
nsouza
Colegas,
1- tenhum um form de ordem de serviço, gostaria que quando alguém fosse digitar uma ordem de serviço
e ela já existisse, no evento ao sair do campo retornasse a mensagem "Numero já cadastrado"

2- Preciso tb do contrario, quando não existisse a Ordem de Serviço retornasse a mensagem" Este número não foi cadastrado"

a tabela é: tblOrdemServico o campo NumOs
Desde já obrigado!
ZueRa
Olá amigo.
Acredito que possa fazer assim:
no evento OnKeyPress do Edit, DBEdit [...] adicione o código

CODE
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  begin
    if (key = #13) and (Edit1.Text = '') then
      begin
        Application.MessageBox('Digite algo para a pesquisa.','Título',MB_ok +
        MB_defbutton1 + MB_iconexclamation);
      end
      else
      if (key = #13) and (Query1.IsEmpty = true) then
        begin
          Application.MessageBox('Este número não foi cadastrado','Título',MB_ok +
          MB_defbutton1 + MB_iconexclamation);
        end
      else
      if (key = #13) and (not(Query1.IsEmpty = true)) then
        begin
          Application.MessageBox('O registro já existe','Título',MB_ok +
          MB_defbutton1 + MB_iconexclamation);
          Edit1.SetFocus;
          Abort;
        end;
  end;


isto serve?
Qualquer dúvida poste aí,
abraço.
Ah sim, na proprieadade SQL da Query você pode adicionar o código abaixo (digo PODE pois não há somente esta forma para fazer a inserção destes parâmetros).

CODE
select * from TblOrdemServico


PS: obviamente terá que adicionar uma Query para retornar o resultado acima.
Micheus
nsouza, algum adendum ao que o colega Zuera postou...

Supondo que você use a query (Query1) para fazer a consulta no banco pelo nº da OS desejada, faça isto de forma a poupar tráfego de dados entre sua aplicação e o servidor.

Digamos que você quer apenas conferir se o número existe e não vai precisar trazer mais nenhuma informação desta OS caso ela exista, então, não use o "*", use apenas o próprio campo:
SQL
select NumOS
from OrdemServico where NumOs = :NumOS

Antes de executar a query, você deve passar o parâmetro NumOS (aquele que está declarado logo após o ":")
CODE
...
  Query1.ParamByName('NumOS').AsString := Edit1.Text;
  Query1.Open;

Considerando que você passou o nome tblOrdemServico, parece que você está utilizando um componente tipo table e talvez você apenas queira posicionar esta table no NumOS que o cara digitar. Para este caso, se esta sua tabela contiver um índice para o campo NumOS e você o tiver selecionado na propriedade IndexFieldName, você pode fazer uso do método FindKey ou até mesmo Locate.


Zuera, é uma das práticas o uso de validação quando o usuário digita o ENTER (coisa herdada do bom e velho DOS), mas na prática, não há garantias de que o usuário vai fazer isto. No Windows (ambiente gráfico), é muito comum que o usuário use o mouse para mudar de campo e, neste caso, a opção citada pelo colega nsouza torna-se mais acertada (usar o evento OnExit) - assim a validação fica em um lugar só (ou é feita apenas uma única vez).
O código que você postou, continua valendo para o uso neste evento - sem problemas. Mas, supondo que o colega use ele, com a query e tudo, há uma correção a fazer que é apontar a ele onde a parametrização e abertura da query devem ser feitas:
1) Mantendo o código no evento OnKeyPress. Vamos observar que para todas as opções dadas, a tecla pressionada teria que ser #13, então:
CODE
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if key = #13 then
  begin
    if Edit1.Text = '' then
    begin
      Application.MessageBox('Digite algo para a pesquisa.','Título', MB_ok +
        MB_defbutton1 + MB_iconexclamation);
    end
    else
    begin
      Query1.ParamByName('NumOS').AsString := Edit1.Text;
      Query1.Open;
      if Query1.IsEmpty then
      begin
        Application.MessageBox('Este número não foi cadastrado','Título',MB_ok +
          MB_defbutton1 + MB_iconexclamation);
      end
      else
      if not Query1.IsEmpty then
      begin
        Application.MessageBox('O registro já existe','Título',MB_ok +
          MB_defbutton1 + MB_iconexclamation);
        Edit1.SetFocus;
        Abort;
      end;
  end;
end;
a chamada a Abort não seria necessária, já que não há mais nenhum código neste procedimento que pudesse ser executado após a mensagem.

2) Colocando o código no evento OnExit:
CODE
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if Edit1.Text = '' then
    ShowMessage('Digite algo para a pesquisa');
  else
  begin
    Query1.ParamByName('NumOS').AsString := Edit1.Text;
    Query1.Open;
    if Query1.EOF then
      ShowMessage('Este número não foi cadastrado');
    else
    begin
      Edit1.SetFocus;
      ShowMessage('O registro já existe');
    end;
  end;
end;

Uma dica: pensando de forma mais profissional, você não deve fazer um teste deste tipo: if Query1.IsEmpty = true then

Lembrem-se de que a expressão a ser avaliada pelo if será sempre uma expressão booleana (algo que retorne True ou False), logo, não faz sentido você testar if true = true then, basta que você use if true then. A expressão que não for verdadeira resultará na execução do código no else.
ZueRa
Uhm, entendi Micheus.
Obrigado pela explicação =D
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.