Qual o melhor componente para comandos SQL?
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:
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:
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á,
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
Curtidas 0
Respostas
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
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
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.
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:
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,
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
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?
Se vc fizer SELECT * FROM TBCLI WHERE TBCLI.COD = Valor fixo direto no banco retorna algum registro?
GOSTEI 0
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
Mas com ADOQUERY, usaria assim:
SELECT MAX (NRO) AS MAXIMO, MIN (NRO) AS MINIMO FROM TBCLI WHERE TBCLI.COD = :COD
GOSTEI 0
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;
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
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
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
29/01/2008
Obrigado a todos.
Não sei oq houve, mas funcionou da maneira q eu estava fazendo:
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!
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