CONTEÚDO
01. VISÃO GERAL
Nesta página iremos documentar algumas informações importantes sobre a funcionalidade da rotina MATA340 - Inventário.
Quando a rotina estiver sendo processada, algumas checagens serão realizadas e caso alguma inconsistência seja detectada, ao final do processamento, será apresentado o relatório Itens Não Inventariados.
| Aviso |
|---|
|
Os exemplos utilizados nesta documentação são apenas modelos de utilização da rotina automática do fonte ATFA430, é de responsabilidade do cliente efetuar a customização conforme a sua necessidade.Os processos de utilização dos ExecAutos no MVC passam pelas validações padrão dos modelos utilizados, por isso, em caso de inconsistência será apresentado mensagem de erro para que seja ajustadomeramente ilustrativos e a responsabilidade pela correta configuração do sistema é do cliente. |
02.
...
| Informações |
|---|
| icon | false |
|---|
| title | Exemplo de Inclusão |
|---|
|
| Bloco de código |
|---|
| language | c# |
|---|
| theme | Midnight |
|---|
| linenumbers | true |
|---|
| collapse | true |
|---|
| #INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
Static __oModelAut := NIL //variavel oModel para substituir msexecauto em MVC
User Function IncProjImob()
Local nOpcAuto :=0
Local nX
Local oFNB
Local oFNC
Local oFND
Local oFNE
Local aLog
Local cLog :=""
Local lRet := .T.
If __oModelAut == Nil //somente uma unica vez carrega o modelo ATFA430
__oModelAut := FWLoadModel('ATFA430')
EndIf
nOpcAuto := 3 //3 - Inclusão | 4 - Alteração | 5 - Exclusão
__oModelAut:SetOperation(nOpcAuto)
__oModelAut:Activate() //ativa modelo
//---------------------------------------------------------
// Preencho os valores da FNB
//---------------------------------------------------------
oFNB := __oModelAut:GetModel('FNBMASTER')
oFNB:SETVALUE('FNB_FILIAL' ,FNB->(xFilial('FNB')))
oFNB:SETVALUE('FNB_CODPRJ','0000000000')
oFNB:SETVALUE('FNB_REVIS','0001')
oFNB:SETVALUE('FNB_DESC','PROJETO EXEAUTO')
oFNB:SETVALUE('FNB_TIPO','2')
oFNB:SETVALUE('FNB_SBTIPO','1')
oFNB:SETVALUE('FNB_MRGREC' ,'2')
oFNB:SETVALUE('FNB_CBASE' ,'ATFPRJEXEC')
oFNB:SETVALUE('FNB_DTINIC' ,CTOD('01/01/2025'))
//---------------------------------------------------------
// Preencho os valores da FNC
//---------------------------------------------------------
oFNC := __oModelAut:GetModel('FNCDETAIL')
oFNC:SETVALUE('FNC_FILIAL' ,FNC->(xFilial('FNC')))
oFNC:SETVALUE('FNC_CODPRJ','0000000000')
oFNC:SETVALUE('FNC_REVIS','0001')
oFNC:SETVALUE('FNC_ETAPA','001')
oFNC:SETVALUE('FNC_DSCETP','ETAPA 001')
oFNC:SETVALUE('FNC_TIPO','2')
oFNC:SETVALUE('FNC_SBTIPO','1')
oFNC:SETVALUE('FNC_TPAVP','1')
//---------------------------------------------------------
// Preencho os valores da FND
//---------------------------------------------------------
oFND := __oModelAut:GetModel('FNDDETAIL')
oFND:SETVALUE('FND_FILIAL' ,FND->(xFilial('FND')))
oFND:SETVALUE('FND_CODPRJ','0000000000')
oFND:SETVALUE('FND_REVIS','0001')
oFND:SETVALUE('FND_ITEM','001')
oFND:SETVALUE('FND_DSCITE','ITEM 001 ETAPA 001')
oFND:SETVALUE('FND_ETAPA','001')
oFND:SETVALUE('FND_TIPO','2')
oFND:SETVALUE('FND_CTRATF','1')
oFND:SETVALUE('FND_SBTIPO','1')
oFND:SETVALUE('FND_DTPROV' ,CTOD('01/01/2025'))
oFND:SETVALUE('FND_PERINI' ,CTOD('01/01/2025'))
oFND:SETVALUE('FND_PERFIM' ,CTOD('31/01/2025'))
oFND:SETVALUE('FND_PRVEXC' ,CTOD('31/01/2025'))
oFND:SETVALUE('FND_VLRPLN' ,10000)
oFND:SETVALUE('FND_TPAVP','1')
//---------------------------------------------------------
// Preencho os valores da FNE
//---------------------------------------------------------
oFNE := __oModelAut:GetModel('FNEDETAIL')
oFNE:SETVALUE('FNE_FILIAL' ,FNE->(xFilial('FNE')))
oFNE:SETVALUE('FNE_CODPRJ','0000000000')
oFNE:SETVALUE('FNE_REVIS','0001')
oFNE:SETVALUE('FNE_ETAPA','001')
oFNE:SETVALUE('FNE_ITEM','001')
oFNE:SETVALUE('FNE_LINHA','001')
oFNE:SETVALUE('FNE_TPCLAS','2')
oFNE:SETVALUE('FNE_TPATF','01')
oFNE:SETVALUE('FNE_TPSALD','1')
oFNE:SETVALUE('FNE_TPDEPR','1')
oFNE:SETVALUE('FNE_DINDEP' ,CTOD('01/01/2025'))
oFNE:SETVALUE('FNE_VORIG' ,10000)
oFNE:SETVALUE('FNE_ENT01B','000001 ') //CONTA DO BEM
oFNE:SETVALUE('FNE_ENT01D','000002 ') //CONTA DE DESPESA DEP
oFNE:SETVALUE('FNE_ENT01A','000003 ') //CONTA DE DEP ACUMULADA
oFNE:SETVALUE('FNE_MOEDRF','01')
If __oModelAut:VldData() //validacao dos dados pelo modelo
__oModelAut:CommitData() //gravacao dos dados
Else
aLog := __oModelAut:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
//laco para gravar em string cLog conteudo do array aLog
For nX := 1 to Len(aLog)
If !Empty(aLog[nX])
cLog += Alltrim(aLog[nX]) + CRLF
EndIf
Next nX
lMsErroAuto := .T. //seta variavel private como erro
AutoGRLog(cLog) //grava log para exibir com funcao mostraerro
mostraerro()
lRet := .F. //retorna false
EndIf
__oModelAut:DeActivate() //desativa modelo
Return( lRet ) |
|
03. EXEMPLO DE UTILIZAÇÃO NA ALTERAÇÃO
| Informações |
|---|
| icon | false |
|---|
| title | Exemplo de Alteração |
|---|
|
| Bloco de código |
|---|
| language | c# |
|---|
| theme | Midnight |
|---|
| linenumbers | true |
|---|
| collapse | true |
|---|
| #INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
Static __oModelAut := NIL //variavel oModel para substituir msexecauto em MVC User Function AltProjImob()
User Function AltProjImob()
Local nOpcAuto :=0
Local nX
Local oFNB
Local oFNC
Local oFND
Local oFNE
Local aLog
Local cLog :=""
Local lRet := .T.
Local cCodPrj:='0000000000'
Local cCodRev:='0001'
Local cCodEtapa:='001'
Local cItemEtp:='001'
Local cLinhaItem:='001'
If __oModelAut == Nil //somente uma unica vez carrega o modelo ATFA430
__oModelAut := FWLoadModel('ATFA430')
EndIf
nOpcAuto := 4 //3 - Inclusão | 4 - Alteração | 5 - Exclusão
__oModelAut:SetOperation(nOpcAuto) // 3 - Inclusão | 4 - Alteração | 5 - Exclusão
__oModelAut:Activate() //ativa modelo
DBSelectArea("FNB")
FNB->(DBSetOrder(1))
If DbSeek( xFilial("FNB") + cCodPrj + cCodRev)
//---------------------------------------------------------
// Preencho os valores da FNB
//---------------------------------------------------------
oFNB := __oModelAut:GetModel('FNBMASTER')
oFNB:SETVALUE('FNB_DESC','PROJETO EXEAUTO ALTERADO')
EndIf
DBSelectArea("FNC")
FNC->(DBSetOrder(1))
If DbSeek( xFilial("FNC") + cCodPrj + cCodRev + cCodEtapa)
//---------------------------------------------------------
// Preencho os valores da FNC
//---------------------------------------------------------
oFNC := __oModelAut:GetModel('FNCDETAIL')
oFNC:SETVALUE('FNC_DSCETP','ETAPA 001 ALTERADA')
EndIf
DBSelectArea("FND")
FND->(DBSetOrder(1))
If DbSeek( xFilial("FND") + cCodPrj + cCodRev + cCodEtapa + cItemEtp)
//---------------------------------------------------------
// Preencho os valores da FND
//---------------------------------------------------------
oFND := __oModelAut:GetModel('FNDDETAIL')
oFND:SETVALUE('FND_DSCITE','ITEM 001 ETAPA 001 ALTERADO')
EndIf
DBSelectArea("FNE")
FNE->(DBSetOrder(1))
If DbSeek( xFilial("FNE") + cCodPrj + cCodRev + cCodEtapa + cLinhaItem)
//---------------------------------------------------------
// Preencho os valores da FNE
//---------------------------------------------------------
oFNE := __oModelAut:GetModel('FNEDETAIL')
oFNE:SETVALUE('FNE_ENT01B','00004 ')
EndIf
If __oModelAut:VldData() //validacao dos dados pelo modelo
__oModelAut:CommitData() //gravacao dos dados
Else
aLog := __oModelAut:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
//laco para gravar em string cLog conteudo do array aLog
For nX := 1 to Len(aLog)
If !Empty(aLog[nX])
cLog += Alltrim(aLog[nX]) + CRLF
EndIf
Next nX
lMsErroAuto := .T. //seta variavel private como erro
AutoGRLog(cLog) //grava log para exibir com funcao mostraerro
mostraerro()
lRet := .F. //retorna false
EndIf
__oModelAut:DeActivate() //desativa modelo
Return( lRet ) |
|
04. EXEMPLO DE UTILIZAÇÃO NA EXCLUSÃO
| Informações |
|---|
| icon | false |
|---|
| title | Exemplo de Exclusão |
|---|
|
| Bloco de código |
|---|
| language | c# |
|---|
| theme | Midnight |
|---|
| linenumbers | true |
|---|
| collapse | true |
|---|
| #INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
Static __oModelAut := NIL //variavel oModel para substituir msexecauto em MVC User Function AltProjImob() User Function ExcProjImob() User Function ExcProjImob()
User Function ExcProjImob()
Local nX
Local aLog
Local cLog :=""
Local lRet := .T.
Local cCodPrj:='0000000000'
Local cCodRev:='0001'
If __oModelAut == Nil //somente uma unica vez carrega o modelo ATFA430
__oModelAut := FWLoadModel('ATFA430')
EndIf
nOpcAuto := 5 //3 - Inclusão | 4 - Alteração | 5 - Exclusão
__oModelAut:SetOperation(nOpcAuto) // 3 - Inclusão | 4 - Alteração | 5 - Exclusão
__oModelAut:Activate() //ativa modelo
DBSelectArea("FNB")
FNB->(DBSetOrder(1))
DbSeek( xFilial("FNB") + cCodPrj + cCodRev)
If __oModelAut:VldData() //validacao dos dados pelo modelo
__oModelAut:CommitData() //gravacao dos dados
Else
aLog := __oModelAut:GetErrorMessage() //Recupera o erro do model quando nao passou no VldData
//laco para gravar em string cLog conteudo do array aLog
For nX := 1 to Len(aLog)
If !Empty(aLog[nX])
cLog += Alltrim(aLog[nX]) + CRLF
EndIf
Next nX
lMsErroAuto := .T. //seta variavel private como erro
AutoGRLog(cLog) //grava log para exibir com funcao mostraerro
mostraerro()
lRet := .F. //retorna false
EndIf
__oModelAut:DeActivate() //desativa modelo
Return( lRet )
|
|
05. ASSUNTOS RELACIONADOS
INCONSISTÊNCIA
02.01. ITENS EMPENHADOS / RESERVADOS NO ARQUIVO SB2/SB8/SBF
A inconsistência Itens empenhados / reservados no arquivo SB2/SB8/SBF será apresentada caso a quantidade empenhada ou reservada seja maior do que a quantidade inventariada.
Para a correta analise dessa inconsistência, deverá ser feito a verificação da configuração do produto, ou seja, se controla rastreabilidade por lote e/ou endereço.
Caso o produto não tenha rastreabilidade ativada por lote e endereço, a quantidade reservada será analisada na tabela SB2 - Saldos Físico e Financeiro.
Caso o produto tenha somente a rastreabilidade por lote ativada, a quantidade empenhada será analisada na tabela SB8 - Saldos por Lote.
Caso o produto tenha a rastreabilidade ativada por lote e endereço ou somente por endereço, a quantidade empenhada será analisada na tabela SBF - Saldos por Endereço.
Exemplo:
Iremos ilustrar como a ordem de produção poderá afetar a geração do relatório Itens Não Inventariados.
Produto acabado
Image Added
Produto matéria prima
Image Added
Estrutura
Image Added
Saldo em estoque
Image Added
Ordem de produção com empenho sem sugestão de endereço
Image Added
Image Added
Image Added
Image Added
Image Added
Cadastro do inventário
Image Added
Processamento do inventário
Image Added
Image Added
Neste cenário, o relatório Itens Não Inventariados não é apresentado, pois o sistema não entende como uma inconsistência um empenho gerado pela ordem de produção que não tinha um endereço informado.
Agora iremos mostrar um cenário onde a ordem de produção terá endereço informado em seu empenho, usando os mesmos cadastros do cenário anterior.
Ordem de produção com empenho e sugestão de endereço
Image Added
Image Added
Image Added
Image Added
Image Added
Cadastro do inventário
Image Added
Processamento do inventário
Image Added
Image Added
Image Added
Neste cenário, o relatório Itens Não Inventariados é apresentado, pois o sistema consegue associar a quantidade empenhada no estoque ao endereço (tabelas SB2 X SBF).
No inventário é solicitado que o saldo do produto MP003 seja zerado no endereço END003, mas há saldo empenhado neste endereço, assim o relatório é apresentado e o inventário não é realizado.
Conclusão
Quando a rastreabilidade por endereço é ativada no produto, é importante que seja informado o endereço nos empenhos das ordens de produção, pois assim o saldo empenhado na tabela SB2 - Saldos Físico e Financeiro terá sua distribuição correta na tabela SBF - Saldos por Endereço. Quando o controle por endereço está ativado no produto, a rotina MATA340 - Inventário buscará o saldo empenhado para o produto e endereço na tabela SBF - Saldos por Endereço, pois o saldo empenhado na tabela SB2 - Saldos Físico e Financeiro é somente o totalizador dos empenhos de todos os endereços daquele produto. Caso os empenhos gerados através de ordens de produção não tenham seus respectivos endereços, não há como saber quais quantidades empenhadas na tabela SB2 - Saldos Físico e Financeiro correspondem ao endereço que está sendo inventariado no momento, dessa forma, o relatório Itens Não Inventariados não entende que há uma inconsistência para o produto e endereço inventariado.
Outro motivo que é importante ser destacado neste momento é que empenhos gerados por ordem de produção sem endereços informados não podem travar o processo de inventário, sendo que muitas empresas não param seus processos de produção durante um inventário físico em seus almoxarifados, da forma explicada anteriormente, garante-se que o inventário somente não ocorra para o produto e endereço específicos.
Vale destacar também que empenhos gerados através de ordem de produção do tipo Prevista não são considerados como inconsistência, pois ainda é incerta sua produção.
03. LISTA ATUAL DE INCONSISTENCIAS
Image Added
04. ASSUNTOS RELACIONADOS