Blog do Project - Tudo que você queria saber sobre Microsoft Project, Project Server e Project Online

Importante: Correção para valores duplicados numa PDP

[ad]
O Cumulative Update de Abril do Project Server 2010 inclui algumas correções bastante esperadas, entre elas:

  • A mensagem de “Erro desconhecido” ou “Unknown Error”na Central de Projetos.
  • Ao tentar editar as informações do projeto numa PDP (Página de Detalhe do Projeto), mais de um valor é exibido por campo personalizado.

Neste post irei focar no segundo erro. Apesar do Cumulative Update corrigir o erro e não deixar que ele volte a ocorrer, os valores que foram inseridos no banco de dados de forma errada devido ao bug não são corrigidos. Abaixo estão os passos que serão necessários para detectar e limpar os registros duplicados que causam esse problema.

OBS: Nós recomendamos que você teste os scripts de limpeza em um ambiente de desenvolvimento para que você possa validar os resultados antes de implementar os scripts em um ambiente de produção. Além disso, você só deve executar esta operação quando não houver atividade de usuário no ambiente.

Scripts

  • Script 1 detecta se você está enfrentando esse problema e apresenta os projetos afetados e campos personalizados.
  • Script 2 faz o backup da tabela afetada.
  • Script 3 elimina os registros duplicados.
  • Script 4 desfaz a exclusão, restaurando os registros da tabela de backup. (Executar apenas caso de erro)
  • Script 5 remove a tabela de backup.
Script 1

A consulta SQL a seguir verifica que esta questão está presente em seu banco de dados. Se não retornar nenhuma linha então você não está enfrentando esse problema. Substitua o nome do banco do Project Server no espaço reservado na primeira linha da consulta.

USE <ProjectServer_Published>
SELECT CFV.PROJ_UID, MP.PROJ_NAME, CFV.MD_PROP_UID, CFPV.MD_PROP_NAME, COUNT (*) TOTALCOUNT FROM MSP_PROJ_CUSTOM_FIELD_VALUES AS CFV
INNER JOIN MSP_PROJECTS AS MP ON CFV.PROJ_UID=MP.PROJ_UID
INNER JOIN MSP_CUSTOM_FIELDS_PUBLISHED_VIEW AS CFPV
ON CFV.MD_PROP_UID=CFPV.MD_PROP_UID
where CFPV.MD_PROP_MAX_VALUES=1
GROUP BY CFV.PROJ_UID,MP.PROJ_NAME, CFV.MD_PROP_UID, CFPV.MD_PROP_NAME HAVING COUNT (*) >1
ORDER BY TOTALCOUNT DESC

 

Script 2

O Script 2 cria uma tabela que é chamada MSP_PROJ_CUSTOM_FIELD_VALUES_Backup e faz backup dos registros na tabela MSP_PROJ_CUSTOM_FIELD_VALUES. Certifique-se de que você executar esse script uma vez antes de executar Script 3. Se você quiser desfazer a operação de limpeza que é realizada pelo script 3, você pode executar novamente script 2.

 

USE <ProjectServer_Published>
SELECT * INTO MSP_PROJ_CUSTOM_FIELD_VALUES_BACKUP FROM MSP_PROJ_CUSTOM_FIELD_VALUES

 

 

Script 3

Script 3 primeiro detecta se você está enfrentando esse problema. Se você não estiver enfrentando esse problema, nenhuma ação é tomada. Se você estiver enfrentando esse problema, o script remove os registros duplicados.

USE <ProjectServer_Published>
DECLARE @ITERATIONS AS INT
SET @ITERATIONS=
(SELECT TOP 1 COUNT (*) TOTALCOUNT FROM MSP_PROJ_CUSTOM_FIELD_VALUES AS CFV
INNER JOIN MSP_PROJECTS AS MP ON CFV.PROJ_UID=MP.PROJ_UID
INNER JOIN MSP_CUSTOM_FIELDS_PUBLISHED_VIEW AS CFPV ON CFV.MD_PROP_UID=CFPV.MD_PROP_UID
INNER JOIN MSP_CUSTOM_FIELDS AS CF ON CFV.MD_PROP_UID = CF.MD_PROP_UID
WHERE CF.MD_PROP_MAX_VALUES=1
GROUP BY CFV.PROJ_UID,MP.PROJ_NAME, CFV.MD_PROP_UID, CFPV.MD_PROP_NAME
HAVING COUNT (*) >1
ORDER BY TOTALCOUNT DESC )-1

IF @ITERATIONS IS NULL
BEGIN
PRINT 'DID NOT FIND ANY DUPLICATES TO PROCESS'

END
ELSE
BEGIN

PRINT 'TOTAL ITERATIONS TO PROCESS: '
PRINT @ITERATIONS

