Filtro no Dbedit

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Filtro no Dbedit

Mensagem por rubens »

Qual a melhor de aplicar este filtro no dbedit?

Código: Selecionar todos

WHILE (.T.)

   cMensagem	:= "ALT_A-Altera ³ ALT_I-Imprime ³ Pesq: F2-Numero ORC F5-Cliente F6-Data "
   SETCURSOR(0)
   aCAMPO		:= { "RIGHT(NUMERO_,7)+'³'+CODCLI_+SUBSTR( M1,7,25 )+'³'+TRAN(VALOR_,P12)+'³'+DTOC(DATA_)+'³'+RIGHT(CODFUN_,3)+'³'+CODCOND+'³'+TIPO" }
   aTITULO		:= { 'NUMERO  CLIENTE                              VALOR   DATA     VEN CON'}

   MENSAGEMN( cMENSAGEM )
   COR("MENU")
   JANELA2(03,04,20,76)
   @ 3,07 SAY '´ GERENCIADOR DE PEDIDOS Ã' COLOR 'W+/R'
   SELE ORC
   SET FILTER TO (TIPO!='O' .AND. TIPO!='L')
   DBSETORDER(3)
   DBGOBOTTOM()
   KEYBOARD CHR( K_CTRL_PGDN )
   DBEDIT(04,05,19,75,aCampo,'TECLAORC',,aTitulo,'Í','³')
   SETCURSOR(1)
   EXIT

ENDDO
Com o Set Filter To quando outro terminal abre a mesma tela de consulta fica muito lento ...
Tentei usar um TBrowse mas por causa do filter tb fica muito lento.

Obg..

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Filtro no Dbedit

Mensagem por Eolo »

O FILTER realmente não dá pra usar...


Use a cláusula FOR do INDEX para o campo TIPO:
(estou usando arquivos indice separados, adapte ao seu sistema)

Código: Selecionar todos

INDEX ON NOME TO IND1
INDEX ON SOBRENOME TO IND2
INDEX ON TIPO+NOME TO IND3 FOR TIPO="O"
SET INDE TO IND1, IND2, IND3

SET ORDE TO IND3
* Vão ser mostrados apenas os registros com TIPO="O", sem precisar usar o FILTER
* e ordenados por TIPO+NOME
* se precisar procurar: SEEK "O"+"EOLO"
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Filtro no Dbedit

Mensagem por billy1943 »

Olá Eolo !

Realmente, essa forma de uso do comando INDEX utilizando cláusula FOR não constava das minhas fontes de consulta.

Você poderia informar onde ela pode ser encontrada/documentada, juntamente com outras igualmente úteis ?
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Filtro no Dbedit

Mensagem por Eolo »

Billy, The kid
Tá no bom e velho NG...
Abraço!

PS. Se o "filtro" é constante, como parece ser o caso (só o campo TIPO e sempre um filtro constante), é um caminho legal. Complica se o filtro não for constante, tipo o usuário quer as vendas de 01-jul a 07-nov-13, aí teria que reconstruir o índice no run time. Mas, se o DBF for pequeno, não há problema.

E o FOR pode incluir várias condições: FOR TIPO>="O" .and. TIPO<="T"
Anexos
index.zip
(121.63 KiB) Baixado 163 vezes
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Filtro no Dbedit

Mensagem por rubens »

Exatamente meu caro Eolo... isso que ia perguntar... esse indíce terá tamanho e componentes diferentes de um ordenação né? porque senão toda vez que for usar terá que reconstruir o índice... certo? No meu caso tenho o gerenciador de orcamentos (acesso dos vendedores) e o gerenciador de pedidos (acesso do caixa) onde os pedidos são transformados em venda. Daí não quero que os orçamentos (tipo O e L) apareçam no caixa somente os pedidos (tipo P). Com o set filter as vezes tem só uns 50 registros e só uns 10 pedidos mas vira uma eternidade para navegar entre eles.
Eu sabia da existência de opções no comando index ma nunca tinha usado e não tinha visto ninguém usar.
Para mim Fórum serve para isso para tirar dúvidas, mesmo que existam manuais que depois de centenas de horas perdidas, você pode até achar a solução, você pode simplesmente postar uma dúvida e uma enciclopédia ambulante ( nesse caso específico o Eolo) te responde de oma lá dá cá..
Vou fazer o teste para ver o que acontece e posto o resultado aqui...

Blz..

Obg..

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Filtro no Dbedit

Mensagem por Eolo »

Rubens, a cláusula FOR não obriga vc a reconstruir o indice.

Fazendo
INDEX ON NOME TO IND1
INDEX ON SOBRENOME TO IND2
INDEX ON TIPO+NOME TO IND3 FOR (TIPO='O' .OR. TIPO='L')...

