SQL quase perfeita.
Olá pessoal.
Aqui na empresa usamos componentes IBO Nativos ou Derivados de TDataset.
Tenho uma sql que funfa muito bem quando mando pegar um parametro inteiro, que realmente pertence a tabela em questão.
Mas a SQl é um pouco complexa, ela pega registros de outra tabela e exibe como resultado. Gostaria de que o parametro que vou informar, sja exatamente esse campo que ela pega de outra tabela. já fiz uma vez, de uma maneira bem simples por sinal, mas com o atual esquema que estou usando nao pega. Vo mandar a sql pra voces analizarem.
Aqui usamos windows XP sp2, Interbase e Delphi 7
select distinct (TT.instituicao), (select INS.descricao from instituicao INS where INS.codigo = tt.instituicao and INS.descricao = :Pinstituicao) as DescInstituicao, TT.instrutor, (select I.nomecompleto from instrutores I where i.codigo = tt.instrutor) as DescInstrutores, TT.almox, (select A.descricao from almox A where a.codigo = tt.almox) as DescAlmox, TT.coidgotreinamento, (select TN.descricao from trn_nomes_treinamento TN where tn.codigo = TT.coidgotreinamento) as DescTreinamento, TT.data, TT.fim, TT.carga_horaria, TT.valor, TT.conceito, TT.objetivo, TT.avaliacao, TT.material, TT.Data_avaliacao From trn_treinamento TT order by TT.instituicao
e tem mais, essa sql acima é a que está com problema, o problema que comentei. ela me retorna o valor que eu quero, mais também todos os registros, só que o campo que uso como parametro vem com valor nulo.
Desde já agradeço. :oops:
Aqui na empresa usamos componentes IBO Nativos ou Derivados de TDataset.
Tenho uma sql que funfa muito bem quando mando pegar um parametro inteiro, que realmente pertence a tabela em questão.
Mas a SQl é um pouco complexa, ela pega registros de outra tabela e exibe como resultado. Gostaria de que o parametro que vou informar, sja exatamente esse campo que ela pega de outra tabela. já fiz uma vez, de uma maneira bem simples por sinal, mas com o atual esquema que estou usando nao pega. Vo mandar a sql pra voces analizarem.
Aqui usamos windows XP sp2, Interbase e Delphi 7
select distinct (TT.instituicao), (select INS.descricao from instituicao INS where INS.codigo = tt.instituicao and INS.descricao = :Pinstituicao) as DescInstituicao, TT.instrutor, (select I.nomecompleto from instrutores I where i.codigo = tt.instrutor) as DescInstrutores, TT.almox, (select A.descricao from almox A where a.codigo = tt.almox) as DescAlmox, TT.coidgotreinamento, (select TN.descricao from trn_nomes_treinamento TN where tn.codigo = TT.coidgotreinamento) as DescTreinamento, TT.data, TT.fim, TT.carga_horaria, TT.valor, TT.conceito, TT.objetivo, TT.avaliacao, TT.material, TT.Data_avaliacao From trn_treinamento TT order by TT.instituicao
e tem mais, essa sql acima é a que está com problema, o problema que comentei. ela me retorna o valor que eu quero, mais também todos os registros, só que o campo que uso como parametro vem com valor nulo.
Desde já agradeço. :oops:
Technos
Curtidas 0
Respostas
Ilanocf
04/11/2004
Veja se isso pode ajudá-lo:
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Em um componente TZMySQLQuery, tenho a SQL:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Já no código (ao clicar o botão) tenho o mesmo código com os critérios:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]No caso acima, trabalho com 2 tabelas:[/b:7ca0d3a6a2][/color:7ca0d3a6a2] [b:7ca0d3a6a2]TB_Avaliacao[/b:7ca0d3a6a2] e [b:7ca0d3a6a2]TB_DetAvalia[/b:7ca0d3a6a2]
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Já em outro exemplo, tenho em Access 97, a consulta:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Se a transformássemos para Delphi seria:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]No caso acima estaríamos utilizando 3 tabelas:[/b:7ca0d3a6a2][/color:7ca0d3a6a2] [b:7ca0d3a6a2]TB_Arquivos[/b:7ca0d3a6a2], [b:7ca0d3a6a2]TB_Enderecos[/b:7ca0d3a6a2] e [b:7ca0d3a6a2]TB_Setores[/b:7ca0d3a6a2].
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Talvez o seu problema possa estar na cláusula (se é assim mesmo q deve ser chamado)[/color:7ca0d3a6a2][/b:7ca0d3a6a2] [b:7ca0d3a6a2]WHERE[/b:7ca0d3a6a2], [color=red:7ca0d3a6a2][b:7ca0d3a6a2]tente substití-la por[/b:7ca0d3a6a2][/color:7ca0d3a6a2] [b:7ca0d3a6a2]HAVING[/b:7ca0d3a6a2].
Espero q isso resolva.
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Em um componente TZMySQLQuery, tenho a SQL:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
SELECT DISTINCTROW TB_Avaliacao.CodigoDoPforessor, TB_Avaliacao.NomeDoProfessor, TB_Avaliacao.NomeDoCurso,
TB_Avaliacao.AnoDaAvaliacao, TB_Avaliacao.Periodo, TB_DetAvalia.CodigoDaPergunta, TB_DetAvalia.Pergunta, TB_DetAvalia.CodigoDaResposta,
TB_DetAvalia.Resposta, Sum(TB_DetAvalia.Contador) AS SomaDeContador,
(Sum(TB_DetAvalia.Contador) / TB_DetAvalia.CodigoDaResposta) AS ValorGeral, (Sum(TB_DetAvalia.Contador)*100/Sum(TB_DetAvalia.Contador)) AS Percentual
FROM TB_Avaliacao INNER JOIN TB_DetAvalia ON TB_Avaliacao.CodigoDaAvaliacao = TB_DetAvalia.CodigoDaAvaliacao
GROUP BY TB_Avaliacao.CodigoDoPforessor, TB_Avaliacao.NomeDoProfessor, TB_Avaliacao.NomeDoCurso,
TB_Avaliacao.AnoDaAvaliacao, TB_Avaliacao.Periodo, TB_DetAvalia.CodigoDaPergunta, TB_DetAvalia.Pergunta, TB_DetAvalia.CodigoDaResposta,
TB_DetAvalia.Resposta
ORDER BY TB_DetAvalia.CodigoDaPergunta
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Já no código (ao clicar o botão) tenho o mesmo código com os critérios:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
With DMConsultas.Resumo Do
Begin
Close;
SQL.Clear;
SQL.Add(´SELECT DISTINCTROW TB_Avaliacao.CodigoDoPforessor, TB_Avaliacao.NomeDoProfessor, TB_Avaliacao.NomeDoCurso,´);
SQL.Add(´TB_Avaliacao.AnoDaAvaliacao, TB_Avaliacao.Periodo, TB_DetAvalia.CodigoDaPergunta, TB_DetAvalia.Pergunta, TB_DetAvalia.CodigoDaResposta,´);
SQL.Add(´TB_DetAvalia.Resposta, Sum(TB_DetAvalia.Contador) AS SomaDeContador,´);
SQL.Add(´(Sum(TB_DetAvalia.Contador) / TB_DetAvalia.CodigoDaResposta) AS ValorGeral, (Sum(TB_DetAvalia.Contador)*100/Sum(TB_DetAvalia.Contador)) AS Percentual´);
SQL.Add(´FROM TB_Avaliacao INNER JOIN TB_DetAvalia ON TB_Avaliacao.CodigoDaAvaliacao = TB_DetAvalia.CodigoDaAvaliacao´);
SQL.Add(´GROUP BY TB_Avaliacao.CodigoDoPforessor, TB_Avaliacao.NomeDoProfessor, TB_Avaliacao.NomeDoCurso,´);
SQL.Add(´TB_Avaliacao.AnoDaAvaliacao, TB_Avaliacao.Periodo, TB_DetAvalia.CodigoDaPergunta, TB_DetAvalia.Pergunta, TB_DetAvalia.CodigoDaResposta,´);
SQL.Add(´TB_DetAvalia.Resposta´);
SQL.Add(´HAVING TB_Avaliacao.CodigoDoPforessor= :P1 AND TB_Avaliacao.AnoDaAvaliacao= :P2 AND TB_Avaliacao.Periodo= :P3´);
SQL.Add(´ORDER BY TB_DetAvalia.CodigoDaPergunta´);
ParamByName(´P1´).Value:=DMDados.TBAvaliacaoCodigoDoPforessor.Value;
ParamByName(´P2´).Value:=DMDados.TBAvaliacaoAnoDaAvaliacao.AsString;
ParamByName(´P3´).Value:=DMDados.TBAvaliacaoPeriodo.Text;
Open;
End;
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]No caso acima, trabalho com 2 tabelas:[/b:7ca0d3a6a2][/color:7ca0d3a6a2] [b:7ca0d3a6a2]TB_Avaliacao[/b:7ca0d3a6a2] e [b:7ca0d3a6a2]TB_DetAvalia[/b:7ca0d3a6a2]
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Já em outro exemplo, tenho em Access 97, a consulta:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
SELECT DISTINCTROW TB_Arquivos.CodigoDeRegistro, TB_Arquivos.NomeDoArquivo, TB_Enderecos.CodigoDeEndereco, TB_Enderecos.Endereco, TB_Setores.CodigoDoSetor, TB_Setores.NomeDoSetor
FROM (TB_Arquivos INNER JOIN TB_Enderecos ON TB_Arquivos.CodigoDeRegistro = TB_Enderecos.CodigoDeRegistro) INNER JOIN TB_Setores ON TB_Arquivos.CodigoDeRegistro = TB_Setores.CodigoDeRegistro
WHERE (((TB_Arquivos.NomeDoArquivo)=[Informe o nome do arquivo]) AND ((TB_Enderecos.CodigoDeEndereco)=[Informe o código do endereço]) AND ((TB_Setores.CodigoDoSetor)=[Informe o código do setor]));
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Se a transformássemos para Delphi seria:[/b:7ca0d3a6a2][/color:7ca0d3a6a2]
SELECT DISTINCTROW TB_Arquivos.CodigoDeRegistro, TB_Arquivos.NomeDoArquivo, TB_Enderecos.CodigoDeEndereco, TB_Enderecos.Endereco, TB_Setores.CodigoDoSetor, TB_Setores.NomeDoSetor
FROM (TB_Arquivos INNER JOIN TB_Enderecos ON TB_Arquivos.CodigoDeRegistro = TB_Enderecos.CodigoDeRegistro) INNER JOIN TB_Setores ON TB_Arquivos.CodigoDeRegistro = TB_Setores.CodigoDeRegistro
HAVING TB_Arquivos.NomeDoArquivo= :P1 AND TB_Enderecos.CodigoDeEndereco= :P2 AND TB_Setores.CodigoDoSetor= :P3;
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]No caso acima estaríamos utilizando 3 tabelas:[/b:7ca0d3a6a2][/color:7ca0d3a6a2] [b:7ca0d3a6a2]TB_Arquivos[/b:7ca0d3a6a2], [b:7ca0d3a6a2]TB_Enderecos[/b:7ca0d3a6a2] e [b:7ca0d3a6a2]TB_Setores[/b:7ca0d3a6a2].
[color=red:7ca0d3a6a2][b:7ca0d3a6a2]Talvez o seu problema possa estar na cláusula (se é assim mesmo q deve ser chamado)[/color:7ca0d3a6a2][/b:7ca0d3a6a2] [b:7ca0d3a6a2]WHERE[/b:7ca0d3a6a2], [color=red:7ca0d3a6a2][b:7ca0d3a6a2]tente substití-la por[/b:7ca0d3a6a2][/color:7ca0d3a6a2] [b:7ca0d3a6a2]HAVING[/b:7ca0d3a6a2].
Espero q isso resolva.
GOSTEI 0
Technos
04/11/2004
Aee cara, valeu a tentativa, mas nao funfou naum.
Essa palavra chave DistinctROW, nao conheço. procurei ver aki no meu IBexpert e nao existe simplesmente. Voce poderia me dizer pra que ela serve ? em qual versão do interbase / firebird ela funciona ? aki uso o firebird 1.5.
A sql que voce me mandou nao funcionou nao.
Continuo com o problema, mas sempre em busca de solução.
Essa palavra chave DistinctROW, nao conheço. procurei ver aki no meu IBexpert e nao existe simplesmente. Voce poderia me dizer pra que ela serve ? em qual versão do interbase / firebird ela funciona ? aki uso o firebird 1.5.
A sql que voce me mandou nao funcionou nao.
Continuo com o problema, mas sempre em busca de solução.
GOSTEI 0
Ilanocf
04/11/2004
Infelizmente não trabalho com [b:f9dcb87ce0]firebird[/b:f9dcb87ce0], mas sobre o [b:f9dcb87ce0]DISTINCTROW[/b:f9dcb87ce0]: Omite dados baseado em registros duplicados completos, e não somente campos duplicados.
[b:f9dcb87ce0]DISTINCT[/b:f9dcb87ce0]: Omite registros que contêm dados duplicados nos campos selecionados. Para serem incluídos nos resultados da consulta, os valores de cada campo listado na instrução SELECT devem ser exclusivos.
Estes são muito usados em Banco de Dados Access, tb utilizo o [b:f9dcb87ce0]DISTINCTROW[/b:f9dcb87ce0] em MySQL e funciona beleza! Vc pode ver isso nos sites:
[url]http://www.profwillian.com/bdados/aula03/BD_Aula05_SQL.htm[/url]
[url]www.ppgia.pucpr.br/~cristina/BancoDados/SQL_Exercicios.doc[/url]
[b:f9dcb87ce0]DISTINCT[/b:f9dcb87ce0]: Omite registros que contêm dados duplicados nos campos selecionados. Para serem incluídos nos resultados da consulta, os valores de cada campo listado na instrução SELECT devem ser exclusivos.
Estes são muito usados em Banco de Dados Access, tb utilizo o [b:f9dcb87ce0]DISTINCTROW[/b:f9dcb87ce0] em MySQL e funciona beleza! Vc pode ver isso nos sites:
[url]http://www.profwillian.com/bdados/aula03/BD_Aula05_SQL.htm[/url]
[url]www.ppgia.pucpr.br/~cristina/BancoDados/SQL_Exercicios.doc[/url]
GOSTEI 0
Gandalf.nho
04/11/2004
Acho que DISTINCTROW não foi implementada no IB/FB (pelo menos, nunca consegui fazer funcionar).
GOSTEI 0