Página 1 de 1

Como limitar a consulta em tabelas dbf ???

Enviado: 17 Jul 2017 17:27
por Cisino Junior
Boa tarde!

Usando SQL é muito fácil limitar uma consulta ao banco de dados para listar dados exemplo:

Código: Selecionar todos

SELECT * FROM table1 LIMIT 100
Agora, como fazer isso no DBF? Estamos implementando o LETODB(fork) no sistema e está funcionando legal, mas queremos diminuir o tráfego de dados. Atualmente ao abrir uma tabela usamos o componente Browser do HMG para mostrar os dados, mas o mesmo lista TODOS os registros, como posso limitar essa consulta?

Atenciosamente,
Cisino Junior.

Como limitar a consulta em tabelas dbf ???

Enviado: 18 Jul 2017 09:44
por Kapiaba
Usando ORDSCOPE() ou INDEX ON... MEMORY

Como limitar a consulta em tabelas dbf ???

Enviado: 18 Jul 2017 10:11
por Cisino Junior
Kapiaba escreveu:Usando ORDSCOPE() ou INDEX ON... MEMORY
Bom dia, Kapiaba, Obrigado pela resposta, vou testar sua dica. Valeu!!!

Atenciosamente,
Cisino Junior.

Como limitar a consulta em tabelas dbf ???

Enviado: 18 Jul 2017 19:18
por Itamar M. Lins Jr.
Ola!
Agora, como fazer isso no DBF? Estamos implementando o LETODB(fork) no sistema e está funcionando legal, mas queremos diminuir o tráfego de dados. Atualmente ao abrir uma tabela usamos o componente Browser do HMG para mostrar os dados, mas o mesmo lista TODOS os registros, como posso limitar essa consulta?
Não tem como. Porque não precisa, só vem o que vc chama. (Via Leto[f] ou NetIO).
O comando "USE" abrirá, e irá trazer alguns registros! isto é, somente o que cabe nas linhas do browse, por exemplo.
Não precisa se preocupar com LIMITE.
Quando abre um DBF qualquer com "milhões" de registro, o ponteiro fica por padrão no primeiro. Não chama nenhum só se posiciona, Se no browse cabe 50 ele puxa apenas os cinquenta registros, mesmo que tenha milhões. Não cria uma MALHA com a sentença... dos fields(campos) da tabela, como em SQL com 100 e só mostra 50.
Vc trata diretamente com a base de dados, não existe uma camada intermediaria virtual.
No LetoDbf tem a opção "Cache_Records = 60", isto é o servidor LetoDBf armazena em memória 60 registros de vez, para não ficar lendo o tempo todo o disco registro a registro.

Se não quer mostrar todos os registros em DBF usamos a cláusula(flag) "FOR" ou "WHILE", mas tem que ter um propósito
index on quantidade TAG XYZ for QUANTIDADE >= 100 // é só um exemplo.

Resumindo, o filtro vc faz na criação de algum índice e abre ele, ou pode usar o comando "FILTER TO" não recomendado o uso em redes.

Essa situação de ler todo o DBF, sobrecarga na rede, só ocorre com redes mapeadas. Ai está a má reputação do DBF.

Saudações,
Itamar M. Lins Jr.

Como limitar a consulta em tabelas dbf ???

Enviado: 18 Jul 2017 21:21
por asimoes
Uma ideia seria fazer append from para uma tabela temporária, ai você pode limitar a qtd de registros do dbf, tipo recno() <= 100

Como limitar a consulta em tabelas dbf ???

Enviado: 18 Jul 2017 21:24
por asimoes
Exemplo:

Código: Selecionar todos

  PROCEDURE Main

      USE Address NEW
      COPY STRUCTURE TO Tmp          // create an intermediate file
      USE Tmp

      APPEND FROM Address FOR RECNO() <= 100

      Browse()
      USE

      ERASE Tmp.dbf                  // delete intermediate file
   RETURN
Transforma isso em uma função e seja feliz

Como limitar a consulta em tabelas dbf ???

Enviado: 19 Jul 2017 09:19
por Itamar M. Lins Jr.
Olá!
Como eu disse, usando o LetoDbf, limitar os registros do DBF, para diminuir o tráfego na rede, não faz sentido.
Se deseja mostrar poucos registros, basta diminuir as linhas do browse.

Saudações,
Itamar M. Lins Jr.

Como limitar a consulta em tabelas dbf ???

Enviado: 19 Jul 2017 10:38
por JAIR RANGEL
Olá, Itamar!

Obrigado por suas explicações.
Agora ficou claro o que acontece quando uma tabela dbf é aberta usando o letodb(f). Não importa a quantidade de registros existentes na tabela. Os registros apresentados no componente browse (no meu caso que utilizo a IDE da hmg3.4.3/MinGW) correspondem ao número de linhas do browse.
O letodb(f) vai armazenar outros tantos registros em memória, conforme configuração do parametro CacheRecords. Quando o Operador rolar até o último registro do browse, os registros armazenados em cache vão atualizar novos registros no browser. A troca de registros no browser se torna muito rápida, pois os registros não são lidos no disco, eles já estão em cache.

Muito bom isso.