ClientDataSet PacketRecords
Estou com uma grande dúvida em relação a ClientDataSet e o PacketRecords. Eu não sei como utilizá-lo.
Como eu faço para trazer um certa quantidade, limitada, de registros dentro de um ClientDataSet?
Por exemplo.
with CDS do begin
CommandText :=
´ select ´ +
´ (NOME || SOBRENOME) as NOMECOMPLETO ´ +
´ from ´ +
´ FUNCIONARIOS ´ +
´ where ´ +
´ (NOME || SOBRENOME) like ´ +#39+ ´¬MARIA¬´ +39;
end;
Este SQL vai me retornar mais ou menos uns 100.000 registros, mas, eu só quero que ele me traga 30 e nada mais. Eu não quero que o CDS fique carregado com os 100.000 e sim só com os 30.
Fui claro?
Desde já eu sou muito grato.
Como eu faço para trazer um certa quantidade, limitada, de registros dentro de um ClientDataSet?
Por exemplo.
with CDS do begin
CommandText :=
´ select ´ +
´ (NOME || SOBRENOME) as NOMECOMPLETO ´ +
´ from ´ +
´ FUNCIONARIOS ´ +
´ where ´ +
´ (NOME || SOBRENOME) like ´ +#39+ ´¬MARIA¬´ +39;
end;
Este SQL vai me retornar mais ou menos uns 100.000 registros, mas, eu só quero que ele me traga 30 e nada mais. Eu não quero que o CDS fique carregado com os 100.000 e sim só com os 30.
Fui claro?
Desde já eu sou muito grato.
Mansur
Curtidas 0
Respostas
Maicongabriel
26/01/2004
Foi bastente claro!
Defina o PacketRecords = 30 !
Porém, existe um problema, no Delphi 7 ! Quando estes dados são apresentados em um DBGrid, ele simplesmente preenche o DBGrid com o mesmo registro tantas vezes quanto o numero especificado no PacketRecords, problema este que não ocorre no Delphi 6 !
Diferença ? Bug ? Não sei exatamente...
Mas mudando um pouco de assunto, esta Select do exemplo abaixo, pode lhe ser util ::
SELECT TOP 10 USUARIO FROM USUARIOS
Ela irá retornar as 10 primeiras ocorências(registros) da tabela USUARIO !
E outra coiza, o ¬ no inicio e no fim da string a ser procurada pelo LIKE, simplesmente faz com que qualquer Indice da sua tabela seja ignorado, forçando assim o banco a percorrer os seus 100.000 registros (todos da tabela), o que acaba baixando o desempenho!
Defina o PacketRecords = 30 !
Porém, existe um problema, no Delphi 7 ! Quando estes dados são apresentados em um DBGrid, ele simplesmente preenche o DBGrid com o mesmo registro tantas vezes quanto o numero especificado no PacketRecords, problema este que não ocorre no Delphi 6 !
Diferença ? Bug ? Não sei exatamente...
Mas mudando um pouco de assunto, esta Select do exemplo abaixo, pode lhe ser util ::
SELECT TOP 10 USUARIO FROM USUARIOS
Ela irá retornar as 10 primeiras ocorências(registros) da tabela USUARIO !
E outra coiza, o ¬ no inicio e no fim da string a ser procurada pelo LIKE, simplesmente faz com que qualquer Indice da sua tabela seja ignorado, forçando assim o banco a percorrer os seus 100.000 registros (todos da tabela), o que acaba baixando o desempenho!
GOSTEI 0
Mansur
26/01/2004
Olá maicongabriel,
realmente eu utilizo o Delphi7
Definir o PacketRecords para 30 eu já tinha feito e não estava adiantando mesmo.
Foi então que eu vi em uma outra pegunta do forum que falava que estava faltando configurar a propriedade ´FetchOnDemand´ para False do ClientDataSet.
Feito isso o CDS só me traz os 30 primeiros registros do SQL.
Agora o SQL que você me passou:
select TOP 30 USUARIO from USUARIOS
Não funciona.
Também tentei:
select USUARIO from USUARIOS LIMIT 30
e também não funcionou
O banco que eu uso é ORACLE 8i
Muito obrigado,
realmente eu utilizo o Delphi7
Definir o PacketRecords para 30 eu já tinha feito e não estava adiantando mesmo.
Foi então que eu vi em uma outra pegunta do forum que falava que estava faltando configurar a propriedade ´FetchOnDemand´ para False do ClientDataSet.
Feito isso o CDS só me traz os 30 primeiros registros do SQL.
Agora o SQL que você me passou:
select TOP 30 USUARIO from USUARIOS
Não funciona.
Também tentei:
select USUARIO from USUARIOS LIMIT 30
e também não funcionou
O banco que eu uso é ORACLE 8i
Muito obrigado,
GOSTEI 0
Maicongabriel
26/01/2004
Bem, me desculpe não ter lhe perguntado, mas aquela syntaxe é para MySQL, porem deve existir algo semelhante para Oracle!
Porem quanto ao ClientDataSet, minha opção FeetchOnDemand esta marcada, mas continuo tendo estes problemas de duplicação do registro dentro do DBGrid :/
Para matar a curiozidade, isto não aconteceu com vc ? :shock:
Porem quanto ao ClientDataSet, minha opção FeetchOnDemand esta marcada, mas continuo tendo estes problemas de duplicação do registro dentro do DBGrid :/
Para matar a curiozidade, isto não aconteceu com vc ? :shock:
GOSTEI 0
Maicongabriel
26/01/2004
Veja, achei uma Select equivalente ao Top, porem para Oracle::
Select * From Clientes Where Cidade = ´Belo Horizonte´ AND RowNum <= 10
GOSTEI 0
Mansur
26/01/2004
Oi maicongabriel,
Teste o SQL que você me passou para oracle e funciona perfeitamente.
Obrigado.
Agora a respeito do CDS....
Eu estou utilizando para WebBroker, não utilizo DBGrids.
Eu estou fazendo da seguinte maneira:
Desta maneira ele começou a buscar do primeiro registro até somar trinta, depois parou, como se tivesse apenas trinta registros na tabela.
Mas eu vou testar, quando eu tiver um tempo, utilizando DBGrid.
p.s. Vale a pena lembrar o que eu estou usando:
Delphi 7 com Oracle 8i
Componentes:
SQLConection
SQLQuery
DataSetProvider
ClientDataSet
Abraços,
Teste o SQL que você me passou para oracle e funciona perfeitamente.
Obrigado.
Agora a respeito do CDS....
Eu estou utilizando para WebBroker, não utilizo DBGrids.
Eu estou fazendo da seguinte maneira:
(* No componente (CDS) eu seleciono as propriedades: -FetchOnDemand e mudo para FALSE -PacketRecords e mudo para 30 E no código eu faço o seguinte: *) with CDS do begin CommandText := ´ select ´ + ´ (NOME || SOBRENOME) as NOMECOMPLETO ´ + ´ from ´ + ´ FUNCIONARIOS ´ + ´ where ´ + ´ (NOME || SOBRENOME) like ´ +#39+ ´¬MARIA¬´ +39; // ´ (NOME || SOBRENOME) like ´ + QuotedStr(´¬MARIA¬´); // pode ser passado desta maneira também. Open; while not Eof do begin //monto uma tabela em html Next; end; Close; end;
Desta maneira ele começou a buscar do primeiro registro até somar trinta, depois parou, como se tivesse apenas trinta registros na tabela.
Mas eu vou testar, quando eu tiver um tempo, utilizando DBGrid.
p.s. Vale a pena lembrar o que eu estou usando:
Delphi 7 com Oracle 8i
Componentes:
SQLConection
SQLQuery
DataSetProvider
ClientDataSet
Abraços,
GOSTEI 0