Fórum ClientDataSet PacketRecords #209395
26/01/2004
0
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
Curtir tópico
+ 0Posts
26/01/2004
Maicongabriel
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
26/01/2004
Mansur
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
26/01/2004
Maicongabriel
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
26/01/2004
Maicongabriel
Select * From Clientes Where Cidade = ´Belo Horizonte´ AND RowNum <= 10
Gostei + 0
26/01/2004
Mansur
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
Clique aqui para fazer login e interagir na Comunidade :)