共用方式為


修正移轉前指令碼 A1 找出的資料問題 (Project Server 2010)

 

適用版本: Project Server 2010

上次修改主題的時間: 2016-11-30

在 Microsoft Office Project Server 2003 資料上執行移轉前指令碼 A1 之後,請檢查指令碼的輸出,看看是否有問題存在。本文說明對輸出中列出有問題的資料,解決其問題的方法,這包括:

  • 專案已取出

  • 專案從外部編輯

  • 專案具有等候中的狀態更新

  • 重複的企業資源

  • Project Server 2003 的產品版本應至少為 Service Pack 2a

  • 專案中重複的企業資源

  • 企業通用範本從外部編輯

  • 企業通用範本已取出

  • 企業通用範本已鎖定

  • Web 資料表資料庫和專案資料表資料庫的預設語言應相符

  • 企業資源名稱中不應有逗號

  • 必要的企業資源自訂欄位沒有值

  • 必要的企業資源自訂欄位其值不存在於查閱表格定義中

  • 企業資源從外部編輯

  • 企業資源工期自訂欄位具有值清單

  • 企業資源工期自訂欄位具有無效值

解決本節前述問題之後,請重新執行此移轉前指令碼 A1,以確定資料問題都已經解決。

專案已取出

舉凡已取出的專案,就不能進行移轉。因此,最好能在移轉前使來源資料處於穩定狀態,也就是自行檢查專案是否處於可移轉的穩定狀態。負責移轉的處理人員可設定期限,要求專案經理在某個日期前完成專案檢查工作,並規定在該日期之後強制存回所有專案。

如何修正問題

存回所有取出的專案。

存回 Project Server 2003 中取出的專案

  1. 在 Microsoft Office Project Server 2003 Project Web Access 中,按一下 [管理]。

  2. 按一下 [管理企業功能]。

  3. 按一下 [存回企業專案],看看哪些專案已取出。請協調讓專案存回或從 Project Web Access 強制執行存回作業。

注意

您也可以在「Project Server 2003 專案資料表」和「Project Server 2003 網頁資料表」資料庫中執行下列 SQL 查詢,測試專案是否已取出。
select PROJ_NAME from dbo.MSP_PROJECTS where PROJ_CHECKEDOUT = 1 and PROJ_TYPE in (0, 1)
如果傳回任何結果,表示所代表的專案已取出。

專案從外部編輯

舉凡從外部編輯的專案,就不能進行移轉。

如何修正問題

在 Project Professional 2003 中,開啟從外部編輯的專案,直接儲存該專案,並回存至伺服器。這個動作應會將 [外部編輯] 旗標設為 [false]。

專案具有等候中的狀態更新

根據預設,如果 Project Server 2003 專案具有等候中的更新,就不會移轉至 Project Server 2007。在移轉之前,建議您的使用者接受或拒絕狀態更新,以確保專案處於可移轉的穩定狀態。

如何修正問題

移轉設定檔中的StopProjectMigrationIfStatusUpdatesPending 參數可以設定成允許移轉具有等候中更新的專案。如需這個參數的詳細資訊,請參閱<設定移轉工具>。

最好的移轉前作法就是設定期限,要求專案經理在某個日期前接受或拒絕等候中的狀態更新,並規定在該日期之後,強制移轉所有專案 (即使專案不具有最新的狀態更新)。

重複的企業資源

Project Server 2003 或 Project Server 2007 不支援企業資源資料庫有多個同名資源。如果發生這種情況,可能是因為直接編輯資料庫所造成。請注意,編輯企業資源資料庫時,重複的名稱可能不會出現在 Project Professional 中。這是因為 MSP_WEB_RESOURCES 資料表中使用該名稱的企業資源可能只有一個。要解決這個問題並不容易。請與 Project Server 專家一起處理這個問題。下文提供一些基本方針,協助您檢查並修正重複企業資源所產生的問題。

找出重複的企業資源

如果資料中包含重複的企業資源,這個移轉前指令碼 A1 就能找出這些重複的企業資源。如果指令碼發現任何重複的企業資源,所顯示的資料會類似下列這兩個重複資源範例:

RES_UID RES_NAME RES_EUID

123

Peter Krebbs

123

124

Peter Krebbs

123

125

Brad Sutton

125

126

Brad Sutton

126

找出專案中是否有重複的企業資源

如果資料中包含重複的企業資源,這個移轉前指令碼 A1 就能找出這些重複的企業資源。如果指令碼發現任何重複的企業資源,所顯示的資料會類似下列這兩個重複資源範例:

RES_NAME RES_EUID

Peter Krebbs

123

Brad Sutton

125

Brad Sutton

126

修正使用重複企業資源的專案

執行下列查詢 (查詢 1) 後會傳回與重複企業資源相關聯的專案識別碼。您需避免這類重複,讓專案只用一種「res_name,res_euid」組合。如果有重複項目,則必須指定其中一個重複項目為「正確」資源,並確認所有專案都使用這項資源 (請更新該專案的 MSP_RESOURCES.RES_EUID 欄,使該欄指向正確的指定企業資源)。執行此作業之後,執行指令碼 A1,再次驗證測試專案是否還有重複企業資源。

查詢 1:

select res_name,  res_euid, proj_id from msp_resources where res_name in (select distinct r1.RES_NAME from dbo.MSP_RESOURCES r1 inner join dbo.MSP_RESOURCES r2 on (r1.RES_NAME = r2.RES_NAME and r1.PROJ_ID = r2.PROJ_ID) where r1.PROJ_ID = 1 and r1.RES_UID != r2.RES_UID) and proj_id <> 1 and res_euid is not null order by res_name, res_euid asc

例如,執行「查詢 1」之後傳回下列結果:

RES_NAME RES_EUID PROJ_ID

Brad Sutton

125

12

Brad Sutton

126

13

Brad Sutton

125

14

若要修正此問題,您可以選擇將識別碼為 RES_EUID=125 的「Brad Sutton」指定為「正確」的企業資源,然後修正各列,如下所示:

RES_NAME RES_EUID PROJ_ID

Brad Sutton

125

12

Brad Sutton

125

13

Brad Sutton

125

14

修正重複企業資源以指向正確項目

前一節中您從重複項目中指定了正確的資源,並修正專案以指向此資源。現在,您必須根據所指定的資源變更 MSP_RESOURCES 資料表。請執行「查詢 4」(它與「查詢 1」相同),取得重複企業資源清單。然後,更新該項重複資源的 RES_EUID 欄,以指向您剛剛指定的正確資源。

查詢 4:

select res_uid, res_name, res_euid from msp_resources where res_name in (select distinct r1.RES_NAME from dbo.MSP_RESOURCES r1 inner join dbo.MSP_RESOURCES r2 on (r1.RES_NAME = r2.RES_NAME and r1.PROJ_ID = r2.PROJ_ID) where r1.PROJ_ID = 1 and r1.RES_UID != r2.RES_UID) and proj_id = 1 order by res_name asc

例如,執行「查詢 4」之後傳回下列結果。「Peter Krebbs」列是正確的,但「Brad Sutton」需要加以修正。

RES_UID RES_NAME RES_EUID

123

Peter Krebbs

123

124

Peter Krebbs

123

125

Brad Sutton

125

126

Brad Sutton

126

若要修正此問題,您可以選擇將識別碼為 RES_UID=125 的「Brad Sutton」指定為「正確」的資源,然後更新另外一列以指向此項目。例如:

RES_UID RES_NAME RES_EUID

123

Peter Krebbs

123

124

Peter Krebbs

123

125

Brad Sutton

125

126

Brad Sutton

125

從企業資源資料庫中移除重複的資源

將重複資源指向假的專案 (PROJ_ID = 最大整數值),便可從企業資源資料庫中移除重複的資源。除此之外,也需要清除相關的企業行事曆。「查詢 5」便可執行這項作業。

查詢 5:

update msp_resources set proj_id=2147483647 WHERE res_uid != res_euid and res_euid is not null and res_uid > 0 and proj_id = 1

update msp_calendars set proj_id=2147483647 WHERE res_uid not in (select res_uid from msp_resources where proj_id=1) and proj_id = 1 and cal_uid > 0 and res_uid is not null

完成上述步驟後,請嘗試再以 -verify 選項執行移轉工具,驗證重複資源問題已解決。

專案版本至少必須是「Project Server 2003 SP2a」

