Fórum Texto Digitado na DBGrid antes de Salvar no DataSet #465486
02/01/2014
0
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
Curtir tópico
+ 0Posts
02/01/2014
Leandro Chiodini
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
02/01/2014
Emerson
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
02/01/2014
Leandro Chiodini
Legal,
Voce pode testar so para desencargo, a seguinte verificação.
Nomedagrid.fieldbyname('NomedoCampo'). value =
att,
Leandro
Gostei + 0
02/01/2014
Leandro Chiodini
do jeito que tais fazendo ali..
assim
Grid.FieldByName(´NomeCampo´).AsString;
Att,
Leandro
Gostei + 0
02/01/2014
Emerson
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
02/01/2014
Leandro Chiodini
tenta o seguinte
dbgProdutos.Fields[colProdCodigo].asString
importante colocar o asString para ele comprar com ' '
att.
Leandro
Gostei + 0
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
02/01/2014
Leandro Chiodini
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
02/01/2014
Emerson
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
02/01/2014
Leandro Chiodini
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
02/01/2014
Emerson
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
02/01/2014
Leandro Chiodini
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
02/01/2014
Emerson
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
Clique aqui para fazer login e interagir na Comunidade :)