Árvore de páginas


CONTEÚDO

  1. Visão Geral
  2. Parâmetro
  3. Pontos de Entrada - ADVPL
  4. Pontos de Entrada - Procedure


01. VISÃO GERAL

Durante a execução do recálculo do custo médio (MATA330), o saldo final do período é atualizado na tabela de saldos físico/financeiro (SB2) e, caso o ambiente onde a execução ocorre seja operado por vários usuários, pode ocorrer concorrência na gravação da tabela SB2, causando lentidão no recálculo do custo e em outros processos.

Ao habilitar o parâmetro MV_A330SB2, o recálculo do custo médio passa a considerar a tabela TR2XXSP (onde XX é o código do grupo de empresas) como a tabela de saldos físico/financeiro para a execução, minimizando a concorrência com a SB2. Ao término do recálculo, antes da geração dos lançamentos contábeis, os saldos finais* calculados na TR2 são gravados na SB2 conforme disponibilidade dos registros.

Antes de habilitar o parâmetro, o cliente deve avaliar em seu ambiente se possui customizações que possam ser impactadas pela alteração da tabela de saldos físico/financeiro. Os tópicos abaixo listam os pontos de entradas que podem ser impactados.

Atenção

O parâmetro MV_A330SB2 estará disponível para os releases 12.1.33 e 12.1.2210; a partir da 12.1.2310, o parâmetro passará a ser obsoleto, pois a funcionalidade estará sempre ativa.

Tabela TR2

A tabela TR2XXSP é uma tabela auxiliar para processamento do recálculo e, por isso, não faz parte do dicionário de dados

Atenção

A tabela TR2 é de uso EXCLUSIVO da rotina Recálculo do Custo Médio (MATA330) e de suas procedures.

*O saldo final é aquele gravado nos campos abaixo:

CampoTítulo

B2_QFIM      

Saldo em qtde no fim mes 

B2_VFIM1      

Valor final p/transferir
B2_VFIM2  Val.final 2a moeda p/tran
B2_VFIM3  Val.final 3a moeda p/tran
B2_VFIM4  Val.final 4a moeda p/tran
B2_VFIM5  Val.final 5a moeda p/tran
B2_QFIM2  Qtd. Fim mes 2a UM       
B2_CMFF1  Custo Unit. do prod. FIFO
B2_CMFF2Custo Unit. do prod. FIFO
B2_CMFF3Custo Unit. do prod. FIFO
B2_CMFF4Custo Unit. do prod. FIFO
B2_CMFF5Custo Unit. do prod. FIFO
B2_VFIMFF1Val.final p/transferir   
B2_VFIMFF2Val.final 2a moeda p/tran
B2_VFIMFF3Val.final 3a moeda p/tran
B2_VFIMFF4Val.final 4a moeda p/tran
B2_VFIMFF5Val.final 5a moeda p/tran
B2_QFIMFF Saldo em qtde no fim mes 
B2_CMFIM1 Custo unitario do produto
B2_CMFIM2 Custo unitario do produto
B2_CMFIM3 Custo unitario do produto
B2_CMFIM4 Custo unitario do produto
B2_CMFIM5 Custo unitario do produto
B2_CM11Custo Unitario do produto
B2_CM21Custo unit. na 2a moeda  
B2_CM31Custo unit. na 3a moeda  
B2_CM41Custo unit. na 4a moeda  
B2_CM51Custo unit. na 5a moeda  
B2_CMRP1Custo Unitario Reposicao 
B2_CMRP2Rep. Unit. na 2a. Moeda  
B2_CMRP3Rep. Unit. na 3a. Moeda  
B2_CMRP4Rep. Unit. na 4a. Moeda  
B2_CMRP5Rep. Unit. na 5a. Moeda  
B2_VFRP1Valor Final de Reposicao 
B2_VFRP2Vlr. Final Reposicao 2a M
B2_VFRP3Vlr. Final Reposicao 3a M
B2_VFRP4Vlr. Final Reposicao 4a M
B2_VFRP5Vlr. Final Reposicao 5a M

