Página 1 de 1

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

Enviado: 04 Mai 2010 16:34
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

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

Enviado: 04 Mai 2010 22:46
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 ?

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

Enviado: 05 Mai 2010 16:49
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.

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

Enviado: 09 Mai 2010 23:02
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

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

Enviado: 10 Mai 2010 23:47
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

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

Enviado: 17 Mai 2010 22:35
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