× Linguagem de Programação ADVPL

Perguntas Stack Memory Overflow in function xFilial

Mais
11 anos 2 meses atrás - 11 anos 2 meses atrás #17310 por llrafaell
Prezados, bom dia!

Venho recorrer ao forum pois não consigo uma solução.

Estou com um problema em uma função recursiva, onde acontece erro de stack memory overflow in function xFilial, alguem já passou por isso ou teria alguma idéia de como resolver?


obrigado

Rafael
Ultima edição: 11 anos 2 meses atrás por llrafaell.

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 2 meses atrás #17312 por kanaamlrr
Rafael, posta seu código ai para podermos dar uma olhada.

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 2 meses atrás #17313 por llrafaell
segue parte do código, é uma função recursiva

Static Function FS_RASTR(__xFilial,__NumSeq,__Alias,__OP,_Moment,__NumLote)
Local cItem 		:='' 
Local nRecM0 := SM0->(Recno()) 
Local aAliaaD1  := GetNextAlias()
Local aAliaaDEV := GetNextAlias()
Local aAliaSD52 := GetNextAlias()
Local nRatOld := 1
DEFAULT __xFilial	:= '' 	
DEFAULT __NumSeq	:= '' 	
DEFAULT __Alias	   	:= '' 
default __OP := ''
default __NumLote := ''  
Default _Moment:= '1'//monento da chamada 1-Purchase - 0-Stocktransaction 

If type('cCodOri')='U'
  	cCodOri := ''
Endif   

If type('cDesCom')='U'
  	cDesCom := ''
Endif   

n_++
If n_ >= 140
	Return .t.
Endif

cQuery := ""
cQuery := "SELECT SD5.* FROM "
cQuery += " ( "
cQuery += " SELECT * FROM SD5010 SD5 "
cQuery += " WHERE "
IF	!EMPTY(cCodOri) //quando movimentação interna
	cQuery += " SD5.D5_ORIGLAN<='"+cCodOri+"' AND " 
Endif 
IF	!EMPTY(__NumSeq) 
	cQuery += " SD5.D5_NUMSEQ='"+__NumSeq +"' AND "
Endif  
IF	!EMPTY(__NumLote) 
	cQuery += " SD5.D5_NUMLOTE='"+__NumLote +"' AND "
Endif     
IF	!EMPTY(__xFilial) 
	cQuery += " SD5.D5_FILIAL='"+__xFilial +"' AND "
Endif  
IF	!EMPTY(__OP)//filtro ordem de produção 
	cQuery += " SD5.D5_ORIGLAN<='499' AND "
Endif  

cQuery += " SD5.D5_ESTORNO<>'S' AND SD5.D_E_L_E_T_='' "
cQuery += " ) as TMP"
cQuery += " LEFT JOIN SD5010 SD5 ON (SD5.D5_PRODUTO=TMP.D5_PRODUTO "
cQuery += " AND SD5.D5_LOTECTL=TMP.D5_LOTECTL AND SD5.D5_NUMLOTE=TMP.D5_NUMLOTE AND SD5.D_E_L_E_T_='' )   "  
cQuery += " WHERE SD5.D5_ESTORNO<>'S'  order by SD5.R_E_C_N_O_"  
//aAliaSD52 := GetNextAlias() 
DbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),aAliaSD52,.t.,.t.)  
DbSelectArea(aAliaSD52)
While !eof() 
//D5_FILIAL+D5_NUMSEQ+D5_PRODUTO+D5_LOCAL+D5_LOTECTL+D5_NUMLOTE
	//variaveis para posicionamento corredo no SD5 quando chamar recursivo
    _prod := (aAliaSD52)->D5_PRODUTO
    _local:= (aAliaSD52)->D5_LOCAL
    _lotec:= (aAliaSD52)->D5_LOTECTL
    _NumLo:= (aAliaSD52)->D5_NUMLOTE