1 O Custo médio unitário é atualizado somente para produtos do tipo Mão de Obra (MOD), por compatibilidade com o parâmetro desabilitado.


Quando o parâmetro MV_A330GRV estiver com o conteúdo .F. (ou seja, o recálculo do custo médio não processa produtos obsoletos), a tabela TR2 será gravada somente com os produtos/locais que possuem saldo ou movimentação no período, minimizando o volume de gravações no banco de dados. Caso seja necessário, os pontos de entrada da rotina deverão ser avaliados, caso estejam tentando acessar produtos não gravados na TR2.

02. Parâmetro

CampoConteúdo
NomeMV_A330SB2
Tipo3-Lógico
Conteúdo.F./.T.
Descrição.F. - o MATA330 utiliza a tabela SB2 para o processamento ou .T. o Recálculo utiliza a tabela TR2 para o processamento e, ao término, grava na SB2.

Uso de Procedures

Para correta execução do recálculo, sempre que o conteúdo do parâmetro MV_A330SB2 for alterado, é necessário reinstalar o pacote de procedures 19 - Custo médio através do configurador, para assegurar que as procedures instaladas acessem a tabela TR2XXSP e não a SB2XX0.

03. Pontos de Entrada - ADVPL

Abaixo estão listados os pontos de entrada que podem ser impactados ao habilitar o parâmetro MV_A330SB2.

A ativação do parâmetro MV_A330SB2 altera o Alias SB2, passando a apontar para a tabela TR2XXSP e deixa de ler a tabela SB2XX0 durante a execução dos pontos de entrada abaixo, entretanto, como somente os campos de quantidade, valor e custo médio finais são gravados na SB2, é necessário avaliar se outros campos da SB2 estão sendo lidos ou gravados, e realizar ajustes de acordo com a necessidade. Da mesma forma, caso sejam feitas consultas utilizando queries na SB2, com a função RetSqlName, será necessário compatibilizar para ler da tabela TR2XXSP.

Ponto de entradaDescrição
MA330CTBCustomização após o recálculo contábil
MA330TRBManipulação do arquivo TRB antes do processamento do recálculo
MA330SEQPermite alterar a ordem de recálculo do custo médio, alterando o campo TRB->TRB_ORDEM
MA330D1Chamado após a atualização dos valores de saldo final com dados da nota de entrada (SD1)
MA330D2Chamado após a atualização dos valores de saldo final com dados de nota de saída (SD2)
MA330D3Chamado após a atualização dos valores de saldo final com dados de movimentações internas (SD3)
M330CD2Altera o custo médio unitário da Nota Fiscal de Saída
M330CD1Manipula custo em parte nas notas de entrada
MA330C3Manipula array de custo médio
MA330P3Alterar o valor do custo médio em partes de movimentos internos 
A330CDEVContabilização dos movimentos de devolução de compras
MA330ALValida filtro do armazém
M330CMUAltera o custo médio unificado para os produtos
MA330PRCDesliga o processo de transferência de materiais no recálculo do custo médio
MA330TRFPermite manipular o custo da nota de origem na transferência entre filiais durante o recálculo
MA330UNIFiltragem de Armazem na Aglutinação de Custos
CRIASB2Caso durante a execução do recálculo seja identificado que não existe SB2 para um movimento a ser processado, o ponto de entrada será chamado duas vezes, uma para gravar a TR2 e outra para gravar a SB2.
MTCNFDVDevolução de Venda
MTCNFDVPAltera Custo da Nota Fiscal
A330E6CPVerifica se mantém o custo em partes para movimentos internos.
A330D1CPMantém custos em partes já informados no recálculo do custo médio.
MA330MODCustomiza calculo do custo de mão-de-obra
A330GRUPConsidera Grupo Contábil.
A330DECCCria cálculo customizado de despesa de centro de custo
A330QTMORealiza ajustes na quantidade apurada da mão-de-obra.
M330FCCFiltro utilizado na seleção das contas processadas pelas MOD (Em Query)
CONVUMTratar o cálculo da quantidade nas unidades de medida
M330PSB6Customiza o custo de terceiros no recálculo do custo médio

