BOM dia.
Alterei uns 4 programas trocando Set filter por Ordscope GOOD Excelente a performance.
Alguns prg tipo Previsão no Financeiro onde exibo um browser e....
permito um filtro por Vários campos inclusive NÂO chaves.
Para esta condição é Impossível o Ordscope então pensei em trocar o filter por um índice temp
Quando acontece +- isso faço da seguinte forma e queria saber se é única opção.
arquivo cbmovi
set index to &pdir\cbmovii1,;
&pdir\cbmovii2,;
&pdir\cbmovii3,;
&pdir\cbmovii5,;
&pdir\cbmovii8,;
&pdir\cbmovii9
Apagando o índice temp e criando( isto porque dentro do programa ele poderá FILTRA varias condições SEM sair do programa)
xerase = pdir+[\T]+alltrim(pusuario)+[.cdx]
erase &xerase
index on docto to &xerase for situacao = [A] .and. campo = X etc
AQUI a dúvida:
set index to
set index to &xerase ,;
&pdir\cbmovii1,;
&pdir\cbmovii2,;
&pdir\cbmovii3,;
&pdir\cbmovii5,;
&pdir\cbmovii8,;
&pdir\cbmovii9
go top
Anulei os Índices depois seto o Temp + os originais da base
é o procedimento correto ?
ob
Paiva
Rede lenta em alguns filtros
Moderador: Moderadores
Rede lenta em alguns filtros
Paiva,
Não uso índices temporários sobre os DBFs principais. Crio os CDXs no início do sistema e não mexo mais. Talvez excesso de zelo, mas acho que como vai ter mais gente usando os DBFs na rede, melhor não criar "gargalos". Quando necessário, como em relatórios, crio um DBF temp, indexo ele (ainda vazio) conforme necessário e vou APPENDando as informações lidas dos registros do(s) DBF(s) principais. Feita a seleção, libero estes DBFs e vou trabalhar só com o temp. Acabou a rotina, detono o temp.
De qualquer forma, dá uma olhada na cláusula ADDITIVE. Com ela, os índices ativos não são fechados nem precisam ser fechados na criação do índice ADICIONAL. Ou seja, você pode criar e setar índices adicionais sem fechar os principais. E usando a cláusula TEMPORARY, esses índices adicionais serão eliminados quando vc fechar o CDX. Só não sei ao certo como isso trabalha em rede: vários usuários, usando a mesma rotina, vão criar índices TEMP com o mesmo nome... Como fica? E, se os TEMP só são deletados quando se fechar o arquivo índice, isso não causaria um "inchaço" no CDX?
Enfim, acho que o Kapiaba pode lhe ajudar melhor nesse assunto (índices temporários).
Agora, uma pergunta: vc cria vários arquivos índice e, sendo CDX, por que vc não usa TAGs? Fica tudo dentro de um só CDX.
Não uso índices temporários sobre os DBFs principais. Crio os CDXs no início do sistema e não mexo mais. Talvez excesso de zelo, mas acho que como vai ter mais gente usando os DBFs na rede, melhor não criar "gargalos". Quando necessário, como em relatórios, crio um DBF temp, indexo ele (ainda vazio) conforme necessário e vou APPENDando as informações lidas dos registros do(s) DBF(s) principais. Feita a seleção, libero estes DBFs e vou trabalhar só com o temp. Acabou a rotina, detono o temp.
De qualquer forma, dá uma olhada na cláusula ADDITIVE. Com ela, os índices ativos não são fechados nem precisam ser fechados na criação do índice ADICIONAL. Ou seja, você pode criar e setar índices adicionais sem fechar os principais. E usando a cláusula TEMPORARY, esses índices adicionais serão eliminados quando vc fechar o CDX. Só não sei ao certo como isso trabalha em rede: vários usuários, usando a mesma rotina, vão criar índices TEMP com o mesmo nome... Como fica? E, se os TEMP só são deletados quando se fechar o arquivo índice, isso não causaria um "inchaço" no CDX?
Enfim, acho que o Kapiaba pode lhe ajudar melhor nesse assunto (índices temporários).
Agora, uma pergunta: vc cria vários arquivos índice e, sendo CDX, por que vc não usa TAGs? Fica tudo dentro de um só CDX.
set index to &pdir\cbmovii1, &pdir\cbmovii2, &pdir\cbmovii3, &pdir\cbmovii5, &pdir\cbmovii8, &pdir\cbmovii9
use dbmovi
index on … tag cbmovii1 to dbmovi[.cdx]
index on … tag cbmovii2 to dbmovi
…
index on … tag cbmovii9 to dbmovi
set inde to dbmovi // fica tudo dentro de um CDX só, cada índice em uma TAG
* pra usar
set orde to “cbmovii9” // ou set orde to 9 (mesma ordem da criação)
etc.
-
Kapiaba
- Colaborador

