CONTEÚDO
- Visão Geral
- Parâmetro
- Pontos de Entrada - ADVPL
- 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:
Campo | Tí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_CMFF2 | Custo Unit. do prod. FIFO |
B2_CMFF3 | Custo Unit. do prod. FIFO |
B2_CMFF4 | Custo Unit. do prod. FIFO |
B2_CMFF5 | Custo Unit. do prod. FIFO |
B2_VFIMFF1 | Val.final p/transferir |
B2_VFIMFF2 | Val.final 2a moeda p/tran |
B2_VFIMFF3 | Val.final 3a moeda p/tran |
B2_VFIMFF4 | Val.final 4a moeda p/tran |
B2_VFIMFF5 | Val.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_CM11 | Custo Unitario do produto |
B2_CM21 | Custo unit. na 2a moeda |
B2_CM31 | Custo unit. na 3a moeda |
B2_CM41 | Custo unit. na 4a moeda |
B2_CM51 | Custo unit. na 5a moeda |
B2_CMRP1 | Custo Unitario Reposicao |
B2_CMRP2 | Rep. Unit. na 2a. Moeda |
B2_CMRP3 | Rep. Unit. na 3a. Moeda |
B2_CMRP4 | Rep. Unit. na 4a. Moeda |
B2_CMRP5 | Rep. Unit. na 5a. Moeda |
B2_VFRP1 | Valor Final de Reposicao |
B2_VFRP2 | Vlr. Final Reposicao 2a M |
B2_VFRP3 | Vlr. Final Reposicao 3a M |
B2_VFRP4 | Vlr. Final Reposicao 4a M |
B2_VFRP5 | Vlr. 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
Campo | Conteúdo |
---|---|
Nome | MV_A330SB2 |
Tipo | 3-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 entrada | Descrição |
---|---|
MA330CTB | Customização após o recálculo contábil |
MA330TRB | Manipulação do arquivo TRB antes do processamento do recálculo |
MA330SEQ | Permite alterar a ordem de recálculo do custo médio, alterando o campo TRB->TRB_ORDEM |
MA330D1 | Chamado após a atualização dos valores de saldo final com dados da nota de entrada (SD1) |
MA330D2 | Chamado após a atualização dos valores de saldo final com dados de nota de saída (SD2) |
MA330D3 | Chamado após a atualização dos valores de saldo final com dados de movimentações internas (SD3) |
M330CD2 | Altera o custo médio unitário da Nota Fiscal de Saída |
M330CD1 | Manipula custo em parte nas notas de entrada |
MA330C3 | Manipula array de custo médio |
MA330P3 | Alterar o valor do custo médio em partes de movimentos internos |
A330CDEV | Contabilização dos movimentos de devolução de compras |
MA330AL | Valida filtro do armazém |
M330CMU | Altera o custo médio unificado para os produtos |
MA330PRC | Desliga o processo de transferência de materiais no recálculo do custo médio |
MA330TRF | Permite manipular o custo da nota de origem na transferência entre filiais durante o recálculo |
MA330UNI | Filtragem de Armazem na Aglutinação de Custos |
CRIASB2 | Caso 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. |
MTCNFDV | Devolução de Venda |
MTCNFDVP | Altera Custo da Nota Fiscal |
A330E6CP | Verifica se mantém o custo em partes para movimentos internos. |
A330D1CP | Mantém custos em partes já informados no recálculo do custo médio. |
MA330MOD | Customiza calculo do custo de mão-de-obra |
A330GRUP | Considera Grupo Contábil. |
A330DECC | Cria cálculo customizado de despesa de centro de custo |
A330QTMO | Realiza ajustes na quantidade apurada da mão-de-obra. |
M330FCC | Filtro utilizado na seleção das contas processadas pelas MOD (Em Query) |
CONVUM | Tratar o cálculo da quantidade nas unidades de medida |
M330PSB6 | Customiza 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.
#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:
#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:
#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
#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
Procedure | Descrição |
---|---|
MA330AL | Valida filtro do armazém |
MA330SEQ | Permite alterar a ordem de recálculo do custo médio |
M330CMU | Altera o custo médio unificado para os produtos |
MA330CP | Define regras para classificação de matéria-prima |
M330INB2CP | Gravar os Valores finais no SB2 com o CUSTO EM PARTES |
M330INC2CP | Atualiza 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:
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:
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