Página 1 de 3

Relatório demorado

Enviado: 26 Jan 2018 15:21
por Poka
Olá a todos

um relatório de faturamento do mês, onde está o sistema demora 3 segundos, no terminal 15 minutos. testei em casa também demora. agora o cliente ficou com o saco cheio, e com razao
alguem pode dar uma ajuda?

harbour 3.2 dev(r1510132105)
minigui extend 2.5.4.2015.10.21

Agradeço qualquer ajuda

Poka

Relatório demorado

Enviado: 26 Jan 2018 15:47
por rubens
Posta a rotina para gente ver Poka...

Rubens

Relatório demorado

Enviado: 26 Jan 2018 15:48
por sygecom
Sempre da pra ajuda...
Faz o seguinte, melhora o filtro, testa e posta aqui pra dizer se deu certo.

Se não der, posta ai o código que ta com problema....:)

Relatório demorado

Enviado: 26 Jan 2018 19:26
por Itamar M. Lins Jr.
Ola!
Especifique ai a situação. Não entendi nada.
Tá usando o que ? DBF/MYSQL/Letodb/ADS.... etc... Terminal Service ?
no terminal 15 minutos.
é rede mapeada ? etc...

Saudações,
Itamar M. Lins Jr.

Relatório demorado

Enviado: 29 Jan 2018 11:45
por JoséQuintas
um relatório de faturamento do mês, onde está o sistema demora 3 segundos, no terminal 15 minuto
Deve ser DBF,,,,
- Criar índices pra agilizar
- usar hbnetio e processar relatório no servidor
- processar relatório no servidor
- deixar relatórios prontos a noite
- etc.

Relatório demorado

Enviado: 29 Jan 2018 15:20
por rochinha
Amiguinhos,

Isso é problema de rede. E se for WIFI piora.

Dica: Se placas de rede, roteadores e hubs forem de mesma marca melhor ainda.

Relatório demorado

Enviado: 30 Jan 2018 08:38
por Poka
Bom dia
utilizo
harbour 3.2 dev(r1510132105)
minigui extend 2.5.4.2015.10.21
DBF CDX
Obrigado Rubens, Itamar Sygecom , Quintas por responder
o cliente testou um switch /100 mas nao resolveu nada, precisaria testar com /1000 .

Já vi a parte que fica mais demorada vou pegar a rotina depois posto aqui.

Rochinha, obrigado também por responder. Também acho que é problema de rede.
A rotina não tem nada de especial. demorar 10 15 segundos a mais por ser um terminal tudo bem. 5, 6 minutos é demais.

Estou passando o sistema para Firebird, espero até o meio do ano já esta substituindo. Acho que esse tipo de problema vai resolver.

Poka

Relatório demorado

Enviado: 30 Jan 2018 09:21
por asimoes
Tenta ver se a configuração da placa de rede tá Full ou half duplex, ou seja uma rede que é 100 MB é placa tá trabalhando como 10 Mbps

Relatório demorado

Enviado: 30 Jan 2018 09:26
por asimoes
Pode criar também um programa de testes, simulando a impressão da sua rotina, pra descartar ser problema na sua aplicação, eu sempre faço isso quando percebo esse tipo de problema, só uma sugestão

Relatório demorado

Enviado: 30 Jan 2018 11:18
por Itamar M. Lins Jr.
Ola!
no terminal 15 minutos. testei em casa também demora.
Então está usando WTS ?
Como está testando ? Em casa abriu dois terminais em uma única maquina ? Se em casa demora está descartado falha da rede.
Está acessando da sua casa a maquina do cliente ? Ainda não fechou o raciocínio em cima da situação. Falta vc especificar mais coisas ai.
DBF não é sinônimo de lentidão. Firebird é mais lento que DBF em rede quando comparado o uso do (DBF+LetoDBf), pelo menos já vi isso e algumas situações, e trava também com Win10 e estações Win7, um dos motivos pelo qual o sistema foi abandonado.

Saudações,
Itamar M. Lins Jr.

Relatório demorado

Enviado: 30 Jan 2018 11:30
por Nascimento
vc usa dbf temporarias? para gerar esse relatorio??
ou é direto da dbf?

Relatório demorado

Enviado: 03 Fev 2018 23:19
por rochinha
Amiguinhos,

Na época do Clipper, muitos vão se lembrar da SubNTX.

Eu estava prestes a abandonar DBF quando encontrei esta maravilha, cheguei até a postar aqui no forum(procure por rochinha e subntx) teste feito usando Fivewin na época exemplificando uso de SetFilter e Subntx para o mesmo procedimento de filtragem.

Mas quando passei para .CDX não encontrei equivalente para tal biblioteca, mas felismente encontrei o SCOPE. Com o uso destes NUNCA usei relations.

Depois garimpando meus downloads antigos encontrei uma função show-de-bola que usei no Clipper+DOS e adaptei para uso com Fivewin.

Uso até hoje quando quero filtragens mais complexas e rápidas. Tudo on-the-fly...Robin fly

Código: Selecionar todos

*
* Autor......: Amigo nos Andes
* Funcao.....: Selecionar registros e campos de uma tabela .DBF
* Saida......: Gera um array ou uma tabela temporario com o resultado
* Modificacao: Jose Carlos da Rocha - 5Volution - Jan-2013
*
#include "fivewin.ch"

#include "common.ch"
#include "inkey.ch"

/* **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
// #include "selector.ch"
#xcommand @ <array> SELECT [<clauses,...>] ;
          => <array> := {} ;
           ; @ <array> SELECT , [ <clauses> ]

#xcommand @ <array> SELECT ;
          [FROM <from>] ;
          [OTM <otm> SEEK <seek> EQUAL <equal>] ;
          [FOR <for>] ;
          [WHILE <while>] ;
          [<rest:REST>] ;
          [TO <(file)>] ;
          [ALIAS <alias>] ;
          [<add:ADDITIVE> [IF <condition>]] ;
          [SUMMARY <summary>] ;
          [EVAL <block>] ;
          => Selector(<array>, <(from)>, [ { <(otm)>, <{seek}>, <{equal}> } ], ;
                      <{for}>, <{while}>, <.rest.>, ;
                      <(file)>, <(alias)>, <.add.> [.and. <condition>], <summary>, ;
                      <{block}>)

// @ SELECT <field> ...
#xcommand @ <array> SELECT , <field> [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'X', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> ...
#xcommand @ <array> SELECT , <expr> AS <name> [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'X', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'X', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> GROUP ...
#xcommand @ <array> SELECT , <field> GROUP [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'G', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> GROUP ...
#xcommand @ <array> SELECT , <expr> AS <name> GROUP [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'G', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> GROUP ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> GROUP [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'G', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> TOTAL ...
#xcommand @ <array> SELECT , <field> TOTAL [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'T', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> AVERAGE ...
#xcommand @ <array> SELECT , <field> AVERAGE [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'A', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> TOTAL ...
#xcommand @ <array> SELECT , <expr> AS <name> TOTAL [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'T', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> AVERAGE ...
#xcommand @ <array> SELECT , <expr> AS <name> AVERAGE [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'A', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'T', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'A', .F. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> SUMMARY ...
#xcommand @ <array> SELECT , <field> SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'X', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'X', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'X', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> TOTAL SUMMARY ...
#xcommand @ <array> SELECT , <field> TOTAL SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'T', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <field> AVERAGE SUMMARY ...
#xcommand @ <array> SELECT , <field> AVERAGE SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{field}>, <"field">, , , 'A', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> TOTAL SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> TOTAL SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'T', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> AVERAGE SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> AVERAGE SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, , , 'A', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> TOTAL SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'T', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

// @ SELECT <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE SUMMARY ...
#xcommand @ <array> SELECT , <expr> AS <name> LENGHT <lenght> DEC <dec> AVERAGE SUMMARY [<clauses,...>] ;
          => aAdd(<array>, { <{expr}>, <"name">, <lenght>, <dec>, 'A', .T. }) ;
           ; @ <array> SELECT [ <clauses> ]

#xcommand @ SELECT [<clauses,...>] ;
          => @ SelectList SELECT [ <clauses> ]

/*
static clientes := {}, nRegiao
function main
   SET DEFAULT TO C:\5VOLUTION\GESTAO
   USE CLIENTES NEW
   USE FORNEC NEW
   @ clientes SELECT clientes->nome, clientes->endereco, clientes->bairro, clientes->estado ;
              FROM clientes ;
              FOR clientes->estado='SP' ;
              TO tempo1
              BROWSE()
   @ clientes SELECT clientes->nome, clientes->endereco, clientes->bairro, clientes->estado ;
              FROM clientes ;
              FOR clientes->estado='RJ' ;
              TO tempo2
              BROWSE()
   @ clientes SELECT clientes->regiao ;
              FROM clientes ; //              INDEX ON regiao+dtoc(datacad)
              TO tempo3 ;
              SUMMARY nRegiao
              BROWSE()
   CLOSE DATA
   return
*/
   
/* **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
Procedure SELECTOR(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, ;
   Arg9, Arg10, Arg11, Arg12)

   Local Local1, Local2, Local3, Local4, Local5, Local6, Local7, ;
      Local8, Local9, Local10, Local11, Local12, Local13, Local14, ;
      Local15, Local16, Local17, Local18, Local19, Local20, Local21, ;
      Local22, Local23
   Local1:= Len(Arg1)
   Local6:= {}
   Local7:= ISARRAY(Arg3)
   Local14:= {}
   Local15:= .F.
   Local17:= ""
   Local19:= !(ISNIL(Arg10))
   If recco()=0
      ? 'Arquivo vazio ou area sem uso','Selector Error'
      //return
   EndIf
   If (ISNIL(Arg2))
      Local10:= Select()
   Else
      If (ISNUMBER(Arg2))
         Local10:= Arg2
      ElseIf (ISCHARACTER(Arg2))
         Local10:= Select(Arg2)
      EndIf
      Select (Local10)
   EndIf
   If (Local7)
      Local11:= Select(Arg3[1])
   EndIf
   If (ISNIL(Arg7))
      Arg7:= "TEMP.DBF"
      Default Arg8 To "temp"
   ElseIf (ISNIL(Arg8))
      Arg8:= SubStr(Arg8:= SubStr(Arg7, rat("\", Arg7) + 1), 1, ;
         At(".", Arg8 + ".") - 1)
   EndIf
   Default Local16 To IIf((Local8:= rat(".", Arg7)) > rat("\", ;
      Arg7), SubStr(Arg7, 1, Local8 - 1), Arg7) + ".NTX"
   Local23:= RecNo()
   Goto LastRec() + 1
   If (Local7)
      (Local11)->(dbGoto(LastRec() + 1))
   EndIf
   For Local9:= 1 To Local1
      Local2:= eval(Arg1[Local9][1])
      Local4:= ValType(Local2)
      Local3:= Transform(Local2, "")
      Local5:= Len(Local3)
      AAdd(Local6, {IIf((Local8:= At("->", Arg1[Local9][2])) == 0, ;
         Arg1[Local9][2], SubStr(Arg1[Local9][2], Local8 + 2)), ;
         Local4, IIf(Arg1[Local9][3] != Nil, Arg1[Local9][3], ;
         IIf(Local4 == "D", 8, Local5)), IIf(Arg1[Local9][4] != Nil, ;
         Arg1[Local9][4], IIf(Local4 == "N" .AND. (Local8:= At(".", ;
         Local3)) > 0, Local5 - Local8, 0))})
      If (Arg1[Local9][5] == "G")
         If (!Local15)
            Local15:= .T.
         Else
            Local17:= Local17 + "+"
         EndIf
         Do Case
         Case Local4 == "C"
            Local17:= Local17 + Local6[Local9][1]
         Case Local4 == "N"
            Local17:= Local17 + ("Str(" + Local6[Local9][1] + ")")
         Case Local4 == "D"
            Local17:= Local17 + ("DToS(" + Local6[Local9][1] + ")")
         Case Local4 == "L"
            Local17:= Local17 + ("Iif(" + Local6[Local9][1] + ;
               [,"1","0")])
         EndCase
         AAdd(Local14, Arg1[Local9][1])
      ElseIf (Arg1[Local9][6] .AND. Local19 .AND. !Arg9)
         AAdd(Arg10, 0)
      EndIf
   Next
   Goto Local23
   If (Arg9)
      Local12:= Select(Arg8)
   Else
      dbcreate(Arg7, Local6)
      dbUseArea(.T., Nil, Arg7, Arg8, .F.)
      Local12:= Select()
      If (Local15)
         dbCreateIndex(Local16, Local17, &("{||" + Local17 + "}"))
      EndIf
      Select (Local10)
   EndIf
   If (!Arg6)
      Goto Top
   EndIf
   If (Local7)
      Do While (!EOF() .AND. !(Local11)->(dbSeek(Local13:= ;
            (Local10)->(eval(Arg3[2])), .F.)))
         dbSkip()
      EndDo
   EndIf
   Do While (!EOF() .AND. (ISNIL(Arg5) .OR. eval(Arg5)))
      If (ISBLOCK(Arg11))
         eval(Arg11)
      EndIf
      If (ISNIL(Arg4) .OR. eval(Arg4))
         Local18:= .F.
         If ((Local21:= "", aeval(Local14, { |_1| Local21:= Local21 ;
               + tostring(eval(_1)) }), !Local15 .OR. ;
               !(Local12)->(dbSeek(Local21, .F.))))
            (Local12)->(dbAppend())
            Local18:= .T.
         EndIf
         Local20:= 0
         For Local9:= 1 To Local1
            If (Arg1[Local9][6])
               Local20++
            EndIf
            If (!Local15 .OR. Local18 .OR. Arg1[Local9][5] $ "TA")
               Local2:= eval(Arg1[Local9][1])
               If (Arg1[Local9][5] == "T")
                  (Local12)->(fieldput(Local9, fieldget(Local9) + ;
                     Local2))
               ElseIf (Arg1[Local9][5] == "A" .AND. !Local18)
                  (Local12)->(fieldput(Local9, (fieldget(Local9) + ;
                     Local2) / 2))
               Else
                  (Local12)->(fieldput(Local9, Local2))
               EndIf
               If (Arg1[Local9][6] .AND. Local19)
                  Arg10[Local20]:= Arg10[Local20] + Local2
               EndIf
            EndIf
         Next
      EndIf
      //If (((Local11)->(dbSkip()), !Local7 .OR. (Local11)->(EOF() .OR. !(Local13 == eval(Arg3[3])))))
         dbSkip()
         If (Local7)
            Do While (!EOF() .AND. !(Local11)->(dbSeek(Local13:= ;
                  (Local10)->(eval(Arg3[2])), .F.)))
               dbSkip()
            EndDo
         EndIf
      //EndIf
   EndDo
   Select (Local12)
   Goto Top
   Return

Static Function TOSTRING(Arg1)
   Local Local1
   Local1:= ValType(Arg1)
   If (Local1 == "N")
      Arg1:= Str(Arg1)
   ElseIf (Local1 == "D")
      Arg1:= DToS(Arg1)
   ElseIf (Local1 == "L")
      Arg1:= IIf(Arg1, "1", "0")
   EndIf
   Return Arg1
Existe uma limitação no caso do uso do @ ... selector, mas é possível usar assim:

Código: Selecionar todos

     M->NUM_TEMP := STRZERO(RANDOM(9999),4)
     M->DBF_TEMP := cPath+cOnde+"\PN"+M->NUM_TEMP+".DB$"
     M->NTX_TEMP := cPath+cOnde+"\PN"+M->NUM_TEMP+".CD$"
     CursorWait()
     dbSelectArea("estoque")

     aclientes := {}
     aAdd(aclientes,{ {||idlinha}   , "idlinha"   ,,,"X",.F. })
     aAdd(aclientes,{ {||descprolin}, "descprolin",,,"X",.F. })
     aAdd(aclientes,{ {||iditem}    , "iditem"    ,,,"X",.F. })
     aAdd(aclientes,{ {||resumido}  , "resumido"  ,,,"X",.F. })
     aAdd(aclientes,{ {||descricao} , "descricao" ,,,"X",.F. })
     aAdd(aclientes,{ {||quantidade}, "quantidade",,,"X",.F. })
     aAdd(aclientes,{ {||unitario}  , "unitario"  ,,,"X",.F. })
     aAdd(aclientes,{ {||valorvenda}, "valorvenda",,,"X",.F. })
     aAdd(aclientes,{ {||minimo}    , "minimo"    ,,,"X",.F. })
     aAdd(aclientes,{ {||pp}        , "pp"        ,,,"X",.F. })
     aAdd(aclientes,{ {||icms}      , "icms"      ,,,"X",.F. })
     aAdd(aclientes,{ {||ipi}       , "ipi"       ,,,"X",.F. })
     aAdd(aclientes,{ {||promocao}  , "promocao"  ,,,"X",.F. })
     aAdd(aclientes,{ {||malaok}    , "malaok"    ,,,"X",.F. })
     aAdd(aclientes,{ {||interno}   , "interno"   ,,,"X",.F. })
     aAdd(aclientes,{ {||vendavel}  , "vendavel"  ,,,"X",.F. })
     aAdd(aclientes,{ {||promocaoVL}, "promocaoVL",,,"X",.F. })
     aAdd(aclientes,{ {||promocaoDT}, "promocaoDT",,,"X",.F. })
     aAdd(aclientes,{ {||mascara}   , "mascara"   ,,,"X",.F. })
     aAdd(aclientes,{ {||medida}    , "medida"    ,,,"X",.F. }) 
     aAdd(aclientes,{ {||ncmfiscal} , "ncmfiscal" ,,,"X",.F. })
     //
     Selector(aclientes,"estoque",,,,.F.,(DBF_TEMP),,.F. ,,)
     //@ aclientes SELECT ;  
     //                     idlinha,descprolin,iditem,resumido,descricao,quantidade,unitario,valorvenda,;
     //                     minimo,pp,icms,ipi,promocao,malaok,interno,promocaoVL ;
     //                FROM estoque TO (DBF_TEMP) 
     USE (DBF_TEMP) ALIAS posicao
     INDEX ON descricao TO (NTX_TEMP)
     SET INDEX TO (NTX_TEMP)
Observação:
Retire a linha #include "fivewin.ch" e procure as .CH restantes caso seje necessário.

Relatório demorado

Enviado: 04 Fev 2018 17:01
por asimoes
Eu costumo usar esse tipo de filtro pra deixar mais rápido consulta, relatório, browse, não tenho problemas

Código: Selecionar todos


cCodIni := '001'
cCodFim := '100'
INDEX ON CODIGO TAG CODIGO TEMPORARY ADDITVE
COMMIT

BASE->( DbSetOrder(1) )
BASE->( OrdScope( 0, cCodIni  ) ) 
BASE->( OrdScope( 1, cCodFim ) )
BASE->( DbGoTop() )

Relatório demorado

Enviado: 04 Fev 2018 17:07
por asimoes
Eu também crio indices temporários com filtro

Código: Selecionar todos

cChave := [CODIGO]
cQuery := [ Left( Classe_Pg, 2 ) $ "01,02,03,04,05" .AND. Empty( D_Deslig ) .AND. ! Deleted()]
INDEX ON &cChave. TAG A020100 FOR &cQuery. TEMPORARY ADDITIVE

Relatório demorado

Enviado: 05 Fev 2018 22:18
por rochinha
Amiguinhos,

Quando vi que doideira seria trocar meus Set Filters sofisticados quase parei. Mas como já vinha usando o OrdScope() a contendo em meus aplicativos DOS pensei:

"...porque não usar, porque usar, porque não usar..."

Acontece que os meus filtros puderam ser melhorados após fazer um escopo dos registros, porque quando o escopo acontece ele traz somente os registros que realmente interessam e então o filtro fica milhões de vezes mais rápido.

Imagine uma base de dados de 10.000 registro e você usar o código:

Código: Selecionar todos

cTempoInicial := time()

SET FILTER TO CODIGO = '254' .or. CODIGO = '600' .or. CODIGO = '340' .or. CODIGO = '750' .or. CODIGO = '2' 
GOTOP

? cTempoInicial, time()

BROWSE()
Agora com escopo:

Código: Selecionar todos

cCodIni := '001'
cCodFim := '1000'
INDEX ON CODIGO TAG CODIGO TEMPORARY ADDITVE
COMMIT

BASE->( DbSetOrder(1) )
BASE->( OrdScope( 0, cCodIni  ) ) 
BASE->( OrdScope( 1, cCodFim ) )
BASE->( DbGoTop() )

cTempoInicial := time()

SET FILTER TO CODIGO = '254' .or. CODIGO = '600' .or. CODIGO = '340' .or. CODIGO = '750' .or. CODIGO = '2' .or. CODIGO = '120' .or. CODIGO = '403' .or. CODIGO = '275' .or. CODIGO = '46' 
GOTOP

? cTempoInicial, time()
Qual deles será mais rápido

A velocidade do OrdScope provavelmente é porque ele trabalha sobre o arquivo de indices e não sob o DBF(me corrijam se estiver errado).

Seja lá qual for o método é muito mais rápido e seus filtros pode até se tornarem mais complexos.

O OrdScope já está presente no Harbour a muito tempo mas somente para RDDCDX.

asimoes
Quando se fala em TEMPORARY ADDITIVE estamos falando de qual versão do Harbour que já possui esta maravilha?