Tempo aproximado para leitura: 00:01:30 min
Ocorrência
Os usuários do nosso PCM a partir do dia de 26/08/26, estão enfrentando problemas ao inserir rotas de manutenção e posterior aberturas de O.S para serviços programados em Rotas de Inspeção.
Ambiente
TOTVS Agro - TOTVS Agro - Bioenergia - Controle Manutenção Industrial - MI – Versão 12
Causa
Falta de Script da função.
Solução
Segue o script:
CREATE OR REPLACE FUNCTION fReprocOsPrpRota( p_nEmp IN NUMBER,
p_dData IN DATE,
p_sUsuario IN VARCHAR2,
p_sRota IN VARCHAR2 ) RETURN NUMBER IS
PRAGMA AUTONOMOUS_TRANSACTION;
nEmp MCPEMPRE.emp_codemp%TYPE;
dData DATE;
sUsuario cacusuario.usu_login%type;
-- Valor de retorno -
-- 0 - não houve ajuste, existe apontamento posterior a esta data -
-- 1 - serviços ajustados -
-- 9 - não houve nenhum processamento, nenhum serviço para reprocessar -
nRet NUMBER(1);
-- identificar os serviços com data igual ou superior ao reprocessamento -
CURSOR cServ IS
SELECT s.id_servrota
FROM MCPSERVROTA s,
MCPPONTO p,
MCPMIS m,
MCPMODPERIOD d
WHERE s.id_ponto = p.id_ponto AND
p.id_mis = m.id_mis AND
s.mod_codmodper = d.mod_codmodper and
m.emp_codemp = nEmp and
--d.mod_lubri = '1' and
nvl( p.pon_ativo, '0' ) = '1' and
nvl( s.ser_ativo, '0' ) = '1' and
( ( m.mis_status = 'A' AND
m.mis_atuini <= dData AND
m.mis_atufim >= dData ) OR
m.mis_status = 'P' ) and
INSTR( p_sRota, s.id_rota ) > 0 and
nvl( s.ser_ult_proc, fSysdateLocal ) >= dData;
rServ cServ%ROWTYPE;
-- verificar se existe alguma OS de PRP gerada após a data de reprocessamento e -
-- que tenha algum apontamento -
CURSOR COS IS
select o.emp_codemp,
o.ord_codos
from mcpordem o,
mcplubrif l,
mcpmodperiod d,
mcpinspeclub i,
mcpinspecocorr c,
mcprotas r
where o.emp_codemp = l.emp_codemp and
o.ord_codos = l.ord_codos and
o.mod_codmodper = d.mod_codmodper and
l.id_lubrif = i.id_lubrif(+) and
i.id_insplub = c.id_insplub(+) and
r.mod_codmodper = o.mod_codmodper and
o.emp_codemp = nemp and
o.ord_dtexecprp >= ddata and
instr( p_sRota, r.id_rota ) > 0 and
--d.mod_lubri = '1' and
( l.res_codigo is not null or c.ins_valreal is not null );
rOs COS%ROWTYPE;
BEGIN
nEmp := p_nEmp;
dData := p_dData;
sUsuario := p_sUsuario;
nRet := 9;
-- verificar se existem serviços gerados após a data solicitada -
OPEN cServ;
FETCH cServ INTO rServ;
IF cServ%FOUND THEN
-- verificar se existe apontamento em OSs de data superior ao reprocessamento -
-- caso existam, não poderá haver reprocessamento -
-- do contrário, as OSs deverão ser canceladas -
OPEN COS;
FETCH COS INTO rOs;
IF COS%NOTFOUND THEN
-- cancelar as OS de PRP posterior a data do processamento -
UPDATE MCPORDEM SET
ord_status = '5',
ord_obs = 'CANCELADA DEVIDO SOLICITAÇÃO DE REPROCESSAMENTO'
WHERE emp_codemp = nEmp and
ord_tipo = 'P' AND
INSTR( p_sRota, id_rota ) > 0 and
ord_dtexecprp >= dData;
-- atualizar a data dos serviços -
UPDATE MCPSERVROTA SET
--ser_ult_proc = ser_ult_proc - ( TRUNC( ( ser_ult_proc - dData ) / NVL( ser_frequencia, 1 ) + 1, 0 ) * nvl( ser_frequencia, 1 ) )
ser_ult_proc = ser_ult_proc - ( TRUNC( ( ser_ult_proc - dData ) / decode( ser_frequencia, null, 1, 0, 1, ser_frequencia ) + 1, 0 ) * decode( ser_frequencia, null, 1, 0, 1, ser_frequencia ) )
WHERE ser_ult_proc >= dData AND
INSTR( p_sRota, id_rota ) > 0 and
id_servrota IN ( SELECT s.id_servrota
FROM MCPSERVROTA s,
MCPPONTO p,
MCPMIS m,
MCPMODPERIOD d
WHERE s.id_ponto = p.id_ponto AND
s.mod_codmodper = d.mod_codmodper and
p.tip_codigo is null and
p.id_mis = m.id_mis AND
m.emp_codemp = nEmp );
-- ajustar a data do último processamento -
UPDATE MCPCONFGERAL SET
con_ultproc = dData
WHERE emp_codemp = nEmp;
pr_GravaLogDetalhe( 201, 'GERAÇÃO DE OS DE PRP POR ROTA',
'CANCELADAS OSS GERADAS NA DATA: '||to_char( dData, 'dd/mm/yyyy' )||' - ROTA(S): '||
p_sRota||' - PELO USUÁRIO: '||pk_SetaParametros.fGetUsuario );
COMMIT;
-- valores ajustados para um novo processamento -
nRet := 1;
ELSE
-- existe apontamento posterior a esta data -
nRet := 0;
pr_GravaLogDetalhe( 201, 'GERAÇÃO DE OS DE PRP POR ROTA',
'TENTATIVA MALSUCEDIDA DE GERAÇÃO DE OS DE PRP (EXISTEM APONTAMENTOS POSTERIORES) NA DATA: '||to_char( dData, 'dd/mm/yyyy' )||' - ROTA(S): '||
p_sRota||' - PELO USUÁRIO: '||pk_SetaParametros.fGetUsuario );
END IF;
CLOSE COS;
CLOSE cServ;
END IF;
RETURN nRet;
END;
0 Comentários