Sugerimos usar a referencia mais atualizada do link : Custo em Partes - Recálculo do Custo Médio
Custo em Partes - Recálculo do Custo Médio
Descrição dos procedimentos para utilização do custo em partes com e sem stored procedures.
O recálculo do custo médio possibilita dividir o custo de produtos fabricados em mais de uma parte, facilitando a visualização da composição de custos dos produtos acabados.
O sistema permite dividir o custo de produtos fabricados em até 99 partes diferentes, cada parte nas 5 moedas padrão do sistema.
O usuário deve através do ponto de entrada "MA330CP" definir as regras que irão classificar cada matéria-prima em uma parte do custo. O número de partes é sempre acrescido de mais uma parte, a qual contempla os materiais que não se encontram em nenhuma regra.
Utilização do Custo em Partes somente em ADVPL
Para definir a regra de utilização do custo em partes, deve-se utilizar o ponto de entrada MA330CP. Abaixo segue um exemplo do ponto de entrada.
Ponto de entrada MA330CP ( desenvolvido em linguagem AdvPL):
#include "RWMAKE.CH" User Function MA330CP () LOCAL aRegraCP:={} AADD(aRegraCP,"SB1->B1_TIPO == 'MP'") AADD(aRegraCP,"SB1->B1_TIPO == 'MC'") Return aRegraCP
Utilizando o exemplo descrito, é possível verificar o custo divido em três partes:
· A parte 1 composta dos valores de produtos que tenham o campo B1_TIPO = "MP"
· A parte 2 composta dos valores de produtos que tenham o campo B1_TIPO = "MC"
· A parte 3 composta dos valores de produtos que não se enquadram nas partes citadas anteriormente
Para utilizar o custo em partes devem ser criados alguns campos no sistema seguindo as regras e nomes do quadro abaixo. Se o ponto de entrada que define as regras do custo existir e os campos não forem criados, a rotina de recálculo do custo processará o recálculo do custo desconsiderando o custo em partes.
Os campos devem ser definidos utilizando a seguinte regra:
CC – Numero do Custo Em Partes
MM – Numero da Moeda (1 a 5)
TABELA | CAMPOS |
---|---|
SB9 – Saldos Iniciais | B9_CP + CC + MM (Custo em partes) – B9_VINI1 B9_CPM + CC + MM (Custo em partes Unitário) – B9_CM1 |
SB2 – Saldos em Estoque | B2_CP + CC + MM (Custo em partes Unitário) – B2_CM1 B2_CPF + CC + MM (Custo em partes Final) – B2_VFIM1 |
SB6 – Saldos em poder de terceiros | B6_CP + CC + MM (Custo em partes) – B6_CUSTO1 |
SC2 – Ordens de Produção | C2_CPF + CC + MM (Custo em partes Final) – C2_VFIM1 C2_CPI + CC + MM (Custo em partes Inicial) – C2_VINI1 C2_API + CC + MM (Apropriação Inicial do Custo em partes) – C2_APRINI1 C2_APF + CC + MM (Apropriação Final do Custo em partes) – C2_APRFIM1 |
SD1 – Itens das NFs de Entrada | D1_CP + CC + MM (Custo em partes) – D1_CUSTO |
SD2 – Itens das NFs de Saída | D2_CP + CC + MM (Custo em partes) – D2_CUSTO1 |
SD3 – Movimentos Internos | D3_CP+ CC + MM (Custo em partes) – D2_CUSTO1 |
Para processar o custo em partes em ADVPL, as procedures padrões não devem estar instaladas. Exemplo: se o processo 17 (Virada de Saldos) estiver instalado e as procedures do Custo em Partes não existirem no banco de dados, o sistema não atualizará as informações do custo em partes nas tabelas envolvidas.
Utilização do Custo em Partes com Stored Procedures
A utilização do custo em partes com stored procedures é mais complexa que a utilização em ADVPL, pois, envolve a linguagem de programação SQL. Para definir a regra do custo em partes, é necessário utilizar o ponto de entrada MA330CP em ADVPL e, também, em Stored Procedure além de algumas stored procedures adicionais. Veja um exemplo de todo o procedimento a ser implementado para o correto funcionamento do custo em partes com stored procedures.
Ponto de entrada MA330CP ( desenvolvido em linguagem AdvPL):
#include "RWMAKE.CH" User Function MA330CP () LOCAL aRegraCP:={} AADD(aRegraCP,"SB1->B1_TIPO == 'MP'") AADD(aRegraCP,"SB1->B1_TIPO == 'MC'") Return aRegraCP
Ponto de entrada MA330CP (Ponto de entrada desenvolvido em Linguagem SQL):
IMPORTANTE : Como as regras das partes variam de Cliente para Cliente, os exemplos em procedure a seguir, são apenas para referencia e foram criados baseados na regra acima, portanto todas procedures devem ser ajustadas para o ambiente e regra do Cliente. Lembramos também que existe um KCS relativo ao tema no link : https://centraldeatendimento.totvs.com/hc/pt-br/articles/360062926213-Cross-Segmento-Backoffice-Linha-Protheus-SIGAEST-Custo-em-Partes-Conceito-e-Configura%C3%A7%C3%A3o#:~:text=Este%20processo%20%C3%A9%20chamado%20de,em%20uma%20parte%20do%20custo |
-- Criacao de procedure CREATE PROCEDURE MA330CP_99 ( @IN_FILIALCOR Char( 02 ) , @IN_COD Char( 15) , @OUT_RESULTADO Integer output ) AS -- Declarações de variáveis DECLARE @cFil_SB1 Char( 2) DECLARE @cB1_TIPO Char( 2) BEGIN EXEC XFILIAL_19_99 'SB1' , @IN_FILIALCOR , @cFil_SB1 output SELECT @cB1_TIPO = B1_TIPO FROM SB1990 WHERE B1_FILIAL = @cFil_SB1 and B1_COD = @IN_COD and D_E_L_E_T_ = ' ' SET @OUT_RESULTADO = 3 IF @cB1_TIPO = 'MP' BEGIN SET @OUT_RESULTADO = 1 END IF @cB1_TIPO = 'MC' BEGIN SET @OUT_RESULTADO = 2 END END
1. O ponto de entrada MA330CP foi escrito em linguagem SQL. Caso esteja utilizando outro gerenciador de banco de dados, é necessário fazer a compatibilização da linguagem escrita.
2. O nome da stored procedure deverá ser compatibilizada de acordo com o ambiente do cliente. Exemplo:
Caso o cliente esteja utilizando a Empresa 01, deve alterar a chamada da procedure MA330CP_99 para MA330CP_01 e, também, alterar a chamada da procedure XFILIAL_19_99 para XFILIAL_19_01.
Caso não seja feita essa alteração, e seja mantida a chamada XFILIAL_19_99, ao salvar a procedure no banco de dados será apresentada a seguinte mensagem:
"O módulo 'MA330CP_01' depende do objeto ausente 'XFILIAL_19_99'. O módulo ainda será criado; entretanto, não poderá ser executado com êxito até o objeto existir."
Caso o cliente esteja utilizando a Empresa 01, é necessário alterar o nome físico da tabela SB1990 para SB1010.
3. A implementação do custo em partes exige um grau elevado de conhecimentos em stored procedures. Desta forma, é recomendado que o procedimento descrito seja efetuado por um profissional qualificado TOTVS.
Utilizando o exemplo, é possível verificar o custo divido em três partes:
· A parte 1 composta dos valores de produtos que tenham o campo B1_TIPO = "MP"
· A parte 2 composta dos valores de produtos que tenham o campo B1_TIPO = "MC"
· A parte 3 composta dos valores de produtos que não se enquadram nas partes citadas
Para utilizar o custo em partes devem ser criados alguns campos no sistema seguindo as regras e nomes, conforme quadro abaixo. Se o ponto de entrada que define as regras do custo existir e os campos não forem criados, a rotina de recálculo do custo processará o recálculo do custo desconsiderando o custo em partes.
Os campos devem ser definidos utilizando a seguinte regra:
CC – Numero do Custo Em Partes
MM – Numero da Moeda (1 a 5)
TABELA | CAMPOS |
---|---|
SB9 – Saldos Iniciais | B9_CP + CC + MM (Custo em partes) – B9_VINI1 B9_CPM + CC + MM (Custo em partes Unitário) – B9_CM1 |
SB2 – Saldos em Estoque | B2_CP + CC + MM (Custo em partes Unitário) – B2_CM1 B2_CPF + CC + MM (Custo em partes Final) – B2_VFIM1 |
SB6 – Saldos em poder de terceiros | B6_CP + CC + MM (Custo em partes) – B6_CUSTO1 |
SC2 – Ordens de Produção | C2_CPF + CC + MM (Custo em partes Final) – C2_VFIM1 C2_CPI + CC + MM (Custo em partes Inicial) – C2_VINI1 C2_API + CC + MM (Apropriação Inicial do Custo em partes) – C2_APRINI1 C2_APF + CC + MM (Apropriação Final do Custo em partes) – C2_APRFIM1 |
SD1 – Itens das NFs de Entrada | D1_CP + CC + MM (Custo em partes) – D1_CUSTO |
SD2 – Itens das NFs de Saída | D2_CP + CC + MM (Custo em partes) – D2_CUSTO1 |
SD3 – Movimentos Internos | D3_CP+ CC + MM (Custo em partes) – D2_CUSTO1 |
Stored Procedure M330INB2CP
-- Criacao de procedure ALTER PROCEDURE M330INB2CP_99 ( @IN_FILIALCOR Char( 02 ) , @IN_DINICIO Char( 08 ) , @IN_CUSUNIF Char( 01 ) , @IN_COD Char( 15 ) , @IN_LOCAL Char( 2 ) , @IN_RECNOSB2 Integer ) AS -- Declarações de variáveis DECLARE @nB2_VFIM1 Float DECLARE @nB2_VFIM2 Float DECLARE @nB2_VFIM3 Float DECLARE @nB2_VFIM4 Float DECLARE @nB2_VFIM5 Float -- Custo em Partes Total DECLARE @nB9_CP0101 Float DECLARE @nB9_CP0102 Float DECLARE @nB9_CP0103 Float DECLARE @nB9_CP0104 Float DECLARE @nB9_CP0105 Float DECLARE @nB9_CP0201 Float DECLARE @nB9_CP0202 Float DECLARE @nB9_CP0203 Float DECLARE @nB9_CP0204 Float DECLARE @nB9_CP0205 Float DECLARE @nB9_CP0301 Float DECLARE @nB9_CP0302 Float DECLARE @nB9_CP0303 Float DECLARE @nB9_CP0304 Float DECLARE @nB9_CP0305 Float -- Custo em Partes Unitário DECLARE @nB9_CPM0101 Float DECLARE @nB9_CPM0102 Float DECLARE @nB9_CPM0103 Float DECLARE @nB9_CPM0104 Float DECLARE @nB9_CPM0105 Float DECLARE @nB9_CPM0201 Float DECLARE @nB9_CPM0202 Float DECLARE @nB9_CPM0203 Float DECLARE @nB9_CPM0204 Float DECLARE @nB9_CPM0205 Float DECLARE @nB9_CPM0301 Float DECLARE @nB9_CPM0302 Float DECLARE @nB9_CPM0303 Float DECLARE @nB9_CPM0304 Float DECLARE @nB9_CPM0305 Float DECLARE @nParte Integer DECLARE @nQtd Float DECLARE @cFil_SB9 Char( 02 ) DECLARE @iRecnoTRT Integer BEGIN EXEC XFILIAL_19_99 'SB9' , @IN_FILIALCOR , @cFil_SB9 output UPDATE SB2990 WITH (ROWLOCK) SET B2_CPF0101= 0, B2_CPF0102= 0, B2_CPF0103= 0, B2_CPF0104= 0, B2_CPF0105= 0 , B2_CPF0201= 0, B2_CPF0202= 0, B2_CPF0203= 0, B2_CPF0204= 0, B2_CPF0205= 0 , B2_CPF0301= 0, B2_CPF0302= 0, B2_CPF0303= 0, B2_CPF0304= 0, B2_CPF0305= 0 , B2_CP0101 = 0, B2_CP0102 = 0, B2_CP0103 = 0, B2_CP0104 = 0, B2_CP0105 = 0 , B2_CP0201 = 0, B2_CP0202 = 0, B2_CP0203 = 0, B2_CP0204 = 0, B2_CP0205 = 0 , B2_CP0301 = 0, B2_CP0302 = 0, B2_CP0303 = 0, B2_CP0304 = 0, B2_CP0305 = 0 WHERE R_E_C_N_O_ = @IN_RECNOSB2 IF SUBSTRING ( @IN_COD , 1 , 3 ) <> 'MOD' BEGIN SELECT @nB9_CP0101 = ISNULL (B9_CP0101,0), @nB9_CP0102 = ISNULL (B9_CP0102,0), @nB9_CP0103 = ISNULL (B9_CP0103,0), @nB9_CP0104 = ISNULL (B9_CP0104,0), @nB9_CP0105 = ISNULL (B9_CP0105,0), @nB9_CP0201 = ISNULL (B9_CP0201,0), @nB9_CP0202 = ISNULL (B9_CP0202,0), @nB9_CP0203 = ISNULL (B9_CP0203,0), @nB9_CP0204 = ISNULL (B9_CP0204,0), @nB9_CP0205 = ISNULL (B9_CP0205,0), @nB9_CP0301 = ISNULL (B9_CP0301,0), @nB9_CP0302 = ISNULL (B9_CP0302,0), @nB9_CP0303 = ISNULL (B9_CP0303,0), @nB9_CP0304 = ISNULL (B9_CP0304,0), @nB9_CP0305 = ISNULL (B9_CP0305,0), @nB9_CPM0101 = ISNULL (B9_CPM0101,0), @nB9_CPM0102 = ISNULL (B9_CPM0102,0), @nB9_CPM0103 = ISNULL (B9_CPM0103,0), @nB9_CPM0104 = ISNULL (B9_CPM0104,0), @nB9_CPM0105 = ISNULL (B9_CPM0105,0), @nB9_CPM0201 = ISNULL (B9_CPM0201,0), @nB9_CPM0202 = ISNULL (B9_CPM0202,0), @nB9_CPM0203 = ISNULL (B9_CPM0203,0), @nB9_CPM0204 = ISNULL (B9_CPM0204,0), @nB9_CPM0205 = ISNULL (B9_CPM0205,0), @nB9_CPM0301 = ISNULL (B9_CPM0301,0), @nB9_CPM0302 = ISNULL (B9_CPM0302,0), @nB9_CPM0303 = ISNULL (B9_CPM0303,0), @nB9_CPM0304 = ISNULL (B9_CPM0304,0), @nB9_CPM0305 = ISNULL (B9_CPM0305,0) FROM SB9990 WHERE B9_FILIAL = @cFil_SB9 and B9_COD = @IN_COD and B9_LOCAL = @IN_LOCAL and B9_DATA = ( SELECT MAX ( B9_DATA ) FROM SB9990 WHERE B9_FILIAL = @cFil_SB9 and B9_COD = @IN_COD and B9_LOCAL = @IN_LOCAL and B9_DATA <= @IN_DINICIO and D_E_L_E_T_ <> '*' ) and D_E_L_E_T_ <> '*' END ELSE BEGIN EXEC MA330CP_99 @IN_FILIALCOR , @IN_COD , @nParte output SELECT @nB2_VFIM1 = ISNULL ( B2_VFIM1 , 0 ), @nB2_VFIM2 = ISNULL ( B2_VFIM2 , 0 ), @nB2_VFIM3 = ISNULL ( B2_VFIM3 , 0 ), @nB2_VFIM4 = ISNULL ( B2_VFIM4 , 0 ), @nB2_VFIM5 = ISNULL ( B2_VFIM5 , 0 ) FROM SB2990 WHERE R_E_C_N_O_ = @IN_RECNOSB2 SET @nB9_CP0101 = 0 SET @nB9_CP0102 = 0 SET @nB9_CP0103 = 0 SET @nB9_CP0104 = 0 SET @nB9_CP0105 = 0 SET @nB9_CP0201 = 0 SET @nB9_CP0202 = 0 SET @nB9_CP0203 = 0 SET @nB9_CP0204 = 0 SET @nB9_CP0205 = 0 SET @nB9_CP0301 = 0 SET @nB9_CP0302 = 0 SET @nB9_CP0303 = 0 SET @nB9_CP0304 = 0 SET @nB9_CP0305 = 0 IF @nParte = 1 BEGIN SET @nB9_CP0101 = @nB2_VFIM1 SET @nB9_CP0102 = @nB2_VFIM2 SET @nB9_CP0103 = @nB2_VFIM3 SET @nB9_CP0104 = @nB2_VFIM4 SET @nB9_CP0105 = @nB2_VFIM5 END IF @nParte = 2 BEGIN SET @nB9_CP0201 = @nB2_VFIM1 SET @nB9_CP0202 = @nB2_VFIM2 SET @nB9_CP0203 = @nB2_VFIM3 SET @nB9_CP0204 = @nB2_VFIM4 SET @nB9_CP0205 = @nB2_VFIM5 END IF @nParte = 3 BEGIN SET @nB9_CP0301 = @nB2_VFIM1 SET @nB9_CP0302 = @nB2_VFIM2 SET @nB9_CP0303 = @nB2_VFIM3 SET @nB9_CP0304 = @nB2_VFIM4 SET @nB9_CP0305 = @nB2_VFIM5 END END -- Removendo valores Nulos SET @nB9_CP0101 = ISNULL ( @nB9_CP0101 , 0 ) SET @nB9_CP0102 = ISNULL ( @nB9_CP0102 , 0 ) SET @nB9_CP0103 = ISNULL ( @nB9_CP0103 , 0 ) SET @nB9_CP0104 = ISNULL ( @nB9_CP0104 , 0 ) SET @nB9_CP0105 = ISNULL ( @nB9_CP0105 , 0 ) SET @nB9_CP0201 = ISNULL ( @nB9_CP0201 , 0 ) SET @nB9_CP0202 = ISNULL ( @nB9_CP0202 , 0 ) SET @nB9_CP0203 = ISNULL ( @nB9_CP0203 , 0 ) SET @nB9_CP0204 = ISNULL ( @nB9_CP0204 , 0 ) SET @nB9_CP0205 = ISNULL ( @nB9_CP0205 , 0 ) SET @nB9_CP0301 = ISNULL ( @nB9_CP0301 , 0 ) SET @nB9_CP0302 = ISNULL ( @nB9_CP0302 , 0 ) SET @nB9_CP0303 = ISNULL ( @nB9_CP0303 , 0 ) SET @nB9_CP0304 = ISNULL ( @nB9_CP0304 , 0 ) SET @nB9_CP0305 = ISNULL ( @nB9_CP0305 , 0 ) SET @nB9_CPM0101 = ISNULL ( @nB9_CPM0101 , 0 ) SET @nB9_CPM0102 = ISNULL ( @nB9_CPM0102 , 0 ) SET @nB9_CPM0103 = ISNULL ( @nB9_CPM0103 , 0 ) SET @nB9_CPM0104 = ISNULL ( @nB9_CPM0104 , 0 ) SET @nB9_CPM0105 = ISNULL ( @nB9_CPM0105 , 0 ) SET @nB9_CPM0201 = ISNULL ( @nB9_CPM0201 , 0 ) SET @nB9_CPM0202 = ISNULL ( @nB9_CPM0202 , 0 ) SET @nB9_CPM0203 = ISNULL ( @nB9_CPM0203 , 0 ) SET @nB9_CPM0204 = ISNULL ( @nB9_CPM0204 , 0 ) SET @nB9_CPM0205 = ISNULL ( @nB9_CPM0205 , 0 ) SET @nB9_CPM0301 = ISNULL ( @nB9_CPM0301 , 0 ) SET @nB9_CPM0302 = ISNULL ( @nB9_CPM0302 , 0 ) SET @nB9_CPM0303 = ISNULL ( @nB9_CPM0303 , 0 ) SET @nB9_CPM0304 = ISNULL ( @nB9_CPM0304 , 0 ) SET @nB9_CPM0305 = ISNULL ( @nB9_CPM0305 , 0 ) -- Tratamento para Custo Unificado IF @IN_CUSUNIF = '1' BEGIN SELECT @iRecnoTRT = ISNULL ( MAX ( R_E_C_N_O_ ), 0 ) FROM TRT99SP WHERE TRB_FILIAL = @IN_FILIALCOR AND TRB_COD = @IN_COD IF @iRecnoTRT = 0 BEGIN SELECT @iRecnoTRT = ISNULL ( MAX ( R_E_C_N_O_ ), 0 ) FROM TRT99SP SET @iRecnoTRT = @iRecnoTRT + 1 INSERT INTO TRT99SP (TRB_COD , R_E_C_N_O_ ) VALUES (@IN_COD , @iRecnoTRT ) END SELECT @nQtd = ISNULL ( TRB_QFIM , 0 ) FROM TRT99SP WHERE R_E_C_N_O_ = @iRecnoTRT IF @nQtd = 0 BEGIN SET @nQtd = 1 END -- Atualiza o Custo Unificado UPDATE TRT99SP WITH (ROWLOCK) SET TRB_VF0101 = TRB_VF0101 + @nB9_CP0101, TRB_VF0102 = TRB_VF0102 + @nB9_CP0102, TRB_VF0103 = TRB_VF0103 + @nB9_CP0103, TRB_VF0104 = TRB_VF0104 + @nB9_CP0104, TRB_VF0105 = TRB_VF0105 + @nB9_CP0105, TRB_VF0201 = TRB_VF0201 + @nB9_CP0201, TRB_VF0202 = TRB_VF0202 + @nB9_CP0202, TRB_VF0203 = TRB_VF0203 + @nB9_CP0203, TRB_VF0204 = TRB_VF0204 + @nB9_CP0204, TRB_VF0205 = TRB_VF0205 + @nB9_CP0205, TRB_VF0301 = TRB_VF0301 + @nB9_CP0301, TRB_VF0302 = TRB_VF0302 + @nB9_CP0302, TRB_VF0303 = TRB_VF0303 + @nB9_CP0303, TRB_VF0304 = TRB_VF0304 + @nB9_CP0304, TRB_VF0305 = TRB_VF0305 + @nB9_CP0305, TRB_CP0101 = TRB_VF0101 + (@nB9_CP0101 / @nQtd) , TRB_CP0102 = TRB_VF0102 + (@nB9_CP0102 / @nQtd ), TRB_CP0103 = TRB_VF0103 + (@nB9_CP0103 / @nQtd) , TRB_CP0104 = TRB_VF0104 + (@nB9_CP0104 / @nQtd), TRB_CP0105 = TRB_VF0105 + (@nB9_CP0105 / @nQtd) , TRB_CP0201 = TRB_VF0201 + (@nB9_CP0201 / @nQtd) , TRB_CP0202 = TRB_VF0202 + (@nB9_CP0202 / @nQtd) , TRB_CP0203 = TRB_VF0203 + (@nB9_CP0203 / @nQtd) , TRB_CP0204 = TRB_VF0204 + (@nB9_CP0204 / @nQtd) , TRB_CP0205 = TRB_VF0205 + (@nB9_CP0205 / @nQtd) , TRB_CP0301 = TRB_VF0301 + (@nB9_CP0301 / @nQtd) , TRB_CP0302 = TRB_VF0302 + (@nB9_CP0302 / @nQtd) , TRB_CP0303 = TRB_VF0303 + (@nB9_CP0303 / @nQtd) , TRB_CP0304 = TRB_VF0304 + (@nB9_CP0304 / @nQtd) , TRB_CP0305 = TRB_VF0305 + (@nB9_CP0305 / @nQtd) WHERE R_E_C_N_O_ = @iRecnoTRT END UPDATE SB2990 WITH (ROWLOCK) SET B2_CPF0101 = @nB9_CP0101 , B2_CPF0102 = @nB9_CP0102 , B2_CPF0103 = @nB9_CP0103 , B2_CPF0104 = @nB9_CP0104 , B2_CPF0105 = @nB9_CP0105 , B2_CPF0201 = @nB9_CP0201 , B2_CPF0202 = @nB9_CP0202 , B2_CPF0203 = @nB9_CP0203 , B2_CPF0204 = @nB9_CP0204 , B2_CPF0205 = @nB9_CP0205 , B2_CPF0301 = @nB9_CP0301 , B2_CPF0302 = @nB9_CP0302 , B2_CPF0303 = @nB9_CP0303 , B2_CPF0304 = @nB9_CP0304 , B2_CPF0305 = @nB9_CP0305 WHERE R_E_C_N_O_ = @IN_RECNOSB2 SELECT @nQtd = ISNULL ( B2_QFIM , 0 ) FROM SB2990 WHERE R_E_C_N_O_ = @IN_RECNOSB2 IF @nQtd = 0 BEGIN SET @nQtd = 1 UPDATE SB2010 WITH (ROWLOCK) SET B2_CP0101 = @nB9_CPM0101, B2_CP0102 = @nB9_CPM0102, B2_CP0103 = @nB9_CPM0103, B2_CP0104 = @nB9_CPM0104, B2_CP0105 = @nB9_CPM0105, B2_CP0201 = @nB9_CPM0201, B2_CP0202 = @nB9_CPM0202, B2_CP0203 = @nB9_CPM0203, B2_CP0204 = @nB9_CPM0204, B2_CP0205 = @nB9_CPM0205, B2_CP0301 = @nB9_CPM0301, B2_CP0302 = @nB9_CPM0302, B2_CP0303 = @nB9_CPM0303, B2_CP0304 = @nB9_CPM0304, B2_CP0305 = @nB9_CPM0305 WHERE R_E_C_N_O_ = @IN_RECNOSB2 END ELSE BEGIN UPDATE SB2010 WITH (ROWLOCK) SET B2_CP0101 = @nB9_CP0101 / @nQtd , B2_CP0102 = @nB9_CP0102 / @nQtd , B2_CP0103 = @nB9_CP0103 / @nQtd , B2_CP0104 = @nB9_CP0104 / @nQtd , B2_CP0105 = @nB9_CP0105 / @nQtd , B2_CP0201 = @nB9_CP0201 / @nQtd , B2_CP0202 = @nB9_CP0202 / @nQtd , B2_CP0203 = @nB9_CP0203 / @nQtd , B2_CP0204 = @nB9_CP0204 / @nQtd , B2_CP0205 = @nB9_CP0205 / @nQtd , B2_CP0301 = @nB9_CP0301 / @nQtd , B2_CP0302 = @nB9_CP0302 / @nQtd , B2_CP0303 = @nB9_CP0303 / @nQtd , B2_CP0304 = @nB9_CP0304 / @nQtd , B2_CP0305 = @nB9_CP0305 / @nQtd WHERE R_E_C_N_O_ = @IN_RECNOSB2 END END
Atenção aos tópicos abaixo:
1. O ponto de entrada M330INB2CP foi escrito em linguagem SQL. Caso esteja utilizando outro gerenciador de banco de dados, é necessário fazer a compatibilização da linguagem escrita.
2. O nome da stored procedure deve ser compatibilizada de acordo com o ambiente do cliente. Exemplo:
Se for utilizada a Empresa 01, é necessário alterar a chamada das procedures:
- M330INB2CP_99 para M330INB2CP_01
- XFILIAL_19_99 para XFILIAL_19_01
- MA330CP_99 para MA330CP_01
"O módulo 'MA330CP_01' depende do objeto ausente 'XFILIAL_19_99'. O módulo ainda será criado; entretanto, não poderá ser executado com êxito até o objeto existir."
Se for utilizada a Empresa 01, é necessário alterar o nome físico das seguintes tabelas:
- SB2990 para SB2010
- SB9990 para SB9010
- TRT99SP para TRT01SP
3. A implementação do custo em partes exige um grau elevado de conhecimentos em stored procedures e Protheus. Desta forma, é recomendado que o procedimento seja efetuado por um profissional qualificado TOTVS.
Stored Procedure M330INC2CP
-- Criacao de procedure CREATE PROCEDURE M330INC2CP_99 ( @IN_FILIALCOR Char( 02 ) ) AS -- Declaracoes de variaveis DECLARE @cFil_SC2 Char( 02 ) DECLARE @nMaxRecnoSC2 Integer DECLARE @nRec Integer BEGIN EXEC XFILIAL_19_99 'SC2' , @IN_FILIALCOR , @cFil_SC2 output SELECT @nMaxRecnoSC2 = ISNULL ( MAX ( R_E_C_N_O_ ), 0 ) FROM SC2990 WHERE C2_FILIAL = @cFil_SC2 and D_E_L_E_T_ <> '*' SELECT @nRec = ISNULL ( MIN ( R_E_C_N_O_ ), 0 ) FROM SC2990 WHERE C2_FILIAL = @cFil_SC2 and D_E_L_E_T_ <> '*' WHILE (@nRec <= @nMaxRecnoSC2 ) BEGIN UPDATE SC2010 WITH (ROWLOCK) SET C2_CPF0101 = C2_CPI0101 , C2_CPF0102 = C2_CPI0102 , C2_CPF0103 = C2_CPI0103 , C2_CPF0104 = C2_CPI0104 , C2_CPF0105 = C2_CPI0105 , C2_CPF0201 = C2_CPI0201 , C2_CPF0202 = C2_CPI0202 , C2_CPF0203 = C2_CPI0203 , C2_CPF0204 = C2_CPI0204 , C2_CPF0205 = C2_CPI0205 , C2_CPF0301 = C2_CPI0301 , C2_CPF0302 = C2_CPI0302 , C2_CPF0303 = C2_CPI0303 , C2_CPF0304 = C2_CPI0304 , C2_CPF0305 = C2_CPI0305 , C2_APF0101 = C2_API0101 , C2_APF0102 = C2_API0102 , C2_APF0103 = C2_API0103 , C2_APF0104 = C2_API0104 , C2_APF0105 = C2_API0105 , C2_APF0201 = C2_API0201 , C2_APF0202 = C2_API0202 , C2_APF0203 = C2_API0203 , C2_APF0204 = C2_API0204 , C2_APF0205 = C2_API0205 , C2_APF0301 = C2_API0301 , C2_APF0302 = C2_API0302 , C2_APF0303 = C2_API0303 , C2_APF0304 = C2_API0304 , C2_APF0305 = C2_API0305 , WHERE R_E_C_N_O_ >= @nRec and R_E_C_N_O_ < @nRec + 1024 and C2_FILIAL = @cFil_SC2 and D_E_L_E_T_ <> '*' SET @nRec = @nRec + 1024 END END
Atenção aos tópicos abaixo:
1. O ponto de entrada M330INC2CP foi escrito em linguagem SQL. Se for utilizado outro gerenciador de banco de dados, é necessário compatibilizar a linguagem escrita
2. O nome da stored procedure deve ser compatibilizada de acordo com o ambiente do cliente. Exemplo:
Se for utilizada a Empresa 01, é necessário alterar a chamada das procedures:
- M330INC2CP_99 para M330INC2CP_01
- XFILIAL_19_99 para XFILIAL_19_01
Se não for feita essa alteração e for mantida a chamada XFILIAL_19_99, ao salvar a procedure no banco de dados será apresentada a seguinte mensagem:
"O módulo 'MA330CP_01' depende do objeto ausente 'XFILIAL_19_99'. O módulo ainda será criado; entretanto, não poderá ser executado com êxito até o objeto existir."
Se for utilizada a Empresa 01, é necessário alterar o nome físico da tabela:
- SC2990 para SC2010
3. A implementação do custo em partes exige um grau elevado de conhecimentos em stored procedures e Protheus. Desta forma, é recomendado que o procedimento seja efetuado por um profissional qualificado TOTVS.
Stored Procedure MA280INB9CP
-- Criacao de procedure CREATE PROCEDURE MA280INB9CP_99 ( @IN_FILIALCOR Char( 02 ) , @IN_COD Char( 15 ) , @IN_MV_CUSZERO Char( 01 ) , @IN_RECNOSB9 Integer , @IN_RECNOSB2 Integer , @IN_NDIVISOR Float , @IN_B9_VINI1 Float , @IN_B9_VINI2 Float , @IN_B9_VINI3 Float , @IN_B9_VINI4 Float , @IN_B9_VINI5 Float ) AS -- Declarações de variáveis DECLARE @nB2_CPF0101 Float DECLARE @nB2_CPF0102 Float DECLARE @nB2_CPF0103 Float DECLARE @nB2_CPF0104 Float DECLARE @nB2_CPF0105 Float DECLARE @nB2_CPF0201 Float DECLARE @nB2_CPF0202 Float DECLARE @nB2_CPF0203 Float DECLARE @nB2_CPF0204 Float DECLARE @nB2_CPF0205 Float DECLARE @nB2_CPF0301 Float DECLARE @nB2_CPF0302 Float DECLARE @nB2_CPF0303 Float DECLARE @nB2_CPF0304 Float DECLARE @nB2_CPF0305 Float -- Variáveis de Custo Unitário DECLARE @nB2_CPM0101 Float DECLARE @nB2_CPM0102 Float DECLARE @nB2_CPM0103 Float DECLARE @nB2_CPM0104 Float DECLARE @nB2_CPM0105 Float DECLARE @nB2_CPM0201 Float DECLARE @nB2_CPM0202 Float DECLARE @nB2_CPM0203 Float DECLARE @nB2_CPM0204 Float DECLARE @nB2_CPM0205 Float DECLARE @nB2_CPM0301 Float DECLARE @nB2_CPM0302 Float DECLARE @nB2_CPM0303 Float DECLARE @nB2_CPM0304 Float DECLARE @nB2_CPM0305 Float BEGIN IF @IN_MV_CUSZERO = 'S' BEGIN SET @nB2_CPF0101 = 0 SET @nB2_CPF0102 = 0 SET @nB2_CPF0103 = 0 SET @nB2_CPF0104 = 0 SET @nB2_CPF0105 = 0 SET @nB2_CPF0201 = 0 SET @nB2_CPF0202 = 0 SET @nB2_CPF0203 = 0 SET @nB2_CPF0204 = 0 SET @nB2_CPF0205 = 0 SET @nB2_CPF0301 = 0 SET @nB2_CPF0302 = 0 SET @nB2_CPF0303 = 0 SET @nB2_CPF0304 = 0 SET @nB2_CPF0305 = 0 END ELSE BEGIN SELECT @nB2_CPF0101 = ISNULL(B2_CPF0101,0), @nB2_CPF0102 = ISNULL(B2_CPF0102,0), @nB2_CPF0103 = ISNULL(B2_CPF0103,0), @nB2_CPF0104 = ISNULL(B2_CPF0104,0), @nB2_CPF0105 = ISNULL(B2_CPF0105,0), @nB2_CPF0201 = ISNULL(B2_CPF0201,0), @nB2_CPF0202 = ISNULL(B2_CPF0202,0), @nB2_CPF0203 = ISNULL(B2_CPF0203,0), @nB2_CPF0204 = ISNULL(B2_CPF0204,0), @nB2_CPF0205 = ISNULL(B2_CPF0205,0), @nB2_CPF0301 = ISNULL(B2_CPF0301,0), @nB2_CPF0302 = ISNULL(B2_CPF0302,0), @nB2_CPF0303 = ISNULL(B2_CPF0303,0), @nB2_CPF0304 = ISNULL(B2_CPF0304,0), @nB2_CPF0305 = ISNULL(B2_CPF0305,0), @nB2_CPM0101 = ISNULL(B2_CP0101,0), @nB2_CPM0102 = ISNULL(B2_CP0102,0), @nB2_CPM0103 = ISNULL(B2_CP0103,0), @nB2_CPM0104 = ISNULL(B2_CP0104,0), @nB2_CPM0105 = ISNULL(B2_CP0105,0), @nB2_CPM0201 = ISNULL(B2_CP0201,0), @nB2_CPM0202 = ISNULL(B2_CP0202,0), @nB2_CPM0203 = ISNULL(B2_CP0203,0), @nB2_CPM0204 = ISNULL(B2_CP0204,0), @nB2_CPM0205 = ISNULL(B2_CP0205,0), @nB2_CPM0301 = ISNULL(B2_CP0301,0), @nB2_CPM0302 = ISNULL(B2_CP0302,0), @nB2_CPM0303 = ISNULL(B2_CP0303,0), @nB2_CPM0304 = ISNULL(B2_CP0304,0), @nB2_CPM0305 = ISNULL(B2_CP0305,0) FROM SB2990 WHERE R_E_C_N_O_ = @IN_RECNOSB2 END UPDATE SB9010 WITH (ROWLOCK) SET B9_CP0101 = @nB2_CPF0101, B9_CP0102 = @nB2_CPF0102, B9_CP0103 = @nB2_CPF0103, B9_CP0104 = @nB2_CPF0104, B9_CP0105 = @nB2_CPF0105, B9_CP0201 = @nB2_CPF0201, B9_CP0202 = @nB2_CPF0202, B9_CP0203 = @nB2_CPF0203, B9_CP0204 = @nB2_CPF0204, B9_CP0205 = @nB2_CPF0205, B9_CP0301 = @nB2_CPF0301, B9_CP0302 = @nB2_CPF0302, B9_CP0303 = @nB2_CPF0303, B9_CP0304 = @nB2_CPF0304, B9_CP0305 = @nB2_CPF0305, B9_CPM0101 = @nB2_CPM0101, B9_CPM0102 = @nB2_CPM0102, B9_CPM0103 = @nB2_CPM0103, B9_CPM0104 = @nB2_CPM0104, B9_CPM0105 = @nB2_CPM0105, B9_CPM0201 = @nB2_CPM0201, B9_CPM0202 = @nB2_CPM0202, B9_CPM0203 = @nB2_CPM0203, B9_CPM0204 = @nB2_CPM0204, B9_CPM0205 = @nB2_CPM0205, B9_CPM0301 = @nB2_CPM0301, B9_CPM0302 = @nB2_CPM0302, B9_CPM0303 = @nB2_CPM0303, B9_CPM0304 = @nB2_CPM0304, B9_CPM0305 = @nB2_CPM0305 WHERE R_E_C_N_O_ = @IN_RECNOSB9 END
Atenção aos tópicos abaixo:
1. O ponto de entrada MA280INB9CP escrito em linguagem SQL. Se for utilizado outro gerenciador de banco de dados, é necessário compatibilizar a linguagem escrita.
2. O nome da stored procedure deve ser compatibilizada de acordo com o ambiente do cliente. Exemplo:
Se for utilizada a Empresa 01, é necessário alterar a chamada das procedures:
- MA280INB9CP_99 para MA280INB9CP_01
- XFILIAL_19_99 para XFILIAL_19_01
Se for utilizada a Empresa 01, é necessário alterar o nome físico das tabelas:
- SB2990 para SB2010
- SB9990 para SB9010
3. A implementação do custo em partes exige um grau elevado de conhecimentos em stored procedures e Protheus. Desta forma, é recomendado que o procedimento seja realizado por um profissional qualificado TOTVS.
Stored Procedure MA280INC2CP
-- Criacao de procedure CREATE PROCEDURE MA280INC2CP_99 ( @IN_RECNOSC2 Integer ) AS BEGIN UPDATE SC2990 WITH (ROWLOCK) SET C2_CPI0101 = C2_CPF0101 , C2_CPI0102 = C2_CPF0102 , C2_CPI0103 = C2_CPF0103 , C2_CPI0104 = C2_CPF0104 , C2_CPI0105 = C2_CPF0105 , C2_CPI0201 = C2_CPF0201 , C2_CPI0202 = C2_CPF0202 , C2_CPI0203 = C2_CPF0203 , C2_CPI0204 = C2_CPF0204 , C2_CPI0205 = C2_CPF0205 , C2_CPI0301 = C2_CPF0301 , C2_CPI0302 = C2_CPF0302 , C2_CPI0303 = C2_CPF0303 , C2_CPI0304 = C2_CPF0304 , C2_CPI0305 = C2_CPF0305 , C2_API0101 = C2_APF0101 , C2_API0102 = C2_APF0102 , C2_API0103 = C2_APF0103 , C2_API0104 = C2_APF0104 , C2_API0105 = C2_APF0105 , C2_API0201 = C2_APF0201 , C2_API0202 = C2_APF0202 , C2_API0203 = C2_APF0203 , C2_API0204 = C2_APF0204 , C2_API0205 = C2_APF0205 , C2_API0301 = C2_APF0301 , C2_API0302 = C2_APF0302 , C2_API0303 = C2_APF0303 , C2_API0304 = C2_APF0304 , C2_API0305 = C2_APF0305 WHERE R_E_C_N_O_ = @IN_RECNOSC2 END
Atenção aos tópicos abaixo:
1. O ponto de entrada MA280INC2CP acima foi escrito em linguagem SQL. Se for utilizado outro gerenciador de banco de dados, é necessário compatibilizar a linguagem escrita.
2. O nome da stored procedure deve ser compatibilizada de acordo com o ambiente do cliente. Exemplo:
Se for utilizada a Empresa 01, é necessário alterar a chamada da procedure:
- MA280INC2CP_99 para MA280INC2CP_01
Se for utilizada a Empresa 01, é necessário alterar o nome físico da tabela:
- SC2990 para SC2010
3. A implementação do custo em partes exige um grau elevado de conhecimentos em stored procedures e Protheus. Desta forma, é recomendado que o procedimento seja efetuado por um profissional qualificado TOTVS.
4. A quantidade limite de campos em cada tabela deve ser observada, considerando os campos padrões e os campos criados para o custo em partes, que não deve ultrapassar o limite de 359 campos.
Importante:
Para mais informações sobre o limite de campos, acesse Limite de campos por tabela.
Utilização do parâmetro MV_MUDATRT
Quando o parâmetro MV_MUDATRT estiver configurado como .T. , a referência do grupo de tabelas TR* deve ser alterada para TR*_SP, conforme documentação disponível na URL abaixo: