Consultas SQL com IBQuery
Galera!!!
Tenho um Data Module com várias consultas e tabelas. De um tempo para cá, percebo que as consultas não estão funcionando como deveriam. Verifico que as consultas retornam apenas a primeira linha da tabela consultada.
Verifico a quantidade de linhas encontradas através do RecordCount.
Porém, se eu vinculo essa consulta a um DBGrid com o DataSource, a consulta funciona numa boa. Tenho 3 consultas que estão assim, e em telas e tabelas diferentes. Alguém sabe por que isso acontece?
Valeu força!!
JR.
Tenho um Data Module com várias consultas e tabelas. De um tempo para cá, percebo que as consultas não estão funcionando como deveriam. Verifico que as consultas retornam apenas a primeira linha da tabela consultada.
Verifico a quantidade de linhas encontradas através do RecordCount.
Porém, se eu vinculo essa consulta a um DBGrid com o DataSource, a consulta funciona numa boa. Tenho 3 consultas que estão assim, e em telas e tabelas diferentes. Alguém sabe por que isso acontece?
Valeu força!!
JR.
Jrjoliv2003
Curtidas 0
Respostas
Vinicius2k
27/07/2004
JR.,
Verificar o RecordCount da IBQuery não lhe dará o resultado esperado pois ela traz para o buffer (´Fetch´) os registros à medida que são necessários... se no momento apenas um registro é necessário ela retornará o RecordCount como 1...
Quando vc a ligar num DBGrid ela irá executar o Fetch necessário para exibição no Grid, mas ainda assim o RecordCount é ´falso´ pq representará o número de linhas no grid até que vc faça a rolagem até o último registro...
Para ler o RecordCount de forma correta execute IBQuery.FecthAll; após o Open, mas eu não aconselho a fazer isso pq em bases grandes vc estará ´matando´ a performance da aplicação...
Veja este tópico : http://delphiforum.icft.com.br/forum/viewtopic.php?t=45198
Espero ter ajudado..
T+
Verificar o RecordCount da IBQuery não lhe dará o resultado esperado pois ela traz para o buffer (´Fetch´) os registros à medida que são necessários... se no momento apenas um registro é necessário ela retornará o RecordCount como 1...
Quando vc a ligar num DBGrid ela irá executar o Fetch necessário para exibição no Grid, mas ainda assim o RecordCount é ´falso´ pq representará o número de linhas no grid até que vc faça a rolagem até o último registro...
Para ler o RecordCount de forma correta execute IBQuery.FecthAll; após o Open, mas eu não aconselho a fazer isso pq em bases grandes vc estará ´matando´ a performance da aplicação...
Veja este tópico : http://delphiforum.icft.com.br/forum/viewtopic.php?t=45198
Espero ter ajudado..
T+
GOSTEI 0
Jrjoliv2003
27/07/2004
A situação é a seguinte:
Peço para consultar dados de uma turma de acordo com uma condição. O resultado da consulta irá atualizar dados dessas turmas. Se eu vinculo com um DbGrid ele acha as turmas e atualiza normalmente. Se tiro do dbgrid ele só acha a primeira linha. Muito estranho!!!
JR.
Peço para consultar dados de uma turma de acordo com uma condição. O resultado da consulta irá atualizar dados dessas turmas. Se eu vinculo com um DbGrid ele acha as turmas e atualiza normalmente. Se tiro do dbgrid ele só acha a primeira linha. Muito estranho!!!
JR.
GOSTEI 0
Vinicius2k
27/07/2004
Poste parte do seu código então...
T+
T+
GOSTEI 0
Jrjoliv2003
27/07/2004
Não entendi!!
JR. :roll:
JR. :roll:
GOSTEI 0
Vinicius2k
27/07/2004
Se vc postar aqui uma a instrução SQL da Query e/ou o código onde vc faz a leitura que só está retornando uma turma, talvez possamos lhe ajudar melhor... :wink:
Ou vc já solucionou o problema com o FetchAll?
T+
Ou vc já solucionou o problema com o FetchAll?
T+
GOSTEI 0
Jrjoliv2003
27/07/2004
A desculpe !! A consulta é simples:
tenho um IBQuery com a seguinte instrução:
select Mod_Turma, Mod_HoraI, Mod_HoraF from ModTurma where Mod_Turma:=turma
Passagem do parâmetro:
data.IBQTurma.close;
data.IBRTumra.ParamByName(´turma´).value:=rxdblookupcombo2.keyvalue;
data.IBRTurma.open;
Para Verificar a Quantidadede Linhas encontradas:
temp:=inttostr(data.IBQTurma.RecordCount);
Se vinculo com dbgrid o DataSource dessa Query ele acha tudo de acordo com a condição. Se não vinculo ele pega apenas 1 linha, a primeira que encontra.
Valeu a força!!
JR.
tenho um IBQuery com a seguinte instrução:
select Mod_Turma, Mod_HoraI, Mod_HoraF from ModTurma where Mod_Turma:=turma
Passagem do parâmetro:
data.IBQTurma.close;
data.IBRTumra.ParamByName(´turma´).value:=rxdblookupcombo2.keyvalue;
data.IBRTurma.open;
Para Verificar a Quantidadede Linhas encontradas:
temp:=inttostr(data.IBQTurma.RecordCount);
Se vinculo com dbgrid o DataSource dessa Query ele acha tudo de acordo com a condição. Se não vinculo ele pega apenas 1 linha, a primeira que encontra.
Valeu a força!!
JR.
GOSTEI 0
Vinicius2k
27/07/2004
Então,
Como eu disse :
Desta forma o RecordCount vai ter a leitura da quantidade correta de registros retornados...
T+
Como eu disse :
data.IBQTurma.close; data.IBRTurma.ParamByName(´turma´).value:=rxdblookupcombo2.keyvalue; data.IBRTurma.open; data.IBRTurma.FetchAll;
Desta forma o RecordCount vai ter a leitura da quantidade correta de registros retornados...
T+
GOSTEI 0
Jrjoliv2003
27/07/2004
Cara vc arrebentou na explicação naquele tópico que vc me passou o link. Muito bom!!
Eu vou testar tudo que foi abordado e o q vc me passou agora. Mais tarde eu te retorno o resultado!!
Valeu a força!!
JR.
Eu vou testar tudo que foi abordado e o q vc me passou agora. Mais tarde eu te retorno o resultado!!
Valeu a força!!
JR.
GOSTEI 0
Jrjoliv2003
27/07/2004
Tudo OK. Sua Dica foi certeira!!!!
coloquei:
data.ibqmod_turma.last;
temp:=data.ibqmod_turma.recordcount;
data.ibqmod_turma.first; {Para verificar linha a linha de acordo com o meu código}
Valeu mais uma vez!!!
JR.
coloquei:
data.ibqmod_turma.last;
temp:=data.ibqmod_turma.recordcount;
data.ibqmod_turma.first; {Para verificar linha a linha de acordo com o meu código}
Valeu mais uma vez!!!
JR.
GOSTEI 0
Vinicius2k
27/07/2004
OK.
Mas evite fazer isso em tabelas com grande volume de dados pois vc pode ter problemas de performance... prefira sempre ´select count´ quando precisar contar registros...
T+
Mas evite fazer isso em tabelas com grande volume de dados pois vc pode ter problemas de performance... prefira sempre ´select count´ quando precisar contar registros...
T+
GOSTEI 0