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.
Importante!
O Custo em partes é basicamente o desmenbramento da composição do custo médio de um produto produzido, facilitando a visualização dos custos de cada parte utilizada na produção e não esta relacionado com o custo de reposição de um produto, que envolve o custo de compra ou aquisição para reposição do estoque.
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/TR2XXSP – 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. Existindo o ponto de entrada MA330CP em ADVPL, a instalação de procedures irá instalar algumas procedures adicionais basicas essenciais ao processo, porem sem tratamentos lógicos devido ao numero de partes não ser fixo, podendo variar para cada cliente. Estas procedures adicionais são M330INB2CP, M330INC2CP para o recalculo do custo medio e MA280INB9CP, MA280INC2CP para o fechamento e seus nomes devem ser mantidos. Por exemplo M330INB2CP_xx, onde xx é o codigo da empresa. Veja um exemplo de todo o procedimento a ser implementado para o correto funcionamento do custo em partes com stored procedures.
Importante!
Caso o ambiente possua o parâmetro MV_A330SB2 configurado como .T., ou release igual ou superior à 12.1.2310, é necessário que as queries onde é feita leitura/atualização da SB2, nas procedures M330INB2CP, M330INC2CP e MA330CP, sejam alteradas para acessar a tabela TR2XXSP, onde XX é o código do grupo de empresas.
Para mais informações, veja: Recálculo do Custo Médio sem concorrência com movimentações de Estoque
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):
-- Criacao de procedure -- ** Esta procedure não é instalada pela instalação de procedures e seu nome não necessariamente deve ser MA330CP -- ** aqui foi usado o mesmo nome do ponto de entrada em ADVPL para melhor entendimento, mas deve ter o nome chamado -- ** logo abaixo no exemplo M330INB2CP_99, Caso a procedure necessite de pesquisar a regra das partes. CREATE PROCEDURE MA330CP_99 ( @IN_FILIALCOR Char( 02 ) , @IN_COD Char( 15) , @OUT_RESULTADO Integer output ) AS -- Declaracoes de variaveis DECLARE @cFil_SB1 Char( 2) DECLARE @cB1_TIPO Char( 2) BEGIN EXEC XFILIAL_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_99 para XFILIAL_01.
Caso não seja feita essa alteração, e seja mantida a chamada XFILIAL_99, ao salvar a procedure no banco de dados será apresentada a seguinte mensagem:
"O módulo 'MA330CP_01' depende do objeto ausente 'XFILIAL_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/TR2XXSP – 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 -- Declaracoes de variaveis DECLARE @nB2_VFIM1 Float DECLARE @nB2_VFIM2 Float DECLARE @nB2_VFIM3 Float DECLARE @nB2_VFIM4 Float DECLARE @nB2_VFIM5 Float 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 DECLARE @nParte Integer DECLARE @nQtd Float DECLARE @cFil_SB9 Char( 02 ) DECLARE @iRecnoTRT Integer BEGIN EXEC XFILIAL_99 'SB9' , @IN_FILIALCOR , @cFil_SB9 output UPDATE SB2990 -- TR299SP, caso release maior ou igual a 12.1.2310, ou parâmetro MV_A330SB2 habilitado 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 , 1 ) <> 'Z' 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) 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 -- TR299SP, caso release maior ou igual a 12.1.2310, ou parâmetro MV_A330SB2 habilitado 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 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 ) 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 TRT010 (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 SELECT @nQtd = 1 END 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 -- TR299SP, caso release maior ou igual a 12.1.2310, ou parâmetro MV_A330SB2 habilitado 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 -- TR299SP, caso release maior ou igual a 12.1.2310, ou parâmetro MV_A330SB2 habilitado WHERE R_E_C_N_O_ = @IN_RECNOSB2 IF @nQtd = 0 BEGIN SELECT @nQtd = 1 END UPDATE SB2990 - TR299SP, caso release maior ou igual a 12.1.2310, ou parâmetro MV_A330SB2 habilitado 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
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_99 para XFILIAL_01
- MA330CP_99 para MA330CP_01
"O módulo 'MA330CP_01' depende do objeto ausente 'XFILIAL_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 ou TR201SP, dependendo do parâmetro MV_A330SB2 ou release (ver: Recálculo do Custo Médio sem concorrência com movimentações de Estoque)
- 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_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_99 para XFILIAL_01
Se não for feita essa alteração e for mantida a chamada XFILIAL_99, ao salvar a procedure no banco de dados será apresentada a seguinte mensagem:
"O módulo 'MA330CP_01' depende do objeto ausente 'XFILIAL_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 -- Declaracoes de variaveis 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 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) FROM SB2990 -- Sempre SB2990, independente da release maior ou igual a 12.1.2310, ou parâmetro MV_A330SB2 habilitado 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 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_99 para XFILIAL_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: