Fórum Validação em DBGrid - TADOQUERY #207805

20/01/2004

0

Caras, sei q o tópico ta extenso, sendo cansativo, chato,etc. mas nesse momento se faz necessário.

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

Diorgenes175

Responder

Posts

20/01/2004

Ilanocf

Modifique a linha:
QryItensNF.ParamByName(´CodigoPesquisado´).asInteger:=StrToInt (EdtCodigo.Text);


para a linha:

QryItensNF.[color=red:68ecff096e]Parameters.[/color:68ecff096e]ParamByName(´CodigoPesquisado´).asInteger:=StrToInt (EdtCodigo.Text);



Responder

Gostei + 0

20/01/2004

Diorgenes175

Cara, me da uma força aí. Fiz o q tu escreveu e compilou, mas nao ta dando certo :-\. Da uma analisada no Código:

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.


Responder

Gostei + 0

21/01/2004

Ilanocf

Vamos tentar de uma forma um pouco diferente:

Troque a consulta:
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;


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.


Responder

Gostei + 0

21/01/2004

Diorgenes175

Cara, coloquei a tua dica no meu projeto, mas ocorre um erro na linha ´Parameters.ParamByName(´CodMov´).Value:=StrToIntDef(EdtCodigo.Text, 0);´. Ele não reconhece o parametro ´CodMov´ (tu tinha colocado ´P1´ eu penso q era uma especie de variavel).Já tentei colocar ´codigo´ e deu o mesmo erro.

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


Responder

Gostei + 0

21/01/2004

Ilanocf

Na verdade o P1 não é uma variável, é um parâmetro, como o CodMov q vc está colocando. Acho assim bem melhor, caso precise de mais parâmetros coloco P2, P3, ...

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:
SELECT TB_Disciplinas.CodigoDaDisciplina, TB_Disciplinas.CodigoDoCurso, TB_Disciplinas.NomeDaDisciplina FROM TB_Disciplinas WHERE (((TB_Disciplinas.CodigoDoCurso)=1));


Altere o SQL no Delphi (propriedade SQL do ADOQuery) para:
SELECT * FROM TB_Disciplinas WHERE CodigoDoCurso=1;


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;


Responder

Gostei + 0

21/01/2004

Diorgenes175

Meu, o caso e q eu não tava pensando em fazer consulta em Access para isso...Tava tentando buscar direto da tabela, mas vou fazer o q tu disse. Mas eu não entendi uma coisa (é q eu não sou um ´Expert´ em SQL): me explica direito esse esquema do parametro ´P1´. Eu necessariamente tenho q declarar ´P1´??? Se tiver, eu já fiz isso, e deu o mesmo erro de ´Parametro inexistente´! To quase disistindo e jogando o PC pela janela. Só não jogo porque é bom, novo, e não é meu. ehehehe!!!!! :-)

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


Responder

Gostei + 0

21/01/2004

Ilanocf

Eu necessariamente tenho q declarar ´P1´???

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.

Ahh..Nunca fiz a conversão de consulta Access e não faço a minima ideia de como se faz...


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:
SELECT TB_Disciplinas.CodigoDaDisciplina, TB_Disciplinas.CodigoDoCurso, TB_Disciplinas.NomeDaDisciplina FROM TB_Disciplinas WHERE (((TB_Disciplinas.CodigoDoCurso)=2));


Consulta na Query:
SELECT TB_Disciplinas.CodigoDaDisciplina, TB_Disciplinas.CodigoDoCurso, TB_Disciplinas.NomeDaDisciplina FROM TB_Disciplinas WHERE TB_Disciplinas.CodigoDoCurso=2;


ou

SELECT * FROM TB_Disciplinas WHERE TB_Disciplinas.CodigoDoCurso=2;


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:

SELECT * FROM TB_Disciplinas WHERE TB_Disciplinas.CodigoDoCurso:=P1;


E no botão (evento OnClick) o código:

Parameters.ParamByName(´P1´).Value:=StroToIntDef(Edit1.Text, 0); Open;


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.


Responder

Gostei + 0

23/01/2004

Diorgenes175

Meu, eu so consegui ler hoje (23/01/04) a tua resposta. Cara, sem querer eu consegui fazer exatamente o que tu disse na ultima resposta, sem precisar fazer consulta no Access!! Eu deixei a linha q trata do parametro como comentario...e funcionou (dava erro no parametro referenciado, ali no exemplo ´CODIGO´). Na tua visão, posso ter algum
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!!!!


Responder

Gostei + 0

23/01/2004

Ilanocf

Sabe, depois de pensar mais um pouco, lembrei de um detalhe, talvez vc esteja usando Access 2000, se for, então tente deixar as linhas:

SQL.Add(´SELECT * FROM TbEntradas Where CodMov=:CODIGO´); Parameters.ParamByName(´CODIGO´).Value:=StrToIntDef(EdtCodigo.Text, 0);


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.


Responder

Gostei + 0

23/01/2004

Diorgenes175

Meu, desse jeito não funcionou. Dá uma olhada no código e depois me responda:
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!!!


Responder

Gostei + 0

23/01/2004

Ilanocf

Faça o seguinte, então:

procedure TFrmEntradasProdutos.Mostrar_Itens; Var VMov: Integer; begin ...sua SQL... VMov:=QryItensNF.CodMov.Value; ... SeuCampo.Value:=VMov; ...resto do seu comando... end;





Responder

Gostei + 0

27/01/2004

Diorgenes175

Cara, desculpa eu ainda estar no mesmo empecilho. A forma q tu me orientou a fazer para lançar o parametro numa variavel tava meio vaga, mas eu fiz algo semelhante. Ficou assim:

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


Responder

Gostei + 0

27/01/2004

Ilanocf

Tudo bem! Vamos lá,

Tente fazer assim:

SQL.Add(´SELECT * FROM TbEntradas Where CodMov= :StrToIntDef(RegMov, 0)´);



Responder

Gostei + 0

27/01/2004

Diorgenes175

Mesmo assim não houve resultado. Na mensagem de erro consta ´Objeto parameter definido incorretamente. As informações são inconsistentes ou incompletas´. Há ainda algum erro de sintaxe...


Valeu!!!


Responder

Gostei + 0

28/01/2004

Ilanocf

Mude para isto:
SQL.ADD(´SELECT * TBENTRADAS WHERE CODMOV = ´ + REGMOV)



Responder

Gostei + 0

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

Aceitar