Clipper On Line • Ver Tópico - Relatório demorado

Relatório demorado

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

Moderador: Moderadores

 

Relatório demorado

Mensagempor Poka » 26 Jan 2018 14:21

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 de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Relatório demorado

Mensagempor rubens » 26 Jan 2018 14:47

Posta a rotina para gente ver Poka...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Relatório demorado

Mensagempor sygecom » 26 Jan 2018 14:48

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
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7006
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 130 vezes

Relatório demorado

Mensagempor Itamar M. Lins Jr. » 26 Jan 2018 18:26

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Relatório demorado

Mensagempor JoséQuintas » 29 Jan 2018 10:45

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Relatório demorado

Mensagempor rochinha » 29 Jan 2018 14:20

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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Relatório demorado

Mensagempor Poka » 30 Jan 2018 07:38

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 de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Relatório demorado

Mensagempor asimoes » 30 Jan 2018 08:21

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Relatório demorado

Mensagempor asimoes » 30 Jan 2018 08:26

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Relatório demorado

Mensagempor Itamar M. Lins Jr. » 30 Jan 2018 10:18

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

Relatório demorado

Mensagempor Nascimento » 30 Jan 2018 10:30

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 de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 vezes

Relatório demorado

Mensagempor rochinha » 03 Fev 2018 22:19

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
*
* 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:
     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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Relatório demorado

Mensagempor asimoes » 04 Fev 2018 16:01

Eu costumo usar esse tipo de filtro pra deixar mais rápido consulta, relatório, browse, não tenho problemas


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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Relatório demorado

Mensagempor asimoes » 04 Fev 2018 16:07

Eu também crio indices temporários com filtro
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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Relatório demorado

Mensagempor rochinha » 05 Fev 2018 21:18

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:
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:
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 fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot], Google Adsense [Bot] e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro