Qual o melhor componente para comandos SQL?

Delphi

29/01/2008

Olá amigos,

Acho que estou fazendo errado ou usando o componente errado. Descrevo o caso abaixo:

Bem, preciso usar um MAX, um MIN, um SUM e um COUNT. Tentei usar o IBQuery. Na propriedade SQL dele coloquei esse codigo:

SELECT MAX(NRO), MIN(NRO) FROM TBCLI WHERE TBCLI.COD = :COD


Daí no ParamByName do IBQuery eu ponho AsInteger e mando um numero de codigo que é o filtro. Esse cod é unico, ou seja, o SELECT retornará apenas 1 registro.
Eu preciso exibir esse campo NRO, então coloco assim:

Label1.Caption:=inttostr(IBQuery1.FieldValues[´MAX´]);
Label2.Caption:=inttostr(IBQuery1.FieldValues[´MIN´]);


Porém o campo está vazio. Esse SELECT não está retornando nada, mas era pra retornar.
Provavelmente estou codificando errado ou utilizando o componente errado. Não sei como fazer, deduzi que fosse assim. Será que alguém, por favor, saberia me explicar a melhor forma de se fazer isso?


Obrigado desde já,


Sérgio Gobbo

Sérgio Gobbo

Curtidas 0

Respostas

Ferreia2

Ferreia2

29/01/2008

Se o select irá retornar apenas um registro porque saber o Maximo e o minimo?

más vamos lá, o que pode estar errado e que não vi você passar parâmetros e nem abrir a query.
Se você escreveu o select dentro do componente você deveria fazer assim:
Suaquery.close
suaquery.parambyname(´cod´).asinteger := codigo do cliente
Suaquery.open

ai sim vc pode colocar o valor do campo na label


GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

29/01/2008

Amigo, eu expliquei errado acima, me desculpe. É o seguinte:

A tabela tem milhares de registros. Nessa tabela tem uma chave estrangeira que seria o codigo de um determinado cliente. Então nela tem registros de varios clientes.
Na hora de fazer a consulta, o usuario vai selecionar um cliente num DBGrid. Daí pego o codigo do cliente e faço um select pra saber o numero maximo e o numero minimo de um pedido. Ou seja, preciso usar um MAX e um MIN na tabela, mas só considerando os registros de um determinado cliente.


SELECT MAX (NRO), MIN (NRO) FROM TBCLI WHERE TBCLI.COD = :COD


Não sei se essa forma acima está correta, mas com ela espero receber o numero maximo e minimo de itens de um pedido desse cliente. (Na tabela o campo NRO é o numero de itens de um pedido, por exemplo, nesse campo pode ter o valor 15, 20, 10, etc)

Depois disso, codifico no Delphi:

IBQuery1.Close;
IBQuery1.ParamByName(´COD´).AsInteger:=id; //id é uma variavel com o codigo do cliente que eu quero as informações
IBQuery1.Open;
Label1.Caption:=inttostr(IBQuery1.FieldValues[´MAX´]);
Label2.Caption:=inttostr(IBQuery1.FieldValues[´MIN´]);


Será que essa codificação está correta, porque desta forma, não vem nenhum valor para os campos MAX e MIN do IBQuery1.

Obrigado novamente,


GOSTEI 0
Ferreia2

Ferreia2

29/01/2008

Olha, aparentemente esta correta sua clausula SQL o que pode estar errado é a Tabela que vc esta consultando ou o Campo pode estar nulo.
Se vc fizer SELECT * FROM TBCLI WHERE TBCLI.COD = Valor fixo direto no banco retorna algum registro?


GOSTEI 0
Japa_h

Japa_h

29/01/2008

Não tenho intimidade com IBQUERY

Mas com ADOQUERY, usaria assim:

SELECT MAX (NRO) AS MAXIMO, MIN (NRO) AS MINIMO FROM TBCLI WHERE TBCLI.COD = :COD


GOSTEI 0
Ferreia2

Ferreia2

29/01/2008

Label1.Caption:=inttostr(IBQuery1.FieldValues[´MAX´]);
Label2.Caption:=inttostr(IBQuery1.FieldValues[´MIN´]);

Experimenta trocar assim
Label1.Caption:=inttostr(IBQuery1.Fieldbyname(´MAX´).asinteger;
Label2.Caption:=inttostr(IBQuery1.Fieldbyname(´MIN´).asinteger;


GOSTEI 0
Edilcimar

Edilcimar

29/01/2008

with ibquery1 do
begin
close;
clear
sql.add(´select max (nro) as maximo, min (nro) as minimo from tbcli ´);
sql.add(´where cod = :codigo ´);
parambyname(´codigo´).asinteger := id;
open;
end;

istso deve funcionar


GOSTEI 0
Sérgio Gobbo

Sérgio Gobbo

29/01/2008

Obrigado a todos.

Não sei oq houve, mas funcionou da maneira q eu estava fazendo:

SELECT MAX (NRO), MIN (NRO) FROM TBCLI WHERE TBCLI.COD = :COD

IBQuery1.Close; 
IBQuery1.ParamByName(´COD´).AsInteger:=id; //id é uma variavel com o codigo do cliente que eu quero as informações 
IBQuery1.Open; 
Label1.Caption:=inttostr(IBQuery1.FieldValues[´MAX´]); 
Label2.Caption:=inttostr(IBQuery1.FieldValues[´MIN´]); 


O formulario que eu estava usando começou a travar loucamente: qualquer componente que eu punha e codificava algum evento, dava um erro louco de que o evento era inválido. Daí eu add outro form, copiei todos os componentes e o código pra esse outro form, e simplismente deu certo. Não entendi realmente, mas esse código acima funciona.

Obrigado a todos pela atenção!


GOSTEI 0
POSTAR