01. DADOS GERAIS

Produto:TOTVS - Folha de Pagamento
Linha de Produto:

Linha RM

Segmento:

RH

Módulo:

TOTVS RH (Linha RM) - Folha de Pagamento (LABORE)

Função:Ficha Financeira
País:Brasil
Requisito/Story/Issue:DRHCALCRM-2901


02. SITUAÇÃO/REQUISITO

Verificar os campos que tem máscara se são calculados para aceitar até 546:07 e caso sim, passar aceitar até 999:59.

03. SOLUÇÃO

Alterar o tipo do campo para int e também a máscara, que só aceita 3 dígitos. Aumentando o tamanho do campo possibilita números maiores. Neste caso teria que também alterar todos os módulos de Lançamento de eventos, como também as grids de lançamentos que tem em módulos como as Retificações, Rescisão Complementar, Entrada de Dados, etc e relatórios.


ATENÇÃO

Para permitir que o TOTVS Folha de Pagamento aceite valor até 999:59 no campo hora, foi necessário criar script de banco de dados para alterar o tipo do campo para int. 

Caso o cliente possua índice (SQL e Oracle) ou estatísticas (SQL) vinculado ao campo hora nas tabelas relacionadas abaixo, poderá retornar erro ao atualizar a base e a mesma ser travada. 

Neste caso recomendamos que seja feito a atualização antes em uma base de homologação e caso ocorra erros referente a marcação LB.2022.08_07, orientamos que os índices (SQL e Oracle) ou estatísticas (SQL) sejam excluídos antes da atualização da base de dados.

Após o processo de atualização ser concluído o com sucesso, é necessário avaliar com o DBA da sua empresa a necessidade de recriar os índices novamente, pois os mesmos podem impactar na performance. 

Lembrando que os clientes possuem autonomia para fazer otimizações para o uso do banco de dados. No caso das tabelas abaixo, por padrão o produto não tem os índices para os campos relacionados.

  • PEVTRELACSALCMP campo:NHORAS
  • PEVTRELACSALCMPCC campo:NHORAS
  • PFENTMOV  campo: HORA  
  • PFFINANC  campo: HORA  
  • PFFINANCCOMPL  campo: HORA  
  • PFHSTENTMOV  campo: HORA  
  • PFMOVCC  campo: HORA  
  • PFMOVCCCOMPL  campo: HORA  
  • PFRESILICAOMOV  campo: HORA  
  • PFVALORFORCADO  campo: HORA  
  • PFVERBAS  campo: HORA  
  • PFVERBASCOMPL  campo: HORA  
  • PFVERBASDIS  campo: HORA  
  • PFVERBASDISFER  campo: HORA  
  • PFVERBASDISFERHIST  campo: HORA  
  • PFVERBASDISHIST  campo: HORA  
  • PORCAMENTOPERFILEVENTOS  campo: HORA  
  • PFMOVTOMADOR  campo: HORA  
  • PFRESILICAOMOVBASE  campo: HORA  
  • PORCAMENTOMOVVALOR  campo: HORA  
  • PPOSTRANSFERENCIA  campo: HORA  
  • PSIMULADEMISSAOEVENTOS  campo: HORA  
  • PFSUBSTITUICAO  campo: NROHORAS  
  • PFSUBSTITUICAO  campo: NROHORASORIGINAL


Foi incluída uma validação onde o atualizador não permitirá a atualização caso existem índice (SQL e Oracle) ou estatísticas (SQL). Caso seja reportado o erro desta situação, pode ser verificado no banco a lista de tabelas e colunas dos índice (SQL e Oracle) ou estatísticas (SQL) existentes com as consultas abaixo:

