Consulta usando uma tabela master e uma detalhe
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
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
Curtidas 0
Respostas
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.
[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
13/07/2006
Qual banco?
GOSTEI 0
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.
Por favor to precisando muito resolver esse problema, estou dependendo so disso pra terminar.
Abraços.
GOSTEI 0
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
espero ter ajudado :wink:
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
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.
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
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:
qq coisa vou dar mais uma olhada depois do almoço e vj o que posso fazer :wink:
GOSTEI 0
Emerson Nascimento
13/07/2006
tente assim:e informe qualquer mensagem de erro que seja exibida
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;
GOSTEI 0
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
[b:ee1d9f8b72]Query1 :No SQL stantement available[/b:ee1d9f8b72]
Valeu Emerson
GOSTEI 0
Emerson Nascimento
13/07/2006
que componente está em uso?
outra coisa... tente rodar essa instrução no Database Desktop.
outra coisa... tente rodar essa instrução no Database Desktop.
GOSTEI 0
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
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.
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
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
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
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.
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
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]:Isto já deve estar funcionando.
(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
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;
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
[]s
GOSTEI 0
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.
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
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
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
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
e no botão exibir ficou assim:
Obs.: Este topico por mim está encerrado, graças a ajuda dos companheiros.
Brigadão e até a proxima.
Clenio
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