Texto Digitado na DBGrid antes de Salvar no DataSet

Delphi

02/01/2014

Pessoal, bom dia...

Estava a muito tempo sem programar em Delphi e agora voltei a utilizar esta ferramenta espetacular em um novo projeto que estou me dedicando, porem estou com um problema com inserção de Dados em uma DBGrid. Deixa ver se consigo me fazer entender:

Estou usando a DBGrid para que o Usuário informe os produtos que vai vender... Na DBGrid tem as colunas de Código do Produto, Descrição do Produto, Qtde, Valor, Etc..

Quando o usuário estiver na célula do código do produto e digitar um código válido, eu busco no banco de dados a sua descrição e já alimento a célula correta da descrição.. até ai, ótimo, tudo funcionando. Supondo que o usuário não saiba o codigo do produto, basta dar um ENTER na celula do produto em branco que eu disparo uma nova tela de Pesquisa, para buscar o produto correto e já alimentar as celular. Tambem está funcionando.

O problema é que quando o usuario digita algo na celula do código e em seguida dá um ENTER para mudar para a celula de quantidade... só que neste momento eu não consigo detectar que teve algo digitado na celula da grid, e o sistema entende que está em branco e dispara a pesquisa, o que é errado... se algo foi digitado, teria que checar sua validade e se estiver de acordo mudar para a próxima celula... A pesquisa só deve ser disparada se a celula estiver em branco... e está acontecendo toda vez que o usuario tecla o ENTER, mesmo que tenha acabado de informar um código.


Alguem sabe como posso fazer para detectar o que foi digitado na celula da Grid quando ainda está em modo de Edição/Inserção, sem que seja gravado no DataSet (porque se o codigo for inválido daria erro de chave)...

Se consegui me fazer entender, alguem pode me ajudar?
Emerson

Emerson

Curtidas 0

Respostas

Leandro Chiodini

Leandro Chiodini

02/01/2014

Bom dia Emerson,
Seria interessante você colocar o trecho do codigo aonde você verifica se a celula foi preenchida ou não,
pode ser que role dicas de como utilizar de outra foram este recurso.

Mais a principio .
utilizando
Suadbgrid.fieldbyname('Nome da coluna'). value

entao seria bem interessante mostrar a forma que voce esta fazendo.

att,
Leandro
GOSTEI 0
Emerson

Emerson

02/01/2014

Bom dia Leandro, boa dica...

Segue abaixo o código da Procedure do KeyDown que estou utilizando:

procedure TfrmFaturamentoNotaFiscal.dbgProdutosKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
var
  form: TfrmPesquisaGeral;
begin
  if Key = VK_RETURN then
  begin
    if dbgProdutos.SelectedIndex = colProdCodigo then
    begin
      if dbgProdutos.Fields[colProdCodigo].Text = '' then
      begin
        form := TfrmPesquisaGeral.Create(Self);
        form.Caption := 'Pesquisa de Produtos';
        form.wCampoRetorno := 'Codigo';
        form.wTxtRetorno := dbgProdutos;
        form.wCampoPesq := 'Descricao';
        form.wTabela := 'Produto';
        form.wComando := 'SELECT Codigo, Titulo FROM Produto ORDER BY Titulo';
        form.ShowModal;
      end
      else
          dbgProdutos.SelectedIndex := colProdQtde;
    end
    else if dbgProdutos.SelectedIndex = colProdQtde then
      dbgProdutos.SelectedIndex := colProdVlrUnit
    else if (dbgProdutos.SelectedIndex = colProdVlrUnit) then
      dbgProdutos.SelectedIndex := colProdPercDesc
    else if (dbgProdutos.SelectedIndex = colProdPercDesc) then
    begin
      dtsTempProdutos.Append;
      dbgProdutos.SelectedIndex := colProdCodigo;
    end;
  end;
end;


Quando o usuario digita algum codigo e tecla o ENTER, o sistema dispara este trecho do código, porem na checagem "if dbgProdutos.Fields[colProdCodigo].Text = '' then", onde eu verifico se a celula está ou não vazia para disparar a pesquisa, ela ta sempre vazia, mesmo que o usuario já tenha digitado algo... ai se eu mudar de celula e voltar para esta, ai sim a checagem funciona, mais quando é uma inserção ou Edição, esta checagem sempre está vazia...

Já tentei o "SelectedField" e tambem não deu certo, está vazio neste momento!!!


Sabe de alguma outra forma de validar isso?
GOSTEI 0
Leandro Chiodini

Leandro Chiodini

02/01/2014

Opa,
Legal,
Voce pode testar so para desencargo, a seguinte verificação.

Nomedagrid.fieldbyname('NomedoCampo'). value =


att,
Leandro
GOSTEI 0
Leandro Chiodini

Leandro Chiodini

02/01/2014

Pode ser adicionado o .AsString para ser melhor de comprar com ' '
do jeito que tais fazendo ali..