...TODA vez que vc incluir um registro no DBF os TRÊS índices vão ser atualizados, sendo que o IND3 vai continuar mostrando só os tipos "O" e "L".

Se o registro incluído tiver TIPO="O" .or. "L", ele vai ficar visível se o SET ORDE for 3.
Se não tiver, não vai.

Em outras palavras: se o campo é sempre TIPO e o "filtro" é sempre "=0 or =L", não precisa reconstruir nada. É todo "tomático".
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Filtro no Dbedit

Mensagem por Eolo »

Rubens,

Pro Caixa, inlcui o SET ORDE TO 4

Código: Selecionar todos

INDEX ON NOME TO IND1
INDEX ON SOBRENOME TO IND2
INDEX ON TIPO+NOME TO IND3 FOR (TIPO='O' .OR. TIPO='L')
INDEX ON TIPO+NOME TO IND4 FOR TIPO="P"

if caixa
  set orde to 4
endi
esse indíce terá tamanho e componentes diferentes de um ordenação né?
Não. Com a cláusula FOR, todos os índices terão o mesmo tamanho. No caso do 3 e do 4, os registros que não tiverem atendidas as condições do FOR terão um FLAG dizendo "não mostrar". Só isso.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Filtro no Dbedit

Mensagem por Eolo »

Rubens, pra engrossar o caldo.

Eu tenho um arquivo de vendas, indexado por data, trocentos milhões de registros, quero as vendas de 01 a 06-nov-2013, só que rápído! Como fazer?

Código: Selecionar todos

use vendas
* Cria vendas2222, temporário, mesma estrutura do vendas
use vendas2222 new excl //precisa ser um NOME exclusivo, no caso de rede
inde on datavend to lixo2222 // idem
set inde to lixo2222
go top

sele vendas
set orde to 5 // vendas pelo campo DATAVEND, crescente
flock() // pra tirar um retrato estático
seek ctod(“01/11/2013”)
do while datavend>= ctod(“01/11/2013”) .and. datavend<= ctod(“06/11/2013”)
  sele vendas2222
  * append registro no DBF temp
  * replace
  sele vendas
  skip
endd
sele vendas
unlock

sele vendas2222 // criado rapidamente
dbedit() //////////////////////////////////////////////
* usa e abusa
* acabou?
use
* deleta vendas2222
* deleta lixo2222.cdx
sele vendas
Fiz este exemplo rapidamente, pode ter faltado alguma coisa ou ter algum pau. A conferir.

O princípio: usar e abusar de DBFs temporários. Eu faço isso.
Meu log mostra que, no pior cenário, uma outra estação teve que aguardar 15 segundos pro DBF Vendas ser liberado...
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Filtro no Dbedit

Mensagem por Eolo »

uma enciclopédia ambulante ( nesse caso específico o Eolo)
Cara, que coisa mais antiga...
Melhor seria "um google ambulante", né não?
Se bem que enciclopédia é melhor que TIO, né Tio Billy? (po, sou de 1950, BEM mais novo)

Continue, Rubens.
Um dia, ensine a alguém o que vc anda aprendendo.
Este é a única condição .T.
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Filtro no Dbedit

Mensagem por billy1943 »

Obrigado pelo Tio, Eolo !

Quase você deixou escapar o "Vô", não é ?

Bem, falando sério, o NG que você utiliza, da versão Clipper 5.2, eu não tenho, somente tenho as versões 5.0 e 5.3;

Você sabe onde a poderia conseguir ?

Procurei na internet e não achei.

E muito obrigado pelas suas dicas de trabalhar com arquivos grandes com os índices utilizando o FOR.

Vou dar uma mudadinhas em algumas rotinas minhas, que mesmo usando arquivos temporários, demoram às vezes, um pouco.

O que também demora um pouco é a gravação de arquivos .DBF mas eu uso as funções:
INITVARS()
CLRVARS()
EQUVARS()
REPLVARS()
FREEVARS()

Elas abreviam sobremaneira o movimento e gravação das variáveis, principalmente em rede.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Filtro no Dbedit

Mensagem por Eolo »

Billy, anexo a que eu tenho, 52e, que inclui CATools, Six, Nanfor etc etc.
Anexos
NG.zip
(1.27 MiB) Baixado 124 vezes
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Filtro no Dbedit

Mensagem por billy1943 »

Obrigado, agora vou utilizar melhor alguns comandos.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Filtro no Dbedit

Mensagem por alxsts »

Olá!

Não existe melhor lugar no planeta para encontrar Norton Guides Clipper do que o Ousob. Tem NG de tudo lá.

Manual Clipper Summer '87
Manual Clipper 5.2
Manual Clipper 5.3
[]´s
Alexandre Santos (AlxSts)
Responder