Rede lenta em alguns filtros

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

Moderador: Moderadores

paiva
Usuário Nível 3
Usuário Nível 3
Mensagens: 300
Registrado em: 04 Ago 2005 10:28

Rede lenta em alguns filtros

Mensagem por paiva »

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
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Rede lenta em alguns filtros

Mensagem por Eolo »

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.
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
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Rede lenta em alguns filtros

Mensagem por Kapiaba »

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()
paiva
Usuário Nível 3
Usuário Nível 3
Mensagens: 300
Registrado em: 04 Ago 2005 10:28

Rede lenta em alguns filtros

Mensagem por paiva »

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
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Rede lenta em alguns filtros

Mensagem por Josmar dos Santos »

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
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Rede lenta em alguns filtros

Mensagem por Itamar M. Lins Jr. »

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.

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.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Rede lenta em alguns filtros

Mensagem por rubens »

Bom dia...

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ê ???"
Responder