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

(Resolvido) Ajuda! Pesquisa Usando Max


Guest José Rodrigo

Pergunta

Guest José Rodrigo

OLá, Gostaria de fazer uma pesquisa no banco de dados e Trazer o maior Codigo!!Esse jeito q eu fiz esta certo mais gostaria q junto com o maior codigo pesquisasse tambem o Nome da Pessoa!!

Obrigado!!!

qr_pesquisa.Active := false;

qr_pesquisa.SQL.Clear;

dbgrid1.DataSource := ds_pesquisa;

qr_pesquisa.SQL.Add ('select MAX(Cod) FROM tb_teste');

qr_pesquisa.Active := true;

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Opa

Seguinte, no SELECT voce deve passar também o nome do campo que armazena

o nome da pessoa, vamos supor que o nome do campo seja Nome

qr_pesquisa.Active := false;
qr_pesquisa.SQL.Clear;
dbgrid1.DataSource := ds_pesquisa;
qr_pesquisa.SQL.Add ('select MAX(Cod),Nome FROM tb_teste');
ShowMessage('Código do Cliente: ' + qr_pesquisa.FieldByName('Cod').AsString + ' / Nome do Cliente: ' + qr_pesquisa.FieldByName('Nome').AsString);
qr_pesquisa.Active := true;

tipo isso

abraçx

Link para o comentário
Compartilhar em outros sites

  • 0
Guest José Rodrigo
Opa

Seguinte, no SELECT voce deve passar também o nome do campo que armazena

o nome da pessoa, vamos supor que o nome do campo seja Nome

qr_pesquisa.Active := false;
qr_pesquisa.SQL.Clear;
dbgrid1.DataSource := ds_pesquisa;
qr_pesquisa.SQL.Add ('select MAX(Cod),Nome FROM tb_teste');
ShowMessage('Código do Cliente: ' + qr_pesquisa.FieldByName('Cod').AsString + ' / Nome do Cliente: ' + qr_pesquisa.FieldByName('Nome').AsString);
qr_pesquisa.Active := true;

tipo isso

abraçx

Olá amigo!! infelizmente sua dica não deu certo apareceu o seguinte erro:

Project Teste.exe raised exception class EDatabeseError with message 'qr_pesquisa: Field 'Cod' not found'.

Não encontra o campo cod mais ele existe..!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Bom... creio que você possa usar o SQL Explorer que acompanha o Delphi, certo?

Então, se você executar esta query lá no SQL Explorer (ou até no SQL Builder de um TQuery), verá que

select MAX(Cod),Nome

FROM `acme`.`personagens`

retorna as colunas com estes nomes:

MAX(Cod)

Nome

e não Cod e Nome... isto porque na tabela, realmente, existe uma columa (um campo) com o nome Cod mas isso não ocorre na "tabela" gerada pelo resultado da query... então, é só você usar:

select max(cod) maxcod, nome

from `acme`.`personagens`

para obter, agora na coluna chamada "maxcod" (isso, para não confundi-la com a coluna "cod" original), o resultado que você espera...

Ok?

Então, importantíssimo:

a) os campos apresentados por uma query NUNCA são os campos da tabela original, e, sim, apenas uma "visualização" desse conteúdo...

B) os campos derivados de outros campos (como o max(cod) por exemplo) devem ser nomeados de forma a identificar o seu conteúdo exato para não confundir com o conteúdo original da tabela... então, isso: select max(cod) cod, ... está muito errado...

Ok?

Espero ter ajudado!

(e se der certo, não esquece de marcar como resolvido)...

Link para o comentário
Compartilhar em outros sites

  • 0
Guest José Rodrigo

Olá amigo paulobergo não se entendi muito Bem sua explicação !!! Tentei alterar o Cod para MAXCOD mais tb nem deu certo... Mesmo assim obrigado!!

qr_pesquisa.Active := false;

qr_pesquisa.SQL.Clear;

dbgrid1.DataSource := ds_pesquisa;

qr_pesquisa.SQL.Add ('select MAX(Cod),Nome FROM tb_teste');

ShowMessage('Código do Cliente: ' + qr_pesquisa.FieldByName('MAXCod').AsString + ' / Nome do Cliente: ' +

qr_pesquisa.FieldByName('Nome').AsString);

qr_pesquisa.Active := true;

ERa isso q você quis dizer?!!

Link para o comentário
Compartilhar em outros sites

  • 0

Observe.. esta query

select MAX(Cod),Nome FROM tb_teste
cria um resultado em que os campos terão os seguintes nomes: MAX(Cod) e Nome Daí... FieldByname('Cod').AsString gera erro... Agora, alterando o código da sua query
select MAX(Cod), Nome FROM tb_teste
       ----------
        \      /
         \    /
          \  /
           \/
       ---------------
select MAX(Cod) MAXCod, Nome FROM tb_teste
Faz com que exista uma coluna (ou um campo) chamado MAXCod, cujo conteúdo nada mais é do que o resultado da função MAX(Cod)... Aí o ShowMessage seguinte: ShowMessage('Código do Cliente: ' + qr_pesquisa.FieldByName('MAXCod').AsString + ' / Nome do Cl... funciona perfeitamente... Eu aproveitei e disse também para você experimentar usar o SQL Explorer... Assim, poderá descobrir muita coisa possível de se fazer... Por exemplo, você pode digitar esta query, baseada na sua tabela:
select 1*1 nada, "nome"+"sobrenome" nomecompletodapessoa
from tb_teste

Ver que ela retorna várias linhas com o número 1, em um campo chamado nada, e

o texto nomesobrenome em um campo nomecompletodapessoa, ilustrando como

se pode dar nomes às colunas geradas nas consultas SQL.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest José Rodrigo

Código alterado erro é o mesmo!!!

qr_pesquisa.Active := false;

qr_pesquisa.SQL.Clear;

dbgrid1.DataSource := ds_pesquisa;

qr_pesquisa.SQL.Add ('select MAX(Cod) MAXCod,Nome FROM tb_teste');

ShowMessage('Código do Cliente: ' + qr_pesquisa.FieldByName('MAXCod').AsString + ' / Nome do Cliente: ' +

qr_pesquisa.FieldByName('Nome').AsString);

qr_pesquisa.Active := true;

Link para o comentário
Compartilhar em outros sites

  • 0

Ah.... agora está quase... você esta tentando mostrar o resultado da query antes de ela existir... então:

qr_pesquisa.Active := false;
qr_pesquisa.SQL.Clear;
dbgrid1.DataSource := ds_pesquisa;
qr_pesquisa.SQL.Add ('select MAX(Cod) MAXCod,Nome FROM tb_teste');

qr_pesquisa.Active := true; // Antes do ShowMessage!!!

ShowMessage('Código do Cliente: ' + qr_pesquisa.FieldByName('MAXCod').AsString + ' / Nome do Cliente: ' + 
qr_pesquisa.FieldByName('Nome').AsString);
Agora, aconselho melhorar seu código... nunca é tarde para começar a organizar seu trabalho... veja um exemplo:
With qr_pesquisa do Begin
  Close; // Aqui, estva o .Active
  dbgrid1.DataSource := ds_pesquisa;
  SQL.Clear;
  SQL.Add('select max(cod) maxcod, nome');
  SQL.Add('from tb_teste');
  Try
    Open; // Aqui estava sem .Active := True;
    ShowMessage(
                'Consulta Ok! Dados do Cliente:'+chr(13)+
                'Código: '+FieldByName('maxcod').AsString+chr(13)+
                'Nome: '+FieldByName('nome').AsString
               );
    Close;
  Except
    ShowMessage('Hmm.... algo errado...');
  End;
End;{With qr_pesquisa}

Ok?

Abraços!

(e se der certo, não esquece de marcar como resolvido)...

(e não se acanhe... pode se inscrever no forum que será bem-vindo!)

Link para o comentário
Compartilhar em outros sites

  • 0
Guest José Rodrigo

Olá amigo eu alterei o codigo com sitado acima!! não deu mais aquele erro... agora é outro...

EDBEngineError with ,essage 'GROUP BY is required when both aggregate and non-aggregate fields are used in result set'

qr_pesquisa.Active := false;

qr_pesquisa.SQL.Clear;

dbgrid1.DataSource := ds_pesquisa;

qr_pesquisa.SQL.Add ('select MAX(Cod) MAXCod,Nome FROM tb_teste');

qr_pesquisa.Active := true;

ShowMessage('Código do Cliente: ' + qr_pesquisa.FieldByName('MAXCod').AsString + ' / Nome do Cliente: ' +

qr_pesquisa.FieldByName('Nome').AsString);

Se ainda poder me ajudar!!! OBrigado!!

Link para o comentário
Compartilhar em outros sites

  • 0

Ah... claro... falta colocar o "group by"...

"GROUP BY is required when both aggregate and non-aggregate fields are used in result set"

Traduzindo,

GROUP BY é requerido (portanto, obrigatório) quando tanto os campos agregados e os não-agregados são usados no resultado da query.

Se você tivesse usado o BabelFish no cade, para traduzir, teria obtido isso:

"O GRUPO é requerido PERTO quando os campos do agregado e do non-agregado são usados no resultado set"

Então:

select MAX(Cod) MAXCod,Nome FROM tb_teste group by nome

retornaria algo como:

maxcod, nome

00003, dumbledore

00983, harry

00889, hermione

01449, rony

00093, snape

(observe que o "group by" já "ordena" o resultado...)

select MAX(Cod) MAXCod FROM tb_teste

retornaria apenas:

maxcod

01449

Ok?

Link para o comentário
Compartilhar em outros sites

  • 0
Guest José Rodrigo

Boaaa muito obrigado kara vlw mesmo deu certinho... muito obrigado pela paciencia com o juvenil aki vlw kara t+!!!

Deu tudo certo agora so falta uma coisa, saber como q eu coloco "resolvido" no tópico..!!!

vou me inscrever sim !!! vlw mesmo falou t+!!!!!!!

Editado por Micheus
Não observação do item 3.7 das regras do forum - NÃO digite em caixa alta (1º aviso)
Link para o comentário
Compartilhar em outros sites

  • 0
Então:

select MAX(Cod) MAXCod,Nome FROM tb_teste group by nome

retornaria algo como:

maxcod, nome

00003, dumbledore

00983, harry

00889, hermione

01449, rony

00093, snape

(observe que o "group by" já "ordena" o resultado...)

Complementando... a ordenação foi pelo campo nome. Mas se fosse necessário ordenar pelo maior valor, seria necessário você indicar a coluna do max. Alguns bancos, não aceitam que você utilize o alias (apelido) dado a coluna com a função de agregação (SUM, MAX, Min, COUNT). Neste caso, você deve indicar o número da coluna - veja exemplo:

SELECT MAX(Cod) MAXCod, Nome 
FROM tb_teste 
GROUP BY nome
ORDER BY 1
onde 1 é o número da coluna onde está o campo de agregação, neste caso o MAXCod. José Rodrigo, apenas para complementar e justificar o motivo pelo qual seu SQL inicial funcionava sem o GROUP BY:
select MAX(Cod) 
FROM tb_teste
E depois exigiu que fosse incluído a coluna nome:
select MAX(Cod), nome 
FROM tb_teste 
GROUP BY nome

A regra é: todo o campo (coluna) que não for função de agregação (SUM, MAX, Min, COUNT), TEM que ser listada na cláusula GROUP BY.

(...) so falta uma coisa, saber como q eu coloco "resolvido" no tópico..!!!
Isto é uma atribuição minha (moderador) ;)

Abraços

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