Resource.ReadResource 方法
取得有關所指定的企業資源或使用者的詳細的資訊。
命名空間: WebSvcResource
組件: ProjectServerServices (在 ProjectServerServices.dll 中)
語法
'宣告
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Resource/ReadResource", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Resource/", _
ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/Resource/", _
Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Function ReadResource ( _
resourceUid As Guid _
) As ResourceDataSet
'用途
Dim instance As Resource
Dim resourceUid As Guid
Dim returnValue As ResourceDataSet
returnValue = instance.ReadResource(resourceUid)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Resource/ReadResource", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Resource/",
ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/Resource/",
Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public ResourceDataSet ReadResource(
Guid resourceUid
)
參數
resourceUid
類型:System.Guid所需的資源 GUID。
傳回值
類型:WebSvcResource.ResourceDataSet
ResourceDataSet Resources 與ResourceCustomFields表格中包含的詳細的資訊。
備註
如果您呼叫ReadResource ,並以 GUID 傳遞不再存在於系統中的資源, ReadResource會傳回GeneralSecurityAccessDenied 」 錯誤。
Project Server 權限
權限 |
描述 |
---|---|
可讓使用者管理所有企業使用者、 資源及群組。通用權限。 |
|
可讓使用者檢視此資源的企業資源資料。類別權限。 |
|
可讓目前的使用者接受,而不是核准時程表。只有當所要求的資源是目前的使用者相同成功。通用權限。 |
範例
Wcf CreateResourceTest範例會執行下列動作:
會剖析命令引數的資源名稱和百分比的可用性。
會建立包含基本的資源與可用性資料ResourceDataSet物件。
將寫入初始ResourceDataSet內容的 XML 檔案。
呼叫CreateResources方法,並接著呼叫ReadResource方法來更新ResourceDataSet物件。
寫入更新的ResourceDataSet內容的 XML 檔案。比較兩個 XML 檔案與您所設定的值會顯示 Project Server 內部建立額外的資源資料。
For information about using the code sample in a Microsoft Visual Studio 2010 project and creating an app.config file for configuration of the WCF endpoint, see Prerequisites for WCF-Based Code Samples.
using System;
using System.Text;
using System.ServiceModel;
using System.Xml;
using PSLibrary = Microsoft.Office.Project.Server.Library;
namespace Microsoft.SDK.Project.Samples.CreateResourceTest
{
class Program
{
private const string ENDPOINT_RESOURCE = "basicHttp_Resource";
// Change the output directory for your computer.
private const string OUTPUT_FILES = @"C:\Project\Samples\Output\";
private const string FILE_BEFORE = "ResourceDataSet_BeforeCreate.xml";
private const string FILE_AFTER = "ResourceDataSet_AfterCreate.xml";
private static SvcResource.ResourceClient resourceClient;
private static string outFileResourceDs;
private static string resourceName = string.Empty;
private static double resAvailUnits = 0.0;
static void Main(string[] args)
{
if (args.Length == 4)
{
if (args[0].ToLower() == "-name")
{
resourceName = args[1];
}
if (args[2].ToLower() == "-units")
{
// Units available, in percent.
resAvailUnits = Convert.ToDouble(args[3]);
}
}
else
{
Console.WriteLine(@"Usage: CreateResourceTest -name ""Resource Name"" -units 100.0");
Console.Write("\nPress any key to exit... ");
Console.ReadKey(true);
Environment.Exit(-1);
}
try
{
ConfigClientEndpoints(ENDPOINT_RESOURCE);
Console.WriteLine("Creating ResourceDataSet...");
SvcResource.ResourceDataSet resourceDs = new SvcResource.ResourceDataSet();
resourceDs = PopulateData(resourceDs, resourceName.Trim(), resAvailUnits);
outFileResourceDs = OUTPUT_FILES + FILE_BEFORE;
Console.WriteLine(
"\nXML output of the ResourceDataSet before CreateResource:\n\t{0}", outFileResourceDs);
resourceDs.WriteXml(outFileResourceDs);
Console.WriteLine("Calling CreateResources...");
resourceClient.CreateResources(resourceDs, false, true);
resourceDs = resourceClient.ReadResource(resourceDs.Resources[0].RES_UID);
outFileResourceDs = OUTPUT_FILES + FILE_AFTER;
Console.WriteLine(
"\nXML output of the ResourceDataSet after CreateResource:\n\t{0}", outFileResourceDs);
resourceDs.WriteXml(outFileResourceDs);
}
catch (FaultException fault)
{
// Use the WCF FaultException, because the ASMX SoapException does not
// exist in a WCF-based application.
WriteFaultOutput(fault);
}
catch (EndpointNotFoundException ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("\nInnerException: \n" + ex.InnerException.Message);
}
catch (ServerTooBusyException ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("\nInnerException: \n" + ex.InnerException.Message);
Console.WriteLine("\nCheck that PWA is running. Can you log on?"
+ "\nIs the endpoint address correct in app.config?");
}
Console.Write("\nPress any key to exit... ");
Console.ReadKey(true);
}
// Populate the minimum data necessary in the ResourceDataSet, for the Resource
// table and for the ResourceAvailabilities table.
private static SvcResource.ResourceDataSet PopulateData(
SvcResource.ResourceDataSet resDs, string resName, double unitsAvail)
{
SvcResource.ResourceDataSet.ResourcesRow resRow = resDs.Resources.NewResourcesRow();
SvcResource.ResourceDataSet.ResourceAvailabilitiesRow resAvailRow =
resDs.ResourceAvailabilities.NewResourceAvailabilitiesRow();
resRow.RES_NAME = resName;
resRow.RES_UID = Guid.NewGuid();
resRow.RES_TYPE = (int)PSLibrary.Resource.Type.WorkResource;
resRow.RES_INITIALS = resName.Substring(0, 1)
+ (resName.IndexOf(" ") > 0
? resName.Substring(resName.IndexOf(" ") + 1, 1)
: string.Empty);
resDs.Resources.AddResourcesRow(resRow);
resAvailRow.RES_UID = resRow.RES_UID;
resAvailRow.SetRES_AVAIL_FROMNull();
resAvailRow.SetRES_AVAIL_TONull();
resAvailRow.RES_AVAIL_UNITS = unitsAvail;
resDs.ResourceAvailabilities.AddResourceAvailabilitiesRow(resAvailRow);
return resDs;
}
// Extract a PSClientError object from the WCF FaultException object, and
// then display the exception details and each error in the PSClientError stack.
private static void WriteFaultOutput(FaultException fault)
{
string errAttributeName;
string errAttribute;
string errOut;
string errMess = "".PadRight(30, '=') + "\r\n"
+ "Error details: " + "\r\n";
PSLibrary.PSClientError error = Helpers.GetPSClientError(fault, out errOut);
errMess += errOut;
if (error != null)
{
PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
PSLibrary.PSErrorInfo thisError;
for (int i = 0; i < errors.Length; i++)
{
thisError = errors[i];
errMess += "\r\n".PadRight(30, '=') + "\r\nPSClientError output:\r\n";
errMess += thisError.ErrId.ToString() + "\n";
for (int j = 0; j < thisError.ErrorAttributes.Length; j++)
{
errAttributeName = thisError.ErrorAttributeNames()[j];
errAttribute = thisError.ErrorAttributes[j];
errMess += "\r\n\t" + errAttributeName
+ ": " + errAttribute;
}
}
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(errMess);
Console.ResetColor();
}
// Use the endpoints defined in app.config to configure the client.
public static void ConfigClientEndpoints(string endpt)
{
if (endpt == ENDPOINT_RESOURCE)
resourceClient = new SvcResource.ResourceClient(endpt);
}
}
// Helper methods: WaitForQueue and GetPSClientError.
class Helpers
{
// Wait for the queue jobs to complete.
public static bool WaitForQueue(SvcQueueSystem.QueueMsgType jobType,
SvcQueueSystem.QueueSystemClient queueSystemClient,
DateTime startTime)
{
const int MAX_WAIT = 50; // Maximum wait time.
int numJobs = 1; // Number of jobs in the queue.
bool completed = false; // Queue job completed.
SvcQueueSystem.QueueStatusDataSet queueStatusDs =
new SvcQueueSystem.QueueStatusDataSet();
int timeout = 0; // Number of seconds waited.
Console.Write("Waiting for job: {0} ", jobType.ToString());
SvcQueueSystem.QueueMsgType[] messageTypes = { jobType };
SvcQueueSystem.JobState[] jobStates = { SvcQueueSystem.JobState.Success };
while (timeout < MAX_WAIT)
{
System.Threading.Thread.Sleep(1000); // Sleep one second.
queueStatusDs = queueSystemClient.ReadMyJobStatus(
messageTypes,
jobStates,
startTime,
DateTime.Now,
numJobs,
true,
SvcQueueSystem.SortColumn.QueuePosition,
SvcQueueSystem.SortOrder.LastOrder);
timeout++;
Console.Write(".");
}
Console.WriteLine();
if (queueStatusDs.Status.Count == numJobs)
completed = true;
return completed;
}
/// <summary>
/// Extract a PSClientError object from the ServiceModel.FaultException,
/// for use in output of the GetPSClientError stack of errors.
/// </summary>
/// <param name="e"></param>
/// <param name="errOut">Shows that FaultException has more information
/// about the errors than PSClientError has. FaultException can also contain
/// other types of errors, such as failure to connect to the server.</param>
/// <returns>PSClientError object, for enumerating errors.</returns>
public static PSLibrary.PSClientError GetPSClientError(FaultException e,
out string errOut)
{
const string PREFIX = "GetPSClientError() returns null: ";
errOut = string.Empty;
PSLibrary.PSClientError psClientError = null;
if (e == null)
{
errOut = PREFIX + "Null parameter (FaultException e) passed in.";
psClientError = null;
}
else
{
// Get a ServiceModel.MessageFault object.
var messageFault = e.CreateMessageFault();
if (messageFault.HasDetail)
{
using (var xmlReader = messageFault.GetReaderAtDetailContents())
{
var xml = new XmlDocument();
xml.Load(xmlReader);
var serverExecutionFault = xml["ServerExecutionFault"];
if (serverExecutionFault != null)
{
var exceptionDetails = serverExecutionFault["ExceptionDetails"];
if (exceptionDetails != null)
{
try
{
errOut = exceptionDetails.InnerXml + "\r\n";
psClientError =
new PSLibrary.PSClientError(exceptionDetails.InnerXml);
}
catch (InvalidOperationException ex)
{
errOut = PREFIX + "Unable to convert fault exception info ";
errOut += "a valid Project Server error message. Message: \n\t";
errOut += ex.Message;
psClientError = null;
}
}
else
{
errOut = PREFIX + "The FaultException e is a ServerExecutionFault, "
+ "but does not have ExceptionDetails.";
}
}
else
{
errOut = PREFIX + "The FaultException e is not a ServerExecutionFault.";
}
}
}
else // No detail in the MessageFault.
{
errOut = PREFIX + "The FaultException e does not have any detail.";
}
}
errOut += "\r\n" + e.ToString() + "\r\n";
return psClientError;
}
}
}
當您執行命令CreateResourceTest –name "Test Res1" –units 30時,將應用程式將其寫入 ResourceDataSet_BeforeCreate.xml 檔案內容如下:
<?xml version="1.0" standalone="yes"?>
<ResourceDataSet xmlns="https://schemas.microsoft.com/office/project/server/webservices/ResourceDataSet/">
<Resources>
<RES_UID>cf45c439-5320-438b-bc30-22a564f64fca</RES_UID>
<RES_ID>-1</RES_ID>
<RES_TYPE>2</RES_TYPE>
<RES_HAS_NOTES>false</RES_HAS_NOTES>
<RES_CAN_LEVEL>true</RES_CAN_LEVEL>
<RES_NAME>Test Res1</RES_NAME>
<RES_INITIALS>TR</RES_INITIALS>
<RES_IS_TEAM>false</RES_IS_TEAM>
<RES_EXCHANGE_SYNC>false</RES_EXCHANGE_SYNC>
</Resources>
<ResourceAvailabilities>
<RES_UID>cf45c439-5320-438b-bc30-22a564f64fca</RES_UID>
<RES_AVAIL_UNITS>30</RES_AVAIL_UNITS>
</ResourceAvailabilities>
</ResourceDataSet>
建立資源,並使用ReadResource更新ResourceDataSet之後, ResourceDataSet_AfterCreate.xml 檔案包含下列項目:
<?xml version="1.0" standalone="yes"?>
<ResourceDataSet xmlns="https://schemas.microsoft.com/office/project/server/webservices/ResourceDataSet/">
<Resources>
<RES_UID>6004cee6-e74a-4389-a5e0-d6925a79e5b8</RES_UID>
<RES_ID>13</RES_ID>
<RES_TYPE>2</RES_TYPE>
<RES_HAS_NOTES>false</RES_HAS_NOTES>
<RES_CAN_LEVEL>true</RES_CAN_LEVEL>
<RES_ACCRUE_AT>3</RES_ACCRUE_AT>
<RES_BOOKING_TYPE>0</RES_BOOKING_TYPE>
<RES_NAME>Test Res47</RES_NAME>
<RES_INITIALS>TR</RES_INITIALS>
<RES_IS_WINDOWS_USER>false</RES_IS_WINDOWS_USER>
<RES_TIMESHEET_MGR_UID>6004cee6-e74a-4389-a5e0-d6925a79e5b8</RES_TIMESHEET_MGR_UID>
<RES_DEF_ASSN_OWNER>6004cee6-e74a-4389-a5e0-d6925a79e5b8</RES_DEF_ASSN_OWNER>
<RES_IS_TEAM>false</RES_IS_TEAM>
<RES_EXCHANGE_SYNC>false</RES_EXCHANGE_SYNC>
<CREATED_DATE>2010-12-08T08:12:50.377-08:00</CREATED_DATE>
<MOD_DATE>2010-12-08T08:12:50.38-08:00</MOD_DATE>
<RES_STD_RATE_FMT>2</RES_STD_RATE_FMT>
<RES_OVT_RATE_FMT>2</RES_OVT_RATE_FMT>
<RES_MAX_UNITS>3000.000000</RES_MAX_UNITS>
<RES_PREVENT_ADSYNC>false</RES_PREVENT_ADSYNC>
<BaseCalendarUniqueId>b6635b2e-e747-4771-a78b-24f7509629d0</BaseCalendarUniqueId>
</Resources>
<ResourceAvailabilities>
<RES_UID>6004cee6-e74a-4389-a5e0-d6925a79e5b8</RES_UID>
<RES_AVAIL_UNITS>30</RES_AVAIL_UNITS>
</ResourceAvailabilities>
</ResourceDataSet>
比較兩個檔案顯示,例如 Project Server 內部RES_MAX_UNITS屬性會對應的值設RES_AVAIL_UNITS屬性值。
下列範例會擷取企業資源,建立數個若不存在,讀取使用資源篩選器的資源,檢查每項資源取出如果有的話更新可用的資源, RES_CODE屬性,並會檢查資源回。它會報告狀態、 更新及資源的事後狀態之前。
Please see Prerequisites for Reference Code Samples for critical information on running this code sample.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Data;
using System.Web.Services.Protocols;
using System.Threading;
using PSLibrary = Microsoft.Office.Project.Server.Library;
namespace Microsoft.SDK.Project.Samples.CheckInResources
{
class Program
{
[STAThread]
static void Main()
{
try
{
const string PROJECT_SERVER_URI = "https://ServerName/ProjectServerName/";
const string RESOURCE_SERVICE_PATH = "_vti_bin/psi/resource.asmx";
SvcResource.ResourceDataSet resourceDs;
PSLibrary.Filter resourceFilter;
string filterXml;
// Set up the Web service objects
SvcResource.Resource resourceSvc = new SvcResource.Resource();
resourceSvc.Url = PROJECT_SERVER_URI + RESOURCE_SERVICE_PATH;
resourceSvc.Credentials = CredentialCache.DefaultCredentials;
// Get the resources
Console.WriteLine("Getting/Creating resources");
Guid[] resources = EnsureEnterpriseResources(resourceSvc);
// Read the resources so we can see what it looked like before.
resourceFilter = GetResourceFilter(resources);
filterXml = resourceFilter.GetXml();
resourceDs = resourceSvc.ReadResources(filterXml, false);
WriteTablesToConsole(resourceDs.Tables);
// Check out resources so they can be modified
Guid me = resourceSvc.GetCurrentUserUid();
bool checkedOut =false;
Random rand = new Random();
// Modify the resources
foreach(SvcResource.ResourceDataSet.ResourcesRow resourceRow in resourceDs.Resources)
{
Console.WriteLine("Check out " + resourceRow.RES_NAME);
if (resourceRow.IsRES_CHECKOUTBYNull())
{
resourceSvc.CheckOutResources(new Guid[] { resourceRow.RES_UID });
checkedOut=true;
}
else
{
if (resourceRow.RES_CHECKOUTBY == me)
{
checkedOut = true;
}
else
{
checkedOut = false;
Console.WriteLine("\tCan't check out this resource, skip updating this one.");
}
}
if (checkedOut)
{
SvcResource.ResourceDataSet updateDs = resourceSvc.ReadResource(resourceRow.RES_UID);
updateDs.Resources[0].RES_CODE = "A" + rand.Next(1000,9999) ;
Console.WriteLine("Update RES_CODE to " + updateDs.Resources[0].RES_CODE);
resourceSvc.UpdateResources(updateDs, false, false);
Console.WriteLine("Check in " + resourceRow.RES_NAME);
resourceSvc.CheckInResources(new Guid[] { resourceRow.RES_UID },false);
}
Console.ForegroundColor=ConsoleColor.Yellow;
Console.WriteLine("".PadRight(30,'-'));
Console.ResetColor();
}
// retrieve the data from the server for display
resourceDs = resourceSvc.ReadResources(filterXml, false);
WriteTablesToConsole(resourceDs.Tables);
}
catch (SoapException ex)
{
PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex);
PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
string errMess = "==============================\r\nError: \r\n";
for (int i = 0; i < errors.Length; i++)
{
errMess += "\n" + ex.Message.ToString() + "\r\n";
errMess += "".PadRight(30, '=') + "\r\nPSCLientError Output:\r\n \r\n";
errMess += errors[i].ErrId.ToString() + "\n";
for (int j = 0; j < errors[i].ErrorAttributes.Length; j++)
{
errMess += "\r\n\t" + errors[i].ErrorAttributeNames()[j] + ": " + errors[i].ErrorAttributes[j];
}
errMess += "\r\n".PadRight(30, '=');
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(errMess);
}
catch (WebException ex)
{
string errMess = ex.Message.ToString() +
"\n\nLog on, or check the Project Server Queuing Service";
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Error: " + errMess);
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Error: " + ex.Message);
}
finally
{
Console.ResetColor();
Console.WriteLine("\r\n\r\nPress any key...");
Console.ReadKey();
}
}
private static void WriteResourceState(SvcResource.ResourceDataSet resourceDs)
{
foreach (SvcResource.ResourceDataSet.ResourcesRow row in resourceDs.Resources.Rows)
{
// If the resource type is greater than the inactive offset, it is inactive.
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write(row.RES_NAME);
Console.ForegroundColor = ConsoleColor.Gray;
Console.Write(" is ");
if (row.RES_TYPE > (int)PSLibrary.Resource.Type.INACTIVATED_OFFSET)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("Inactive\r\n");
}
else
{
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.Write("Active\r\n");
}
Console.ResetColor();
}
}
private static Guid[] EnsureEnterpriseResources(SvcResource.Resource resourceSvc)
{
string[] resourceNames = new string[] { "Lertchai Treetawatchaiwong",
"Bricks",
"Conference Room A",
"Rental"};
PSLibrary.Resource.Type[] resourceTypes = new PSLibrary.Resource.Type[] { PSLibrary.Resource.Type.WorkResource, PSLibrary.Resource.Type.MaterialResource, PSLibrary.Resource.Type.WorkResource, PSLibrary.Resource.Type.CostResources };
Guid[] resources = new Guid[resourceNames.Length];
for (int i = 0; i < resourceNames.Length; i++)
{
resources[i] = EnsureEnterpriseResource(resourceSvc, resourceNames[i], resourceTypes[i]);
}
return resources;
}
private static Guid EnsureEnterpriseResource(SvcResource.Resource resourceSvc, string resourceName, PSLibrary.Resource.Type resourceType)
{
SvcResource.ResourceDataSet resourceDs = new SvcResource.ResourceDataSet();
PSLibrary.Filter resourceFilter = new Microsoft.Office.Project.Server.Library.Filter();
resourceFilter.FilterTableName = resourceDs.Resources.TableName;
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_INITIALSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
PSLibrary.Filter.FieldOperator existingResource = new PSLibrary.Filter.FieldOperator(PSLibrary.Filter.FieldOperationType.Equal, resourceDs.Resources.RES_NAMEColumn.ColumnName, resourceName);
resourceFilter.Criteria = existingResource;
string filterXml = resourceFilter.GetXml();
resourceDs = resourceSvc.ReadResources(filterXml, false);
if (resourceDs.Resources.Count >= 1)
{
return resourceDs.Resources[0].RES_UID;
}
else
{
resourceDs = new SvcResource.ResourceDataSet();
SvcResource.ResourceDataSet.ResourcesRow resourceRow = resourceDs.Resources.NewResourcesRow();
resourceRow.RES_UID = Guid.NewGuid();
resourceRow.RES_NAME = resourceName;
resourceRow.RES_INITIALS = resourceName.Substring(0, 1) +
(resourceName.IndexOf(" ") > 0 ? resourceName.Substring(resourceName.IndexOf(" ") + 1, 1) : "");
resourceRow.RES_TYPE = (int)resourceType;
resourceDs.Resources.AddResourcesRow(resourceRow);
resourceSvc.CreateResources(resourceDs, false, true);
return resourceRow.RES_UID;
}
}
private static PSLibrary.Filter GetResourceFilter(Guid[] resources)
{
SvcResource.ResourceDataSet resourceDs = new SvcResource.ResourceDataSet();
PSLibrary.Filter resourceFilter = new PSLibrary.Filter();
resourceFilter.FilterTableName = resourceDs.Resources.TableName;
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_INITIALSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CODEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_ACCRUE_ATColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_BOOKING_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CAN_LEVELColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CHECKOUTBYColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_CHECKOUTDATEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_COST_CENTERColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_DEF_ASSN_OWNERColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_EXTERNAL_IDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_GROUPColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HAS_NOTESColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HIRE_DATEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HYPERLINK_ADDRESSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HYPERLINK_FRIENDLY_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_HYPERLINK_SUB_ADDRESSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IS_TEAMColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IS_WINDOWS_USERColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_MATERIAL_LABELColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
//resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NOTESColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_PHONETICSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_RTF_NOTESColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TERMINATION_DATEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TIMESHEET_MGR_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
//List<PSLibrary.Filter.FieldOperator> resourceFieldOps = new List<PSLibrary.Filter.FieldOperator>();
PSLibrary.Filter.IOperator[] fos = new PSLibrary.Filter.IOperator[resources.Length];
for (int i = 0; i < resources.Length; i++)
{
fos[i] = new PSLibrary.Filter.FieldOperator(PSLibrary.Filter.FieldOperationType.Equal, resourceDs.Resources.RES_UIDColumn.ColumnName, resources[i]);
}
PSLibrary.Filter.LogicalOperator lo = new Microsoft.Office.Project.Server.Library.Filter.LogicalOperator(PSLibrary.Filter.LogicalOperationType.Or, fos);
resourceFilter.Criteria = lo;
return resourceFilter;
}
// Write all contents of a table collection to the console
private static void WriteTablesToConsole(System.Data.DataTableCollection theTables)
{
Console.ForegroundColor = ConsoleColor.DarkGreen;
foreach (System.Data.DataTable table in theTables)
{
int[] columnWidths = new int[table.Columns.Count];
int tableWidth = 0;
string dataString;
Console.WriteLine("Table: " + table.TableName);
// Write out the column names and get their spacing
StringBuilder tableRow = new StringBuilder();
for (int i = 0; i < table.Columns.Count; i++)
{
columnWidths[i] = GetColumnWidth(table.Columns[i]);
tableRow.Append(table.Columns[i].ColumnName.PadRight(columnWidths[i]));
tableWidth += columnWidths[i];
}
// add a space so it won't wrap
tableWidth += 1;
// make the console as wide as the widest table
Console.BufferWidth = (Console.BufferWidth > tableWidth ? Console.BufferWidth : tableWidth);
tableRow.Append("\r\n");
Console.Write(tableRow.ToString());
// Write out the data
foreach (DataRow row in table.Rows)
{
tableRow = new StringBuilder();
for (int i = 0; i < table.Columns.Count; i++)
{
dataString = row[i].ToString();
// truncate output if it is wider than
// the desired column width
if (dataString.Length >= columnWidths[i])
{
dataString = dataString.Substring(0, columnWidths[i] - 1);
}
// add the output to the stringbuilder and pad right to fill
// up to the column width.
tableRow.Append(dataString.PadRight(columnWidths[i]));
}
tableRow.Append("\r\n");
Console.Write(tableRow.ToString());
}
Console.Write("\r\n".PadLeft(tableWidth, '-'));
}
Console.ResetColor();
}
// Helper function for WriteTablesToConsole
private static int GetColumnWidth(DataColumn column)
{
// Note: may not handle byte[]data types well
const int MAX_COL_WIDTH = 40;
int dataWidth = 0;
//return 12 for numbers, 30 for dates, and string width for strings.
switch (column.DataType.UnderlyingSystemType.ToString())
{
case "System.Boolean":
case "System.Byte":
case "System.Byte[]":
case "System.Char":
case "System.Decimal":
case "System.Double":
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "System.SByte":
case "System.Single":
case "System.UInt16":
case "System.UInt32":
case "System.UInt64":
dataWidth = 12;
break;
case "System.DateTime":
case "System.TimeSpan":
dataWidth = 30;
break;
case "System.Guid":
dataWidth = 37;
break;
case "System.String":
// If it has a maxlength, use it
if (column.MaxLength > 0)
{
dataWidth = column.MaxLength;
}
else
{
// Otherwise use the max col width
dataWidth = MAX_COL_WIDTH;
}
break;
default:
dataWidth = column.ColumnName.Length;
break;
}
// truncate if over the max length
if (dataWidth > MAX_COL_WIDTH)
{
dataWidth = MAX_COL_WIDTH;
}
// always be at least as wide as the colum name
return (column.ColumnName.Length > (dataWidth) ? column.ColumnName.Length + 1 : dataWidth);
}
}
}