lilia Postado Julho 22, 2004 Denunciar Share Postado Julho 22, 2004 Olá amigos,Comecei agora a mexer com Delphi, e estou com algumas dúvidas:A mais importante é : - Como que faço uma subconsulta numa Query. Ex.:Na propriedade SQL do Query1:SELECT * FROM associacao.db WHERE UF_ASSOCIACAO='MG';(SELECT * FROM associacao.db ORDER BY UF_ASSOCIACAO); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Corposemalma Postado Julho 22, 2004 Denunciar Share Postado Julho 22, 2004 Como subconsulta??? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 22, 2004 Autor Denunciar Share Postado Julho 22, 2004 quero incluir uma instrução dentro da outra, como se fosse duas consultas em uma Query.SELECT * FROM associacao.db WHERE UF_ASSOCIACAO='MG' ORDER BY MUNI_ASSOCIACAO UNION ALL (SELECT * FROM associacao.db WHERE UF_ASSOCIACAO<>'MG' ORDER BY UF_ASSOCIACAO);cloquei assim mas não deu certo.Para que aparece primeiro UF_ASSOCIACAO='MG' (os campos que contem MG)e depois me mostrar o resto ordenado pelos estados excluindo MG. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 22, 2004 Denunciar Share Postado Julho 22, 2004 Olá LILIA,É possível incluir uma consulta dentro da outra, de modo que a primeira fique sendo uma subconsulta da principal. No entanto, algumas regras devem ser observadas na subconsulta.1) uma subconsulta pode ter apenas uma coluna na cláusula SELECT, a menos que existam múltiplas colunas na consulta principal;2) ORDER BY não pode ser usada em uma subconsulta. Desta forma, substituir ORDER BY por GROUP BY seria um boa idéia;3) subconsultas que retornam mais de uma linha só podem ser usadas com operadores de vários valores, como o operador IN;ETC...Olhando os dois exemplos que você postou, me parece que ambos não preenchem a 2ª e a 3ª regra mencionadas acima.No caso do exemplo nº 1: SELECT * FROM associacao.db WHERE UF_ASSOCIACAO='MG'; (SELECT * FROM associacao.db ORDER BY UF_ASSOCIACAO); Por que vc. não altera para simplesmente: SELECT * FROM associacao.db WHERE UF_ASSOCIACAO='MG' ORDER BY UF_ASSOCIACAO Não vejo a necessidade de utilizar uma subconsulta, neste caso. Outra observação: qual a razão de vc. pedir para ordenar os registros pelo campo UF_ASSOCIACAO? Veja. Pela sua instrução SQL, somente irão retornar os registros onde UF_ASSOCIACAO for igual a "MG". Logo, salvo melhor juízo, não há utilidade alguma em utilizar ORDER BY UF_ASSOCIACAO. Teria se fosse, por exemplo, ORDER BY NOME (ou outro campo). No caso do exemplo nº 2: SELECT * FROM associacao.db WHERE UF_ASSOCIACAO='MG' ORDER BY MUNI_ASSOCIACAO UNION ALL (SELECT * FROM associacao.db WHERE UF_ASSOCIACAO<>'MG' ORDER BY UF_ASSOCIACAO); Faço a mesma observação. Creio não ser necessário uma outra subconsulta. Que tal: SELECT * FROM associacao.db WHERE UF_ASSOCIACAO='MG' AND UF_ASSOCIACAO<>'MG' ORDER BY MUNI_ASSOCIACAO Qualquer problema é só dar um toque.Abs. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 nossa valeu mesmo !!!Mas aconteceu outro probleminha eu coloquei este código: Query2.SQL.Add('SELECT * FROM associacao.db WHERE UF_ASSOCIACAO =' + #39 + ComboBoxEstado.Text + #39' AND UF_ASSOCIACAO <> ' + #39 + ComboBoxEstado.Text + #39' ORDER BY UF_ASSOCIACAO , MUNI_ASSOCIACAO;'); Query2.Open; FormRelatAssoc.QuickRep2.Preview;Só que o Relatório não me mostra nada, nem um campo com valor (ele volta vazio).Verifiquei O DataSet do QuickReport := FormRelatorio.Query2;do QRDBText1 :=FormRelatorio.Query2;A configuração está correta?!?! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 nossa valeu mesmo !!!Mas aconteceu outro probleminha eu coloquei este código: Query2.SQL.Add('SELECT * FROM associacao.db WHERE UF_ASSOCIACAO =' + #39 + ComboBoxEstado.Text + #39' AND UF_ASSOCIACAO <> ' + #39 + ComboBoxEstado.Text + #39' ORDER BY UF_ASSOCIACAO , MUNI_ASSOCIACAO;'); Query2.Open; FormRelatAssoc.QuickRep2.Preview;Só que o Relatório não me mostra nada, nem um campo com valor (ele volta vazio).Verifiquei O DataSet do QuickReport := FormRelatorio.Query2;do QRDBText1 :=FormRelatorio.Query2;A configuração está correta?!?! Olá novamente LILIA, Estou sem o Delphi no momento, mas acredito que a configuração esteje certa. O problema parece ser o seguinte: quando você faz uma instrução SQL para consultar os dados de uma tabela onde UF_ASSOCIACAO seja igual a COMBOBOX.TEXT E UF_ASSOCIACAO seja diferente de COMBOBOX.TEXT, a princípio, só examinando pela lógica, não haverá retorno de nenhum registro. Pois, qual registro tem UF_ASSOCIACAO igual e diferente a COMBOBOX.TEXT? Entendeu? Exemplificando: sua consulta está assim: CONSULTE e me RETORNE todos os dados da tabela onde UF_ASSOCIACAO for igual a SP (de São Paulo) e diferente de SP. Ora, só é possível ser igual ou diferente (e não igual e diferente). Compreendeu?Em todo caso, a título de teste, ligue um DBGRID ao DATASOURCE correspondente, deixe o DATASET (ao qual o DATASOURCE faz referência) ativo, para ver se ele exibe algum dado (acredito que, pelas razões acima, ele não exibirá nenhum). Caso (a título de argumentação), ele exiba algum registro, me fale, pois daí o problema realmente está no relatório. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 olá Capablancada uma olhada nisso Query2.SQL.Add('SELECT * FROM associacao.db WHERE UF_ASSOCIACAO = :UF ORDER BY MUNI_ASSOCIACAO'); Query2.parambyname('UF').AsString := '%' +ComboBoxEstado.Text + '%'; Query2.Open; FormRelatAssoc.QuickRep2.Preview;Eu tinha já colocado isso e não deu certo também.nem um consulta simples esta aparecendo e eu olhei todas as configurações do relatório e não esta aparecendo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 olá Capablancada uma olhada nisso Query2.SQL.Add('SELECT * FROM associacao.db WHERE UF_ASSOCIACAO = :UF ORDER BY MUNI_ASSOCIACAO'); Query2.parambyname('UF').AsString := '%' +ComboBoxEstado.Text + '%'; Query2.Open; FormRelatAssoc.QuickRep2.Preview;Eu tinha já colocado isso e não deu certo também.nem um consulta simples esta aparecendo e eu olhei todas as configurações do relatório e não esta aparecendo. Uhhhh.... Você fez o teste do DBGrid? Os dados aparecem nele? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 Não apareceu nada no DBGrid !!!Não seria alguma coisa relacionada a isso ?Query2.SQL.Clear; Query2.Cancel; Query2.Close; Query2.Destroy; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Não apareceu nada no DBGrid !!!Não seria alguma coisa relacionada a isso ?Query2.SQL.Clear; Query2.Cancel; Query2.Close; Query2.Destroy; Como assim?Se vc. colocou este código acima, ele vai cancelar a operação (por exemplo, de inclusão ou alteração), posteriormente vai fechar o seu QUERY e destruir a instância dele. Conseqüentemente, não vai funcionar mesmo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 não eu coloquei ele depois ,quando fecho o form, mas mesmo assim não auterou em nada.Ele continua não aparecendo ... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Bem, eu não consegui vislumbrar nenhum equívoco em seus códigos (exceto aqueles que eu já comentei e você já corrigiu).Se não houver problema, ZIPA seu projeto com o banco de dados e me manda que eu dou uma olhada hoje à noite.E-mail: mack@cordeirorodrigues.com.brICQ: 4826639 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 procedure TFormRelatorio.SpeedButtonVisualizarClick(Sender: TObject); begin if ComboBoxRelatorio.Text = 'Associação' then begin case RadioGroupOrdenar.ItemIndex of 0:Begin Query1.SQL.Add('SELECT * FROM associacao.db ORDER BY NOME_ASSOCIACAO;'); Query1.Open; FormRelatAssoc.QuickRep1.Preview; End; 1:Begin Query2.SQL.Add('SELECT * FROM associacao.db WHERE UF_ASSOCIACAO = :UF ORDER BY UF_ASSOCIACAO'); query2.parambyname('UF').AsString := '%' +ComboBoxEstado.Text + '%'; Query2.Open; FormRelatAssoc.QuickRep2.Preview; End; 2:Begin Query3.SQL.Add('SELECT * FROM associacao.db WHERE MUNI_ASSOCIACAO = :MUNI ORDER BY MUNI_ASSOCIACAO'); query3.parambyname('MUNI').AsString := '%' +ComboBoxMunicipio.Text + '%'; Query3.Open; FormRelatAssoc.QuickRep3.Preview; End; End; end; end; procedure TFormRelatorio.SpeedButtonCancelarClick(Sender: TObject); begin FormProLeite2.Visible:=true; Close; Query2.SQL.Clear; Query2.Cancel; Query2.Close; Query2.Destroy; end; end.Bom o código posso até te enviar mas o banco não, pois é da Empresa e eu não tenho autorização.tenho certeza que a parte que esta com algum problema é essa pois antes estava dando certo com algumas consultas simples.Vou tentar refazer a parte do relatório, mas creio que lá esta tudo certo.vou dar uma olhada de novo .Obrigada.cabrallilia@hotmail.com Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Vc. poderia me enviar o BD vazio mesmo... Por que vc. está utilizando '%', ao lado de "ComboBoxEstado.Text" ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 São parâmetros a apostila que eu estou usando mostra assim, mas não fala o por que .Eu já tirei, mas não fez nem um efeito. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Tente colocar assim: query2.parambyname('UF').AsString := #39 + ComboBoxEstado.Text + #39; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 Não funcionou...eu vou refazer o código. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Desculpe Lilia, mas até onde vc. pode me passar, fora os comentários que já fiz, não sei lhe dizer onde pode estar o erro. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 vou tentar refazer todo o código de novo.você deixou seu e-mail em dos post, posso utiliza-lo para manter contato, para que você possa me ajudar?Obrigada.lilia@cnpgl.embrapa.br Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 vou tentar refazer todo o código de novo.você deixou seu e-mail em dos post, posso utiliza-lo para manter contato, para que você possa me ajudar?Obrigada.lilia@cnpgl.embrapa.br Fique à vontade. Lilia, vá fazendo testes mais simples, antes de refazer TODO o código. A princípio, como já havia comentado, não há nada de errado com seu código (isto é que está intrigando).Desta forma, ao invés de refazer TOTALMENTE seu código, vá fazendo testes SIMPLES e alterando aos poucos. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Vou pedir para alguns colegas visitarem este tópico e darem uma "olhada". De repente, está escapando algum detalhe que nós não vimos. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 Muito obrigada Capablanca. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Antes de dar Query.Open, dê um ShowMessage(Query.Sql.Text) e poste o que aparece no ShowMessage. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Antes de dar Query.Open, dê um ShowMessage(Query.Sql.Text) e poste o que aparece no ShowMessage. Obrigado S3C. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 lilia Postado Julho 23, 2004 Autor Denunciar Share Postado Julho 23, 2004 QUOTE (s3c @ Jul 23 2004, 01:31 PM) Antes de dar Query.Open, dê um ShowMessage(Query.Sql.Text) e poste o que aparece no ShowMessage. Obrigado S3C. Por que? Ele vai me mostrar o que esta dentro da propriedade SQL. 'SELECT * FROM associacao.db WHERE UF_ASSOCIACAO = :UF ORDER BY MUNI_ASSOCIACAO Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Julho 23, 2004 Denunciar Share Postado Julho 23, 2004 Olá Lilia, como você alimenta o parâmetro UF ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
lilia
Olá amigos,
Comecei agora a mexer com Delphi, e estou com algumas dúvidas:
A mais importante é :
- Como que faço uma subconsulta numa Query.
Ex.:
Na propriedade SQL do Query1:
SELECT * FROM associacao.db WHERE UF_ASSOCIACAO='MG';
(SELECT * FROM associacao.db ORDER BY UF_ASSOCIACAO);
Link para o comentário
Compartilhar em outros sites
29 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.