WHILE @ITERATIONS <>0
BEGIN
PRINT 'ITERATION COUNT: '
PRINT @ITERATIONS

DECLARE @PROJ_UID AS UNIQUEIDENTIFIER
DECLARE @MD_PROP_UID AS UNIQUEIDENTIFIER
DECLARE @MOD_DATE AS DATETIME
DECLARE ACDELETEDUPLICATERECORDS CURSOR FOR 

SELECT PROJ_UID, MD_PROP_UID, MIN(MOD_DATE) AS MOD_DATE FROM MSP_PROJ_CUSTOM_FIELD_VALUES WHERE PROJ_UID IN
(
SELECT CFV.PROJ_UID FROM MSP_PROJ_CUSTOM_FIELD_VALUES AS CFV
INNER JOIN MSP_PROJECTS AS MP ON CFV.PROJ_UID=MP.PROJ_UID
INNER JOIN MSP_CUSTOM_FIELDS_PUBLISHED_VIEW AS CFPV
ON CFV.MD_PROP_UID=CFPV.MD_PROP_UID
INNER JOIN MSP_CUSTOM_FIELDS AS CF
ON CFV.MD_PROP_UID = CF.MD_PROP_UID
WHERE CF.MD_PROP_MAX_VALUES=1
GROUP BY CFV.PROJ_UID,MP.PROJ_NAME, CFV.MD_PROP_UID, CFPV.MD_PROP_NAME HAVING COUNT (*) >1
)
AND MD_PROP_UID IN
(
SELECT CFV.MD_PROP_UID FROM MSP_PROJ_CUSTOM_FIELD_VALUES AS CFV
INNER JOIN MSP_PROJECTS AS MP ON CFV.PROJ_UID=MP.PROJ_UID
INNER JOIN MSP_CUSTOM_FIELDS_PUBLISHED_VIEW AS CFPV
ON CFV.MD_PROP_UID=CFPV.MD_PROP_UID
INNER JOIN MSP_CUSTOM_FIELDS AS CF
ON CFV.MD_PROP_UID = CF.MD_PROP_UID
WHERE CF.MD_PROP_MAX_VALUES=1
GROUP BY CFV.PROJ_UID,MP.PROJ_NAME, CFV.MD_PROP_UID, CFPV.MD_PROP_NAME HAVING COUNT (*) >1
)

GROUP BY PROJ_UID, MD_PROP_UID
HAVING COUNT (*) >1
ORDER BY PROJ_UID

OPEN ACDELETEDUPLICATERECORDS
FETCH NEXT FROM ACDELETEDUPLICATERECORDS
INTO @PROJ_UID, @MD_PROP_UID, @MOD_DATE
WHILE @@FETCH_STATUS =0 

BEGIN 

DELETE FROM MSP_PROJ_CUSTOM_FIELD_VALUES
WHERE PROJ_UID=@PROJ_UID
AND MD_PROP_UID=@MD_PROP_UID
AND MOD_DATE=@MOD_DATE

FETCH NEXT FROM ACDELETEDUPLICATERECORDS
INTO @PROJ_UID, @MD_PROP_UID, @MOD_DATE 

END 

CLOSE ACDELETEDUPLICATERECORDS
DEALLOCATE ACDELETEDUPLICATERECORDS 

SET @ITERATIONS = @ITERATIONS-1
END
END

 

Script 4

O script 4 só deverá ser executado caso você queira desfazer a operação de limpeza que foi realizada pelo script 3. O Script 4 funciona restaurando os registros que o Script 2 fez backup.

USE <ProjectServer_Published>
DELETE FROM MSP_PROJ_CUSTOM_FIELD_VALUES
INSERT INTO MSP_PROJ_CUSTOM_FIELD_VALUES
SELECT * FROM MSP_PROJ_CUSTOM_FIELD_VALUES_BACKUP

OBS: Executar apenas em caso de algum problema.

 

Script 5

Para remover a tabela de backup criada no Script 2

 

USE <ProjectServer_Published>
DROP TABLE MSP_PROJ_CUSTOM_FIELD_VALUES_BACKUP

Espero ter ajudado !

Abraços,

André Xavier

Com um histórico de mais de quinze anos trabalhando com desenvolvimento, consultoria e gerenciamento em produtos da plataforma Microsoft. André Xavier foi fundador da Sotis Consultoria, empresa especializada em Gerenciamentos de Projetos utilizando a solução EPM da Microsoft. Em 2009 após a fusão com a BHS foi responsável pela criação e gerenciamento do escritório de São Paulo. Em 2011 de volta a Belo Horizonte, ficou responsável por toda área de consultoria da BHS. Hoje, sou Presidente da BHS e há 6 anos seguidos recebo o prêmio de Microsoft MVP de Project.

Categoria: Project

Deixe uma resposta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.