ClientDataSet PacketRecords

Delphi

26/01/2004

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.


Mansur

Mansur

Curtidas 0

Respostas

Maicongabriel

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!


GOSTEI 0
Mansur

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,


GOSTEI 0
Maicongabriel

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:


GOSTEI 0
Maicongabriel

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

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:

(*
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
POSTAR