MsExecAuto pedidos lento

Boa tarde galera, estou com um processo de geração de pedido que leva mais de 1 hora, sao 340 itens, é aceitavel levar um determinado tempo, porem mais de 1 hora ? Alguem tem alguma sugestao, abaixo o codigo que eu uso

static function bPed(oSay)
Local aArea := FWGetArea()
local cQry:= ‘’
local _aItens := {}
local _aAutoSC5 := {}
local _aAutoSC6 := {}
local _citem := ‘00’
local cTipProd := ‘’
local cDesPrd := ‘’
local cProdBKP := ‘’
local lcont := .t.

if Alltrim(ZD1_COND) <> '' .and.  Alltrim(ZD1_NATURE) <>  '' .and. Alltrim(ZD1_VEND) <> '' .and.  Alltrim(ZD1_TES) <> ''
	oSay:SetText("Consultando dados...")

	cQry := " SELECT  ZD1_ORCAME, ZD1_CLIENT, ZD1_LOJA,ZD2_ITEM, ZD1_TES,ZD1_VEND,ZD1_COND, ZD1_NATURE,ZD2_PRODUT,ZD3_ITEM,ZD3_QUANT, B1_UM,B1_DESC, ZD3_PBRUNI, ZD3_COD,ZD3_VLITEM FROM ZD1010 ZD1 "
	cQry += "  INNER JOIN ZD2010 ZD2 ON ZD2_ORCAME = '"+ ZD1->ZD1_ORCAME +"' AND ZD1_FILIAL = ZD2_FILIAL AND ZD2.D_E_L_E_T_ = '' "
	cQry += "  INNER JOIN ZD3010 ZD3 ON ZD3_ORCAME = '"+ ZD1->ZD1_ORCAME +"' AND ZD2_FILIAL = ZD3_FILIAL AND ZD2_PRODUT = ZD3_PRODUT "
	cQry += "  INNER JOIN SB1010 SB1 ON ZD2.ZD2_PRODUT = SB1.B1_COD AND SB1.D_E_L_E_T_ = '' "
	cQry += "  AND ZD3.D_E_L_E_T_ = ''  "
	cQry += "  WHERE ZD1.D_E_L_E_T_ = '' AND ZD1.ZD1_ORCAME = '"+ZD1->ZD1_ORCAME+"'  ORDER BY ZD2_ITEM,ZD3_ITEM"

	TCQUERY cQry NEW ALIAS "TRBC"

	If FWIsAdmin()
		ShowLog(cQry)
	EndIf

	cTipProd:=POSICIONE("SA1",1,XFILIAL("SA1")+TRBC->ZD1_CLIENT+TRBC->ZD1_LOJA,"A1_TIPFPRO")

	dbSelectArea('TRBC')
	dbgotop()
	AADD( _aAutoSC5, { "C5_TIPO"     , "N"         , Nil } )
	AADD( _aAutoSC5, { "C5_EMISSAO"  , dDataBase   , Nil } )
	AADD( _aAutoSC5, { "C5_CLIENTE"  , TRBC->ZD1_CLIENT         , Nil } )
	AADD( _aAutoSC5, { "C5_LOJACLI"  , TRBC->ZD1_LOJA         , Nil } )
	AADD( _aAutoSC5, { "C5_TIPOCLI"  , "F"             , Nil } )
	AADD( _aAutoSC5, { "C5_VEND1"    , TRBC->ZD1_VEND             , Nil } )
	AADD( _aAutoSC5, { "C5_CONDPAG"  , TRBC->ZD1_COND          , Nil } )
	AADD( _aAutoSC5, { "C5_NATUREZ"  , TRBC->ZD1_NATURE             , Nil } )

	While !eof()
		_citem    := soma1(_citem)
		if lcont
			AADD(_aItens , {"C6_ITEM"    , _citem                        , Nil } )
			if cTipProd == '1'
				cDesPrd:= veEst(TRBC->ZD2_PRODUT)
				IF cDesPrd == TRBC->ZD2_PRODUT .and. cProdBKP <> cDesPrd
					if FWAlertYesNo("O cliente possui configuração para usar estrutura.<br>	Nao encontrei a mesma para o produto <b>"+TRBC->ZD2_PRODUT+".<b><br>Deseja continuar e usar este codigo de produto ?", "Estrutura nao encontrada")
						lcont := .t.
					else
						lcont := .f.							
					endif
				Endif
				cProdBKP:=cDesPrd
			else
				cDesPrd := TRBC->ZD2_PRODUT
			endif

			dbSelectArea('TRBC')
			AADD(_aItens , {"C6_PRODUTO" , cDesPrd, Nil } )
			AADD(_aItens , {"C6_PRODCLI" , TRBC->ZD3_COD,  Nil } )
			AADD(_aItens , {"C6_DESCRI"  , alltrim(TRBC->B1_DESC), Nil } )
			AADD(_aItens , {"C6_UM"      , TRBC->B1_UM, Nil } )
			AADD(_aItens , {"C6_QTDVEN"  , TRBC->ZD3_PBRUNI    , Nil } )
			AADD(_aItens , {"C6_PRCVEN"  , TRBC->ZD3_VLITEM / TRBC->ZD3_PBRUNI      , Nil } )
			AADD(_aItens , {"C6_QTDLIB"  , TRBC->ZD3_PBRUNI , Nil } )
			AADD(_aItens , {"C6_ENTREG"  , dDatabase  , Nil } )
			AADD(_aItens , {"C6_TES"     , TRBC->ZD1_TES, Nil } )
			AADD(_aItens , {"C6_UNSVEN"  , TRBC->ZD3_QUANT, Nil } )

			AADD( _aAutoSC6, AClone( _aItens ) )
		endif
		dbskip()
	Enddo

	TRBC->(DbCloseArea())
	IF lcont
		oSay:SetText("Gerando pedido...")
		ProcessMessages()

		Begin Transaction
			MsExecAuto({|x,y,z|MATA410(x,y,z)},_aAutoSC5,_aAutoSC6,3)
			If lMsErroAuto
				_lErroArq := .T.
				//If (!IsBlind()) // com interface gráfica
				MostraErro()
			else
				FWAlertSuccess('Pedido gerado <b>'+SC5->C5_NUM+'</b> com sucesso', 'Pedido gerado')
				RecLock('ZD1', .f.)
				ZD1->ZD1_PEDIDO   := SC5->C5_NUM
				ZD1->(MsUnlock())
			endif

		End Transaction
	endif

	FWRestArea(aArea)
else

	FWAlertWarning("Verifique os campos <b><TES, Condição de pagamento, Natureza e vendedor>'</b> na aba Faturamento", "Campos faltantes")
endif

return

1 curtida

Essa demora realmente é muito acima do normal, esse tipo de problema de lentidão é difícil de identificar porque pode ser muita coisa. Pode ser alguma customização que esteja demorando muito para rodar (como algum recálculo ao digitar os itens por exemplo), pode ser algum lock no banco demorou para ser liberado, etc.
É um trabalho forense de investigação até achar o verdadeiro culpado.
Testa com menos itens, se possível testa sem nenhuma customização no RPO só essa do execAuto. Olha no DBAccess se a rotina está gerando muitos locks no banco e ficando presa esperando outra rotina. E até como está o uso do próprio servidor de aplicação e banco se estão sobrecarregados.

2 curtidas

pois é, totvscloud… ai complica um pouco, realmente é complicado, o cliente nao tem customizacoes no pedido, ja verifiquei…
att

1 curtida

Olá,

A primeira coisa que você deve fazer é gerar um logprofiler, para analisar os pontos de lentidão.

A lentidão pode ter inúmeros motivos:

  • Lentidão no banco de dados
  • Lentidão na infraestrutura
  • Volume da dados
  • Problemas no servidor da aplicação
  • Entre inúmeras outras

O logprofiler vai conter informações importantes para análise, como o tempo que cada função levou, quantas vezes foram chamadas, quando chamada mais demorada entre outras informações.

Outro ponto importante é gerar informações via MallocIO, esse simula a alocação de memória do sistema e caso ele retorne resultados ruins, é certeza que sua aplicação não vai performar:
https://tdn.totvs.com/display/PROT/MallocIO

Gere um logprofiler, é possível gerar via Shift+F6, que gera inclusive de forma mais pontual ao problema, ele vai lhe ajudar a compreender quais os pontos de lentidão.

1 curtida

Recentemente um colega também relatou esse mesmo problema com muitos itens. Então parece mesmo ser algum problema com a rotina padrão, algo precisa ser otimizado para funcionar nesses cenários.
Recomendo tentar abrir um ticket com a Totvs para ver se eles resolvem, sei que muitas vezes é uma briga árdua.