Rotina em Rede TS Rápida em Rede Mapeada Lenta? Será Código?

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

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Rotina em Rede TS Rápida em Rede Mapeada Lenta? Será Código?

Mensagem por fladimir »


Amigos e colegas do Fórum eu tenho o codigo abaixo pra pegar do DBF Debitos (Contas Recebidas e a Receber) e fazer uma analise geral por periodo de um determinado cliente mostrando todas a compras deles, em aberto, pagas, canceladas e dando um resumo no rodapé da tela com um Semáforo: Verde para médias de atraso menores q 10 dias Amarelo para 11 a 20 dias e acima disto vermelho.


Bom esta rodando bem, mas alguns clientes reclamam de lentidao da rotina qdo não é executado no Servidor.

Uma solução para tal foi em alguns clientes usarmos TS Ok sem problemas, mas tem clientes q não usam TS devido outros fatores e a rotina ao ser usada em Rede mapeada fica lenta, menos no servidor.

Algum colega poderia analisar o codigo e ver se tem algo q possa melhorado para agilizar o processo na rede...

Código: Selecionar todos

#include "inkey.ch"
#include "proprio.ch"
#include "common.ch" 

*******************************************************************************
FUNCTION AnalizFin(cCliente)
* Mostra tela com Analize Financeira do Cliente
********************************************************************************

Local  cTela:=SaveScreen(s_geral)
LOCAL  nQtdCompG := nQtdCompP := nQtdCompN := nQtdCompC := 0
LOCAL nQtdCompGP := nQtdCompPP := nQtdCompNP := nQtdCompCP := 0
LOCAL  nTotCompG := nTotCompP := nTotCompN := nTotCompC := 0
LOCAL   nPontual := 0, nMediaPont := 0, nJurosP := 0

LOCAL aCampo:={}, aMask:={}, aTitulo:={}
LOCAL cTitulo, aCoordenadas:={}, aMensagem:={}
LOCAL area:=SELECT(), cOldColor := SetColor()

SETKEY( K_ALT_C, NIL )

SHOWTIME()  

IIf(cCliente=NIL,cCliente:="", cCliente)


// coloquei pra definir se volta com a area ou nÆo
If Select("debitos")!=0 // quer dizer q veio com area debitos e Registro
   nVeio := 1 // Veio com area debitos
   nRegVeio := debitos->(RecNo())
Else
   nVeio := 0
   nRegVeio := 0
Endif

WHILE LASTKEY() != K_ESC
   cls
   tot_gas:=0
   tot_gasGeral:=0
   SETCOLOR(vcr)
   desccli := 0
   cNomeCli:=""
   AbreParam()
   IF SELECT("Clientes")==0
      Abrir("Clientes","Clientes")
   ENDIF
   IIf(cCliente="", cCliente := SPACE(8), cCliente)
   @ 05,03 SAY "Cliente.....:"
   @ 05,17 SAY SPACE(08) COLOR "W+/R"
   @ 05,17 GET cCliente PICTURE "@!" WHEN Mensag("Informe o c¢digo do cliente, ENTER procura por Nome")
   READ
   IF LASTKEY()==K_ESC
   	IF SELECT("debitos")!=0 .and. nVeio=0
			debitos->( DbCloseArea() )
		ENDIF
		DBSELECTAR(area)
      SetColor(cOldColor)
      RestScreen(s_geral, cTela)
      EXIT
   ENDIF
   IF EMPTY(cCliente) 
      cCliente:=ALLTRIM(cCliente)
      Mensag("Informe o c¢digo do cliente, ESC procura por CPF")
      IF !AchaCli(cCliente, "Clientes",{"Nome","Codigo"},;
          {"Nome","C¢digo"},;
          {"@!","99999999"},2,,,"Clientes",;
          "[ESC] Procura por TELEFONE, CPF ou CNPJ" )
         cCliente:=""
      ELSE
         cCliente:=Clientes->Codigo
      ENDIF
   ENDIF
   * Procura por telefone
   IF EMPTY(cCliente)
      cCliente:=SPACE(11)
      @ 05,03 SAY "CPF.........:"
      @ 05,25 SAY SPACE(35)
      @ 05,17 SAY SPACE(13) COLOR "W+/R"
      @ 05,17 GET cCliente PICTURE "@R 999.999.999-99" VALID;
		        Validacao( {|| Cpf(cCliente) },"N£mero do CPF inv lido") WHEN;
      		  Mensag("Informe o n£mero do CPF, ENTER procura por CNPJ")
      READ
      IF LASTKEY()==K_ESC
         LOOP
      ENDIF
      IF !EMPTY(cCliente)
         Clientes->( ORDSETFOCUS(3) )
         IF Clientes->( !DBSEEK(cCliente) )
            Mensagem("N£mero do CPF n„o encontrado!")
            Clientes->( ORDSETFOCUS(1) )
            LOOP
         ENDIF
         cCliente:=Clientes->codigo
      ENDIF
   ENDIF
   IF EMPTY(cCliente)
      cCliente:=SPACE(15)
      @ 05,03 SAY "CNPJ.........:"
      @ 05,25 SAY SPACE(35)
      @ 05,17 SAY SPACE(15) COLOR "W+/R"
      @ 05,17 GET cCliente PICTURE "@R 99.999.999/9999-99" VALID;
   		     Validacao( {|| CNPJ(cCliente) },"N£mero do CNPJ inv lido") WHEN;
		        Mensag("Informe o n£mero do CNPJ, ENTER procura por nome")
      READ
      IF LASTKEY()==K_ESC
         LOOP
      ENDIF
      IF !EMPTY(cCliente)
         Clientes->( ORDSETFOCUS(4) )
         IF Clientes->( !DBSEEK(cCliente) )
            Mensagem("N£mero do CNPJ n„o encontrado!")
            Clientes->( ORDSETFOCUS(1) )
            LOOP
         ENDIF
         cCliente:=Clientes->codigo
      ENDIF
   ENDIF
   Clientes->( ORDSETFOCUS(1) )
   IF EMPTY(cCliente)
      cCliente:=""
      IF !AchaCli(cCliente, "Clientes",{"Nome","Codigo"},;
		          {"Nome","C¢digo"},;
      		    {"@!","99999999"},2,,,"Clientes" )
         DBCLOSEALL()
         LOOP
      ENDIF
      cCliente:=Clientes->Codigo
   ELSE
      cCliente:=ZeraCodigo(cCliente)
      IF Clientes->( !DBSEEK(cCliente) )
         Mensagem("C¢digo n„o cadastrado!")
         DBCLOSEALL()
         LOOP
      ENDIF
   ENDIF
   cCliente:=Clientes->Codigo
   cExterno:=Clientes->Externo
   @ 05,17 SAY cCliente+"-"+Clientes->Nome
   cNomeCli := Clientes->Nome
   IF !SenhaCli(Clientes->Codigo)
      DBCLOSEALL() 
      LOOP
   ENDIF

   IF SELECT("debitos")==0
      Abrir("debitos","debitos")
   ENDIF
   	
      cls
      Set Century On

		debitos->( DBGOTOP() )       
		debitos->( ORDSETFOCUS(4) )  
      
      DO WHILE .T.
         debitos->( DBGOTOP() )
         WDataIni:= CtoD("01/01/1990")
         WDataFim:=Date()

         cTitulo:="An lise das compras do cliente "+ALLTRIM(SUBSTR(Clientes->Nome,1,30))
         @0,0 Say PADC(cTitulo,80) color("W+/R")
  
         @ 01,01 Say "Entre com a Data Inicial: "
         @ 01,27 Get WDataIni Pict "@D" Valid !Empty(WDataIni)
         @ 01,41 Say "Entre com a Data Final..: "
         @ 01,67 Get WDataFim Pict "@D" Valid (WDataIni<=WDataFim)
         Read
         If Lastkey()=27
            Exit
         Endif
         
         *Zerando valores Variaveis de Calculo
          nQtdCompG :=  nQtdCompP :=  nQtdCompN :=  nQtdCompC := 0
			nQtdCompGP := nQtdCompPP := nQtdCompNP := nQtdCompCP := 0
		 	 nTotCompG :=  nTotCompP :=  nTotCompN :=  nTotCompC := 0
			  nPontual := nMediaPont :=    nJurosP := 0

			// Vou colocar aki o bloco de calculos para ver se atualiza conforme a data
			debitos->( ORDSETFOCUS(4) )
			debitos->( DBGOTOP() )
			
			While debitos->( !Eof() )
			   Mensag("Analizando o Cliente","W+*/R")
			   If debitos->clCodi==cCliente .AND. debitos->cldata>=WDataIni ;
			      .And. debitos->ClData<=WDataFim

			      cVendaDeb := debitos->ClTick   ;    cCondDeb := debitos->ClPago
			      nValorDeb := debitos->ClPreco  ;    dDataDeb := debitos->ClData
			       dVencDeb := debitos->ClData + debitos->Tolerancia
			      dPagtoDeb := debitos->DT_Pagto
			      nVlrQPago := IIf(debitos->CreditoAtu>0, debitos->CreditoAtu, debitos->Vl_Pago)
								
			      
					If debitos->ClPago="S"
			         nQtdCompPP++
			         nTotCompP += nVlrQPago
			         nPontual += (dPagtoDeb - dVencDeb)
			      Endif
			      If debitos->ClPago="C"
			         nQtdCompCP++
			         nTotCompC +=  nValorDeb
			      Endif
			      If debitos->ClPago=" "
			         nQtdCompNP++
			         nTotCompN += nValorDeb
			         If (Date() - dVencDeb) > 0
							nPontual += (Date() - dVencDeb) 
						Endif
			      Endif
			      nQtdCompGP++
												
			      Iif(right(Alltrim(debitos->PrDesc),6)="Rest.)", ,;
			       	nTotCompG += nValorDeb)
			       	debitos->( DBSKIP() )
						
			      If !debitos->ClTick = cVendaDeb
			         If cCondDeb=="S"
			            nQtdCompP++
			         Endif
			         If cCondDeb=="C"
			            nQtdCompC++
			         Endif
			         If cCondDeb==" "
			            nQtdCompN++
			         Endif
			         nQtdCompG++
			         nMediaPont := If((nQtdCompGP-nQtdCompCP)=0, 0, nPontual / (nQtdCompGP-nQtdCompCP))
			      Endif
			   Else
					debitos->( DBSKIP() )    
			   Endif
			ENDDO
			
			DbSelectAr("debitos")
			debitos->(DbGoTop())
			
   		@ 03,12 SAY "Criando Arquivo Temporario..."        
         Set Softseek On
         Seek cCliente + Dtos(WDataIni)
         Set Softseek Off
         
         ArqTemp() // cria arquivos temporarios
         
			Index on debitos->clcodi + Dtos(debitos->cldata) + debitos->clTick To &Arq_Temp7 ;
                  WHILE (debitos->ClCodi=cCliente .and. debitos->cldata>=WDataIni .And. debitos->ClData<=WDataFim)
         Set Index To &Arq_Temp7    //Ind_tmp
         GO TOP

         Janela(19,0,24,16,.t.)
         Janela(19,18,24,36,.t.)
         Janela(19,38,24,54,.t.)
         Janela(19,56,24,79,.t.)
         @19,01 say " C O M P R A S "
         @19,19 say " P A R C E L A S "
         @19,39 say " V A L O R E S "
         @19,58 say "I N F O R M A € å E S"
         
         nJurosP := (nTotCompP-(nTotCompG-(nTotCompC+nTotCompN)))
         
         @20,01 say "Qtd. GERAL. " + Transform(nQtdCompG,"999")
         @20,20 say "Qtd. GERAL. " + Transform(nQtdCompGP,"999")
         @20,40 say "R$ " + Transform(nTotCompG,"@E 999,999.99")
         @21,01 say "Qtd. Pagas. " + Transform(nQtdCompP,"999")
         @21,20 say "Qtd. Pagas. " + Transform(nQtdCompPP,"999")
         @21,40 say "R$ " + Transform(nTotCompP-nJurosP,"@E 999,999.99")
         @22,01 say "Qtd. Aberto " + Transform(nQtdCompN,"999")
         @22,20 say "Qtd. Aberto " + Transform(nQtdCompNP,"999")
         @22,40 say "R$ " + Transform(nTotCompN,"@E 999,999.99")
         @23,01 say "Qtd. Cancel " + Transform(nQtdCompC,"999")
         @23,20 say "Qtd. Canc.. " + Transform(nQtdCompCP,"999")
         @23,40 say "R$ " + Transform(nTotCompC,"@E 999,999.99")
  
         @20,58 say "M‚dia Atras:  "
			@20,72 say Transform(nMediaPont, "@E 9999.99") color(IIf(nMediaPont<10,"w+/G", IIf(nMediaPont<20,"N*/GR","w+/r")))
         @21,58 say "Juros Pagos: " + Transform(nJurosP, "@E 9999.99")
         @22,58 say "Receb.+ Jur: " + Transform(nTotCompP,"@E 9999.99")
    
         aCampo := { "debitos->ClTick", "debitos->clData", "(debitos->cldata+debitos->Tolerancia)", "debitos->ClPreco", "debitos->dt_pagto", ;
          "IIf(debitos->ClPago='S',debitos->DT_Pagto-(debitos->ClData+debitos->Tolerancia), IIF(debitos->ClPago=' ',  IIF( (Date()-(debitos->ClData+debitos->Tolerancia)>0) , (Date()-(debitos->ClData+debitos->Tolerancia)),0),0))", ;
			 "IIf(debitos->CreditoAtu=0,debitos->Vl_Pago,debitos->CreditoAtu)","debitos->ClPago", "LEFT(debitos->prdesc,30)", "debitos->retirado"}

         aMask := { "999999", "  /  /  ", "  /  /  ", "@E 999,999.99",  "  /  /  ", "9999", "@E 999,999.99",;
          "!", "@!",  "@!"	}
 
         aTitulo:= {"Nr.Vend", "Data", "Vencimento",  "Valor",  "Pagamento", "Atraso", "Valor Pago",;
          "Status", "Descri‡„o", "Quem retirou"}

         KEYBOARD CHR(30)
         Janela(02,00,18,79,.t.)
         DBEDIT(03,01,17,78,aCampo,,aMask,aTitulo,CHR(196),CHR(179),"")
  			
			DbSelectAr("debitos") // coloquei pq dava erro clcodi, mas talvez nao precise
			Set Index To &Arq_Temp7   //debitos
      ENDDO
   //Endif
