GARANTIR DESCONTO

Fórum Testar um valor digitado no DBGrid, pra mudar de coluna #369038

14/03/2009

0

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


Fonsenix

Fonsenix

Responder

Posts

14/03/2009

Marco Salles

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

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


Responder

Gostei + 0

14/03/2009

Fonsenix

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.


Responder

Gostei + 0

15/03/2009

Marco Salles

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 ?


Responder

Gostei + 0

15/03/2009

Martins

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.


Responder

Gostei + 0

15/03/2009

Fonsenix

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


Responder

Gostei + 0

16/03/2009

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!


Responder

Gostei + 0

16/03/2009

Fonsenix

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


Responder

Gostei + 0

16/03/2009

Marco Salles

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 ????


Responder

Gostei + 0

17/03/2009

Fonsenix

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.


Responder

Gostei + 0

17/03/2009

Marco Salles

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar