Performance na Rede

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

Moderador: Moderadores

Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Luciano, me chama depois das 19:00 que lhe faço uma demostração do TS.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Luciano,

Vc pode aumentar a performace com MySql copiando os dados que vai mostrar no relatório para um DBF temporário e partir deste montar seu relatório.

A velocidade aumenta significamente dessa maneira.

OU

Se vc quiser continuar com DBF mesmo, a solução é o TS que o Lernardo (sygecom) falou. Aí fica rápido em todas as estações.

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

Jânio, deixa eu ver se eu entendi.

Vou pegar todos os meus DBFs atuais e jogá-los para o MYSQL que estará no servidor, aí por exemplo, vou usar uma tela que eu irei precisar de uns 5 DBFs (que já estaräo transformados em tabeloas no MYSQL) entäo antes de entrar nessa tela eu crio esses 5 DBFs (que säo tabelas no MYSQL) no drive C da estaçäo dando comandos do tipo "select * from tabela_dbf1" e jogando o retorno no DBF c:\dbf1.dbf e etc até dbf5.dbf

é isso mesmo ou entend errado?

Quanto ao TS vou entrar em contato com o Leonardo para ele me ensinar a usar, é que ontem estive fora

Muito Obrigado
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Luciano,

Isso mesmo. Com um detalhe: Em vez de vc dar algum SQL, pode usar o COPY TO mesmo acrescentando VIA 'DBFCDX'

Veja um exemplo de um Relatório de VENDAS POR CLIENTE que tenho:

Código: Selecionar todos


DBSELECTAREA(1)
DBUSEAREA(,,[A03PED],[PEDIDO], .T., [READONLY])
DBSETINDEX("A03PED")

DBSELECTAREA(2)
DBUSEAREA(,,[A16CLI],[CLIENTE], [READONLY])
DBSETINDEX("A16CLI")

DBSELECTAREA(3)
DBUSEAREA(,,[A16VED],[VENDEDOR], [READONLY])
DBSETINDEX("A16VED")

DBSELECTAREA(4)
DBUSEAREA(,,[A17EMP],[EMPRESA], [READONLY])
DBSETINDEX("A17EMP")

      @ PROW() + 01, 00 SAY REPLICATE("-",79) 
      @ PROW() + 01, 00 SAY EMPRESA PICT "@!"
      @ PROW() + 00, 69 SAY DATE()
      @ PROW() + 01, 00 SAY USUARIO pict "@!"
      @ PROW() + 00, 69 SAY "Pagina " + STRZERO(vPAGINA,3)
      @ PROW() + 01, 00 SAY REPLICATE("-",79) 
      @ PROW() + 01, 00 SAY PADC(" RESUMO DE VENDAS POR CLIENTE ",79, "*")
      @ PROW() + 01, 00 SAY REPLICATE("-",79) 
      @ PROW() + 01, 20 SAY "Emitidas entre " + DTOC(vDATAi) + " e " + DTOC(vDATAf)
      @ PROW() + 01, 00 SAY REPLICATE("-",79) 

      *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

      GERA_DBF()
      tmp1 = dbftmp

      SELECT CLIENTE
      DBSETORDER(1)
      DBGOTOP()
      COPY FIELDS CODIGO, NOMCLI TO C:\&tmp1 VIA 'DBFCDX'
      USE C:\&tmp1 NEW VIA 'DBFCDX'
      INDEX ON CODIGO TAG CHAVE1 TO C:\&tmp1

      *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

      GERA_DBF()
      tmp2 = dbftmp

      SELECT VENDEDOR
      DBSETORDER(1)
      DBGOTOP()
      COPY FIELDS CODIGO, NOMRDZ TO C:\&tmp2 VIA 'DBFCDX'
      USE C:\&tmp2 NEW VIA 'DBFCDX'
      INDEX ON CODIGO TAG CHAVE1 TO C:\&tmp2

      *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

      GERA_DBF()
      tmp3 = dbftmp      

      SELECT EMPRESA
      DBGOTOP()
      COPY FIELDS CODIGO, NOMRDZ TO C:\&tmp3 VIA 'DBFCDX'
      USE C:\&tmp3 NEW VIA 'DBFCDX'
      INDEX ON CODIGO TAG CHAVE1 TO C:\&tmp3
           
      *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

      GERA_DBF()
      
      SELECT PEDIDO
      DBSETORDER(5)
      DBGOTOP()
      DBSEEK( DTOS(vDATAi), .T.)

      COPY TO C:\&dbftmp WHILE DATEMI <= vDATAf FOR FLGCAN <> "S" VIA 'DBFCDX'
      
      USE C:\&dbftmp NEW VIA 'DBFCDX'
      INDEX ON STR(CODCLI)+DTOS(DATEMI) TAG CHAVE1 TO C:\&dbftmp

      DBSETORDER(1)      
      GOTO TOP
      DO WHILE !EOF()

         xSOMA   = 0        
         xCODIGO = CODCLI

         SET RELATION TO CODCLI INTO &tmp1

         @ PROW() + 01,05 SAY "Cliente " + StrZero(&tmp1->CODIGO,5) + " " + &tmp1->NOMCLI
         @ PROW() + 01,00 SAY "Venda    Emissao    Vendedor      Emitente   Qtde Parc.  1o. Venc.   Tot Pedido"

         DO WHILE CODCLI = xCODIGO

            @ PROW() + 01,00 SAY &dbftmp->PEDIDO PICT "@E 999,999"
            @ PROW()     ,08 SAY &dbftmp->DATEMI
               
            SET RELATION TO CODVED INTO &tmp2, TO CODEMT INTO &tmp3

            @ PROW()     ,19 SAY &dbftmp->CODVED PICT "99"
            @ PROW()     ,22 SAY &tmp2->NOMRDZ PICT "@!"
                              
            @ PROW()     ,34 SAY &dbftmp->CODEMT PICT "9"
            @ PROW()     ,36 SAY &tmp3->NOMRDZ PICT "@!"
            @ PROW()     ,48 SAY STRZERO(&dbftmp->QTDPAR,02)
            @ PROW()     ,56 SAY &dbftmp->VENPRI
            @ PROW()     ,70 SAY &dbftmp->TOTPED PICT "@E 99,999.99"

            xSOMA = xSOMA + &dbftmp->TOTPED
            DBSKIP()

         ENDDO

         vSOMA = vSOMA + xSOMA
         @ PROW() + 01,42 SAY "Total deste CLIENTE -->>"
         @ PROW()     ,69 SAY xSOMA PICT  "@E 999,999.99"
         @ PROW() + 01,00 SAY REPLICATE("-",79) 

     ENDDO

      @ PROW() + 02,45 SAY "** Totalizacao **" 
      @ PROW()     ,66 SAY vSOMA PICT "@E 99,999,999.99"
      @ PROW() + 03,00 SAY PADC("****** FIM DO RELATORIO ******",79) 

Código: Selecionar todos

*****************************************************************************
************** Funcao   : Gera Arquivo Temporario         *******************
************** Inicio   : 18/10/2004                      *******************
************** Ult.Alter: 15/01/2003                      *******************
*****************************************************************************

FUNCTION GERA_DBF
Local contafil := 1

SET DEFAULT TO C:\

 PUBLIC dbftmp := space(8)

   IF FILE('C:\rela0001.dbf') 
      dbftmp = 'rela' + strzero(contafil,4) +'.dbf'
      DO WHILE FILE(dbftmp) 
         contafil = contafil + 1
         dbftmp = "rela" + STRZERO(contafil,4) +'.dbf'
      ENDDO 
   ELSE 
      dbftmp = 'rela0001.dbf' 
   ENDIF

   dbftmp = 'rela' + strzero(contafil,4) 

SET DEFAULT TO

RETURN .T. 
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

e se um arquivo tiver 500 mil registros, nao vai ficar lento ficar copiando toda hora ele do servidor para o C?

se na cópia pudermos utiizar a clausula where do mysql ai copiariamos apenas os dados que interessariam ao relatório....

em tempo: em rotinas de cadstro este técnica näo vai funcionar direito por causa da atualizacao do banco, ne?

muito obrigado
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Janio, neste caso em questão, dá para fazer tudo isto com apenas uma sentença. Vou bisbilhotar por aqui, e se encontrar te mando.
Como disse com uma sentença dá para gerar este relatorio, em sql mesmo, com tabela temporaria. Existe um comando do Mediator, que vc pode inserir comandos sql, podendo colocar sentenças das mais absurdas.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: Performance na Rede

Mensagem por Eolo »

Tenho um sistema XH Console, DBF/CDX:
. antes rodava em 1 "servidor" XP (não dedicado) com 6 terminais XP (DBFs no servidor e EXEs nos terminais), e era como foi comentado acima: 2 usuários abriam o Tbrowse do mesmo DBF e ficava lento pros dois.
. agora é 1 servidor win2003 dedicado (dual, 4Gb RAM etc), com os mesmos terminais XP (só que DBFs e EXEs no servidor e acesso via Terminal Service): vc pode abrir o mesmo arquivo em 2 ou mais terminais, via Tbrowse, e "grudar" o dedo no PgDn. Roda normalmente em todos, como se fosse só 1 terminal acessando.

Show de bola.

NOTA: transferi o resto deste post para um novo tópico: Terminal Service versus XH+WVT - Lixo na tela.
Editado pela última vez por Eolo em 27 Jan 2009 11:59, em um total de 1 vez.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Re: Performance na Rede

Mensagem por asimoes »

Olá Eolo,

Você poderia me dar informações sobre o terminal service, tem algum tutorial de ajuda para instalar e configurar este serviço.

[]´s
►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
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Re: Performance na Rede

Mensagem por Eolo »

ASimoes, eu só tenho alguma idéia, pq foi um pessoal externo que montou (o servidor já veio pronto). Mas o ALAMINO tem as dicas, quem sabe ele poderia abrir um outro tópico a respeito?
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: Performance na Rede

Mensagem por janio »

e se um arquivo tiver 500 mil registros, nao vai ficar lento ficar copiando toda hora ele do servidor para o C?
Luciano, essa técnica de copiar os dados primeiramente para um dbf temporário é somente para os cadastros! Percebi que se num relatório de vendas, por exemplo, vc tiver que ir a cada registro pegar no cadastro de clientes o nome do cliente (no banco de vendas vc não guarda o nome do cliente, apenas o codigo deste), é muito demorado isso em Mysql. Se vc copiar todo o cadastro de cliente para um dbf temporário (mesmo que sejam 5.000 registros) e no relatório de vendas vc ir pegar o nome do cliente nesse dbf temporário, é mais rápido do que ir diretamente na tabela mysql de clientes.
Vou bisbilhotar por aqui, e se encontrar te mando.
Como disse com uma sentença dá para gerar este relatorio, em sql mesmo, com tabela temporaria.
Se houver como jogar tudo isso dentro de uma sentença slq SERIA MUITO MELHOR e mais RÁPIDO!

Vamos ver o que o Alamino conseguiu!

Jânio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Re: Performance na Rede

Mensagem por MARCELOG »

Olá pessoal,
tô achando esquisita essa história de que com o uso do mysql as consultas ficaram lentas.
Em todos os testes que fiz em rede local, o mysql voou baixo.
Quem sabe não é problema de estruturação da sua consulta.
Não há necessidade do uso de dbf, que se traduz num desperdício de recurso (memória, energia, etc.).
Grossamente falando, a consulta sql retorna um objeto array contendo os dados da consulta (e que já está na memória do terminal que a realizou).
Trate esse objeto como uma espécie de array e pronto.
Algo do tipo:

oQuery:GETROW(X):FIELDGET(Y)

Retorna o conteúdo da pesquisa que está na linha X e coluna Y.

Um exemplo para você ver funcionalidades que seriam um pouco mais difíceis com dbf.

tabela A
Campo1/Nome
campo2/Código da categoria
Campo3/Código do tipo

tabela B
Campo4/Código
Campo5/Nome da categoria
Campo6

tabela C
Campo7/Código
Campo8/Nome do tipo
Campo9

select A.Campo1,A.Campo2,A.Campo3,B.Campo5,C.Campo8
from A
left join B on B.Campo4=A.Campo2
left join C on C.Campo7=A.Campo3
order by A.Campo1

Isso geraria uma consulta/ tabela assim

A.Campo1 - A.Campo2 - A.Campo3 - B.Campo6 - C.Campo9
AAAA 0001 0002 A X
BBBB 0001 0002 A X
CCCC 0005 0003 F Z
DDDD 0001 0005 A Y

Então oQuery:GETROW(3):FIELDGET(4) retorna a letra "F"

Mesmo sem um índice, com certa velocidade, você poderia ordenar o resultado por qualquer campo indicado na pesquisa.

É só estudar um pouco o mysql.

MarceloG
Água mole em pedra dura tanto bate que até espirra!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Performance na Rede

Mensagem por Maligno »

Janio escreveu:Luciano, essa técnica de copiar os dados primeiramente para um dbf temporário é somente para os cadastros! Percebi que se num relatório de vendas, por exemplo, vc tiver que ir a cada registro pegar no cadastro de clientes o nome do cliente (no banco de vendas vc não guarda o nome do cliente, apenas o codigo deste), é muito demorado isso em Mysql.
Se o MySQL não faz isso rápido, só pode ser por conta de algum problema na rede. Até porque, no SELECT você resgata só alguns campos. Nem precisa de todos. Pesquisas desse tipo TEM que ser rápidas. Pelo menos a ponto de dispensar esse tipo de artifício. Com folga.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Re: Performance na Rede

Mensagem por Luciano Bonfim »

Caros,

Retomei agora o uso do mediator no meu sistema, instalei até a versão mais recente do site, porem os relatórios continuam muito lentos (não estou nem falando de rede, estou testando na minha máquina local com o banco de dados rodando local também)

meus relatórios ainda são do tempo da vovozinha, ou seja, ainda mantive a nossa velha e eficiente forma de criar relatórios:

exemplo:

select arq1
go top
do while !eof()

mcodigo=codigo
mvalor=0
select arq2
seek codigo
do while !eof() .and. codigo=mcodigo
mvalor+=valor
skip
enddo
.
.
.

select arqN
.
.
.

select arq1
skip
enddo

Pelo que entendi terei que mudar meus relatórios usando selects com cláusulas WHERE , mas com isso terei que alterar eles todos e são mais de 100 e com isso a utilização do mediator vai por agua abaixo, pois a grande vantagem dele é não precisar alterar o código.

Se usar a TMySQL vai ser pior ainda, vou ter que mudar tudo mesmo ....

Alguem poderia me dar uma luz e me indicar um caminho melhor.

Muito Obrigado
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Re: Performance na Rede

Mensagem por alaminojunior »

Luciano, tente o seguinte usando o Mediator mesmo, já que é só relatório:

Código: Selecionar todos

...
cr1:= "select * from cdcli003 where clicod = "
cr2:= " order by clidat"
seek1:= str(clicod,7)
use (netname()) as cr1+seek1+cr2 new scrollable overwrite // este comando faz o select
...
Dá para usar em relatórios, tbrowse´s, etc ...
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Re: Performance na Rede

Mensagem por janio »

Alguém utiliza a forma mostrada pelo MARCELOG???

Muito interessante...
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Responder