assim

Grid.FieldByName(´NomeCampo´).AsString;


Att,
Leandro
GOSTEI 0
Emerson

Emerson

02/01/2014

Cara,

Não tenho este método FieldByName na minha DBGrid... Só tem no DataSet, que neste momento do código também ainda está vazio...

Desde já agradeço pelo empenho em aujdar Leandro..

GOSTEI 0
Leandro Chiodini

Leandro Chiodini

02/01/2014

Emerson
tenta o seguinte

dbgProdutos.Fields[colProdCodigo].asString

importante colocar o asString para ele comprar com ' '


att.
Leandro
GOSTEI 0
Emerson

Emerson

02/01/2014

Emerson
tenta o seguinte

dbgProdutos.Fields[colProdCodigo].asString

importante colocar o asString para ele comprar com ' '


att.
Leandro


Boa Tarde Leandro, fiz da forma que pediu... mais sem sucesso..

Veja na sequencia de imagens que o código ta digitado e assim que dou ENTER e parei para debugar.. a célula da grid ainda se encontra vazia... Estou testando com outras grids do sistema para ter certeza que não é um caso isolado.. e realmente não é! Veja:
[img:descricao=Código digitado e tecla ENTER pressionada]http://arquivo.devmedia.com.br/forum/imagem/228065-20140102-120626.jpg[/img][img:descricao=Debug parado na linha onde deveria checar e detectar o código digitado!]http://arquivo.devmedia.com.br/forum/imagem/228065-20140102-120721.jpg[/img]

Será que não é possível obter este valor antes de sair do modo Edição /Inserção da Grid?


GOSTEI 0
Leandro Chiodini

Leandro Chiodini

02/01/2014

Verifica se essa atributo
DBGrid.Columns.Count

vem maior que 0,
se nao tiver vindo maior que 0,
dai realmente nos fields nao vai ter nada

avisa depois do teste.
GOSTEI 0
Emerson

Emerson

02/01/2014

Verifica se essa atributo
DBGrid.Columns.Count

vem maior que 0,
se nao tiver vindo maior que 0,
dai realmente nos fields nao vai ter nada

avisa depois do teste.


Leandro, boa tarde...

Sim, tem numero de Colunas (4 no caso).. Veja Imagem abaixo:

[img:descricao=Numero de Colunas da GRID]http://arquivo.devmedia.com.br/forum/imagem/228065-20140102-140307.jpg[/img]

rs.. ta fera isso em!

Obrigado pelo Empenho em ajudar Leandro..
GOSTEI 0
Leandro Chiodini

Leandro Chiodini

02/01/2014

faz um teste com o
grid.fields[]
passado o id da coluno,
pra ver se ele traz o valor.
se for a primeira passe 0. se for a segunda 1
e assim por diante.

att,
GOSTEI 0
Emerson

Emerson

02/01/2014

faz um teste com o
grid.fields[]
passado o id da coluno,
pra ver se ele traz o valor.
se for a primeira passe 0. se for a segunda 1
e assim por diante.

att,


Não vem o valor digitado nem assim... Eu já tinha feito este teste, pois como pode ver nos anteriores, eu utilizo umas constantes para definir a numeração das colunas da grid para facilitar trabalhar com elas ao longo do código.. ai passei o numero direto pensando que poderia ser algo com a constante, mais não traz valor nem com o numero direto... No momento do KeyDown retorna Vazio o valor da célula!

[img]http://arquivo.devmedia.com.br/forum/imagem/228065-20140102-143040.jpg[/img]

      if dbgClassificacao.SelectedIndex = colCodigo then
      begin
        if dbgClassificacao.Fields[0].AsString = '' then
        begin
          form := TfrmPesquisaGeral.Create(Self);
GOSTEI 0
Leandro Chiodini

Leandro Chiodini

02/01/2014

Da uma olhada nesse cara,
e ve se tu consegue usar o Locate..

https://www.devmedia.com.br/forum/digitar-num-edit-e-mostrar-no-dbgrid-delphi-2009-firebird-1-5/446311

att,
Leandro
GOSTEI 0
Emerson

Emerson

02/01/2014

Da uma olhada nesse cara,
e ve se tu consegue usar o Locate..

https://www.devmedia.com.br/forum/digitar-num-edit-e-mostrar-no-dbgrid-delphi-2009-firebird-1-5/446311

att,
Leandro


É cara.. isso infelizmente não resolve meu problema.. até porque o Locate já é feito em cima do DataSet e neste caso quero recuperar o que ta na celula, ates de ir pro DataSet... seria oque ta em Tela mesmo... Mais blz Leandro, valeu pela disposição em responder a tantos Posts..

Vou continuar tentando aqui... caso consiga a solução, posto aqui para auxiliar a todos, quando alguem precisar disso. rs..

Valeu!
GOSTEI 0
POSTAR