Consulta usando uma tabela master e uma detalhe

Delphi

13/07/2006

Ola

tenho as seguintes tabelas

[b:827d42ad97]CONSUMO[/b:827d42ad97]
NConsumo *
NCartao
Nome
Origem
Data


[b:827d42ad97]ITENS[/b:827d42ad97]
Controle *
NConsumo
CodMeicamento
Medicamento
Quantidade



Gostaria de mostrar em um DBGrid os seguintes dados

Nome, Origem, Data, Medicamento, e quantidade


Seria uma consulta entre duas datas e usaria um DBLookupCombobox para escolher o nome a ser mostrado e tambem dois MaskEdits para colocar as datas, um botão com o codigo para fazer a chamada da consulta.

So que nao sei como fazer essa consulta, se alguem puder me ajudar ficarei muito grato.

Uso Delphi 5 paradox


Clenio

Clenio

Curtidas 0

Respostas

Clenio

Clenio

13/07/2006

Vejam o codigo que coloquei, mas, esta dando o seguinte erro:

[b:223465ec69]Query1 : No SQL stantement available[/b:223465ec69]


procedure TfmConData.BitBtn1Click(Sender: TObject);
begin
With Query1 do
begin
close;
SQL.CLEAR;
Query1.sql.Add (´SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde, FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero´);
sql.add(´WHERE C.Data BETWEEN DataInicial AND DataFinal) AND (C.Nome = DBLooKupComboBox1.Text))´);
sql.add (´Order by C.Nome, C.Data´);
params[0].Asstring:= DBLooKupCombobox1.Text;
params[1].asdatetime:=strtoDate(MaskEdit1.text);
params[2].asdatetime:=strtoDate(MaskEdit2.text);
Open;
end;
end;

end.

Por favor se alguem souber o que ta errado, de uma ajudinha, to precisando muito.


GOSTEI 0
Paullsoftware

Paullsoftware

13/07/2006

Qual banco?


GOSTEI 0
Clenio

Clenio

13/07/2006

Estou usando Delphi5 Tabelas Paradox

Por favor to precisando muito resolver esse problema, estou dependendo so disso pra terminar.


Abraços.


GOSTEI 0
Paullsoftware

Paullsoftware

13/07/2006

a melhor maneira de vc testar seria usando o gerenciador da sua base que no seu caso poderia ser o Database Explorer que vem junto com o BDE para testar as consultas SQL, mais vamos fazer umas inversões pra ver se funcionam:
o seu código é esse, eu fiz umas modificações para ver se resolve esse problema
begin 
With Query1 do 
begin 
close; 
SQL.CLEAR; 
Query1.sql.Add (´SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde, FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero´); 
sql.add(´WHERE C.Data BETWEEN DataInicial AND DataFinal) AND (C.Nome = DBLooKupComboBox1.Text))´); 
sql.add (´Order by C.Nome, C.Data´); 
params[0].Asstring:= DBLooKupCombobox1.Text; 
params[1].asdatetime:=strtoDate(MaskEdit1.text); 
params[2].asdatetime:=strtoDate(MaskEdit2.text); 
Open; 
end; 
end;


var
aSelect,aLeft,aWhere,aOrderby:String;
begin 
aSelect := ´ SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde,  FROM Consumo C ´;
aLeft  := ´ LEFT JOIN Itens I ON (I.Numero = C.Numero) ´;
aWhere  := ´ WHERE C.Data BETWEEN :pDi AND :pDf) AND (C.Nome = :pNome)´;//Estou criando três paramentros nessa linha o parametro pDi, pDf e pNome...
aOrderby  := ´ Order by C.Nome, C.Data ´;
With Query1 do 
begin 
 Close; 
 SQL.CLEAR; 
 SQL.Add (´aSelect + aLeft + aWhere + aOrderBy´); 
 Params.ParamByName(´pNome´).AsString := DBLooKupCombobox1.Text; 
 Params.ParamByName(´pDi´).AsString := FormatDateTime(´dd/mm/yyyy´,StrToDate(MaskEdit1.text)); 
 Params.ParamByName(´pDf´).AsString := FormatDateTime(´dd/mm/yyyy´,StrToDate(MaskEdit1.text)); 
 Open;