Microsoft 支援的是從 Project Server 2003 SP2a 或 SP3 移轉。如果並未安裝至少應具備的 Service Pack 2a,就需套用這兩者之一 (建議套用最新的 Service Pack 3)。

如何修正問題

將 Project Server 2003 SP3 套用至您的 Project Server 2003 安裝。如需 Project Server 2003 SP3 的詳細資訊,請參閱知識庫文章說明 Project Server 2003 Service Pack 3 (https://go.microsoft.com/fwlink/?linkid=188720\&clcid=0x404)。

企業通用範本從外部編輯

如果 [企業通用] 範本是在 Project 之外的軟體 (例如協力廠商應用程式) 上編輯,[外部編輯] 旗標會設為 true。Project Professional 會檢查此旗標,如果它設為 true,Project Professional 便會重新計算 [企業通用] 範本中的所有資料,以確保一致性。您需將此旗標設為 false才能進行移轉。

如何修正問題

在 Project Professional 中開啟 [企業通用] 並回存至伺服器。

企業通用範本已取出

移轉專案時,[企業通用] 範本不應已取出。

如何修正問題

請確定 [企業通用] 已存回。

  1. 在 Project Server 2003 Project Web Access 中,按一下 [管理]。

  2. 按一下 [管理企業功能]。

  3. 按一下 [存回企業專案],看看誰取出 [企業通用]。請協調讓專案存回或從 Project Web Access 強制執行存回作業。

判斷企業通用範本是否已鎖定

如果電腦不正常關機或 Project Professional 不正常結束,專案就會變成鎖定。如果 [企業通用] 範本已鎖定,便無法執行移轉工具。

如何修正問題

下列 SQL 查詢會對 [企業通用] 範本解除鎖定。請在「Project Server 2003 專案資料表」資料庫中執行下列 SQL 查詢。

Update MSP_PROJECTS set PROJ_LOCKED = 1 where PROJ_TYPE = 2

判斷網頁資料表資料庫和專案資料表資料庫中的預設語言是否應相符

「Project Server 2003 網頁資料表」資料庫和「Project Server 2003 專案資料表」資料庫上的預設語言必須相符才能進行移轉。

如何修正問題

請與系統管理員一起修正這兩個資料庫之間不一致的狀態。

判斷資源的名稱中是否有逗號

Project Server 2007 有一項限制是,(任何語言的) 企業資源名稱不可以有逗號字元 (,)。必須以有效字元取代該字元。

如何修正問題

請在「Project Server 2003 專案資料表」和「Project Server 2003 網頁資料表」資料庫中執行下列 SQL 查詢。這項查詢會將逗號字元取代成底線字元。如果要使用其他有效字元,則可以編輯該查詢。

-- run this against the project tables db

declare @replacement_char char

declare @char_to_replace char

set @replacement_char = '_'

set @char_to_replace = ','

update dbo.MSP_RESOURCES set RES_NAME = replace(RES_NAME, @char_to_replace, @replacement_char)

where RES_NAME is not null and charindex(@char_to_replace, RES_NAME) > 0

-- run this against the web tables db

declare @replacement_char char

declare @char_to_replace char

set @replacement_char = '_'

set @char_to_replace = ','

update dbo.MSP_WEB_RESOURCES set RES_NAME = replace(RES_NAME, @char_to_replace, @replacement_char)

where RES_NAME is not null and charindex(@char_to_replace, RES_NAME) > 0

必要的企業資源自訂欄位沒有值

如果企業資源的必要企業自訂欄位 (如 RBS) 沒有值,將導致移轉失敗。系統會在移轉過程中對移轉記錄檔發佈錯誤資訊。因此,建議您在移轉前先檢查是否有這種情形。如果您的企業資源非常老舊 (在自訂欄位設為 [必要的] 之前所建立),或處於非作用中,這些資源在必要自訂欄位上可能沒有值。

如何修正問題

在 Project Server 2003 中開啟企業資源資料庫,並設定必要自訂欄位的值,或將受影響的自訂欄位設定為 [非必要的]。等到這些值移轉之後,您可以在 Office Project Server 2007 中以手動方式再改回原來的設定。

資源自訂欄位的值不存在於查閱表格定義中

資源自訂欄位的值所有必須存在於查閱定義資料表中。

如何修正問題

下列 SQL 查詢會將無效的資源自訂欄位值設為 Null。請在「Project Server 2003 專案資料表」資料庫中執行下列 SQL 查詢。

declare @eglobal_proj_id int

set @eglobal_proj_id = (select PROJ_ID from dbo.MSP_PROJECTS where PROJ_TYPE = 2)

update dbo.MSP_MV_FIELDS

set

   CODE_UID = NULL

from dbo.MSP_MV_FIELDS cf1

   left join dbo.MSP_OUTLINE_CODES oc1 on (oc1.CODE_UID = cf1.CODE_UID and (cf1.CODE_FIELD_ID - 76) = oc1.OC_FIELD_ID and oc1.PROJ_ID = @eglobal_proj_id)

   left join (

      select

         oc.CODE_UID,

         fa.ATTRIB_FIELD_ID as OC_FIELD_ID,

         @eglobal_proj_id as PROJ_ID

      from

         dbo.MSP_OUTLINE_CODES oc

         inner join dbo.MSP_FIELD_ATTRIBUTES fa on (fa.PROJ_ID = oc.PROJ_ID and fa.ATTRIB_VALUE = oc.OC_FIELD_ID and fa.ATTRIB_ID = 212)

      where

         oc.PROJ_ID = @eglobal_proj_id

         and fa.PROJ_ID = @eglobal_proj_id

         and fa.ATTRIB_ID = 212

   ) as oc2 on (oc2.CODE_UID = cf1.CODE_UID and (cf1.CODE_FIELD_ID - 76) = oc2.OC_FIELD_ID and oc2.PROJ_ID = @eglobal_proj_id)

where

   cf1.proj_id = 1

   and oc1.CODE_UID is null

   and oc2.CODE_UID is null

update dbo.MSP_CODE_FIELDS

set

   CODE_UID = NULL

from dbo.MSP_CODE_FIELDS cf1

   left join dbo.MSP_OUTLINE_CODES oc1 on (oc1.CODE_UID = cf1.CODE_UID and cf1.CODE_FIELD_ID = oc1.OC_FIELD_ID and oc1.PROJ_ID = @eglobal_proj_id)

   left join (

      select

         oc.CODE_UID,

         fa.ATTRIB_FIELD_ID as OC_FIELD_ID,

         @eglobal_proj_id as PROJ_ID

         from

         dbo.MSP_OUTLINE_CODES oc

         inner join dbo.MSP_FIELD_ATTRIBUTES fa on (fa.PROJ_ID = oc.PROJ_ID and fa.ATTRIB_VALUE = oc.OC_FIELD_ID and fa.ATTRIB_ID = 212)

      where

         oc.PROJ_ID = @eglobal_proj_id

         and fa.PROJ_ID = @eglobal_proj_id

         and fa.ATTRIB_ID = 212

   ) as oc2 on (oc2.CODE_UID = cf1.CODE_UID and cf1.CODE_FIELD_ID = oc2.OC_FIELD_ID and oc2.PROJ_ID = @eglobal_proj_id)

where

   cf1.proj_id = 1

   and oc1.CODE_UID is null

   and oc2.CODE_UID is null

update dbo.MSP_PROJECTS set PROJ_EXT_EDITED = 1, PROJ_EXT_EDITED_CODE = 1 where PROJ_ID = 1

企業資源從外部編輯

若要企業資源從 Project Server 2003 移轉到 Project Server 2007,這些資源必須不是從外部編輯。

如何修正問題

若要修正此問題,需先將所有企業資源設為外部編輯。這可以透過 SQL 查詢來完成。然後您可以為每個企業資源進行變更,好讓儲存企業資源資料庫時,所有相關的重新整理都由 Project Professional 完成。這個動作會移除每個企業資源的 [外部編輯] 旗標。如果企業資源沒有加以變更,Project Professional 就不會對該資源進行重新計算。這個特定企業資源會繼續標示成外部編輯,而且企業資源資料庫就不會移轉。

注意

企業資源資料庫移轉之後,便可以移除之前對每個企業資源所做的變更。

您可以利用下列一般解決方法移除企業資源中的所有外部編輯旗標。

  1. 先將所有企業資源設為外部編輯。您可以在「Project Server 2003 專案資料表」資料庫中執行下列 SQL 查詢。

    Update dbo.MSP_RESOURCES set EXT_EDIT_REF_DATA = 1 where PROJ_ID = 1

    Update dbo.MSP_PROJECTS set PROJ_EXT_EDITED = 1, PROJ_EXT_EDITED_DATE = 1, PROJ_EXT_EDITED_DUR = 1, PROJ_EXT_EDITED_NUM = 1, PROJ_EXT_EDITED_FLAG = 1, PROJ_EXT_EDITED_CODE = 1, PROJ_EXT_EDITED_TEXT = 1 where PROJ_ID = 1

  2. 對每個企業資源暫時新增一個不重要的資源自訂欄位,讓 Project Professional 2003 強制執行重新計算。此強制重新計算會將每個企業資源標示成不再從外部編輯。例如,在 Project Professional 2003 中您可以對每個企業資源新增一個 [測試] 資源自訂欄位。任何自訂欄位類型都可以使用。例如,您可以使用一個不常用的自訂欄位 [企業資源工期]。

    注意

    如果使用 [企業資源工期] 自訂欄位,請勿為該欄位建立值清單。凡是具有值清單的 [企業資源工期] 自訂欄位都不會移轉。因此,建立這個臨時自訂欄位時,請使用數字值。

    您可以將新的自訂欄位命名為 [測試資源 CF]。建立 [測試資源 CF] 自訂欄位之後,開啟企業資源資料庫,並新增 [測試資源 CF] 欄。再對所有資源設定此自訂欄位的有效值。儲存企業資源資料庫並執行移轉作業。移轉之後,在 Microsoft Office Project Professional 2007 中移除 [測試資源 CF] 這個自訂欄位。

企業資源工期自訂欄位具有值清單

具有關聯值清單的 [企業資源工期] 自訂欄位會導致移轉失敗。

如何修正問題

若要修正此問題,您必須以手動方式針對 SQL 查詢所找到的每個 [企業資源工期] 自訂欄位移除所有值清單。若要執行這項操作,請執行下列程序。

  1. 開啟連線到 Project Server 2003 伺服器的 Project Professional 2003。

  2. 在 [工具] 功能表上,指向 [企業選項],再按一下 [開啟企業通用]。

  3. 在 [Microsoft Project - 取出企業通用] 頁面上,從 [工具] 功能表,指向 [自訂],然後按一下 [企業欄位]。

  4. 在 [自訂企業欄位] 頁面上的 [自訂欄位] 索引標籤中,按一下 [欄位] 區段中的 [資源]。

  5. 在 [類型] 下拉式清單中,按一下 [工期]。所有 [企業工期] 自訂欄位將會出現在 [欄位] 清單中。

  6. 在 [欄位] 清單中,選取第一個與您先前所執行之 SQL 查詢傳回結果相符的 [企業資源工期] 自訂欄位。在 [自訂屬性] 區段中,按一下 [值清單] 按鈕。在該特定 [企業工期] 自訂欄位的值清單中,刪除 [值] 欄中的任何值,然後按一下 [確定]。[Microsoft Office Project] 對話方塊出現之後,按一下 [確定]。

  7. 在 [自訂企業欄位] 頁面上的 [自訂屬性] 區段中,驗證 [值清單] 是否未選用於 [欄位] 清單中所選取的 [企業資源工期] 自訂欄位。如果選用了 [值清單],則請選取 [無]。

  8. 在 [欄位] 清單中,選取其餘所有對應於上述 SQL 查詢的 [企業資源工期] 自訂欄位,然後重複執行步驟 6 和 7。

  9. 按一下 [確定]。

企業資源工期自訂欄位包含有效值

Project Server 2010 不允許負的工期值或工期值大於 34689600。如果您嘗試移轉的 Project Server 2003 [企業資源工期] 自訂欄位包含這兩者其中一,移轉作業將會失敗。

如何修正問題

若要修正此問題,您必須針對每個所識別的自訂欄位,以手動方式編輯 [企業資源工期] 自訂欄位值。您必須確定欄位值是有效的 (也就是介於 0 和 34689600 之間)。

如果查詢所識別的欄位為簡單自訂欄位 (而不是公式欄位),您可以變更欄位值,讓值介於允許範圍內。如果查詢所識別的欄位為公式欄位,就必須改變公式,才能確保結果會介於有效範圍內。