- Mensagens: 1908
- Registrado em: 07 Dez 2012 16:14
- Localização: São Paulo
- Contato:
Rede lenta em alguns filtros
Paiva, simples:
Código: Selecionar todos
LOCAL XCONTADOR
PRIVATE TEMP
//Abro os pedidos
SELECT ( DbPedidos:cAlias )
DbPedidos:SetOrder( 1 )
TEMP := "TEMP0"
XCONTADOR := 0
// SE TIVER TEMPORARIO, INCREMENTA
WHILE FILE(TEMP+".DBF")
SYSREFRESH()
XCONTADOR := XCONTADOR + 1
TEMP := "TEMP"+LTRIM(STR(XCONTADOR))
ENDDO
//-> Copia a Estrutura do banco dos pedidos para o Temporario
COPY STRUCTURE TO &TEMP
IF NETUSE( "&TEMP", .F. )
DATABASE DbTemp
DbTemp:Load() //-> Temporario = a FP_PROV.DBF
DbTemp:SetBuffer( .T. )
ELSE
MsgStop( "Banco de Dados Temporario Bloqueado", "Cuidado!" )
RETURN NIL
ENDIF
//Abro os pedidos
SELECT ( DbPedidos:cAlias )
DbPedidos:SetOrder( 1 )
DBSEEK( XNOVOPEDIDO )
//-> Repassa um pedido antigo para um novo no temporario
WHILE PEDIDO = XNOVOPEDIDO
SYSREFRESH()
IF EOF()
EXIT
ENDIF
cCodClien := ( DbPedidos:cAlias )->MATRICULA
nNumeroTel := ( DbPedidos:cAlias )->TELEFONE
cNomeClien := ( DbPedidos:cAlias )->NOME_CLI
XCGCCLI := ( DbPedidos:cAlias )->CGCCLI
nCodigoProd := ( DbPedidos:cAlias )->CODIGO
cNomeProduto := ( DbPedidos:cAlias )->DESCRICAO
nQuantidade := ( DbPedidos:cAlias )->QTD_VENDEU
nValorProd := ( DbPedidos:cAlias )->VLUNITARIO
TOTALITENS := ( DbPedidos:cAlias )->TOTITEM
SELECT ( DbTemp:cAlias )
//-> Adiciona Um Registro
ADICIONE(0)
REPLACE ( DbTemp:cAlias )->PEDIDO WITH XNUMPEDIDO
REPLACE ( DbTemp:cAlias )->MATRICULA WITH cCodClien
REPLACE ( DbTemp:cAlias )->TELEFONE WITH nNumeroTel
REPLACE ( DbTemp:cAlias )->NOME_CLI WITH cNomeClien
REPLACE ( DbTemp:cAlias )->CGCCLI WITH XCGCCLI
REPLACE ( DbTemp:cAlias )->MESANO WITH XDA
REPLACE ( DbTemp:cAlias )->CODIGO WITH nCodigoProd
REPLACE ( DbTemp:cAlias )->DESCRICAO WITH cNomeProduto
REPLACE ( DbTemp:cAlias )->QTD_VENDEU WITH nQuantidade
REPLACE ( DbTemp:cAlias )->VLUNITARIO WITH nValorProd
REPLACE ( DbTemp:cAlias )->TOTITEM WITH TOTALITENS
REPLACE ( DbTemp:cAlias )->CAIXA WITH XCAIXA
REPLACE ( DbTemp:cAlias )->VENDEDOR WITH XCODVEND
DESTRAVA(0)
SELECT ( DbPedidos:cAlias )
DBSKIP()
ENDDO
//-> Abre o Temporario
SELECT ( DbTemp:cAlias )
GO TOP
//-> Repassa um pedido antigo para um novo no temporario
WHILE .NOT. EOF()
SYSREFRESH()
IF EOF()
EXIT
ENDIF
XNUMPEDIDO := ( DbTemp:cAlias )->PEDIDO
cCodClien := ( DbTemp:cAlias )->MATRICULA
nNumeroTel := ( DbTemp:cAlias )->TELEFONE
cNomeClien := ( DbTemp:cAlias )->NOME_CLI
XCGCCLI := ( DbTemp:cAlias )->CGCCLI
nCodigoProd := ( DbTemp:cAlias )->CODIGO
cNomeProduto := ( DbTemp:cAlias )->DESCRICAO
nQuantidade := ( DbTemp:cAlias )->QTD_VENDEU
nValorProd := ( DbTemp:cAlias )->VLUNITARIO
TOTALITENS := ( DbTemp:cAlias )->TOTITEM
//-> Retorna o Valor da Compra
nValorCompra += ROUND(( nValorProd * nQuantidade ),2)
SELECT ( DbPedidos:cAlias )
//-> Adiciona Um Registro
ADICIONE(0)
REPLACE ( DbPedidos:cAlias )->PEDIDO WITH XNUMPEDIDO
REPLACE ( DbPedidos:cAlias )->MATRICULA WITH cCodClien
REPLACE ( DbPedidos:cAlias )->TELEFONE WITH nNumeroTel
REPLACE ( DbPedidos:cAlias )->NOME_CLI WITH cNomeClien
REPLACE ( DbPedidos:cAlias )->CGCCLI WITH XCGCCLI
REPLACE ( DbPedidos:cAlias )->MESANO WITH XDA
REPLACE ( DbPedidos:cAlias )->CODIGO WITH nCodigoProd
REPLACE ( DbPedidos:cAlias )->DESCRICAO WITH cNomeProduto
REPLACE ( DbPedidos:cAlias )->QTD_VENDEU WITH nQuantidade
REPLACE ( DbPedidos:cAlias )->VLUNITARIO WITH nValorProd
REPLACE ( DbPedidos:cAlias )->TOTITEM WITH TOTALITENS
REPLACE ( DbPedidos:cAlias )->CAIXA WITH XCAIXA
REPLACE ( DbPedidos:cAlias )->VENDEDOR WITH XCODVEND
DESTRAVA(0)
//-> Gravar a Baixa do Produto
SELECT ( DbEstoque:cAlias )
DbEstoque:SetOrder( 1 )
DBSEEK( nCodigoProd )
IF ( DbEstoque:cAlias )->QUANTIDADE > 0
TRAVEREG(0)
REPLACE ( DbEstoque:cAlias )->QUANTIDADE WITH ;
( DbEstoque:cAlias )->QUANTIDADE - nQuantidade
DESTRAVA(0)
ELSE //-> Para Nao Ter Estoque Negativo
TRAVEREG(0)
REPLACE ( DbEstoque:cAlias )->QUANTIDADE WITH 0
DESTRAVA(0)
ENDIF
SELECT ( DbTemp:cAlias )
DBSKIP()
ENDDO
//-> Fecha e Apaga o Temporario
DbTemp:Close()
SELECT ( DbPedidos:cAlias )
DbPedidos:SetOrder( 1 )
// Filtro Para Um Pedido Anterior do Cliente, Usando OrdScope.
( DbPedidos:cAlias )->( OrdScope( 0, XNUMPEDIDO ) ) // Inicio do Pedido.
( DbPedidos:cAlias )->( OrdScope( 1, XNUMPEDIDO ) ) // Fim do Pedido.
GO TOP
oLbx:Show()
oLbx:Enable()
//-> Refresca a ListBox
oLbx:GoBottom()
oLbx:Refresh()
oLbx:SetFocus()
Rede lenta em alguns filtros
Boa tarde.
REALMENTE Vai valer o tempo gasto para alterar pelo menos uma 1/2 dúzia de programas chaves (rs).
testei com UM e Apenas uma condição .... e ficou um TIRO o Trabalho vai ser um pouco pesado PORQUE ...
exibo um browser e permito que mudem a apresentação (ordem) então dependendo da ORDEM terei que criar um INDICE por determinados campos.... + mesmo assim vale a pena mexer.
1 - Uso CDX separados por vir lá de LONGE e por abrir os índices nos prg e somente o que usa e
como NÂO tenho tempo para mudar e... como não da problema (rs) vou tocando.
2- o que estou fazendo de errado ?
index on docto to &p_cdx_temp for situacao = [A] .and. valor = tcliv TEMPORARY
index on docto to &p_cdx_temp for situacao = [A] .and. valor = tcliv MEMORY
as 2 de cima Não cria o índice somente a de baixo cria algo errado ?
index on docto to &p_cdx_temp for situacao = [A] .and. valor = tcliv
ob
Paiva
REALMENTE Vai valer o tempo gasto para alterar pelo menos uma 1/2 dúzia de programas chaves (rs).
testei com UM e Apenas uma condição .... e ficou um TIRO o Trabalho vai ser um pouco pesado PORQUE ...
exibo um browser e permito que mudem a apresentação (ordem) então dependendo da ORDEM terei que criar um INDICE por determinados campos.... + mesmo assim vale a pena mexer.
1 - Uso CDX separados por vir lá de LONGE e por abrir os índices nos prg e somente o que usa e
como NÂO tenho tempo para mudar e... como não da problema (rs) vou tocando.
2- o que estou fazendo de errado ?
index on docto to &p_cdx_temp for situacao = [A] .and. valor = tcliv TEMPORARY
index on docto to &p_cdx_temp for situacao = [A] .and. valor = tcliv MEMORY
as 2 de cima Não cria o índice somente a de baixo cria algo errado ?
index on docto to &p_cdx_temp for situacao = [A] .and. valor = tcliv
ob
Paiva
-
Josmar dos Santos
- Usuário Nível 3