Atenção!

Caso o ambiente do cliente possua algum dos pontos de entrada acima e, nestes programas, realize algum acesso à tabela SB2 para leitura ou gravação, deverá ser avaliado a necessidade de compatibilização do ponto de entrada.


Abaixo, é apresentado um exemplo hipotético de regra de negócio em ponto de entrada que pode ser impactado e os ajustes necessários para corrigir.

MA330AL
#INCLUDE 'totvs.ch'

User Function MA330AL()
    Local aArea := GetArea()
    Local cArmazem := "20" // Armazém que NÃO deseja recalcular custo médio
    Local lRet := .T.
 
    If SB2->B2_LOCAL == cArmazem
        lRet := .F.
    Endif
 
    RestArea(aArea)
Return lRet // Retorno Lógico, sendo .T. para recalcular armazém e .F. para não recalcular

No exemplo acima, embora seja feito acesso à SB2, não é necessário alterar o tratamento, pois com o parâmetro MV_A330SB2 habilitado, o Alias SB2 já aponta para a tabela TR2XXSP corretamente.

Caso a regra acima esteja escrita desta forma:

MA330AL
#INCLUDE 'totvs.ch'

User Function MA330AL()
    Local aArea := GetArea()
    Local cArmazem := "20" // Armazém que NÃO deseja recalcular custo médio
	Local cQuery   := ""
	Local cAlTmp   := ""
    Local lRet := .T.

	cQuery := " Select B2_LOCAL From "+RetSqlName("SB2")+" "
	cQuery += "  Where R_E_C_N_O_ = "+cValToChar(SB2->(Recno()))

	cAlTmp := MPSysOpenQuery(cQuery)
 
    If !(cAlTmp)->(EoF()) .And. (cAlTmp)->B2_LOCAL == cArmazem
        lRet := .F.
    Endif
	
	(cAlTmp)->(DbCloseArea())
 
    RestArea(aArea)
Return lRet // Retorno Lógico, sendo .T. para recalcular armazém e .F. para não recalcular

Será necessário corrigir a query, pois o RetSqlName retorna SB2XX0, mas a rotina deve ler os campos da TR2XXSP:

MA330AL
#INCLUDE 'totvs.ch'

User Function MA330AL()
    Local aArea := GetArea()
    Local cArmazem := "20" // Armazém que NÃO deseja recalcular custo médio
	Local cQuery   := ""
	Local cAlTmp   := ""
	Local cAlSB2   := RetSqlName("SB2")
    Local lRet := .T.
	Local lA330SB2 := SuperGetMV("MV_A330SB2")

	If  lA330SB2
		cAlSB2 := "TR2"+cEmpAnt+"SP"
	EndIf

	cQuery := " Select B2_LOCAL From "+ cAlSB2 +" "
	cQuery += "  Where R_E_C_N_O_ = "+cValToChar(SB2->(Recno()))

	cAlTmp := MPSysOpenQuery(cQuery)
 
    If !(cAlTmp)->(EoF()) .And. (cAlTmp)->B2_LOCAL == cArmazem
        lRet := .F.
    Endif
	
	(cAlTmp)->(DbCloseArea())
 
    RestArea(aArea)
Return lRet // Retorno Lógico, sendo .T. para recalcular armazém e .F. para não recalcular


Abaixo é apresentado outro exemplo, onde ocorre a gravação de campos na SB2

MA330D1
#INCLUDE 'totvs.ch'  User Function MA330D1()
    Local cFornece := '000001' //Dados do fornecedor - pode ser lido de parâmetro
    Local cLoja    := '01'     //ou outra tabela para a customização

    //Fornecedor da nota se enquadra na regra X
    If SD1->D1_FORNECE == cFornece .And. SD1->D1_LOJA == cLoja
        If RecLock('SB2', .F.)
            //Faz com que o valor de custo considerado seja o total da nota e não o custo
            SB2->B2_VFIM1  := B2_VFIM1 - SD1->D1_CUSTO + SD1->D1_TOTAL
            //Acumula o custo total deste fornecedor
            SB2->B2_XCTTOT += SD1->D1_CUSTO
            SB2->B2_CMFIM1 := B2_VFIM1 / B2_QFIM
            SB2->(MsUnlock())
        EndIf
    EndIf

