Fórum Validação em DBGrid - TADOQUERY #207805
20/01/2004
0
Estou desde Sexta-Feira tentando fazer, e não conseguindo, com a ajuda do Programador Marco Sales (a quem agradeço a atenção) uma exibição em DBGrid.
O quadro eh o seguinte: Tenho um Form de Entradas de Produtos, referenciando duas tabelas: TbMovimentos (Grava os dados da compra) e TbEntradas (Grava os itens q estão sendo comprados). Na tabela TbMovimentos tenho um campo CodMov, existente tambem na TbEntradas. Este campo serve para fazer a indexação dos itens com seu respectivo movimento. Certo até aí???
Bom, estou usando BASE DE DADOS MS ACCESS. Para fazer esta consulta tenho um TADOQUERY ligado a TbEntradas, um DATASOURCE ligado ao TADOQUERY e o DBGRID ligado ao DATASOURCE.
Na propriedade SQL do TADOQUERY tenho:
SELECT * FROM TbEntradas
Na Procedure de Consulta eu tinha:
procedure TFrmEntradasProdutos.Mostrar_Itens (Codigo: String);
begin
Try
QryItensNF.Close;
QryItensNF.SQL.Clear ;
QryItensNF.SQL.Add (´ SELECT * FROM TbEntradas Where = ´ + QuotedStr (Codigo));
QryItensNF.Open;
Except
On e:exception Do
begin
MessageDlg(´Erro ao localizar Registro!´ + #1310 + e.message,mterror,[mbok],0);
QryItensNF.Close ;
end;
End;
procedure TFrmEntradasProdutos.BtnAdicionarClick(Sender: TObject);
begin
Mostrar_Itens (EdtCodigo.Text);
end;
Deste jeito ele buscava todos os registros da TbEntradas, bastando para isso ser digitado um valor qualquer no EdtCodigo, independente se existisse o Codigo do Movimento (CodMov).
Por Ex: Todos os registros da TbEntradas tinham no campo CodMov o Valor 1. Se digitasse 2, ele buscava todos os registros, ou seja, ele não validava a condição. Com a ajuda do outro Programador fiz alterações na Procedure de Consulta:
procedure TFrmEntradasProdutos.Mostrar_Itens;
begin
Try
QryItensNF.Close;
QryItensNF.SQL.Clear ;
QryItensNF.SQL.Add (´ SELECT * FROM TbEntradas´);
QryItensNF.Sql.Add(´Where CodMov =: CodigoPesquisado´);
QryItensNF.ParamByName(´CodigoPesquisado´).asInteger:=StrToInt (EdtCodigo.Text);
QryItensNF.Prepare;
QryItensNF.Open;
Except
On e:exception Do
begin
MessageDlg(´Erro ao localizar Registro!´ + #1310 + e.message,mterror,[mbok],0);
QryItensNF.Close ;
end;
End;
end;
Para chamar a Procedure tenho:
procedure TFrmEntradasProdutos.BtnAdicionarClick(Sender: TObject);
begin
Mostrar_Itens;
end;
Ocorre q agora não copmpila. Esse codigo que ele me enviou creio que seja para trabalhar com TQUERY, só que tenho de trabalhar com TADOQUERY pois a BD eh MS Access. O erro que da eh q ele não reconhece o procedimento ´ParamByName´ tampouco ´Prepare´. É esse o dilema. Por que ta ocorrendo isso??? Posso ta falando bobagem mas será q não tem q haver alguma inclusão na clausula Uses??? Isso eh o q ta me parecendo.
Sempre obtive ajuda imprescindivel aqui, tenho certeza q vao me ajudar de novo!!!! :)
Valeu !!!
Desculpa a extensão do tópico!!!!
Diorgenes175
Curtir tópico
+ 0Posts
20/01/2004
Ilanocf
para a linha:
Gostei + 0
20/01/2004
Diorgenes175
Pra entender: Eu digito o valor num Edit referindo o Codigo do Movimento e ele mostra todos os registros q possuem este mesmo Codigo do Movimento.
OBS.: Tentando consertar fiz algumas alterações...
procedure TFrmEntradasProdutos.Mostrar_Itens;
begin
Try
QryItensNF.Close;
QryItensNF.SQL.Clear ;
QryItensNF.SQL.Add (´ SELECT * FROM TbEntradas Where CodMov = ´+ (CodMov));
QryItensNF.Parameters.ParamByName(´CodMov´).Value:= StrToInt(EdtCodigo.Text);
QryItensNF.Prepared;
QryItensNF.Open;
Except
On e:exception Do
begin
MessageDlg(´Erro ao localizar Registro!´ + #1310 + e.message,mterror,[mbok],0);
QryItensNF.Close ;
end;
End;
end;
procedure TFrmEntradasProdutos.BtnAdicionarClick(Sender: TObject);
begin
CodMov:= EdtCodigo.Text;
QryItensNF.Open;
QryItensNF.Locate(´Codigo´, CodMov, [loPartialKey]);
Mostrar_Itens;
end;
end.
Gostei + 0
21/01/2004
Ilanocf
Troque a consulta:
Por esta:
[color=red:918f4b5016][b:918f4b5016]
WITH QryItensNF DO
Begin
Close;
SQL.Clear ;
SQL.Add(´SELECT * FROM TbEntradas´);
SQL.Add(´Where CodMov=:P1´);
Parameters.ParamByName(´P1´).Value:=StrToIntDef(EdtCodigo.Text, 0);
Prepared;
Open;[/b:918f4b5016][/color:918f4b5016]
Dessa forma é mais fácil o sistema ler a consulta. Se não der certo poste aqui a mensagem de erro, ok?
Espero ter ajudado e boa sorte.
Gostei + 0
21/01/2004
Diorgenes175
A mensagem de erro é: ´QryItensNF: Parameter ´CodMov´ not found´
Ou seja, ele não reconhece o parametro CodMov. E este é o código completo:
With QryItensNF Do
begin
Close;
SQL.Clear ;
SQL.Add(´SELECT * FROM TbEntradas´);
SQL.Add(´Where CodMov=1´);
Parameters.ParamByName(´CodMov´).Value:=StrToIntDef(EdtCodigo.Text, 0);
Prepared;
Open;
End
Tchê, porque q ocorre isso?????
Valeu a Ajuda!!!!
Gostei + 0
21/01/2004
Ilanocf
Agora vamos fazer o seguinte. No próprio Access crie a consulta q vc deseja, converta-a em SQL e depois coloque um novo ADOQuery e copie o código SQL do Access para a propriedade de sua Query e coloque o Active como True e veja se dá algum problema. Por exemplo:
Tenho uma tabela chamada TB_Disciplinas, e no SQL Access:
Altere o SQL no Delphi (propriedade SQL do ADOQuery) para:
Onde o número 1 será o número do código do curso.
Depois mude a propriedade Active para False e na linha [color=blue:a241869d04]WHERE CodigoDoCurso=1[/color:a241869d04] altere para [color=red:a241869d04]WHERE CodigoDoCurso=:P1[/color:a241869d04]
O código no evento OnClick do botão ficaria apenas assim:
Parameters.ParamByName(´P1´).Value:=StroToIntDef(Edit1.Text, 0);
Open;
Gostei + 0
21/01/2004
Diorgenes175
Ahh..Nunca fiz a conversão de consulta Access e não faço a minima ideia de como se faz...
Se puder me ajudar fico grato... :-|
Valeu a ajuda!!
Gostei + 0
21/01/2004
Ilanocf
Não. P1 é pq, para mim, fica mais fácil saber quem é quem no parâmetro. Mas vc pode utilizar outro parâmetro se quiser.
Vc só precisa criar sua consulta no Access, normalmente e na linha critérios informar o parâmetro, por exemplo, no seu caso digite na linha critérios logo abaixo da coluna do campo CodMov o valor 2, então ele irá buscar po movimento q tiver aquele valor, ok? Bem, depois disso entre novamente na estrutura de sua consulta Access e lá naquela parte cinza ao lado da tabela clique com o botão direito do mouse e clique em Modo SQL, selecione o código e copie-o para sua Query e faça o teste, só não esqueça q a Query não aceita os parênteses:
Consulta Access:
Consulta na Query:
ou
Depois, q colocar sua consulta como Active = True e der certo o código, no lugar do valor 2 coloque seu parâmetro P1, seguido de dois pontos ( : ), assim:
E no botão (evento OnClick) o código:
Lembre-se de q o seu parâmetro pode ser como vc desejar: P1, Cod1, etc...
Outra coisa, o parâmetro q vc estava colocando [b:e8340339a7]CodMov[/b:e8340339a7] era igual ao nome do campo? Se for não dá certo, por isso é importante ser algo bem simples. Qualquer coisa visite a minha página sobre Access, lá mostra como se faz uma consulta: [url]br.geocities.com/linkotecabr[/url].
Boa sorte,
Ilano.
Gostei + 0
23/01/2004
Diorgenes175
porblema fazendo deste jeito? Eu acho q não... Mas se tu for notar, eu codifiquei o parametro, sendo assim está errado pois o parametro (onde ta escrito 10) tem de ser uma variável. Eis o Codigo:
procedure TFrmEntradasProdutos.BtnMostrarClick(Sender: TObject);
begin
With QryItensNF Do
begin
Close;
SQL.Clear ;
SQL.Add(´SELECT * FROM TbEntradas Where CodMov=10´);
//Parameters.ParamByName(´CODIGO´).Value:=StrToIntDef(EdtCodigo.Text, 0);
Prepared;
Open;
End
end;
end.
Portanto, agradecendo tua atenção e ajuda, eu só gostaria q tu me orientasse a como fazer para lançar o Parametro numa especie de variavel e aí tá feito.
Valeu a Ajuda!!!!
Gostei + 0
23/01/2004
Ilanocf
Assim:
[color=red:5d72985836]SQL.Add(´SELECT * FROM TbEntradas Where CodMov= :CODIGO);
Parameters.ParamByName(´CODIGO´).Value:=StrToIntDef(EdtCodigo.Text, 0); [/color:5d72985836]
Diferença pequena, não? Afaste o [color=red:5d72985836][b:5d72985836]:CODIGO[/b:5d72985836][/color:5d72985836] do sinal de igualdade.
Espero ter ajudado.
Gostei + 0
23/01/2004
Diorgenes175
Note q a linha ´Parameters.ParamByName´ está como comentário e tb q na linha anterior o parametro eh ´10´. ´10´ é o codigo do movimento que eu inseri manualmente direto no Access para fazer um teste. Assim uncionou beleza, porém ele sempre vai buscar os registros q comtenham o valor ´10´ no campo ´CodMov´, pois está codificado um valor como parametro, entende? O que eu queria q tu me ajudasse é a descobrir uma forma de lançar este parametro (no caso deste exemplo ´10´) numa variavel.
Eis o codigo:
Procedure ...
With QryItensNF Do
begin
Close;
SQL.Clear ;
SQL.Add(´SELECT * FROM TbEntradas Where CodMov=10´);
// Parameters.ParamByName(´Codigo´).Value:=StrToIntDef(EdtCodigo.Text, 0);
Prepared;
Open;
End
end;
Desse jeito deu certo mas sempre buscando pelo valor 10. Estou usando Access 2000... desculpe não ter informado antes...
Desculpa o incomodo...
Valeu a ajuda!!!
Gostei + 0
23/01/2004
Ilanocf
Gostei + 0
27/01/2004
Diorgenes175
Procedure...
var
RegMov: String; // => como integer ocorria incompatibilidade
begin
With QryItensNF Do
begin
Close;
SQL.Clear;
RegMov:= FldCodMovimento.Text;
SQL.Add(´SELECT * FROM TbEntradas Where CodMov= :RegMov´);
Prepared;
Open;
End
end;
O q ocorre eh q desse jeito nao aparece nenhum registro... O q ta q errado??? Por que ocorre isso???
Desculpa o incomodo!!!
Valeu a Ajuda!!!
Gostei + 0
27/01/2004
Ilanocf
Tente fazer assim:
Gostei + 0
27/01/2004
Diorgenes175
Valeu!!!
Gostei + 0
28/01/2004
Ilanocf
Gostei + 0