Logo Hardware.com.br
gto
gto Tô em todas Registrado
2.1K Mensagens 18 Curtidas
#2 Por gto
10/05/2006 - 20:45
Olá amigo

Você pode usar o evento OnExit do DbEdit, e lá verificar

Poderia ter uma função no form (ou no datamodule), que aceite como parametros a tabela, o campo e o valor (variant), crie uma query, descubra o tipo do campo, transforme o valor e procure-o. Algo do tipo:

function ProcuraValor(tabela, campo: string; valor: Variant): boolean;
begin
Criar uma query;
Atribuir a ela o componente de conexão;
Criar o SQL: 'select ' + campo + ' from ' + tabela + ' where...';
Abrir a Query;
Verificar o Tipo do Campo;
Procurar na tabela pelo valor com TypeCast:
Retornar se achou ou não;
end.

Só tem que ter muito cuidado com o OnExit, para não deixar o user trancado naquele DbEdit!
gto
gto Tô em todas Registrado
2.1K Mensagens 18 Curtidas
#5 Por gto
11/05/2006 - 15:42
Dalhe AdNuX !
Seguinte tchê, tu podes colocar tanto no private como no public. Depende de onde tu quer usar. Imagine que há um punhado de forms com cadastros, e tu quer aproveitar a mesma função em todos eles. Aí eu lhe recomendaria colocar a função em um form de acesso comum (MainForm ou DataModule), na parte de public declarations, para que ela se torne acessível as outras units. Já se tu vais usá-la apenas em um form, coloca ela no private e pronto smile.png
Quanto ao código, não tenho muita exp com ClientDataSet e talz... vou postar pra ti uma aqui que eu tenho, mais ou menos igual, aí tu adapta como quiser wink.png

function LocalizaCodigo(Tabela, Campo, Codigo: string): boolean;
begin
QueryLocaliza.Active := False;
QueryLocaliza.SQL.Clear;
QueryLocaliza.SQL.Add('select ' + campo + ' from ' + Tabela);
QueryLocaliza.SQL.Add('where ' + Campo + ' = ' + quotedstr(Codigo));
try
QueryLocaliza.Active := True;
result := not QueryLocaliza.IsEmpty;
finally
QueryLocaliza.Active := False;
end;
end;


É uma versão simples, que usa uma query já pré definida (eu uso o Zeos pra conectar no banco). Eu tenho como parâmetros de entrada a tabela, o campo e o valor, todos string. Para achar o valor eu faço um select com (where campo = valor). Se a query estiver vazia, quer dizer que este valor não existe smile.png
AdNuX
AdNuX Super Participante Registrado
674 Mensagens 0 Curtidas
#6 Por AdNuX
11/05/2006 - 17:55
meu codigo adaptado...


procedure TF_GrProd.DBECodExit(Sender: TObject);
var
argumento:string;
begin
argumento:=DBECod.Text;
try
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select GR_CODIGO from GR_PROD where GR_CODIGO = argumento;');
IBQuery1.Active:=True;
IBQuery1.Open;
MessageDlg('Código já cadastrado.',mtError,[mbOK],0);
ShowMessage(argumento);
except
on Exception do
DBEDesc.SetFocus;
end;
end;


ñ consigo fazer com que o sql reconheça a variavel argumento para verificar se ela já é existente no banco de dados ou não...
qndo coloco um nº (codigo) já existente direto no codigo ele aceita e o delphi reconhece a variavel pois mostra no showmessage.
alguem pode me ajudar.
gto
gto Tô em todas Registrado
2.1K Mensagens 18 Curtidas
#7 Por gto
11/05/2006 - 19:43
procedure TF_GrProd.DBECodExit(Sender: TObject);
var
argumento: string;
begin
argumento := TDBEdit(Sender).Text;
try
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select GR_CODIGO from GR_PROD where GR_CODIGO = ' + argumento + ';');
try
IBQuery1.Active := True;
if not IBQuery1.IsEmpty then
begin
MessageDlg('Código já cadastrado.', mtError, [mbOK], 0);
TDBEdit(Sender).SetFocus;
end;
finally
IBQuery1.Active := False;
end;
except
DBEDesc.SetFocus;
end;
end;


Testa assim wink.png
AdNuX
AdNuX Super Participante Registrado
674 Mensagens 0 Curtidas
#10 Por AdNuX
16/05/2006 - 16:25

Try
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select GR_CODIGO from GR_PROD where GR_CODIGO =' + argumento + ';');
Try
IBQuery1.Active:=True ;
IBQuery1.Open;
============> if not IBQuery1.IsEmpty then
begin
beep;
MessageDlg('Código já cadastrado.', mtError, [mbOK], 0);
TDBEdit(Sender).SetFocus;
end;//not if
finally
//IBQuery1.Active:=False;
//DBEDesc.SetFocus;
ShowMessage('passa por aki!!');
end; //try2
except
//ShowMessage(argumento);
DBEDesc.SetFocus;
end;//try1



no teste do IF (com a seta) eu tento verificar se o quer achou algum resultado na pequisa, sendo esse resultado verdade/true (caso tenha achado algo), ou falso/false (se naum tiver o COD q eu procuro...).
porém não sei oq eu uso pra ter essa resposta do Query, se eh dele que eu tenho que ter essa resposta dele mesmo, ou de algum outro componente!? hehe
se puder dar uma luz ae agradeço! hehe
Vlw :P :lol:
gto
gto Tô em todas Registrado
2.1K Mensagens 18 Curtidas
#11 Por gto
17/05/2006 - 09:50
Opa. Cara, aquela linha com a seta funciona assim: Você abre a query e verifica se a propriedade IsEmpty (está vazia) é falsa. Se não for fazia, você achou o que procura, e o código já está lá. Caso contrário não.

Uma observação ao seu código: Quando você chamar IbQuery1.Active := True, não precisa chamar o Open. Quando você invoca o método open, por baixo, o componente faz: Nome.Active := True. Quer dizer, é tudo a mesma coisa.

Outra: Dá uma olhada nesse código que eu acho que ele está meio "estranho". Veja: Se a query nao esriver vazia então mostra a mensagem, dá um beep e seta o foco para o DbEdit que serve de sender. Mas lá no final, sempre passa o foco para outro controle (DBEDesc.SetFocuswink.png. Meio estranho heheh.
AdNuX
AdNuX Super Participante Registrado
674 Mensagens 0 Curtidas
#12 Por AdNuX
17/05/2006 - 14:59
fala GTO... consegui fazer funcionar a bagaça aki! :lol: hehehehe
o código ficou assim:

procedure TF_GrProd.DBECodExit(Sender: TObject);
var
argumento:string;
i:integer;
begin
argumento:=DBECod.Text;
if DBECod.Text='' then
begin
beep;
MessageDlg('Digite um Valor Váido.', mtError, [mbOK], 0);
DBECod.SetFocus;
end//if principal
else
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select GR_CODIGO from GR_PROD where GR_CODIGO =' + argumento + ';');
Try
IBQuery1.Active:=True;
if not IBQuery1.IsEmpty then
begin
beep;
MessageDlg('Código já cadastrado.', mtError, [mbOK], 0);
DBECod.SetFocus;
end;//not if
finally
IBQuery1.Active:=False;
end; //try+finally
end;//else if principal
end;//procedure

:P
porem, eis que surge outro problema... heh
quando tento colocar uma máscara no DBECod ele dá erro se tentar sair sem digitar nada ele dá erro na máscara e não aparece a menssagem de "Digite um Valor Váido."... oq faço para "burlar" esse erro do maskedit?

antes de mais nada vlw a ajuda que vc tá dando ae! big_green.png
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal