Jump to content
Fivewin Brasil

lentidão rede


nardeypm

Recommended Posts

 

mencionaram usar ads com dbf, mas não consegui localizar no forum como utilizar e o que eu preciso para implantar isso. essa lentidão tá me tirando do sério. se alguem puder me direcionar, agradeço.

 

Tb não consegui localizar os topico, e nem os exemplos postado pelo Giovany Vecchi, no link abaixo segue a LIB do Giovany com os fonte, e tem inclusive um Help criado por ele...

embora o Gilmer mencionou acima que não tem que mudar nada no codigo, aqui so obtive sucesso depois que passei a usar comandos nativos do ADS , tipo no lugar do set filter, usar ADSSETAOF() entre outros detalhe que vc ira ver no manual criado pelo Giovany que esta no link abaixo...

http://www.4shared.com/rar/qSiCOBae/xAds.html

Abraços

Luiz Fernando

Link to comment
Share on other sites

Olá, amigo.

 

Vejo que você usa algumas funções do meu "Pacote Fivewin". Por isso, resolvi entrar nessa.

 

1º - Não estou mais indexando mostrando um "progress bar" para todo o processos de indexação. Para indexar mais rápido, função BuildIndex() mudou para:

 

FUNCTION BuildIndex( oMeter, oText, oDlg, lEnd, campo, bolsa )
   LOCAL a_Filds := dbstruct()
   oDlg:lHelpIcon := .f.
   nScan := ASCAN(a_Filds, {|nCel|ALIAS()+"->"+nCel[1] = campo})
   IF nScan = 0
      nScan := ASCAN(a_Filds, {|nCel|nCel[1] $ campo})
      IF nScan = 0
         RETURN NIL
      ENDIF
   ENDIF
   oMeter:nTotal = RecCount()
   OrdSetFocus(0)
   oMeter:Set( (RecCount() / 10) * 9 ) // Pulo logo para 90%
   oMeter:Refresh()
   INDEX ON &(Campo) TAG &(Bolsa) TO &(ALIAS()) // Crio o índice sem atualizar o Meter
   oMeter:Set( RecCount() ) // Pulo direto para 100%
   oMeter:Refresh()
   SysWait(0.1) // Espero 0.1 segundo só para mostrar o oMeter concluído. Isso é desnecessário.
RETURN NIL

 

 

2º - Não uso mais SET FILTER para selecionar dados ao gerar relatórios. Em vez disso uso índice temporário, no PC local, com a tag WHILE. Por exemplo, se eu pretendo gerar um relatório de vendas, por período, mesmo que o DBF tenha milhares de registros, consigo "filtrar" os dados de um período curto - uma semana, por exemplo - em menos de um segundo, O exemplo abaixo mostra como faço o "filtro".

 

      // Criar um arquivo temporário único para índice no PC local
      cTmpName := ""
      nFile := 1
      cPasta := CurDrive()+":\"+GetCurDir()+"\DADOS"
      WHILE .T.
         cTmpName := cPasta+"\VNDTMP"+STRZERO(nFile,2)+".CDX"
         FERASE(cTmpName)
         if ! file(cTmpName)
            EXIT
         endif
         nFile ++
      END
      cTmpName := "VNDTMP"+STRZERO(nFile,2)

      SET SOFTSEEK ON // Preciso localizar o valor mais proximo, não o exeto.
      SELECT 2 // DBF vendas
      VENDAS->(DBSETORDER(3)) // Ordem por DATA
      VENDAS->(DBSEEK(dIni)) // Localizo a data inicial (dIni) ou a mais próxima
      // Crio o indice temporário
      INDEX ON VENDAS->DATAMOV TAG DATAS TO &(cTmpName) WHILE( VENDAS->DATAMOV >= dIni .AND. VENDAS->DATAMOV <= dFim )
      ordListClear()
      OrdListAdd(cTmpName, "VNDTMP01")
      SET SOFTSEEK OFF // Desligo o SOFTSEEK para que os próximos DBSEEKs localizem apenas valores exatos

      // SET FILTER TO VENDAS->... (Isso não existe mais.)
      VENDAS->(DBGOTOP())
      WHILE ! VENDAS->(EOF())
         // Impressão do relatório ...
         VENDAS->(DBSKIP())
      END
      // Fecho e Reabrir VENDAS com os índices corretos
      SELECT 2
      CLOSE VENDAS
      SysWait(0.2) // Isso é só pra dar um tempinho para o PC "pensar". Desnecessário.
      SELECT 2
      USE VENDAS SHARED
      ordListClear()
      OrdListAdd("VENDAS", "VENDCODI", "VENDCLIE", "VENDDATA", "VENDNCNT", "VENDPLAC", "VENDNCLI", "VENDNCCF")

 

 

Seguindo as idéias acima, mesmo com DBF muito grandes (300 mil registros), os relatórios são muito rápidos. 

 

No entanto, vale ressaltar que, devido a fragilidade do DBF, também já estou migrando para banco de dados relacional. Optei pelo Firebird com SQLRDD, visto que até o BANCO DO BRASIL usa este.

Link to comment
Share on other sites

  • 2 weeks later...

Como disse, peguei esta rotina aqui mesmo no forum, talvez possso lhe ajudar, faça o teste:

 

 

*--( Grava no registro do windows instrução para agilizar gravação em rede )--*
Function TurbinaRede()
   local oReg
   oReg := TReg32():New( HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" )
   oReg:Set("EnableOplocks", "00000000")
   oReg:Set("CachedOpenLimit", "00000000")
   oReg:Set("Autodisconnect", "ffffffff")
   oReg:Set("EnableOplockForceClose", "00000001")
   oReg:Set("MaxKeepSearch", "000000b4")
   oReg:Set("MinKeepSearch", "0000000a")
   oReg:Set("ScavTimeout", "0000000a")
   oReg:Set("ThreadPriority", "00000002")
   oReg:Close()
   *
   If MsgYesNo("É Necessário Reiniciar o Computador"+CRLF+"Deseja Reiniciar Agora?","Reiniciar")
        oWndMain:End()
      WinExec( "ShutDown -s" )
   End
   *
RETURN NIL
* -------------------- *

Alguém já testou isso aqui? Você já testou Rone?

Link to comment
Share on other sites

Alguém já testou isso aqui? Você já testou Rone?

eu uso esta rotina, e realmente melhorou no meu caso...  o problema que eu tinha é que mesmo uma abertura simples do arquivo em um terminal, a abertura ficava lenta (simples browse) ai com esta rotina acabou o problema.

Link to comment
Share on other sites

vagner, on 23 May 2013 - 07:40, said:snapback.png

Olá,

Faça um teste e retire o

#xcommand @ <nRow>,<nCol> SAY <cText> OF <oPrinter> => <oPrinter>:Say(<nRow>, <nCol>, <cText> )

 

Theotokos, on 22 May 2013 - 07:25, said:snapback.png

Como disse, peguei esta rotina aqui mesmo no forum, talvez possso lhe ajudar, faça o teste:

 

 

*--( Grava no registro do windows instrução para agilizar gravação em rede )--*
Function TurbinaRede()
   local oReg
   oReg := TReg32():New( HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" )
   oReg:Set("EnableOplocks", "00000000")
   oReg:Set("CachedOpenLimit", "00000000")
   oReg:Set("Autodisconnect", "ffffffff")
   oReg:Set("EnableOplockForceClose", "00000001")
   oReg:Set("MaxKeepSearch", "000000b4")
   oReg:Set("MinKeepSearch", "0000000a")
   oReg:Set("ScavTimeout", "0000000a")
   oReg:Set("ThreadPriority", "00000002")
   oReg:Close()
   *
   If MsgYesNo("É Necessário Reiniciar o Computador"+CRLF+"Deseja Reiniciar Agora?","Reiniciar")
        oWndMain:End()
      WinExec( "ShutDown -s" )
   End
   *
RETURN NIL
* -------------------- *

 

parece que ambas sugestões determinaram o aumento da performance dos dbf's.

 

A sugestão de alteração da função BuildIndex() tb foi introduzida no sistema e acelerou muito o processo de indexação.

 

Acredito que seja a solução para o meu problema de lentidão e provavelmente de outros tb.

De forma geral, aproveitei tudo que foi sugerido pelos colegas.

Grato a todos.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...