end; 
end;

espero ter ajudado :wink:


GOSTEI 0
Clenio

Clenio

13/07/2006

paullsoftware, muito obrigado por estar me ajudando, fiz exatamente como voce colocou, o programa compila normalmente, mas quando clico no link para abrir o formulario onde está a pesquisa sai a mesma mensagem de antes: [b:344f51e017]Query1 :No SQL stantement available[/b:344f51e017]

o que poderá ser isso ? acho que deve ser uma coizinha de nada, mas que não tem jeito de ir adiante.

Mais uma vez obrigado por tudo, e vamos tentando até dar certo,

Inssistir sempre, desistir jamais.


GOSTEI 0
Paullsoftware

Paullsoftware

13/07/2006

Como eu já falei antes, execute testes usando o ultilitario DataBase Exmplorer que vem com o BDE para ver se o codigo SQL usado é suportado e depois adapte ao seu sistema...
qq coisa vou dar mais uma olhada depois do almoço e vj o que posso fazer :wink:


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/07/2006

tente assim:
begin 
  With Query1 do 
  begin 
    Close; 
    SQL.Text :=
      ´SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde ´+
      ´FROM Consumo C ´+
      ´LEFT JOIN Itens I ON (I.NConsumo = C.NConsumo) ´+
      ´WHERE (C.Data BETWEEN :pDi and :pDf) ´+
      ´  and (C.Nome = :pNome) ´+
      ´ORDER BY C.Nome, C.Data ´;
    ParamByName(´pNome´).AsString := DBLooKupCombobox1.Text;
    ParamByName(´pDi´).AsDateTime := StrToDate(MaskEdit1.text);
    ParamByName(´pDf´).AsDateTime := StrToDate(MaskEdit2.text);
    Open;
  end;
end;
e informe qualquer mensagem de erro que seja exibida


GOSTEI 0
Clenio

Clenio

13/07/2006

Infelismente continua dando o mesmo erro na hora que chamo o formulario de consulta.

[b:ee1d9f8b72]Query1 :No SQL stantement available[/b:ee1d9f8b72]


Valeu Emerson


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/07/2006

que componente está em uso?
outra coisa... tente rodar essa instrução no Database Desktop.


GOSTEI 0
Paullsoftware

Paullsoftware

13/07/2006

que componente está em uso? outra coisa... tente rodar essa instrução no Database Desktop.


foi o que eu disse pra ele aqui, não adianta insistir se a tecnologia não aceitar a forma como está a instrução SQL...


a melhor maneira de vc testar seria usando o gerenciador da sua base que no seu caso poderia ser o Database Explorer que vem junto com o BDE para testar as consultas SQL, mais vamos fazer umas inversões pra ver se funcionam:


um abraço Emerson, valeu pela ajuda...
Clenio, tenta ai pelo DataBase Explorer e ver se vai rodar esse script, se sim, é só adaptar as suas necessidades...


GOSTEI 0
Clenio

Clenio

13/07/2006

Obrigado a vocês pela ajuda.

coloquei essa intrução no Database Explorer como vocês disseram.

SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde
FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero
WHERE C.Data BETWEEN :DataInicial AND :DataFinal AND C.Nome = C.Nome
Order by C.Nome, C.Data

está saindo a seguinte mensagem:

P[b:144c1b7446]arameter not set in query string.[/b:144c1b7446]

Me parece que o problema está no parametro do nome porque o resto esta correto, tentei varios parametros, mas não encontrei o correto.

O problema está na linha 3 nesse ponto aqui ( [b:144c1b7446]C.Nome = C.Nome[/b:144c1b7446])

Vejam o que podem fazer agora.

Obrigado mais uma vez.


GOSTEI 0
Micheus

Micheus

13/07/2006

Query1.sql.Add (´SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde, FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero´);
[b:e189d3da4f]clenio[/b:e189d3da4f], se vc observar bem o código que vc postou, verá que tem uma [u:e189d3da4f]vírgula sobrando[/u:e189d3da4f] antes do FROM. O código do colega [b:e189d3da4f]paullsoftware[/b:e189d3da4f], que fez uma adaptação do seu código, também manteve-a. Por isso o erro continuou.
Na proposta do colega [b:e189d3da4f]emerson.en[/b:e189d3da4f], já está corrigida e deve funcionar.
coloquei essa intrução no Database Explorer como vocês disseram. ... está saindo a seguinte mensagem: Parameter not set in query string.
Esta mensagem se deve ao fato de os parâmetros (aqueles campos que seguem os dois pontos) não estarem definidos. Para fazer o teste da instrução SQL no Database Explorer acredito que vc devesse substituir estes parâmetros por valores adequados. Os parâmetros serão utilizados no código do seu programa, na forma como propôs o colega [b:e189d3da4f]emerson.en[/b:e189d3da4f].


GOSTEI 0
Paullsoftware

Paullsoftware

13/07/2006

[quote:fd16b282d7]Query1.sql.Add (´SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde, FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero´);
[b:fd16b282d7]clenio[/b:fd16b282d7], se vc observar bem o código que vc postou, verá que tem uma [u:fd16b282d7]vírgula sobrando[/u:fd16b282d7] antes do FROM. O código do colega [b:fd16b282d7]paullsoftware[/b:fd16b282d7], que fez uma adaptação do seu código, também manteve-a. Por isso o erro continuou.
Na proposta do colega [b:fd16b282d7]emerson.en[/b:fd16b282d7], já está corrigida e deve funcionar.
coloquei essa intrução no Database Explorer como vocês disseram. ... está saindo a seguinte mensagem: Parameter not set in query string.
Esta mensagem se deve ao fato de os parâmetros (aqueles campos que seguem os dois pontos) não estarem definidos. Para fazer o teste da instrução SQL no Database Explorer acredito que vc devesse substituir estes parâmetros por valores adequados. Os parâmetros serão utilizados no código do seu programa, na forma como propôs o colega [b:fd16b282d7]emerson.en[/b:fd16b282d7].[/quote:fd16b282d7]

Meu camarada, eu não olhei esse detalhe, vlw... :wink:


GOSTEI 0
Clenio

Clenio

13/07/2006

Olá,

Fiz o teste novamente com o codigo abaixo e sai essa mensagem:

[b:91dfb0c39b]Parameter not set in query string.[/b:91dfb0c39b]

SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde
FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero
WHERE C.Data BETWEEN :pDi AND :pDf AND C.Nome = :pNome

tenho que conseguir encontrar um parametro para colocar no lugar do :pNome, ja tentei varios, mas nenhum esta dando certo.

esse ta complicado to quase desistindo, pior é que ja pesquisei em tudo quanto é lugar e não consigo nada parecido.

vou tentando aqui, vamos ver até onde vai.

Abraços e obrigado por tentarem me ajudar.


GOSTEI 0
Micheus

Micheus

13/07/2006

Quem sabe se voltarmos a origem de tudo...
Seu trecho de código, corrigido, com a proposta do colega [b:f9174c54a2]emerson.en[/b:f9174c54a2]:
procedure TfmConData.BitBtn1Click(Sender: TObject);
begin
  With Query1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add(´SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde´);
    SQL.Add(´FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero´);
    SQL.Add(´WHERE C.Data BETWEEN :pDi AND :pDf AND C.Nome = :pNome)´);
    SQL.Add(´ORDER BY C.Nome, C.Data´);
    ParamByName(´pDi´).AsDateTime := StrToDate(MaskEdit1.text);
    ParamByName(´pDf´).AsDateTime := StrToDate(MaskEdit2.text);
    ParamByName(´pNome´).AsString := DBLooKupCombobox1.Text;
    Open;
  end;
end;
Isto já deve estar funcionando.

coloquei essa intrução no Database Explorer como vocês disseram. SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero WHERE C.Data BETWEEN :DataInicial AND :DataFinal AND C.Nome = :Nome Order by C.Nome, C.Data


(por emerson.en) ...tente rodar essa instrução no Database Desktop.
(por paullsoftware) tenta ai pelo DataBase Explorer e ver se vai rodar esse script, se sim, é só adaptar as suas necessidades...
[b:f9174c54a2]clenio[/b:f9174c54a2], quando o pessoal ´falou´ em testar dentro do Database Explorer, vc deveria fazer algo como:
SELECT C.Nome, C.Destino, C.Data, I.Medicamento, I.Qtde
FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero
WHERE C.Data BETWEEN ´2006/01/01´ AND ´2006/03/31´ AND C.Nome = ´ESTEVAO ARAUJO´
Order by C.Nome, C.Data
(não estou certo do formato das datas) Com isto vc está testando se sua query está corretamente definida (em termos de sintaxe e lógica). Estando correta, então vc substitui os valores constantes que foram utilizados pelos parâmetros para utilizá-la em seu código. :wink:

[]s


GOSTEI 0
Clenio

Clenio

13/07/2006

Oi, Micheus e os outros colegas que estão me ajudando,

Coloquei desta forma como vocês disseram no DataBase Explorer e funcionou perfeitamente.

SELECT C.Nome, C.Destino, I.Data, I.Medicamento, I.Qtde
FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero
WHERE I.Data BETWEEN 07/01/06 AND 07/31/06 AND C.Nome = ´CLENIO RIBEIRO´
Order by I.Data

Só que quando substituo os valores constantes como está abaixo da erro na linha 3 especificamente no parametro Nome, ja tentei colocar assim: [b:bcdef98d9a]C.Nome, :Nome, C.:Nome [/b:bcdef98d9a], mas nao tem jeito da sempre o erro, sinseramente ja nao sei mais o que fazer.

SELECT C.Nome, C.Destino, I.Data, I.Medicamento, I.Qtde
FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero
WHERE I.Data BETWEEN :DataInicial AND :DataFinal AND C.Nome = C.:Nome
Order by I.Data

Obs.: Fiz a inclusão do campo data na tabela ITENS, mas isso não influenciou em nada, fiz os testes e acontece a mesma coisa.

Mais uma vez obrigado a todos.


GOSTEI 0
Micheus

Micheus

13/07/2006

[b:cccbfb2be8]clenio[/b:cccbfb2be8], foi só um pouquinho de distração sua. :wink:
A definição de parâmetro sempre vai iniciar com o dois pontos. Logo, se vc olhar melhor verá que ´definiu´ o parâmetro nome de forma incorreta:
- está C.:Nome
- seria :Nome

[]s


GOSTEI 0
Clenio

Clenio

13/07/2006

Olá, Micheus, paullsoftware, emerson, e todos que me ajudaram a solucionar esse tema, enfim conseguimos, ai de mim se não fosse vocês.
Muito obrigado pela ajuda e espero sempre contar com todos vocês que tem experiencia no assunto.
Segue abaixo o codigo correto para que se alguém algum dia tiver a mesma duvida possa servir de pesquisa.

Agora está tudo funcionando perfeitamente

SELECT C.Nome, C.Destino, I.Data, I.Medicamento, I.Qtde
FROM Consumo C LEFT JOIN Itens I ON I.Numero = C.Numero
WHERE C.Nome =  :Nome AND I.Data BETWEEN :DataInicial AND :DataFinal
Order by I.Data


e no botão exibir ficou assim:

With Query1  do
    begin
     close;
     params[0].AsString:= DBLooKupCombobox1.Text;
     Params[1].Asdatetime:=strtoDate(MaskEdit1.text);
     Params[2].asdatetime:=strtoDate(MaskEdit2.text);
     Open;
   end;
end.


Obs.: Este topico por mim está encerrado, graças a ajuda dos companheiros.
Brigadão e até a proxima.

Clenio


GOSTEI 0
POSTAR