Enddo
IF SELECT("debitos")!=0 .and. nVeio=0
	debitos->( DbCloseArea() )
ENDIF
DBSELECTAR(area)

If UPPER(Alias(Area))="debitos" .and. nVeio=1
   debitos->(DbGotop(nRegVeio))
Endif

SetColor(cOldColor)
RestScreen(s_geral,cTela)
SETKEY( K_ALT_C,   {|| AnalizFin() } )

Ferase(Arq_temp7+".cdx")  // apaga o indice temporario

RETU
Grato a todos e Sucesso!!!


:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


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

Re: Rotina em Rede TS Rápida em Rede Mapeada Lenta? Será Código?

Mensagem por sygecom »

Buenas,
Comparar TS com rede mapeada é covardia, o TS roda tudo no lado servidor deixando tudo muito mais rapido.

Em que ponto do codigo está a lentidão ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Re: Rotina em Rede TS Rápida em Rede Mapeada Lenta? Será Código?

Mensagem por Itamar M. Lins Jr. »

Se estiver usando o Harbour, pode usar(criar) indices temporários na memória.
Ou usar o NETIO que é uma boa opção ou o LetoDb.

É o que está dando uma sobre vida aos meus DBF's.

Se não fosse pelo uso do LetoDb e agora com esta nova NETIO do Przmek. Só mudando para SGDB. Por exemplo PGSQL ou MySql.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Rotina em Rede TS Rápida em Rede Mapeada Lenta? Será Código?

Mensagem por fladimir »

Desculpem colegas estava em viagem... dia das mães... fui ver a minha...

Bom vamos lá...

Leonardo, realmente comparar TS com rede mapeada é uma grande covardia, mas eu ainda tenho alguns clientes assim.... o momento q esta gerando a lentidão é qdo... após as datas inicial e final para análise....

Itamar... como seria com índice temporários na memória ?

Grato a tds....

Sucesso!!!!
:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


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

Re: Rotina em Rede TS Rápida em Rede Mapeada Lenta? Será Código?

Mensagem por sygecom »

Olá fladimir,

Com índice temporário ficaria mais ou menos assim:

SELECT debitos // sua tabela
INDEX ON clCodi TAG TEMP FOR(clCodi)==cCliente .AND. cldata>=WDataIni .And. ClData<=WDataFim TEMPORARY
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Rotina em Rede TS Rápida em Rede Mapeada Lenta? Será Código?

Mensagem por fladimir »

RESOLVIDO

Obrigado Sygecom e Itamar... fiz com Indices Temporários e resolveu, conforme o Leonardo deu a forma a idéia do Itamar tb.

Sucesso a tds!!!
:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Responder