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 thenLembrem-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.