Return

No exemplo acima, a gravação dos campos B2_VFIM1 e B2_CMFIM1 está correta e, ao término do recálculo, será gravada na SB2 conforme esperado, entretanto, o campo B2_XCTTOT, por não fazer parte dos campos de saldo final padrão, não será gravado na SB2, sendo necessário reavaliar o cenário customizado para adequar o ponto de entrada.

04. Pontos de Entrada - Procedure

Durante a execução do recálculo, as procedures são utilizadas para preparar o arquivo TRB e iniciar os dados na SB2, e, por conta disso, é preciso avaliar se as procedures abaixo estão instaladas no banco de dados fazendo algum acesso à tabela SB2XX0. Caso estejam, deve ser alterado para que acesse a tabela TR2XXSP

ProcedureDescrição
MA330ALValida filtro do armazém
MA330SEQPermite alterar a ordem de recálculo do custo médio
M330CMUAltera o custo médio unificado para os produtos
MA330CPDefine regras para classificação de matéria-prima
M330INB2CPGravar os Valores finais no SB2 com o CUSTO EM PARTES
M330INC2CPAtualiza partes do custo em partes no SC2

Uso de Procedures

Caso o ambiente do cliente possua algum dos pontos de entrada acima e, nestas procedures, realize algum acesso à tabela SB2 para leitura ou gravação, deverá ser avaliado a necessidade de compatibilização do ponto de entrada.


Abaixo é apresentado um exemplo hipotético de regra de negócio em um ponto de entrada escrito em procedure para MSSQL que precisaria ser ajustado:

MA330AL
USE [P12127MNTDBEXP]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Procedure creation
ALTER PROCEDURE [dbo].[MA330AL_T1] (
    @IN_FILIALCOR Char( 8) ,
    @IN_COD Char( 30) ,
    @IN_LOCAL Char( 2) ,
    @IN_RECNOSB2 Integer ,
    @OUT_RESULTADO Char( 01 )  output ) AS
 
-- Declaration of variables
DECLARE @cB2_LOCAL Char(02)

BEGIN
   SET @OUT_RESULTADO  = '0'

   Select @cB2_LOCAL = ISNULL(B2_LOCAL, '  ')
   From SB2990
   Where R_E_C_N_O_ = @IN_RECNOSB2

   IF @cB2_LOCAL = '20' -- Armazém que NÃO deseja recalcular custo médio
   BEGIN
      SET @OUT_RESULTADO  = '1' -- Retorno em caractere, sendo '0' para recalcular armazém e '1' para não recalcular   
   END
END

Onde é feito o select na SB2990, é necessário trocar para TR299SP:

MA330AL
USE [P12127MNTDBEXP]
GO
 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Procedure creation
ALTER PROCEDURE [dbo].[MA330AL_T1] (
    @IN_FILIALCOR Char( 8) ,
    @IN_COD Char( 30) ,
    @IN_LOCAL Char( 2) ,
    @IN_RECNOSB2 Integer ,
    @OUT_RESULTADO Char( 01 )  output ) AS
 
-- Declaration of variables
DECLARE @cB2_LOCAL Char(02)

BEGIN
   SET @OUT_RESULTADO  = '0'

   Select @cB2_LOCAL = ISNULL(B2_LOCAL, '  ')
   From TR299SP
   Where R_E_C_N_O_ = @IN_RECNOSB2

   IF @cB2_LOCAL = '20' -- Armazém que NÃO deseja recalcular custo médio
   BEGIN
      SET @OUT_RESULTADO  = '1' -- Retorno em caractere, sendo '0' para recalcular armazém e '1' para não recalcular   
   END
END