//    if (aAliaSD52)->D5_NUMSEQ = '127490'
    	//cteste := ''
    //Endif
	
		If (aAliaSD52)->D5_ORIGLAN < '500' //ENTRADAS
	
			//verifica se é uma saida/entrada inventario
			IF (aAliaSD52)->D5_DOC='INVENT   '//IVENTARIO
				aAdd(aPuRch,{(aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_LOCAL,(aAliaSD52)->D5_ORIGLAN,0,0,0,0,0,(aAliaSD52)->D5_QUANT*nRateio,(aAliaSD52)->D5_NUMSEQ,(aAliaSD52)->D5_NUMLOTE,(aAliaSD52)->D5_QUANT*nRateio,'Entrada Inventário' })
			else  
				aAdd(aPuRch,{(aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_LOCAL,(aAliaSD52)->D5_ORIGLAN,(aAliaSD52)->D5_QUANT*nRateio,0,0,0,0,0,(aAliaSD52)->D5_NUMSEQ,(aAliaSD52)->D5_NUMLOTE,(aAliaSD52)->D5_QUANT*nRateio,'Entrada'+cDesCom })
			Endif
		Else //saidas
			//Verifica a TES saida
			DbSelectArea("SF4")
			DbSetOrder(1)
			If DbSeek(xFilial("SF4")+(aAliaSD52)->D5_ORIGLAN)  // todo  
			
				//verifica se é uma saida/entrada inventario
				IF (aAliaSD52)->D5_DOC='INVENT   '//IVENTARIO
				 
			    	aAdd(aPuRch,{(aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_LOCAL,(aAliaSD52)->D5_ORIGLAN,0,0,0,0,(aAliaSD52)->D5_QUANT*nRateio,0,(aAliaSD52)->D5_NUMSEQ,(aAliaSD52)->D5_NUMLOTE,(aAliaSD52)->D5_QUANT*nRateio*-1,'Saida Inventário' })  

				ElseIf !Empty((aAliaSD52)->D5_OP)//requisição Para order de produção
				
					aAdd(aPuRch,{(aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_LOCAL,(aAliaSD52)->D5_ORIGLAN,0,0,(aAliaSD52)->D5_QUANT*nRateio,0,0,0,(aAliaSD52)->D5_NUMSEQ,(aAliaSD52)->D5_NUMLOTE,(aAliaSD52)->D5_QUANT*nRateio*-1,' Saida Order de Produção' })                                     
				
				//Verifica se é venda ou Bonificação
				ElseIF (SF4->F4_DUPLIC='S' .and. SF4->F4_ESTOQUE='S' .and. SF4->F4_X_TPMOV $ ('4/5')) .or. SF4->F4_X_TPMOV $ ('6') 
					If  SF4->F4_X_TPMOV $ ('6')//bonificação
						aAdd(aPuRch,{(aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_LOCAL,(aAliaSD52)->D5_ORIGLAN,0,0,0,(aAliaSD52)->D5_QUANT*nRateio,0,0,(aAliaSD52)->D5_NUMSEQ,(aAliaSD52)->D5_NUMLOTE,(aAliaSD52)->D5_QUANT*nRateio*-1,'Saida Bonificação' })
					Else//venda
						aAdd(aPuRch,{(aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_LOCAL,(aAliaSD52)->D5_ORIGLAN,0,0,0,(aAliaSD52)->D5_QUANT*nRateio,0,0,(aAliaSD52)->D5_NUMSEQ,(aAliaSD52)->D5_NUMLOTE,(aAliaSD52)->D5_QUANT*nRateio*-1,'Saida Venda' })
	                Endif
					FS_RASTR((aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_NUMSEQ,"SD1")
				Else 
					If SF4->F4_PODER3 $ ('R')
						FS_RASTR((aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_NUMSEQ,"SD2") 
					Else				
						FS_RASTR((aAliaSD52)->D5_FILIAL,(aAliaSD52)->D5_NUMSEQ,"SD2") 
					Endif  

 
				EndIF
			Endif	
		Endif
	DbSelectArea(aAliaSD52)
	DbSkip()
enddo    
(aAliaSD52)->(DbCloseArea())
DbSelectArea("SD2")    
    
DbSelectArea("SM0")
DbGoto(nRecM0)    

Return .t.

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 2 meses atrás #17334 por kanaamlrr
Rafael, tenta tirar o xFilial("SF4") de dentro do seu loop e joga o resultado disso em uma variável apenas para teste.
Pode ser que resolva o problema.

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 2 meses atrás #17345 por henry.charriere
Brother, Bom dia!

Para fazer Select, gosto sempre de usar essa lógica.

cAlias := GETNEXTALIAS()

cQuery := " SELECT * FROM SD2 "

TCQUERY cQuery ALIAS(cAlias)

while( !(cAlias)->(EOF()))
ALERT((cAlias)->D2_DOC)
dbSkip()
EndDo

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.120 segundos
Joomla templates by a4joomla