Como limitar a consulta em tabelas dbf ???

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Cisino Junior
Usuário Nível 2
Usuário Nível 2
Mensagens: 67
Registrado em: 14 Abr 2016 13:12
Localização: Rio de Janeiro

Como limitar a consulta em tabelas dbf ???

Mensagem 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.
HMG 3.4.3 + DBF, Java, MySQL, PostgreSQL, PHP, JavaScript + HTML5 + CSS3, Bootstrap, Spring, Thymeleaf.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Como limitar a consulta em tabelas dbf ???

Mensagem por Kapiaba »

Usando ORDSCOPE() ou INDEX ON... MEMORY
Cisino Junior
Usuário Nível 2
Usuário Nível 2
Mensagens: 67
Registrado em: 14 Abr 2016 13:12
Localização: Rio de Janeiro

Como limitar a consulta em tabelas dbf ???

Mensagem 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.
HMG 3.4.3 + DBF, Java, MySQL, PostgreSQL, PHP, JavaScript + HTML5 + CSS3, Bootstrap, Spring, Thymeleaf.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Como limitar a consulta em tabelas dbf ???

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Como limitar a consulta em tabelas dbf ???

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Como limitar a consulta em tabelas dbf ???

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Como limitar a consulta em tabelas dbf ???

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

Como limitar a consulta em tabelas dbf ???

Mensagem 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.
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
Responder