Ir para conteúdo
Fórum Script Brasil
  • 0

Query


lilia

Pergunta

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

Posts Recomendados

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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?!?!

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0

olá Capablanca

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

Link para o comentário
Compartilhar em outros sites

  • 0
olá Capablanca

da 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?

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0

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

ICQ: 4826639

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0
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.

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...