- Mensagens: 277
- Registrado em: 11 Jan 2006 18:36
- Localização: Botucatu-SP
Rede lenta em alguns filtros
Bom dia queria agradecer as aulas que vocês me deram, testei os dois, tando o ORDSCOPE() como o INDICE TEMPORÁRIO e ambos ficaram excelentes. Obrigado a todos pela paciência e que Deus abençoe a todos...
)
Josmar
Josmar
- Itamar M. Lins Jr.
- Administrador

- Mensagens: 7929
- Registrado em: 30 Mai 2007 11:31
- Localização: Ilheus Bahia
- Curtiu: 1 vez
Rede lenta em alguns filtros
Faltou criar o arquivo temporário (DBF) na memória, eu passei a usar aqui e é show também!
Exemplo, gerando o registro 75 do sintegra,(itens do estoque). Faz e depois apaga.
Saudações,
Itamar M. Lins Jr.
Exemplo, gerando o registro 75 do sintegra,(itens do estoque). Faz e depois apaga.
Código: Selecionar todos
***************
Function Cria75
***************
*
*
LOCAL aDbStrut := {{"cod_mercad","c",14,0},;
{"ncm" ,"c",08,0},;
{"mercadoria","c",53,0},;
{"unidade" ,"c",06,0},;
{"cst" ,"c",03,0},;
{"ipi" ,"n",05,2},;
{"ICMS" ,"n",05,2},;
{"ICMSR" ,"n",05,2},;
{"ICMSS" ,"n",12,2}}
If Select('ps') > 0
FechaDb('ps')
dbDrop("mem:"+"reg75.dbf",,"DBFCDX")
EndIf
DbCreate("mem:"+"reg75.dbf",aDbStrut,'DBFCDX',.T.,"ps")
index on cod_mercad tag ps01
RETURN Nil
************************
Function FechaDb(cAlias)
************************
*
*
hb_default( @cAlias,alias() )
If select(cAlias) == 0
Return .T.
EndIf
If lRddLeto
(cAlias)->(Leto_commit())
EndIf
(cAlias)->(DbCloseArea())
If neterr()
hwg_Msgstop("Erro Fechando Arquivo: "+cAlias)
EndIf
Return .T.
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Itamar M. Lins Jr.
- rubens
- Colaborador

- Mensagens: 1520
- Registrado em: 16 Ago 2003 09:05
- Localização: Nova Xavantina - MT
Rede lenta em alguns filtros
Bom dia...
Como faz para saber se o arquivo existe?
Normal:
File( 'ivendast.dbf' )
Temporario
File( 'mem:ivendast.dbf' )
retorna .f.
Obrigado
Rubens
Como faz para saber se o arquivo existe?
Normal:
File( 'ivendast.dbf' )
Temporario
File( 'mem:ivendast.dbf' )
retorna .f.
Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você
"