0

別のフィールドの変更に基づいてプロジェクトの 1 つのカスタム フィールドを更新する OnPublished イベント ハンドラーに取り組んでいます。

エラーが発生します

Event Handler for event \ProjectPublished\ of type \PS.UpdateProjectStatusChangeDate.EventHandlerUpdateField\ threw an exception: ProjectServerError(s) LastError=CICOCheckedOutToOtherUser Instructions: Pass this into PSClientError constructor to access all error information

これがコードです

        //loading project data from server
        //Every change on this dataset will be updated on the server!
        ProjectDataSet projectDs = projectClient.ReadProject(projectId, projectSvc.DataStoreEnum.WorkingStore);

        foreach (projectSvc.ProjectDataSet.ProjectRow row in projectDs.Project)
        {
            if (row.PROJ_SESSION_UID != null)
            {
                sessionId = row.PROJ_SESSION_UID;
                break;
            }
        }
       //send the dataset to the server to update the database
       bool validateOnly = false;
       Guid jobId = Guid.NewGuid();
       projectClient.QueueUpdateProject(jobId, sessionId, projectDs, validateOnly);

プロジェクトがチェックイン状態のときにコードを実行している他の回答とは異なり、チェックアウトして新しい SessionID を割り当てています。しかし、イベント ハンドラーが起動すると、プロジェクトは既にチェックアウトされています。では、SessionID を取得するにはどうすればよいでしょうか。コードが壊れているところだと思います。

4

1 に答える 1

0

論理的には理にかなっています。プロジェクトがチェックアウトされている間、誰かがいつでも、どのような方法でもプロジェクトを変更できることを意味します。

そのため、あなたのアイデアがうまくいったとしても、Project Pro から行われる次の保存によって更新が上書きされる可能性があります。Project Pro はユーザーの操作について何も知らないためです。

あなたのシステムについては何も知らないので、あなたのユーザーは主に Project Pro を使用していると思います。この場合、イベント ハンドラーをApplication.ProjectBeforePublish msdn リンクイベントに追加し、Project Pro からフィールドを更新できます。ただし、ユーザーは公開前にプロジェクトを保存するよう求められることに注意してください。

Project Pro を使用したソリューションがうまくいかない場合は、公開済みのプロジェクトに何らかの方法でフラグを立てて、プロジェクトがチェックインされたらすぐにチェックアウトし、フィールドを更新し、プロジェクトを保存して再度公開してください。

于 2013-02-23T01:15:37.697 に答える