Testar um valor digitado no DBGrid, pra mudar de coluna
Amigos,
como eu testo um valor que acabei de digitar no DBGrid.
Eu tentei assim:
DBgrid.SelectField.Value, mas o teste só funciona depois que saio da coluna e volto.
Isso eu tentei tanto no KeyDown como no KeyPress.
Eu quero testar antes que ele saia da coluna pra que se estiver nas condiçoes que preciso o programa permita que saia, caso contrário ele deve digitar um novo valor.
Grato
como eu testo um valor que acabei de digitar no DBGrid.
Eu tentei assim:
DBgrid.SelectField.Value, mas o teste só funciona depois que saio da coluna e volto.
Isso eu tentei tanto no KeyDown como no KeyPress.
Eu quero testar antes que ele saia da coluna pra que se estiver nas condiçoes que preciso o programa permita que saia, caso contrário ele deve digitar um novo valor.
Grato
Fonsenix
Curtidas 0
Respostas
Marco Salles
14/03/2009
vc deve testar isto no onsetText do Field ..
Aqui um exemplinho que fiz rapidinho
No evento OnsetText do Tfield FIRSTNAME de uma tabelinha MyBase que
eu tenho
Aqui testa se o Text é igual a Constante ´Marco´ ... caso seje gera uma
exceção silenciosa (Abort) e não consigo mudar de campo
Acho que é isso que vc quer
Aqui um exemplinho que fiz rapidinho
No evento OnsetText do Tfield FIRSTNAME de uma tabelinha MyBase que
eu tenho
procedure TForm1.ClientDataSet1FIRSTNAMESetText(Sender: TField; const Text: String); begin if uppercase(text) = Uppercase(´Marco´) then abort else sender.AsString:=text end;
Aqui testa se o Text é igual a Constante ´Marco´ ... caso seje gera uma
exceção silenciosa (Abort) e não consigo mudar de campo
Acho que é isso que vc quer
GOSTEI 0
Fonsenix
14/03/2009
Grande Marco,
mais um vez agradeço sua colaboração.
Então, tentei como vc passou, com esse código:
if (StrToFloat(Text) > qnestoque) then
begin
Application.MessageBox(´Não consta esta quantidade de material´+#13+
´no estoque escolhido´,´ESTOQUE INSUFICIENTE´,MB_ICONERROR+MB_OK);
Abort;
end
else
begin
sender.AsString:=text
end;
Mas aparece duas vezes a mensagem.
Por que será?
Valeu.
mais um vez agradeço sua colaboração.
Então, tentei como vc passou, com esse código:
if (StrToFloat(Text) > qnestoque) then
begin
Application.MessageBox(´Não consta esta quantidade de material´+#13+
´no estoque escolhido´,´ESTOQUE INSUFICIENTE´,MB_ICONERROR+MB_OK);
Abort;
end
else
begin
sender.AsString:=text
end;
Mas aparece duas vezes a mensagem.
Por que será?
Valeu.
GOSTEI 0
Marco Salles
14/03/2009
Oi FONSENIX , para esta mensagem aparecer duas vezes , o evento de alguma forma , deve estar sendo disparado duas vezes.
Para uma resposta mais aferida , talves seje necessário conhecermos detalhes da sua arquiteruta ou do seu codigo
Existem Outros eventos relacionados com esta validação ??w
Vc esta usando DbEdits ou DbGrid ???
Coloque mais detalhes e debuguer ... Algo esta ocorrendo de forma recursiva. Ok ?
Para uma resposta mais aferida , talves seje necessário conhecermos detalhes da sua arquiteruta ou do seu codigo
Existem Outros eventos relacionados com esta validação ??w
Vc esta usando DbEdits ou DbGrid ???
Coloque mais detalhes e debuguer ... Algo esta ocorrendo de forma recursiva. Ok ?
GOSTEI 0
Martins
14/03/2009
Nesta sua tela, vc tem apenas o componente DBGrid ou está usando componentes DBEdit?
Pq creio q está acontecendo o q o nobre [b:f21a2ac335]Marco Salles[/b:f21a2ac335] citou logo acima, dê uma revisada em seu código.
Boa sorte.
Pq creio q está acontecendo o q o nobre [b:f21a2ac335]Marco Salles[/b:f21a2ac335] citou logo acima, dê uma revisada em seu código.
Boa sorte.
GOSTEI 0
Fonsenix
14/03/2009
Caros amigos,
Marco e Salles,
na tela eu tenho sim, outros componentes como DBedits mas estão ligados a outra tabela.
No DBGrid eu tenho 7 campos, cod, descriçao, subitem, quantidade(onde eu quero testar o valor digitado), preço, desconto, total eu faço vários controles. Por exemplo, se estou em descrição e dou um Enter ele pula pro código o mesmo acontece no código. Se digito algo ele busca na tabela de produtos, preenche os campos cod e descrição e pula pro campo quantidade, e assim por diante.
Então, e esses controles eu faço no KeyDown do DBGrid, onde uso um case, pra testar se o DBGridSelectedIndex é tal, se for pulo pro próximo:
VK_RETURN:
begin
//inicio case ENTER
case dbgrd1.SelectedIndex of
2:
begin
DM.MDS_SUBPRODUTOS.Close;
DM.MDS_SUBPRODUTOS.SelectSQL.Clear;
DM.MDS_SUBPRODUTOS.SelectSQL.Add(´select * from subprodutos where cd_produto=:cdproduto´);
DM.MDS_SUBPRODUTOS.Params[0].AsInteger:=DM.MDOPRODUTOS.Fields[0].AsInteger;
DM.MDS_SUBPRODUTOS.Open;
// ShowMessage(IntToStr(DM.MDOPRODUTOS.Fields[0].AsInteger));
// ShowMessage(IntToStr(DM.MDS_SUBPRODUTOS.RecordCount));
if DM.MDS_SUBPRODUTOS.RecordCount<>0 then
begin
CreateForm(TFrmBuscaSubProd);
end
else
begin
dbgrd1.SelectedIndex:=3;
end;
end;
3:
begin
dbgrd1.SelectedIndex:=5;
end;
5:
begin
dbgrd1.SelectedIndex:=7;
end;
7:
begin
if (DBGrd1.Fields[0].AsString<>NullAsStringValue) and (DBGrd1.Fields[1].AsString<>NullAsStringValue) then
begin
if (StrToFloat(dbgrd1.Fields[5].AsString)>DM.MDOPRODUTOS.Fields[6].AsFloat) then
begin
Application.MessageBox(´O desconto dado esta acima do permitido´,´AVISO´,MB_ICONINFORMATION+MB_OK);
dbgrd1.SelectedIndex:=5;
end
else
begin
if (DM.MDS_ORCAMI.State in [dsEdit,dsInsert]) then
begin
DM.MDS_ORCAMI.Post;
// DM.MDS_ORCAMI.Last;
// DM.MDS_ORCAMI.Append;
dbgrd1.SelectedIndex:=0;
end else
begin
// DM.MDS_ORCAMI.Append;
// DM.MDS_ORCAMI.Last;
// DM.MDS_ORCAMI.Append;
dbgrd1.SelectedIndex:=0;
end;
DM.MDOTOTAL.Close;
DM.MDOTOTAL.SQL.Clear;
DM.MDOTOTAL.SQL.Add(´select * from TOTAL_ORCAM(:onum)´);
DM.MDOTOTAL.Params[0].AsInteger:=onum_var;
DM.MDOTOTAL.Open;
DM.MDS_ORCAM.Edit;
DM.MDS_ORCAM.Fields[18].AsFloat:=DM.MDOTOTAL.Fields[0].AsFloat;
DM.MDS_ORCAM.Post;
DM.MDS_ORCAMI.Append;
end;
end
else
dbgrd1.SelectedIndex:=0;
end;
end;
end;
Meio bagunçado né? rs
Marco e Salles,
na tela eu tenho sim, outros componentes como DBedits mas estão ligados a outra tabela.
No DBGrid eu tenho 7 campos, cod, descriçao, subitem, quantidade(onde eu quero testar o valor digitado), preço, desconto, total eu faço vários controles. Por exemplo, se estou em descrição e dou um Enter ele pula pro código o mesmo acontece no código. Se digito algo ele busca na tabela de produtos, preenche os campos cod e descrição e pula pro campo quantidade, e assim por diante.
Então, e esses controles eu faço no KeyDown do DBGrid, onde uso um case, pra testar se o DBGridSelectedIndex é tal, se for pulo pro próximo:
VK_RETURN:
begin
//inicio case ENTER
case dbgrd1.SelectedIndex of
2:
begin
DM.MDS_SUBPRODUTOS.Close;
DM.MDS_SUBPRODUTOS.SelectSQL.Clear;
DM.MDS_SUBPRODUTOS.SelectSQL.Add(´select * from subprodutos where cd_produto=:cdproduto´);
DM.MDS_SUBPRODUTOS.Params[0].AsInteger:=DM.MDOPRODUTOS.Fields[0].AsInteger;
DM.MDS_SUBPRODUTOS.Open;
// ShowMessage(IntToStr(DM.MDOPRODUTOS.Fields[0].AsInteger));
// ShowMessage(IntToStr(DM.MDS_SUBPRODUTOS.RecordCount));
if DM.MDS_SUBPRODUTOS.RecordCount<>0 then
begin
CreateForm(TFrmBuscaSubProd);
end
else
begin
dbgrd1.SelectedIndex:=3;
end;
end;
3:
begin
dbgrd1.SelectedIndex:=5;
end;
5:
begin
dbgrd1.SelectedIndex:=7;
end;
7:
begin
if (DBGrd1.Fields[0].AsString<>NullAsStringValue) and (DBGrd1.Fields[1].AsString<>NullAsStringValue) then
begin
if (StrToFloat(dbgrd1.Fields[5].AsString)>DM.MDOPRODUTOS.Fields[6].AsFloat) then
begin
Application.MessageBox(´O desconto dado esta acima do permitido´,´AVISO´,MB_ICONINFORMATION+MB_OK);
dbgrd1.SelectedIndex:=5;
end
else
begin
if (DM.MDS_ORCAMI.State in [dsEdit,dsInsert]) then
begin
DM.MDS_ORCAMI.Post;
// DM.MDS_ORCAMI.Last;
// DM.MDS_ORCAMI.Append;
dbgrd1.SelectedIndex:=0;
end else
begin
// DM.MDS_ORCAMI.Append;
// DM.MDS_ORCAMI.Last;
// DM.MDS_ORCAMI.Append;
dbgrd1.SelectedIndex:=0;
end;
DM.MDOTOTAL.Close;
DM.MDOTOTAL.SQL.Clear;
DM.MDOTOTAL.SQL.Add(´select * from TOTAL_ORCAM(:onum)´);
DM.MDOTOTAL.Params[0].AsInteger:=onum_var;
DM.MDOTOTAL.Open;
DM.MDS_ORCAM.Edit;
DM.MDS_ORCAM.Fields[18].AsFloat:=DM.MDOTOTAL.Fields[0].AsFloat;
DM.MDS_ORCAM.Post;
DM.MDS_ORCAMI.Append;
end;
end
else
dbgrd1.SelectedIndex:=0;
end;
end;
end;
Meio bagunçado né? rs
GOSTEI 0
Marco Salles
14/03/2009
FONSENIX , deburgar ai amigo... Na coluna do DbGrid em questão
< no case> coloque um BreakPoint e execute passo a passo e veja o que
esta Rolando .. Tenho certeza que vai clarear .
Ai vc coloca os detalhes para tds que acompanham o tópico. Ok!
< no case> coloque um BreakPoint e execute passo a passo e veja o que
esta Rolando .. Tenho certeza que vai clarear .
Ai vc coloca os detalhes para tds que acompanham o tópico. Ok!
GOSTEI 0
Fonsenix
14/03/2009
[quote:c0ba0a2fee=´Marco Salles´]FONSENIX , deburgar ai amigo... Na coluna do DbGrid em questão
< no case> coloque um BreakPoint e execute passo a passo e veja o que
esta Rolando .. Tenho certeza que vai clarear .
Ai vc coloca os detalhes para tds que acompanham o tópico. Ok![/quote:c0ba0a2fee]
Marco, eu debuguei e percebi o seguinte, como eu controlo o movimento no DBGrid, quando dou um ENTER no KeyDown tem um código que joga pro próximo campo, mas no OnSetText ele testa, aborta se for menor, então o código tenta jogar pra próximo campo, ai testa denovo, por isso as duas mensagens.
Ja sei a causa, agora vou descobrir a solução.Valeu um abraço.
< no case> coloque um BreakPoint e execute passo a passo e veja o que
esta Rolando .. Tenho certeza que vai clarear .
Ai vc coloca os detalhes para tds que acompanham o tópico. Ok![/quote:c0ba0a2fee]
Marco, eu debuguei e percebi o seguinte, como eu controlo o movimento no DBGrid, quando dou um ENTER no KeyDown tem um código que joga pro próximo campo, mas no OnSetText ele testa, aborta se for menor, então o código tenta jogar pra próximo campo, ai testa denovo, por isso as duas mensagens.
Ja sei a causa, agora vou descobrir a solução.Valeu um abraço.
GOSTEI 0
Marco Salles
14/03/2009
Marco, eu debuguei e percebi o seguinte, como eu controlo o movimento no DBGrid, quando dou um ENTER no KeyDown tem um código que joga pro próximo campo
Sei .. então me repsonda o seguinte :
Com a tecla Tab , o problema da mensagem duplicada não ocorre ????
GOSTEI 0
Fonsenix
14/03/2009
Sei .. então me repsonda o seguinte :
Com a tecla Tab , o problema da mensagem duplicada não ocorre ????
Me desculpe a demora em responder Marco,
então com tab, a mensagem aparece apenas um vez.
Por isso, que acho que tem a ver com o controle que fiz no dbgrid.
E me desculpando, eu disse na mensagem acima caros amigos, Marco e Salles, eu quis dizer Marco e Martins.
Um abraço.
GOSTEI 0
Marco Salles
14/03/2009
Me desculpe a demora em responder Marco,
então com tab, a mensagem aparece apenas um vez.
Por isso, que acho que tem a ver com o controle que fiz no dbgrid.
Por acaso vc nao tem algum codigo que troca o Enter pelo Tab na sua
Aplocação . To achndo que o problema pode esta ai
GOSTEI 0