Fórum SQL quase perfeita. #257261

04/11/2004

0

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:


Technos

Technos

Responder

Posts

05/11/2004

Ilanocf

Veja se isso pode ajudá-lo:

[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.


Responder

Gostei + 0

05/11/2004

Technos

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.


Responder

Gostei + 0

07/11/2004

Ilanocf

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]


Responder

Gostei + 0

08/11/2004

Gandalf.nho

Acho que DISTINCTROW não foi implementada no IB/FB (pelo menos, nunca consegui fazer funcionar).


Responder

Gostei + 0

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

Aceitar