Página 1 de 1
Filtro no Dbedit
Enviado: 07 Nov 2013 07:44
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
Filtro no Dbedit
Enviado: 07 Nov 2013 09:42
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"
Filtro no Dbedit
Enviado: 07 Nov 2013 13:55
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 ?
Filtro no Dbedit
Enviado: 07 Nov 2013 15:32
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"
Filtro no Dbedit
Enviado: 07 Nov 2013 15:49
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
Filtro no Dbedit
Enviado: 07 Nov 2013 15:57
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".
Filtro no Dbedit
Enviado: 07 Nov 2013 16:15
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.
Filtro no Dbedit
Enviado: 07 Nov 2013 17:05
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...
Filtro no Dbedit
Enviado: 07 Nov 2013 18:00
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.
Filtro no Dbedit
Enviado: 07 Nov 2013 21:19
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.
Filtro no Dbedit
Enviado: 07 Nov 2013 21:56
por Eolo
Billy, anexo a que eu tenho, 52e, que inclui CATools, Six, Nanfor etc etc.
Filtro no Dbedit
Enviado: 08 Nov 2013 23:27
por billy1943
Obrigado, agora vou utilizar melhor alguns comandos.
Filtro no Dbedit
Enviado: 09 Nov 2013 01:10
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