Olá,
O erro não tem relação com a função Pergunte
, o problema é que você está abrindo uma query com um alias fixo e não fecha a workarea após o uso, como você não fecha, ao executar novamente, a workarea já está em uso e o ADVPL gera a exceção.
Para corrigir esse erro é muito simples, basta fazer o dbCloseArea
do seu alias P01 após o uso:
/*/{Protheus.doc} MontaQry
Função que busca os registros na tabela P01
@type function
@author nogueira.candido
@since 25/09/2023
/*/
Static Function MontaQry(aMonitor)
Local cAlias := "P01"
BeginSql alias cAlias
SELECT
P01_ID,
P01_STATUS,
P01_DATA,
P01_HORA,
P01_DTPROC,
P01_HRPROC,
P01_FILORI,
P01_ROTINA
FROM
%table:P01%
WHERE
P01_DATA BETWEEN %exp:MV_PAR01% AND %exp:MV_PAR02% AND
P01_ROTINA BETWEEN %exp:MV_PAR03% AND %exp:MV_PAR04% AND
P01_STATUS BETWEEN %exp:MV_PAR05% AND %exp:MV_PAR06% AND
%notDel%
EndSql
While ! (P01->(EoF()))
AADD(aMonitor,{P01->(P01_ID),;
P01->(P01_STATUS),;
P01->(P01_DATA),;
P01->(P01_HORA),;
P01->(P01_DTPROC),;
P01->(P01_HRPROC),;
P01->(P01_FILORI),;
P01->(P01_ROTINA)})
P01->(DbSkip())
EndDo
P01->(dbCloseArea())
return
Além de corrigir o erro, eu recomendo você salvar a workarea anterior com FWGetArea
e FWRestArea
e também utilizar a função getNextAlias
para não utilizar um alias fixo em sua query, algo assim:
/*/{Protheus.doc} MontaQry
Função que busca os registros na tabela P01
@type function
@author nogueira.candido
@since 25/09/2023
/*/
Static Function MontaQry(aMonitor)
Local cAlias as character
Local aArea as array
aArea := FWGetArea()
cAlias := GetNextAlias()
BeginSql alias cAlias
SELECT
P01_ID,
P01_STATUS,
P01_DATA,
P01_HORA,
P01_DTPROC,
P01_HRPROC,
P01_FILORI,
P01_ROTINA
FROM
%table:P01%
WHERE
P01_DATA BETWEEN %exp:MV_PAR01% AND %exp:MV_PAR02% AND
P01_ROTINA BETWEEN %exp:MV_PAR03% AND %exp:MV_PAR04% AND
P01_STATUS BETWEEN %exp:MV_PAR05% AND %exp:MV_PAR06% AND
%notDel%
EndSql
While ! ((cAlias)->(EoF()))
AADD(aMonitor,{(cAlias)->(P01_ID),;
(cAlias)->(P01_STATUS),;
(cAlias)->(P01_DATA),;
(cAlias)->(P01_HORA),;
(cAlias)->(P01_DTPROC),;
(cAlias)->(P01_HRPROC),;
(cAlias)->(P01_FILORI),;
(cAlias)->(P01_ROTINA)})
(cAlias)->(DbSkip())
EndDo
(cAlias)->(dbCloseArea())
FWRestArea(aArea)
return
Documentações:
https://tdn.totvs.com/display/framework/FwRestArea
https://tdn.totvs.com/display/framework/FwGetArea
https://tdn.totvs.com/display/framework/Embedded+SQL
https://tdn.totvs.com/display/tec/DBCloseArea