PortfolioAnalyses.ReadOptimizerSolution メソッド
ソリューション (および関連付けられているプロジェクト)、ソリューションの一意の識別子を使用するを取得します。
名前空間: WebSvcPortfolioAnalyses
アセンブリ: ProjectServerServices (ProjectServerServices.dll 内)
構文
'宣言
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/PortfolioAnalyses/ReadOptimizerSolution", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/PortfolioAnalyses/", _
ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/PortfolioAnalyses/", _
Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Function ReadOptimizerSolution ( _
solutionUid As Guid _
) As OptimizerSolutionDataSet
'使用
Dim instance As PortfolioAnalyses
Dim solutionUid As Guid
Dim returnValue As OptimizerSolutionDataSet
returnValue = instance.ReadOptimizerSolution(solutionUid)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/PortfolioAnalyses/ReadOptimizerSolution", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/PortfolioAnalyses/",
ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/PortfolioAnalyses/",
Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public OptimizerSolutionDataSet ReadOptimizerSolution(
Guid solutionUid
)
パラメーター
- solutionUid
型: System.Guid
戻り値
型: WebSvcPortfolioAnalyses.OptimizerSolutionDataSet
OptimizerSolutionDataSet を返します。
注釈
プロジェクト サーバーのアクセス許可
権限 |
説明 |
---|---|
ポートフォリオ分析を作成することができます。グローバル アクセス権。 |
例
例では、ProjectServerServices.dll プロキシ アセンブリ内のSvcPortfolioAnalysesの名前空間を使用します。ConfigClientEndpointsおよびSetClientEndPointsメソッドは、WCF のバインディング、動作、およびエンドポイントの設定を app.config ファイルを使用します。PSI プロキシ アセンブリと app.config ファイルを作成する方法の詳細については、 Project 2013 での WCF ベースのコード サンプルの前提条件を参照してください。
注意
次の使用例は、さまざまなPortfolioAnalysesメソッドの使用方法を示すように設計されています完全ソリューションの Guid が、ローカル プロジェクトの必要に応じて、ドライバー、ドライバーの優先順位付け、およびなどのハードコードされたです。この例を使用するには GUID を変更するものと一致する値がProject Server 2010のインストールをテスト
ReadOptimizerSolutionメソッドは、 OptimizerSolutionDataSetです。アプリケーション次のように、 OptimizerSolutionDataSet.xmlファイルに、XML コンテンツを書き込みます。
<?xml version="1.0" standalone="yes"?>
<OptimizerSolutionDataSet xmlns="https://schemas.microsoft.com/office/project
/server/webservices/OptimizerSolutionDataSet/">
<Solution>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<SOLUTION_UID>df499264-3640-44fd-b8a1-92b3e74a4bb5
</SOLUTION_UID>
<SOLUTION_NAME>Baseline</SOLUTION_NAME>
<HARD_CONSTRAINT_CF_UID>dc68b96a-965e-4b25-ac8a-15a5df729831
</HARD_CONSTRAINT_CF_UID>
<HARD_CONSTRAINT_CF_NAME>Sample Proposal Cost
</HARD_CONSTRAINT_CF_NAME>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<OPT_USE_DEPENDENCIES>true</OPT_USE_DEPENDENCIES>
<CREATED_DATE>2010-04-07T10:28:09.007-07:00</CREATED_DATE>
<MOD_DATE>2010-04-07T10:28:09.007-07:00</MOD_DATE>
<LAST_UPDATED_BY_RES_UID>4cde51d4-d636-4c54-94c3-0b55b00aa111
</LAST_UPDATED_BY_RES_UID>
<LAST_UPDATED_BY_RES_NAME>Shana</LAST_UPDATED_BY_RES_NAME>
<CREATED_BY_RES_UID>4cde51d4-d636-4c54-94c3-0b55b00aa111
</CREATED_BY_RES_UID>
<CREATED_BY_RES_NAME>Shana</CREATED_BY_RES_NAME>
<ANALYSIS_NAME>Analysis8e805fcc-385e-4f9c-92e7-68ca1cdd9a2b
</ANALYSIS_NAME>
</Solution>
<SolutionConstraints>
<SOLUTION_UID>df499264-3640-44fd-b8a1-92b3e74a4bb5
</SOLUTION_UID>
<MD_PROP_UID>dc68b96a-965e-4b25-ac8a-15a5df729831
</MD_PROP_UID>
<MD_PROP_NAME>Sample Proposal Cost</MD_PROP_NAME>
<MD_PROP_POS>0</MD_PROP_POS>
<MAX_VALUE>0.000000</MAX_VALUE>
</SolutionConstraints>
<SolutionConstraintValues>
<SOLUTION_UID>df499264-3640-44fd-b8a1-92b3e74a4bb5
</SOLUTION_UID>
<MD_PROP_UID>dc68b96a-965e-4b25-ac8a-15a5df729831
</MD_PROP_UID>
<PROJ_UID>c13feaeb-8a19-4f43-becd-44f43b1a82d9
</PROJ_UID>
<NUM_VALUE>0.000000</NUM_VALUE>
</SolutionConstraintValues>
<SolutionProjects>
<SOLUTION_UID>df499264-3640-44fd-b8a1-92b3e74a4bb5
</SOLUTION_UID>
<PROJ_UID>c13feaeb-8a19-4f43-becd-44f43b1a82d9
</PROJ_UID>
<PROJ_NAME>Project1</PROJ_NAME>
<PRIORITY>1</PRIORITY>
<ABSOLUTE_PRIORITY>4.75</ABSOLUTE_PRIORITY>
<STATUS>1</STATUS>
<FORCE_STATUS>2</FORCE_STATUS>
</SolutionProjects>
<SolutionStrategicAlignment>
<SOLUTION_UID>df499264-3640-44fd-b8a1-92b3e74a4bb5
</SOLUTION_UID>
<DRIVER_UID>cb75b3e4-4f7a-44a3-bae1-59061b44b156
</DRIVER_UID>
<DRIVER_NAME>Driver1</DRIVER_NAME>
<DRIVER_PRIORITY>0.75</DRIVER_PRIORITY>
<REVERSE_VALUE>0.000000</REVERSE_VALUE>
</SolutionStrategicAlignment>
<SolutionStrategicAlignment>
<SOLUTION_UID>df499264-3640-44fd-b8a1-92b3e74a4bb5
</SOLUTION_UID>
<DRIVER_UID>bc858049-d638-480b-8071-e5eabe995fe8
</DRIVER_UID>
<DRIVER_NAME>Driver2</DRIVER_NAME>
<DRIVER_PRIORITY>0.25</DRIVER_PRIORITY>
<REVERSE_VALUE>0.000000</REVERSE_VALUE>
</SolutionStrategicAlignment>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>c443d627-2259-4ba6-acf0-b8139e8d5713
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>6e3d8a42-cbaf-4e97-833a-2bcdb367cd94
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>fd13f215-7436-4622-a0c6-54fdbda45f76
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>40333069-0d35-4044-a813-7d76304320cd
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>9018ffe8-8673-4d1e-b6d1-cba387116290
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>11f01cd7-9c14-47b7-a62f-825d7f05b7a2
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>afbe69c7-a142-4e25-8983-5bf8250b1342
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>5d583716-bb47-46ee-ac8e-3d342bc38d46
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>68c55a6e-2c46-470e-83d9-a57ccce35185
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>288f4466-663c-45c0-94ed-666d91cc86f2
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
<SolutionEfficientFrontier>
<FRONTIER_UID>11c19e14-fa13-49a6-932c-2a9e222ef64a
</FRONTIER_UID>
<ANALYSIS_UID>37b6529a-75d8-4ab8-a597-d2c07256f7be
</ANALYSIS_UID>
<POINT_UID>ac25e7c9-95f7-4385-a739-60c2badb1064
</POINT_UID>
<X_VALUE>0.000000</X_VALUE>
<Y_VALUE>1.000000</Y_VALUE>
</SolutionEfficientFrontier>
</OptimizerSolutionDataSet>
完全なサンプル コードは次のとおりです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceModel;
using PSLibrary = Microsoft.Office.Project.Server.Library;
// The following code requires one project, two drivers and a driver
// prioritization to exist in the database. Change the values of all hard-coded
// GUIDs to match values in your instance.
// You can make the same logic work for more than one project by
// adding a FOR -EACH loop.
namespace Microsoft.SDK.Project.Samples.Portfolio
{
class PortFolio
{
private const string PROJECT_GUID =
"C13FEAEB-8A19-4F43-BECD-44F43B1A82D9";
private const string DRIVER0_GUID =
"CB75B3E4-4F7A-44A3-BAE1-59061B44B156";
private const string DRIVER1_GUID =
"BC858049-D638-480B-8071-E5EABE995FE8";
private const string DRIVER_PRIORITIZATION_GUID =
"9ADF2C29-D409-41EB-BC6C-6B7BFCDC0CAA";
private const string ALT_PROJECT_STARTDATE_CF_GUID =
"5B21E11D-0B2F-4D93-8995-F4A6625EB3EB";
private const string ALT_PROJECT_ENDDATE_CF_GUID =
"5B21E11D-0B2F-4D93-8995-F4A6625EB3EB";
private const string HARD_CONSTRAINT_CF_GUID =
"DC68B96A-965E-4B25-AC8A-15A5DF729831";
private const string MD_PROP_GUID =
"DC68B96A-965E-4B25-AC8A-15A5DF729831";
private const string BINARY_USING_CF_PRIORITY_GUID =
"C834DF36-6712-4891-92B0-FA6BFB5775FD";
private const string GREATER_THAN_LOOKUPTABLE_VALUE =
"426F8D32-6961-4B4B-91AB-705F0200F45E";
private const string LESS_THAN_LOOKUPTABLE_VALUE =
"779271C4-894D-4385-9E33-1251A9E80541";
private const string ENDPOINT_PA = "basicHttp_PortfolioAnalyses";
private const string ENDPOINT_Q = "basicHttp_QueueSystem";
private const string OUTPUT_FILES = @"C:\Projects\Samples\Output\";
private static string outFilePathAnalysisDS;
private static string outFilePathUpdatedAnalysisInfo;
private static string outFilePathOptimizerDS;
private static SvcPortfolioAnalyses.PortfolioAnalysesClient analysesClient;
private static SvcQueueSystem.QueueSystemClient queueSystemClient;
static void Main(string[] args)
{
DateTime startTime = DateTime.Now;
// Configure the end points.
ConfigClientEndpoints(ENDPOINT_PA);
SetClientEndpoints(ENDPOINT_Q);
// If output directory does not exist,create it.
if (!Directory.Exists(OUTPUT_FILES))
{
Directory.CreateDirectory(OUTPUT_FILES);
}
outFilePathAnalysisDS = OUTPUT_FILES + "AnalysisDataSet.xml";
outFilePathUpdatedAnalysisInfo = OUTPUT_FILES + "UpdatedAnalysisInfo.xml";
outFilePathOptimizerDS = OUTPUT_FILES + "OptimizerSolutionDS.xml";
// Create the Portfolio Analysis DataSet.
SvcPortfolioAnalyses.AnalysisDataSet portfolioAnalysisDS =
new SvcPortfolioAnalyses.AnalysisDataSet();
Guid analysis_uid;
Guid[] numDrivers;
Guid jobGuid;
// Create analysis.
CreateAnalysis(portfolioAnalysisDS,
out analysis_uid,
out numDrivers,
out jobGuid);
// Read analysis.
SvcPortfolioAnalyses.AnalysisDataSet analysisDSAfterAdd =
analysesClient.ReadAnalysis(analysis_uid);
// Write the DataSet contents to an XML file.
analysisDSAfterAdd.WriteXml(outFilePathAnalysisDS);
// Update the Portfolio Analysis.
analysisDSAfterAdd = UpdateAnalysis(analysis_uid,
numDrivers, jobGuid, analysisDSAfterAdd);
// Create the Optimizer Solution.
CreateOptimizerSolution(analysis_uid,
analysisDSAfterAdd);
}
// Creates the Optimizer Solution.
private static void CreateOptimizerSolution(Guid analysis_uid,
SvcPortfolioAnalyses.AnalysisDataSet analysisDSAfterAdd)
{
// Create the Optimizer Solution DataSet.
SvcPortfolioAnalyses.OptimizerSolutionDataSet solutionDS =
new SvcPortfolioAnalyses.OptimizerSolutionDataSet();
SvcPortfolioAnalyses.OptimizerSolutionDataSet.SolutionRow
solutionRow =
solutionDS.Solution.NewSolutionRow();
Guid solutionGuid = Guid.NewGuid();
string solutionName = "Baseline";
solutionRow.ANALYSIS_UID = analysis_uid;
solutionRow.SOLUTION_UID = solutionGuid;
solutionRow.SOLUTION_NAME = solutionName;
solutionRow.OPT_USE_DEPENDENCIES = true; // The default is true.
solutionDS.Solution.AddSolutionRow(solutionRow);
// Populate DecisionsTable with projects and force-in/force-out status
// and PrioritiesTable with projects and project priority.
foreach (SvcPortfolioAnalyses.AnalysisDataSet.AnalysisProjectsRow
projRow in
analysisDSAfterAdd.AnalysisProjects.Rows)
{
SvcPortfolioAnalyses.OptimizerSolutionDataSet.SolutionProjectsRow
solutionsProjectsRow =
solutionDS.SolutionProjects.NewSolutionProjectsRow();
solutionsProjectsRow.SOLUTION_UID =
solutionDS.Solution[0].SOLUTION_UID;
solutionsProjectsRow.PROJ_UID = projRow.PROJ_UID;
// Leave decision to the optimization (Auto = 2).
solutionsProjectsRow.FORCE_STATUS = (byte)PSLibrary.Optimizer.ForceStatus.Auto;
solutionDS.SolutionProjects.AddSolutionProjectsRow(
solutionsProjectsRow);
}
// Populate SolutionConstraintValuesDataTable with custom field
// Guid/Value pairs for each project.
Decimal constraintTotal = 0;
int num_value = 0;
SvcPortfolioAnalyses.OptimizerSolutionDataSet.SolutionConstraintsRow
solutionConstraintsRow =
solutionDS.SolutionConstraints.NewSolutionConstraintsRow();
solutionConstraintsRow.SOLUTION_UID =
solutionDS.Solution[0].SOLUTION_UID;
solutionConstraintsRow.MD_PROP_UID = new Guid(MD_PROP_GUID);
solutionConstraintsRow.MD_PROP_POS = 0;
solutionConstraintsRow.MAX_VALUE = constraintTotal;
solutionDS.SolutionConstraints.AddSolutionConstraintsRow(
solutionConstraintsRow);
foreach (SvcPortfolioAnalyses.AnalysisDataSet.AnalysisProjectsRow
projRow in
analysisDSAfterAdd.AnalysisProjects.Rows)
{
SvcPortfolioAnalyses.OptimizerSolutionDataSet.
SolutionConstraintValuesRow
solutionConstraintValuesRow =
solutionDS.SolutionConstraintValues.
NewSolutionConstraintValuesRow();
solutionConstraintValuesRow.SOLUTION_UID =
solutionDS.Solution[0].SOLUTION_UID;
solutionConstraintValuesRow.MD_PROP_UID = new Guid(MD_PROP_GUID);
solutionConstraintValuesRow.PROJ_UID = projRow.PROJ_UID;
constraintTotal += solutionConstraintValuesRow.NUM_VALUE =
Convert.ToDecimal(num_value);
solutionDS.SolutionConstraintValues.
AddSolutionConstraintValuesRow(
solutionConstraintValuesRow);
}
Guid jobUid = Guid.NewGuid();
try
{
// Create the Optimizer Solution.
analysesClient.QueueCreateOptimizerSolution(
analysis_uid, solutionDS, jobUid);
Helpers.WaitForQueue(SvcQueueSystem.QueueMsgType.
OptimizerSolutionCreate,
1, queueSystemClient, jobUid);
Console.WriteLine("Optimizer solution created successfully.");
}
catch (CommunicationException e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(
"\n***System.ServiceModel.CommunicationException:");
Console.WriteLine(e.ToString());
Console.ResetColor();
}
// Read the contents of the Optimizer Solution DataSet.
SvcPortfolioAnalyses.OptimizerSolutionDataSet
optimizerSolutionDS =
analysesClient.ReadOptimizerSolution(solutionGuid);
optimizerSolutionDS.WriteXml(outFilePathOptimizerDS);
// Commit Optimizer Solution.
analysesClient.CommitOptimizerSolution(solutionGuid);
Console.WriteLine("Optimizer solution committed.");
Console.Read();
}
// Create the Portfolio Analysis.
private static void CreateAnalysis(
SvcPortfolioAnalyses.AnalysisDataSet portfolioAnalysisDS,
out Guid analysis_uid,
out Guid[] numDrivers,
out Guid jobGuid)
{
string analysisName = "Analysis" + Guid.NewGuid();
analysis_uid = Guid.NewGuid();
Guid PROJECT_IMPACT_MD_PROP_UID =
PSLibrary.CustomField.PROJECT_IMPACT_MD_PROP_UID;
Guid RoleCFGuid =
PSLibrary.CustomField.COST_TYPE_MD_PROP_UID;
numDrivers = new Guid[2];
numDrivers[0] = new Guid(DRIVER0_GUID);
numDrivers[1] = new Guid(DRIVER1_GUID);
int prioritizationType = (int)PSLibrary.Optimizer.PrioritizationType.BinaryUsingPrioritization;
int analysisType = (int)PSLibrary.Optimizer.AnalysisType.Cost_and_Schedule;
int binaryUsingPrioritizationPrioType =
(int)PSLibrary.Optimizer.AnalysisType.Cost;
// If the prioritization is not a driver prioritization, then impactGuid should be null.
object impactGuid = null;
if (prioritizationType == binaryUsingPrioritizationPrioType)
impactGuid = PROJECT_IMPACT_MD_PROP_UID;
SvcPortfolioAnalyses.AnalysisDataSet.AnalysisRow analysisRow =
portfolioAnalysisDS.Analysis.NewAnalysisRow();
analysisRow.ANALYSIS_NAME = analysisName;
analysisRow.ANALYSIS_UID = analysis_uid;
analysisRow.ANALYSIS_TYPE = analysisType;
analysisRow.PRIORITIZATION_TYPE = prioritizationType;
analysisRow.PRIORITIZATION_UID = new Guid(DRIVER_PRIORITIZATION_GUID);
analysisRow.ROLE_CUSTOM_FIELD_UID = RoleCFGuid;
analysisRow.PROJECT_IMPACT_CF_UID = new Guid(impactGuid.ToString());
analysisRow.ALT_PROJ_START_DATE_CF_UID = new Guid(ALT_PROJECT_STARTDATE_CF_GUID);
analysisRow.ALT_PROJ_END_DATE_CF_UID = new Guid(ALT_PROJECT_ENDDATE_CF_GUID);
analysisRow.HORIZON_START_DATE = new DateTime(2010, 1, 1);
analysisRow.HORIZON_END_DATE = new DateTime(2011, 1, 31);
analysisRow.TIME_SCALE = (int)PSLibrary.TimeScaleClass.TimeScale.Months;
analysisRow.BOOKING_TYPE = (int)PSLibrary.Resource.BookingType.Committed;
analysisRow.HARD_CONSTRAINT_CF_UID = new Guid(HARD_CONSTRAINT_CF_GUID);
portfolioAnalysisDS.Analysis.AddAnalysisRow(analysisRow);
// Add a project to the Portfolio Analysis.
SvcPortfolioAnalyses.AnalysisDataSet.AnalysisProjectsRow
projectsRow =
portfolioAnalysisDS.AnalysisProjects.NewAnalysisProjectsRow();
projectsRow.ANALYSIS_UID = analysis_uid;
projectsRow.PROJ_UID = new Guid(PROJECT_GUID);
portfolioAnalysisDS.AnalysisProjects.AddAnalysisProjectsRow(
projectsRow);
Console.WriteLine("Creating analysis.....");
jobGuid = Guid.NewGuid();
try
{
analysesClient.QueueCreateAnalysis(portfolioAnalysisDS,
jobGuid);
Helpers.WaitForQueue(SvcQueueSystem.QueueMsgType.AnalysisCreate,
1, queueSystemClient, jobGuid);
Console.WriteLine("Analysis created successfully");
}
catch (CommunicationException e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(
"\n***System.ServiceModel.CommunicationException:");
Console.WriteLine(e.ToString());
Console.ResetColor();
}
}
// Update the strategic impact data of a Portfolio Analysis.
private static SvcPortfolioAnalyses.AnalysisDataSet UpdateAnalysis(
Guid analysis_uid,
Guid[] numDrivers,
Guid jobGuid,
SvcPortfolioAnalyses.AnalysisDataSet analysisDSAfterAdd)
{
// Update the impact values and update the analysis.
// Look-up-table values for comparison (hard coded here).
Guid[] lookUpTableValues = new Guid[2];
Guid updateJobGuid = Guid.NewGuid();
// Represents the "greater than" relationship.
lookUpTableValues[0] =
new Guid(GREATER_THAN_LOOKUPTABLE_VALUE);
// Represents the "less than" relationship.
lookUpTableValues[1] =
new Guid(LESS_THAN_LOOKUPTABLE_VALUE); // is <
SvcPortfolioAnalyses.AnalysisDataSet.AnalysisProjectImpactRow
relationRow = null;
// If there is more than one project, do the following for all the projects.
for (int j = 0; j < numDrivers.Count(); j++)
{
relationRow =
analysisDSAfterAdd.AnalysisProjectImpact.
NewAnalysisProjectImpactRow();
relationRow.ANALYSIS_UID = analysis_uid;
relationRow.LT_STRUCT_UID = lookUpTableValues[j];
relationRow.PROJ_UID = new Guid(PROJECT_GUID);
relationRow.DRIVER_UID = numDrivers[j];
analysisDSAfterAdd.AnalysisProjectImpact.
AddAnalysisProjectImpactRow(
relationRow);
}
try
{
Console.WriteLine("Updating the analysis....");
analysesClient.QueueUpdateAnalysis(analysisDSAfterAdd,
false, updateJobGuid);
Helpers.WaitForQueue(SvcQueueSystem.QueueMsgType.AnalysisUpdate,
1, queueSystemClient, updateJobGuid);
Console.WriteLine("Analysis updated successfully...");
}
catch (CommunicationException e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(
"\n***System.ServiceModel.CommunicationException:");
Console.WriteLine(e.ToString());
Console.ResetColor();
}
// Read the updated Portfolio Analysis.
SvcPortfolioAnalyses.AnalysisDataSet analysisDSAfterUpdate =
analysesClient.ReadAnalysis(analysis_uid);
analysisDSAfterUpdate.WriteXml(outFilePathUpdatedAnalysisInfo);
return analysisDSAfterUpdate;
}
// Configure the custom field client end points.
public static void ConfigClientEndpoints(string endpt)
{
analysesClient = new SvcPortfolioAnalyses.PortfolioAnalysesClient(endpt);
}
// Configure the client end points.
public static void SetClientEndpoints(string qendpt)
{
queueSystemClient = new SvcQueueSystem.QueueSystemClient(qendpt);
}
}
class Helpers
{
/// <summary>
/// Public TimeOut property
/// </summary>
/// <value>Gets/sets the timeout for WaitForQueue calls</value>
public static int TimeOut
{
get
{
return timeOut;
}
set
{
timeOut = value;
}
}
// Default time out is 3 minutes.
private static int timeOut = 3 * 60 * 1000;
// Incremental sleep time is 2 seconds.
private static int incrementalSleepTime = 2 * 1000;
public static SvcQueueSystem.JobState WaitForQueue(SvcQueueSystem.QueueMsgType jobType, int numJobs,
SvcQueueSystem.QueueSystemClient queueSystemClient, Guid jobId)
{
int timeSlept = 0;
int sleepInterval = (TimeOut / 60 > incrementalSleepTime) ? TimeOut / 60 : incrementalSleepTime;
SvcQueueSystem.QueueStatusDataSet queueStatusDs = new SvcQueueSystem.QueueStatusDataSet();
String errorString = String.Empty;
Console.WriteLine("Waiting for job" + jobType.ToString());
while (true)
{
SvcQueueSystem.JobState jobState = queueSystemClient.GetJobCompletionState(out errorString, jobId);
SvcQueueSystem.QueueStatusDataSet jobStatus = queueSystemClient.ReadJobStatusSimple(new Guid[] { jobId }, true);
if (jobState == SvcQueueSystem.JobState.Unknown)
{
string jobStatusInfo = "Job status is unknown.";
jobStatusInfo += "\n\tWas the job placed on the Queue?";
jobStatusInfo += "\n\t--returning from WaitForQueue.";
Console.WriteLine(jobStatusInfo);
return jobState;
}
if (jobState == SvcQueueSystem.JobState.Success ||
jobState == SvcQueueSystem.JobState.Failed ||
jobState == SvcQueueSystem.JobState.FailedNotBlocking ||
jobState == SvcQueueSystem.JobState.CorrelationBlocked ||
jobState == SvcQueueSystem.JobState.Canceled)
{
Console.WriteLine("Job completed, returning from WaitForQueue");
return jobState;
}
System.Threading.Thread.CurrentThread.Join(sleepInterval);
timeSlept += sleepInterval;
if (timeSlept > TimeOut)
{
return SvcQueueSystem.JobState.Unknown;
}
}
}
}
}