Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Ajuda! Pesquisa Usando Max


Guest José Rodrigo
 Share

Question

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 to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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+!!!!!!!

Edited by Micheus
Não observação do item 3.7 das regras do forum - NÃO digite em caixa alta (1º aviso)
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...