Tempo aproximado para leitura: 00:01:45 min
Ocorrência
Ao tentar realizar a Captação de Entrada de Custos no módulo Processamento de Custos do Agro Multicultivo, o processamento é interrompido apresentando a seguinte mensagem de erro no log de execução:
Captação não executada. Falha Captando Consumo de Insumos Agrícolas. Erro ORA-00001: restrição exclusiva (PIMSMCPRD.PLC_ENTRADACST_UN) violada , SQLCode: 1 , SQLNextException: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: restrição exclusiva (PIMSMCPRD.PLC_ENTRADACST_UN) violada.
Ambiente
TOTVS Agro – TOTVS Agro – Multicultivos – Custos Agrícola - CST – Versão 12
Causa
O erro ocorre devido à duplicidade de lançamentos de insumos com a mesma combinação de chaves, inseridos por rotinas distintas de entrada de dados. As duplicidades podem ocorrer nas rotinas Aplicação de Insumo Nativa/Antiga AERM0002 / APAPLINSUMO e Apontamento Agrícola do tipo Insumo AERM0019 / AU_APTO_INS_LC_DE. Durante a captação, o Sistema tenta inserir os registros duplicados na tabela PLC_ENTRADACST, violando a restrição de chave única PLC_ENTRADACST_UN.
Solução
Para identificar e corrigir os registros duplicados e concluir a Captação de Entrada de Custos:
1. Identifique a Duplicidade no Banco de Dados;
Execute a consulta SQL abaixo no banco do PIMS MC para localizar exatamente os lançamentos que estão gerando a duplicidade de chaves no período desejado:
WITH BASE AS (
SELECT AP.ID_UNIDADEADM, AP.DT_OPERACAO, AP.ID_CCUSTO, AP.ID_OPERACAO, PS.ID_SAFRA, U3.ID_PERIODOSAFRA, APLC.ID_UPNIVEL3, APLC.ID_INSUMO, IM.ID_UNIMEDIDA, IM.CD_INT_ERP, IMCO.ID_COMPONENTE, IMCO.FG_TP_COMPONENTE, IMCO.ID_UNIMEDIDA ID_UNIMEDIDA_CO, IMCO.ID_CONTACUSTO, SUM(APLC.QT_CONS_TOTAL) QT_TOTAL, SUM(APLC.QT_CONS_TOTAL*APLC.QT_VALOR) QT_VALOR_TOTAL
FROM APAPLINSUMO AP
JOIN APAPLINS_INSLC APLC ON APLC.ID_APAPLINSUMO = AP.ID_APAPLINSUMO
JOIN UPNIVEL3 U3 ON APLC.ID_UPNIVEL3 = U3.ID_UPNIVEL3
JOIN PERIODOSAFRA PS ON U3.ID_PERIODOSAFRA = PS.ID_PERIODOSAFRA
JOIN INSUMO IM ON APLC.ID_INSUMO = IM.ID_INSUMO
LEFT OUTER JOIN (
SELECT DISTINCT CM.ID_UNIDADEADM, INS.ID_INSUMO, CO.ID_COMPONENTE, CO.FG_TP_COMPONENTE, CO.ID_UNIMEDIDA, CO.ID_CONTACUSTO
FROM INSUMO INS
RIGHT JOIN COMPONENTE_MAT CM ON (LPAD(CM.CD_MATERIAL_INI, 30, '0') <= LPAD(INS.CD_INT_ERP, 30, '0') AND LPAD(CM.CD_MATERIAL_FIN, 30, '0') >= LPAD(INS.CD_INT_ERP, 30, '0'))
LEFT JOIN COMPONENTE CO ON CM.ID_COMPONENTE = CO.ID_COMPONENTE
WHERE CM.ID_UNIDADEADM = :ID_UNIDADEADM
) IMCO ON IM.ID_INSUMO = IMCO.ID_INSUMO
WHERE AP.ID_UNIDADEADM = :ID_UNIDADEADM
AND (AP.DT_OPERACAO BETWEEN :DT_INICIO AND :DT_FIM)
GROUP BY AP.ID_UNIDADEADM, AP.DT_OPERACAO, AP.ID_CCUSTO, AP.ID_OPERACAO, PS.ID_SAFRA, U3.ID_PERIODOSAFRA, APLC.ID_UPNIVEL3, APLC.ID_INSUMO, IM.ID_UNIMEDIDA, IM.CD_INT_ERP, IMCO.ID_COMPONENTE, IMCO.FG_TP_COMPONENTE, IMCO.ID_UNIMEDIDA, IMCO.ID_CONTACUSTO
UNION ALL
SELECT AP.ID_UNIDADEADM, AP.DT_OPERACAO, APLCDE.ID_CCUSTO, AP.ID_OPERACAO, PS.ID_SAFRA, U3.ID_PERIODOSAFRA, APLCDE.ID_UPNIVEL3, APLC.ID_INSUMO, IM.ID_UNIMEDIDA, IM.CD_INT_ERP, IMCO.ID_COMPONENTE, IMCO.FG_TP_COMPONENTE, IMCO.ID_UNIMEDIDA ID_UNIMEDIDA_CO, IMCO.ID_CONTACUSTO, SUM(COALESCE(APLCDE.QT_CONS_CONV, APLCDE.QT_CONS_TOTAL)) QT_TOTAL, SUM(COALESCE(APLCDE.QT_CONS_CONV, APLCDE.QT_CONS_TOTAL)*APLCDE.QT_VALOR) QT_VALOR_TOTAL
FROM AU_APTO_INS_LC_DE APLCDE
JOIN AU_APTO_INS_LC APLC ON (APLCDE.ID_AU_APTO_INS_LC = APLC.ID_AU_APTO_INS_LC)
JOIN AU_APTO AP ON (APLC.ID_AU_APTO = AP.ID_AU_APTO)
JOIN AU_APTO_INS AP_INS ON (AP_INS.ID_AU_APTO = AP.ID_AU_APTO AND APLC.ID_AU_APTO_INS = AP_INS.ID_AU_APTO_INS)
JOIN UPNIVEL3 U3 ON APLCDE.ID_UPNIVEL3 = U3.ID_UPNIVEL3
JOIN PERIODOSAFRA PS ON U3.ID_PERIODOSAFRA = PS.ID_PERIODOSAFRA
JOIN INSUMO IM ON APLC.ID_INSUMO = IM.ID_INSUMO
LEFT OUTER JOIN (
SELECT DISTINCT CM.ID_UNIDADEADM, INS.ID_INSUMO, CO.ID_COMPONENTE, CO.FG_TP_COMPONENTE, CO.ID_UNIMEDIDA, CO.ID_CONTACUSTO
FROM INSUMO INS
RIGHT JOIN COMPONENTE_MAT CM ON (LPAD(CM.CD_MATERIAL_INI, 30, '0') <= LPAD(INS.CD_INT_ERP, 30, '0') AND LPAD(CM.CD_MATERIAL_FIN, 30, '0') >= LPAD(INS.CD_INT_ERP, 30, '0'))
LEFT JOIN COMPONENTE CO ON CM.ID_COMPONENTE = CO.ID_COMPONENTE
WHERE CM.ID_UNIDADEADM = :ID_UNIDADEADM
) IMCO ON IM.ID_INSUMO = IMCO.ID_INSUMO
WHERE AP.ID_UNIDADEADM = :ID_UNIDADEADM
AND (AP.DT_OPERACAO BETWEEN :DT_INICIO AND :DT_FIM)
AND APLCDE.ID_CCUSTO IS NOT NULL
AND COALESCE(APLCDE.QT_CONS_CONV, APLCDE.QT_CONS_TOTAL) > 0
GROUP BY AP.ID_UNIDADEADM, AP.DT_OPERACAO, APLCDE.ID_CCUSTO, AP.ID_OPERACAO, PS.ID_SAFRA, U3.ID_PERIODOSAFRA, APLCDE.ID_UPNIVEL3, APLC.ID_INSUMO, IM.ID_UNIMEDIDA, IM.CD_INT_ERP, IMCO.ID_COMPONENTE, IMCO.FG_TP_COMPONENTE, IMCO.ID_UNIMEDIDA, IMCO.ID_CONTACUSTO
), DUP AS (
SELECT ID_UNIDADEADM, DT_OPERACAO, ID_CCUSTO, ID_OPERACAO, ID_SAFRA, ID_PERIODOSAFRA, ID_UPNIVEL3, ID_INSUMO, ID_COMPONENTE, ID_CONTACUSTO
FROM BASE
GROUP BY ID_UNIDADEADM, DT_OPERACAO, ID_CCUSTO, ID_OPERACAO, ID_SAFRA, ID_PERIODOSAFRA, ID_UPNIVEL3, ID_INSUMO, ID_COMPONENTE, ID_CONTACUSTO
HAVING COUNT(*) > 1
)
SELECT B.DT_OPERACAO, U3.CD_UPNIVEL3, OP.CD_OPERACAO, IM.CD_INSUMO, IM.DE_INSUMO, CO.CD_COMPONENTE, B.QT_TOTAL
FROM BASE B
JOIN DUP D ON (D.ID_UNIDADEADM = B.ID_UNIDADEADM
AND D.DT_OPERACAO = B.DT_OPERACAO
AND D.ID_CCUSTO = B.ID_CCUSTO
AND D.ID_OPERACAO = B.ID_OPERACAO
AND D.ID_UPNIVEL3 = B.ID_UPNIVEL3
AND D.ID_INSUMO = B.ID_INSUMO
AND NVL(D.ID_COMPONENTE,-1) = NVL(B.ID_COMPONENTE,-1))
LEFT JOIN UPNIVEL3 U3 ON U3.ID_UPNIVEL3 = B.ID_UPNIVEL3
LEFT JOIN OPERACAO OP ON OP.ID_OPERACAO = B.ID_OPERACAO
LEFT JOIN INSUMO IM ON IM.ID_INSUMO = B.ID_INSUMO
LEFT JOIN COMPONENTE CO ON CO.ID_COMPONENTE = B.ID_COMPONENTE
ORDER BY B.DT_OPERACAO, U3.CD_UPNIVEL3, IM.CD_INSUMO;
2. Elimine o Registro em Duplicidade;
Avalie os registros retornados pela consulta;
Acesse no Sistema a rotina correspondente ao Apontamento Agrícola (Insumos)
AERM0019e também a rotina de Apontamento de Insumos - Nativa (caso utilize);Localize o lançamento duplicado e realize a sua exclusão/cancelamento.
3. Reprocessando a Captação.
Acesse novamente a rotina de Captação de Entrada de Custos.
Execute o reprocessamento referente ao mês afetado.
Confirme que o processo foi concluído com sucesso sem apresentar erros de restrição exclusiva.
0 Comentários