- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Stack Memory Overflow in function xFilial
×
Linguagem de Programação ADVPL
Perguntas Stack Memory Overflow in function xFilial
- llrafaell
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 3
- Obrigados Recebidos: 0
11 anos 2 meses atrás - 11 anos 2 meses atrás #17310
por llrafaell
Stack Memory Overflow in function xFilial foi criado 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
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.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
- llrafaell
- Autor do Tópico
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 3
- Obrigados Recebidos: 0
11 anos 2 meses atrás #17313
por llrafaell
Respondido por llrafaell no tópico Stack Memory Overflow in function xFilial
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.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
11 anos 2 meses atrás #17334
por kanaamlrr
Respondido por kanaamlrr no tópico Stack Memory Overflow in function xFilial
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.
Pode ser que resolva o problema.
Por favor Acessar ou Registrar para participar da conversa.
- henry.charriere
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 492
- Obrigados Recebidos: 0
11 anos 2 meses atrás #17345
por henry.charriere
Respondido por henry.charriere no tópico Stack Memory Overflow in function xFilial
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
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.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Stack Memory Overflow in function xFilial
Tempo para a criação da página:0.120 segundos