Verificar índices
SELECT TABLE_NAME, COLUMN_NAME, INDEX_NAME
FROM USER_IND_COLUMNS
WHERE 
(  ( TABLE_NAME = 'PEVTRELACSALCMP' AND COLUMN_NAME = 'NHORAS' ) 
OR ( TABLE_NAME = 'PEVTRELACSALCMPCC' AND COLUMN_NAME = 'NHORAS' ) 
OR ( TABLE_NAME = 'PFENTMOV' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFFINANC' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFFINANCCOMPL' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFHSTENTMOV' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFMOVCC' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFMOVCCCOMPL' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFRESILICAOMOV' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFVALORFORCADO' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFVERBAS' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFVERBASCOMPL' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFVERBASDIS' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFVERBASDISFER' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFVERBASDISFERHIST' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFVERBASDISHIST' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PORCAMENTOPERFILEVENTOS' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFMOVTOMADOR' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFRESILICAOMOVBASE' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PORCAMENTOMOVVALOR' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PPOSTRANSFERENCIA' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PSIMULADEMISSAOEVENTOS' AND COLUMN_NAME = 'HORA' ) 
OR ( TABLE_NAME = 'PFSUBSTITUICAO' AND COLUMN_NAME = 'NROHORAS' ) 
OR ( TABLE_NAME = 'PFSUBSTITUICAO' AND COLUMN_NAME = 'NROHORASORIGINAL' ) 
)
Verificar índices
select tabela, type_desc, indice, colunasIndice
from
(
SELECT s.name as [schema], t.name as [tabela] 
-- Detalhes do Indice
, i.[type_desc], i.[is_primary_key], i.[is_unique], i.[is_unique_constraint]
, ISNULL(i.name, '') AS [indice]
, ISNULL(SUBSTRING(c.[indexed], 0, LEN(c.[indexed])), '') AS [colunasIndice]
-- Filtro utilizado pelo I­ndice
, ISNULL(i.filter_definition, '') AS [filtered] 
FROM sys.schemas s
INNER JOIN sys.tables t
ON s.[schema_id] = t.[schema_id]
INNER JOIN sys.indexes i
ON t.[object_id] = i.[object_id] 
-- Relacao de colunas que formam o I­ndice
CROSS APPLY (
SELECT (
	SELECT c.name + ', '
	FROM sys.columns c
	INNER JOIN sys.index_columns ic
	ON c.[object_id] = ic.[object_id]
	AND c.[column_id] = ic.[column_id]
	WHERE t.[object_id] = c.[object_id]
	AND ic.[index_id] = i.[index_id]
	ORDER BY [key_ordinal]
	FOR XML PATH('')
) AS [indexed] 
) AS c
) AS D
WHERE 
(  ( D.tabela = 'PEVTRELACSALCMP' AND D.colunasIndice LIKE '%NHORAS%')
OR ( D.tabela = 'PEVTRELACSALCMPCC' AND D.colunasIndice LIKE '%NHORAS%')
OR ( D.tabela = 'PFENTMOV' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFFINANC' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFFINANCCOMPL' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFHSTENTMOV' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFMOVCC' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFMOVCCCOMPL' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFRESILICAOMOV' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFVALORFORCADO' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFVERBAS' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFVERBASCOMPL' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFVERBASDIS' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFVERBASDISFER' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFVERBASDISFERHIST' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFVERBASDISHIST' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PORCAMENTOPERFILEVENTOS' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFMOVTOMADOR' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFRESILICAOMOVBASE' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PORCAMENTOMOVVALOR' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PPOSTRANSFERENCIA' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PSIMULADEMISSAOEVENTOS' AND D.colunasIndice LIKE '%HORA%')
OR ( D.tabela = 'PFSUBSTITUICAO' AND D.colunasIndice LIKE '%NROHORAS%')
OR ( D.tabela = 'PFSUBSTITUICAO' AND D.colunasIndice LIKE '%NROHORASORIGINAL%')
)
Verificar estatísticas
SELECT s.name [STATS_NAME], s.stats_id [STATS_ID], t.name [TABLE_NAME], c.name [COLUNM_NAME]
FROM sys.stats s
INNER JOIN sys.tables t ON s.object_id = t.object_id
INNER JOIN sys.stats_columns sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id
INNER JOIN sys.columns c ON sc.object_id = c.object_id AND sc.column_id = c.column_id
WHERE
   (  object_name(c.object_id) = 'PFFINANCCOMPL' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFHSTENTMOV' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFMOVCC' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFMOVCCCOMPL' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFRESILICAOMOV' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFVALORFORCADO' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFVERBAS' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFVERBASCOMPL' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFVERBASDIS' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFVERBASDISFER' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFVERBASDISFERHIST' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFVERBASDISHIST' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PORCAMENTOPERFILEVENTOS' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFMOVTOMADOR' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFRESILICAOMOVBASE' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PORCAMENTOMOVVALOR' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PPOSTRANSFERENCIA' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PSIMULADEMISSAOEVENTOS' AND c.name LIKE '%HORA%')
OR (  object_name(c.object_id)  = 'PFSUBSTITUICAO' AND c.name LIKE '%NROHORAS%')
OR (  object_name(c.object_id)  = 'PFSUBSTITUICAO' AND c.name LIKE '%NROHORASORIGINAL%')