Relatório demorado

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

Moderador: Moderadores

Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Relatório demorado

Mensagem 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
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Relatório demorado

Mensagem por rubens »

Posta a rotina para gente ver Poka...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Relatório demorado

Mensagem 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....:)
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Relatório demorado

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Relatório demorado

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Relatório demorado

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Relatório demorado

Mensagem 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
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Relatório demorado

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Relatório demorado

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Relatório demorado

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Relatório demorado

Mensagem por Nascimento »

vc usa dbf temporarias? para gerar esse relatorio??
ou é direto da dbf?
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Relatório demorado

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Relatório demorado

Mensagem 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() )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Relatório demorado

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Relatório demorado

Mensagem 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?
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder