Fórum DBLookupComboBox isto é um bug ? #328124

27/08/2006

0

to com um DBLookupComboBox onde clico no down para vizualizar a lista aparece estreito, onde somente um registro aparece, depois fecho clico novamente e os dados aparecem normal ...isto é alguma configuração ? ou é bug..vlw t+


Gigatel

Gigatel

Responder

Posts

27/08/2006

Micheus

Eu tenho este problema utilizando o componente MDO para acesso ao Firebird. Por questões de otimização, RecordCount não represente realmente a quantidade de registros resultante na consulta. Ele vai sendo ajustado a cada leitura que é feita nela. Não consigo explicar exatamente, mas é como se ele armazenasse apenas a quantidade de registros lidos para o buffer em memória. Se estiver utilizando o MDO dê uma olhada na explicação colocada pelo responsável pelo componente neste [url=http://br.groups.yahoo.com/group/mdo-suporte/message/548][b:c9c57e3d65]link[/b:c9c57e3d65][/url]

O DBLookupComboBox utiliza a propriedade RecordCount do dataset para calcular o tamanho da janela a ser mostrada, com a lista. Normalmente apresenta 7(o valor de DropDownRows) linhas.
Vc vai observar que isto só vai ocorrer quando vc estiver inserindo um novo registro, já que quando for uma edição, a consulta terá que percorrer alguns registros para mostrar o valor correto no componente.
No caso específico deste componente, fiz uma modificação no código e adicionei uma nova propriedade(PreFetchedRows) onde indico o número de linhas que devem ser lidas quando a consulta é aberta. No método Open, simplesmente faço algo como:
procedure T...Open;
begin
  for := 1 to PreFetchedRows do
    Next;
  First;
end;

que é o suficiente para que RecordCount contenha um nº adequado para que a caixa de lista seja apresentada corretamente.


Responder

Gostei + 0

27/08/2006

Gigatel

Eu tenho este problema utilizando o componente MDO para acesso ao Firebird. Por questões de otimização, RecordCount não represente realmente a quantidade de registros resultante na consulta. Ele vai sendo ajustado a cada leitura que é feita nela. Não consigo explicar exatamente, mas é como se ele armazenasse apenas a quantidade de registros lidos para o buffer em memória. Se estiver utilizando o MDO dê uma olhada na explicação colocada pelo responsável pelo componente neste [url=http://br.groups.yahoo.com/group/mdo-suporte/message/548][b:ba277afc10]link[/b:ba277afc10][/url] O DBLookupComboBox utiliza a propriedade RecordCount do dataset para calcular o tamanho da janela a ser mostrada, com a lista. Normalmente apresenta 7(o valor de DropDownRows) linhas. Vc vai observar que isto só vai ocorrer quando vc estiver inserindo um novo registro, já que quando for uma edição, a consulta terá que percorrer alguns registros para mostrar o valor correto no componente. No caso específico deste componente, fiz uma modificação no código e adicionei uma nova propriedade(PreFetchedRows) onde indico o número de linhas que devem ser lidas quando a consulta é aberta. No método Open, simplesmente faço algo como:
procedure T...Open;
begin
  for := 1 to PreFetchedRows do
    Next;
  First;
end;
que é o suficiente para que RecordCount contenha um nº adequado para que a caixa de lista seja apresentada corretamente.


más e aí ? tem jeito ? outbm tenho que alterar o componente ? e onde coloco este código ? ...vlw t+


Responder

Gostei + 0

27/08/2006

Gigatel

Eu tenho este problema utilizando o componente MDO para acesso ao Firebird. Por questões de otimização, RecordCount não represente realmente a quantidade de registros resultante na consulta. Ele vai sendo ajustado a cada leitura que é feita nela. Não consigo explicar exatamente, mas é como se ele armazenasse apenas a quantidade de registros lidos para o buffer em memória. Se estiver utilizando o MDO dê uma olhada na explicação colocada pelo responsável pelo componente neste [url=http://br.groups.yahoo.com/group/mdo-suporte/message/548][b:345e019561]link[/b:345e019561][/url] O DBLookupComboBox utiliza a propriedade RecordCount do dataset para calcular o tamanho da janela a ser mostrada, com a lista. Normalmente apresenta 7(o valor de DropDownRows) linhas. Vc vai observar que isto só vai ocorrer quando vc estiver inserindo um novo registro, já que quando for uma edição, a consulta terá que percorrer alguns registros para mostrar o valor correto no componente. No caso específico deste componente, fiz uma modificação no código e adicionei uma nova propriedade(PreFetchedRows) onde indico o número de linhas que devem ser lidas quando a consulta é aberta. No método Open, simplesmente faço algo como:
procedure T...Open;
begin
  for := 1 to PreFetchedRows do
    Next;
  First;
end;
que é o suficiente para que RecordCount contenha um nº adequado para que a caixa de lista seja apresentada corretamente.


más e aí ? tem jeito ? outbm tenho que alterar o componente ? e onde coloco este código ? ...vlw t+


Responder

Gostei + 0

28/08/2006

M@gnun

quando vc abrir o dataset do dblookup coloque

dataset_do_lookup.FetchAll;

ps: Cuidado com tabelas com mt registros.


Responder

Gostei + 0

28/08/2006

Micheus

[b:e5cdd912f4]Gigatel[/b:e5cdd912f4], se seguir a dica do [b:e5cdd912f4]m@gnun[/b:e5cdd912f4], leve em conta a observação que ele fez (também consta do link que lhe informei).

Se vc realmente está utilizando o MDO, o que posso sugerir é que faça a mesma alteração que eu fiz.
Eu alterei apenas o [i:e5cdd912f4]MDOQuery.pas[/i:e5cdd912f4], porque utilizo apenas o componente TMDOQuery para fazer os lockup´s. Resolveu perfeitamente o meu problema, porém o ´chato´ é que quando há uma atualização de versão (não ocorre como frequência) tem que ser refeita a alteração - até que o Henrique se sensibilize e implemente algo parecido em seus componentes (já mandei um e-mail para ele e nada :x )
Seguem abaixo as alterações que realizei (ver citações com meu nome):
unit MDOQuery;
  ...
  TMDOQuery = class (TMDOCustomDataSet)
  private
    FCheckRowsAffected: Boolean;
    FGenerateParamNames: Boolean;
    FParams: TParams;
    FPrepared: Boolean;
    FRowsAffected: Integer;
    FPreFetchRecords :Integer;  // *** included by Micheus
    ...
  public
    constructor Create(AOwner: TComponent); override;
    ...
    procedure GetDetailLinkFields(MasterFields, DetailFields: TList); override;
    procedure Open;  // *** changed by Micheus
    ...
  published
    property Active;
    ...
    property Params: TParams read FParams write SetParamsList stored False;
    property PreFetchRecords :Integer read FPreFetchRecords write FPreFetchRecords default 0;  // *** included by Micheus

...

constructor TMDOQuery.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ...
  FPreFetchRecords := 0;  // *** included by Micheus
  FRowsAffected := -1;
end;
...
// *** included by Micheus - Jul/2005
// *** Objetivo: Gerar um número mínimo para RecordCount, contornando
// ***           problemas visuais com as listas (TDBComboBox)
procedure TMDOQuery.Open;
 // Força atualização do RecordCount
  procedure CalcRecordCount;
  begin
    DisableControls;
    while not EOF and (RecordCount < FPreFetchRecords) do
      Next;
    First;
    EnableControls;
  end;
begin
  inherited Open;

  if Active and (FPreFetchRecords > 0) then
    CalcRecordCount;
end;
...



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar