Página 2 de 3

Enviado: 14 Fev 2008 16:21
por sygecom
Luciano, me chama depois das 19:00 que lhe faço uma demostração do TS.

Enviado: 15 Fev 2008 09:35
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

Enviado: 15 Fev 2008 13:37
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

Enviado: 15 Fev 2008 13:57
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. 

Enviado: 15 Fev 2008 14:30
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

Enviado: 15 Fev 2008 15:17
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.

Re: Performance na Rede

Enviado: 27 Jan 2009 09:42
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.

Re: Performance na Rede

Enviado: 27 Jan 2009 10:40
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

Re: Performance na Rede

Enviado: 27 Jan 2009 11:37
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?

Re: Performance na Rede

Enviado: 29 Jan 2009 12:26
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

Re: Performance na Rede

Enviado: 29 Jan 2009 15:07
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

Re: Performance na Rede

Enviado: 29 Jan 2009 16:17
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.

Re: Performance na Rede

Enviado: 18 Set 2009 14:56
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

Re: Performance na Rede

Enviado: 18 Set 2009 16:50
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 ...

Re: Performance na Rede

Enviado: 18 Set 2009 20:00
por janio
Alguém utiliza a forma mostrada pelo MARCELOG???

Muito interessante...