Á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.

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

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