Validação da Quantidade de Reserva Exclusiva dos Pedidos
Segue abaixo o conceito da reserva exclusiva do pedido. Um pedido possuirá reserva exclusiva quando esse estiver vinculado em uma pré-fatura que não esteja com a situação "9 - Cancelada" ou "4 - Faturada".
O pedido também possuirá reserva exclusiva quando estiver vinculado à uma nota fiscal que estiver com a situação "1 - Digitada". A transação da nota fiscal precisa estar integrada com uma transação de estoque do tipo "ESN", "ESF", "ESC", "ESR", "ESB", ou seja, ela precisa movimentar estoque.
1) Qual o problema:
Quantidade de reserva exclusiva dos pedidos incoerente, que pode fazer com que os pedidos fiquem com a situação dos itens e/ou cabeçalho incorretas.
Quantidades de reserva exclusiva incoerentes podem impossibilitar o uso do pedido em notas e pré-faturas e/ou ocasionar atualizações do estoque incorretas.
2) Passo a passo para corrigir:
2.1) Diagnóstico: executar o select para buscar itens de pedido que estão com a quantidade de reserva exclusiva incorreta.
SELECT TAB.* FROM (
SELECT E120IPD.CODEMP, E120IPD.CODFIL, E120IPD.NUMPED, E120IPD.SEQIPD,
E120IPD.QTDRAE RAEPED,
( SELECT ISNULL(SUM(PES.QTDPPF),0)
FROM E135PES PES
WHERE PES.CODEMP = E120IPD.CODEMP
AND PES.FILPED = E120IPD.CODFIL
AND PES.NUMPED = E120IPD.NUMPED
AND PES.SEQIPD = E120IPD.SEQIPD
AND PES.SITPES NOT IN (9, 4) ) RAEPFA,
( SELECT ISNULL(SUM(IPV.QTDFAT),0)
FROM E140IPV IPV, E140NFV NFV
WHERE IPV.CODEMP = E120IPD.CODEMP
AND IPV.FILPED = E120IPD.CODFIL
AND IPV.NUMPED = E120IPD.NUMPED
AND IPV.SEQIPD = E120IPD.SEQIPD
AND IPV.CODEMP = NFV.CODEMP
AND IPV.CODFIL = NFV.CODFIL
AND IPV.CODSNF = NFV.CODSNF
AND IPV.NUMNFV = NFV.NUMNFV
AND NFV.SITNFV = '1'
AND ( SELECT COUNT(*)
FROM E001INT
WHERE E001INT.CODTNS = IPV.TNSPRO
AND E001INT.CODEMP = IPV.CODEMP
AND E001INT.MODINT IN ('ESN', 'ESF', 'ESC', 'ESR', 'ESB') ) > 0 )
RAENFV
FROM E120IPD
LEFT JOIN E135PES ON (E120IPD.CODEMP = E135PES.CODEMP
AND E120IPD.CODFIL = E135PES.FILPED
AND E120IPD.NUMPED = E135PES.NUMPED
AND E120IPD.SEQIPD = E135PES.SEQIPD )
LEFT JOIN E140IPV ON (E120IPD.CODEMP = E140IPV.CODEMP
AND E120IPD.CODFIL = E140IPV.CODFIL
AND E120IPD.NUMPED = E140IPV.NUMPED
AND E120IPD.SEQIPD = E140IPV.SEQIPD )
WHERE E120IPD.SEQCVP = 0
SeuFiltroAqui
GROUP BY E120IPD.CODEMP, E120IPD.CODFIL, E120IPD.NUMPED, E120IPD.SEQIPD, E120IPD.QTDRAE
) TAB
WHERE RAEPED <> (RAEPFA + RAENFV)
Observação
Pode ser adicionado um filtro customizado ao comando SQL, substituindo a linha que contém o texto SeuFiltroAqui. Caso não for necessária a utilização de um filtro, retire a linha que contém o texto SeuFiltroAqui.
Nesse filtro pode ser feito uso de qualquer campo das seguintes tabelas: tabela de item do pedido (Vendas - Pedidos - Itens de Produto (E120IPD)), tabela de item da análise (Vendas - Análise de Embarque - Itens de Serviço e Produto (E135PES)) ou tabela de item da nota fiscal de saída (Vendas - Notas Fiscais de Saída - Itens de Produtos (E140IPV)).
Exemplo de filtro de um pedido em específico:
AND E120IPD.CODEMP = 1
AND E120IPD.CODFIL = 1
AND E120IPD.NUMPED= 23
Exemplo de filtro de uma análise em específico:
AND E135PES.CODEMP = 1
AND E135PES.CODFIL = 1
AND E135PES.NUMANE = 23
Exemplo de filtro de uma nota em específico:
AND E140IPV.CODEMP = 1
AND E140IPV.CODFIL = 1
AND E140IPV.CODSNF= "NE"
AND E140IPV.NUMNFV= 23
2.2) Comando update para alterar a quantidade de reserva exclusiva dos pedidos com base no que existe em pré-faturas e notas.
Atenção
Deve ser verificado o comando para casos onde existe integração com sistemas externos.
UPDATE E120IPD SET QTDRAE = ( SELECT ISNULL(SUM(PES.QTDPPF),0)
FROM E135PES PES
WHERE PES.CODEMP = E120IPD.CODEMP
AND PES.FILPED = E120IPD.CODFIL
AND PES.NUMPED = E120IPD.NUMPED
AND PES.SEQIPD = E120IPD.SEQIPD
AND ( PES.SITPES <> 9
AND PES.SITPES <> 4) )
+
( SELECT ISNULL(SUM(IPV.QTDFAT),0)
FROM E140IPV IPV, E140NFV NFV
WHERE IPV.CODEMP = E120IPD.CODEMP
AND IPV.FILPED = E120IPD.CODFIL
AND IPV.NUMPED = E120IPD.NUMPED
AND IPV.SEQIPD = E120IPD.SEQIPD
AND IPV.CODEMP = NFV.CODEMP
AND IPV.CODFIL = NFV.CODFIL
AND IPV.CODSNF = NFV.CODSNF
AND IPV.NUMNFV = NFV.NUMNFV
AND NFV.SITNFV = '1'
AND ( SELECT COUNT(*)
FROM E001INT
WHERE CODTNS = IPV.TNSPRO
AND CODEMP = IPV.CODEMP
AND MODINT IN ('ESN', 'ESF', 'ESC', 'ESR', 'ESB') ) > 0 )
WHERE QTDRAE <> (( SELECT ISNULL(SUM(PES.QTDPPF),0)
FROM E135PES PES
WHERE PES.CODEMP = E120IPD.CODEMP
AND PES.FILPED = E120IPD.CODFIL
AND PES.NUMPED = E120IPD.NUMPED
AND PES.SEQIPD = E120IPD.SEQIPD
AND ( PES.SITPES <> 9
AND PES.SITPES <> 4) )
+
( SELECT ISNULL(SUM(IPV.QTDFAT),0)
FROM E140IPV IPV, E140NFV NFV
WHERE IPV.CODEMP = E120IPD.CODEMP
AND IPV.FILPED = E120IPD.CODFIL
AND IPV.NUMPED = E120IPD.NUMPED
AND IPV.SEQIPD = E120IPD.SEQIPD
AND IPV.CODEMP = NFV.CODEMP
AND IPV.CODFIL = NFV.CODFIL
AND IPV.CODSNF = NFV.CODSNF
AND IPV.NUMNFV = NFV.NUMNFV
AND NFV.SITNFV = '1'
AND ( SELECT COUNT(*)
FROM E001INT
WHERE CODTNS = IPV.TNSPRO
AND CODEMP = IPV.CODEMP
AND MODINT IN ('ESN', 'ESF', 'ESC', 'ESR', 'ESB') ) > 0 ))
SeuFiltroAqui
Observação
Assim como no passo 2.1, aqui também poderá ser adicionado um filtro customizado ao comando SQL, substituindo a linha que contém o texto SeuFiltroAqui. Caso não for necessária a utilização de um filtro, retire a linha que contém o texto SeuFiltroAqui.
Nesse filtro pode ser feito uso de qualquer campo das seguintes tabelas: tabela de item do pedido (Vendas - Pedidos - Itens de Produto (E120IPD)), tabela de item da análise (Vendas - Análise de Embarque - Itens de Serviço e Produto (E135PES)) ou tabela de item da nota fiscal de saída (Vendas - Notas Fiscais de Saída - Itens de Produtos (E140IPV)).
Exemplo de filtro de um pedido em específico:
AND E120IPD.CODEMP = 1
AND E120IPD.CODFIL = 1
AND E120IPD.NUMPED= 23
Exemplo de filtro de uma análise em específico:
AND E135PES.CODEMP = 1
AND E135PES.CODFIL = 1
AND E135PES.NUMANE = 23
Exemplo de filtro de uma nota em específico:
AND E140IPV.CODEMP = 1
AND E140IPV.CODFIL = 1
AND E140IPV.CODSNF= "NE"
AND E140IPV.NUMNFV= 23
2.3) Habilitar a rotina de validação da quantidade de reserva exclusiva dos pedidos.
3) Rotina de validação da quantidade de reserva exclusiva dos pedidos:
Com essa rotina será possível verificar se as quantidades de reserva exclusiva do pedido estão corretas e apresentar/logar a informação para o cliente.
3.1) Como ativar a rotina:
Ela é ativada pelos parâmetros globais RaePedAnt e RaePedPos, podendo ter os seguintes valores: "P - Perguntar", "E - Erro", "L1 - Log simples", "L2 - Log aprimorado" ou "N - Não Validar". Poderá ser informado apenas um dos valores mencionados, ou uma combinação destes.
Regras de preenchimento
- Se for informada a letra "N" nesses parâmetros, nenhuma outra opção será considerada e não entrará na rotina.
- Também não é possível informar a letra "P - Perguntar" junto da letra "E - Erro".
- Recomenda-se evitar o uso simultâneo dos parâmetros globais "L1" e "L2", pois isso resultaria em redundância de informações.
Pré-requisitos
- A opção "L1" não exige nenhum pré-requisito para ser utilizada.
- Para que a opção "L2" funcione, é necessário que o parâmetro global GerLogPed esteja com valor igual a "S - Sim" e que um dos valores contidos no parâmetro dinâmico PEDIDO.LOG.OPERACOES seja igual à "D - Depuração".
Observação
- O parâmetro global tem abrangência a nível de empresa e filial.
- A cada tentativa de log, o sistema verifica o valor do parâmetro global que habilita a rotina na base de dados, nunca em memória. Isso foi feito para que seja possível habilitar/desabilitar o recurso sem a necessidade de reiniciar o sistema/middleware.
3.2) Como a rotina funciona
Quando são encontradas divergências na quantidade de reserva exclusiva dos pedidos, antes e/ou depois do processamento das rotinas em que essa validação se aplica (a depender do parâmetro global utilizado e da configuração de cada um), o sistema pode perguntar ao usuário o que deve ser feito, gerar um erro, logar ou não validar.
3.3) Como desabilitar a rotina em emergências
O recurso deve ser desabilitado mediante a alteração de algum dos parâmetros globais por meio da tela Manutenção dos parâmetros globais do sistema (F000PGS). Em emergências, caso não seja possível acessar essa tela, pode-se desabilitar por meio do comando SQL de Update abaixo:
UPDATE E000PXF
SET VLRCMP = 'N'
WHERE CODEMP = Informe o Código da Empresa aqui.
AND CODFIL = Informe o Código da Filial aqui.
AND CODUSU = 0
AND IDFFRM = '$PARAMETROS_GLOBAIS_SAPIENS$'
AND CMPFRM = Informe o Parâmetro Global que deseja desabilitar aqui.
3.4) A rotina é executada nas seguintes telas, processos automáticos e web service:
* Formação de Cargas (via Pedidos) (F135FCP)
* Exclusão de Cargas (F135ECA)
* Formação de Cargas Via Produtos (F135FCA)
* Inclusão de Pedidos na Carga (F135IPC)
* Manutenção de Pré-faturas (F135MPF)
* Faturamento Agrupado de Cargas (F149GNA)
* Atendimento Automático de Pedidos (Análise de embarque) (F135AEA)
* Processo automático 01 - Análise de Embarque
* Processo automático 145 - Integração Pré-fatura
* Web service com.senior.g5.co.mcm.ven.prefatura, porta CancelarPreFatura
3.5) Como consultar os dados salvos em log:
Para consultar as divergências encontradas pela validação da quantidade de reserva exclusiva, deve-se proceder de uma das seguintes formas:
- Quando o parâmetro global RaePedAnt ou RaePedPos tiver um "L1", o sistema salvará um registro dentro da tabela Cadastros - Log Genérico (E000LOG) com as informações referentes ao processo, gravando na coluna nomtab o valor "ValidarRaePedido". Para trazer todas as ocorrências utilizar o select abaixo:
SELECT * FROM E000LOG WHERE NOMTAB='ValidarRaePedido';
- Quando o parâmetro global RaePedAnt ou RaePedPos tiver um "L2" e atender aos pré-requisitos descritos anteriormente, o sistema salvará um registro dentro da tabela de usuário (USU_T120PEDLOG), a qual existe somente quando habilitado o log de operações de pedido. Para trazer todas as ocorrências utilizar o select abaixo:
SELECT * FROM USU_T120PEDLOG;
4) Onde o sistema pode e onde não pode executar a validação
Os parâmetros dinâmicos PEDIDO.VALIDARQTDRAE.ONDE.PERMITE e PEDIDO.VALIDARQTDRAE.ONDE.NAOPERMITE definem as telas, rotinas e web services em que a validação da quantidade reservada exclusivamente de um pedido poderá, respectivamente, ser executada e não executada.
Como o sistema usa os dois parâmetros para saber se a validação será ou não realizada
O sistema executa os passos na ordem descrita abaixo. Quando, no entanto, não é permitida a validação, o restante dos passos não é seguido.
1. Se existe informação dentro do parâmetro PEDIDO.VALIDARQTDRAE.ONDE.NAOPERMITE e a tela, rotina e/ou web service executado está listado dentro do parâmetro, então não ocorre validação. Os demais passos não são executados.
2. Se não existe informação dentro do parâmetro PEDIDO.VALIDARQTDRAE.ONDE.NAOPERMITE, então o sistema passa para o passo 3.
3. Se existe informação dentro do parâmetro PEDIDO.VALIDARQTDRAE.ONDE.PERMITE e a tela, rotina e/ou web service executado está listado dentro do parâmetro, então ocorre validação. Os demais passos não são executados.
4. Se não existe informação dentro do parâmetro PEDIDO.VALIDARQTDRAE.ONDE.PERMITE, então ocorre a validação. Os demais passos não são executados.
5. Se não há informação em nenhum dos parâmetros, então ocorre a validação.
Exemplo: Geração de uma pré-fatura pela tela Formação de Cargas (via Pedidos) (F135FCP).
Lista | Valor | Resultado |
---|---|---|
Não Permite | (vazio) | Pode validar. |
Permite | (vazio) | Pode validar. |
Vai executar a validação: sim.
Lista | Valor | Resultado |
---|---|---|
Não Permite | F135FCP | Não pode validar. Dessa forma, nem chega a executar a lista "Permite". |
Permite | (vazio) | - |
Vai executar a validação: não.
Lista | Valor | Resultado |
---|---|---|
Não Permite | (vazio) | Pode validar. |
Permite | F135FCP | Pode validar. |
Vai executar a validação: sim.
Lista | Valor | Resultado |
---|---|---|
Não Permite | F135FCP | Não pode validar. Dessa forma, nem chega a executar a lista "Permite". |
Permite | F135FCP | - |
Vai executar a validação: não.
Lista | Valor | Resultado |
---|---|---|
Não Permite | F135ECA | Pode validar. |
Permite | (vazio) | Pode validar. |
Vai executar a validação: sim.
Lista | Valor | Resultado |
---|---|---|
Não Permite | F135ECA | Pode validar. |
Permite | F135ECA | Não pode validar. |
Vai executar a validação: não.
Lista | Valor | Resultado |
---|---|---|
Não Permite | (vazio) | Pode validar. |
Permite | F135ECA | Não pode validar. |
Vai executar a validação: não.
Observação
Ao utilizar um processo automático que usa a tela para processamento, serão considerados tanto o nome da tela quanto o código da rotina do processo automático. O mesmo acontece com web services que utilizem a tela para processamento.