Resource.CreateResources-Methode
Erstellt einen oder mehrere Enterprise-Arbeit, Material oder Kostenressourcen.
Namespace: WebSvcResource
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Syntax
'Declaration
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Resource/CreateResources", 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 CreateResources ( _
rds As ResourceDataSet, _
validateOnly As Boolean, _
autoCheckIn As Boolean _
) As ResourceDataSet
'Usage
Dim instance As Resource
Dim rds As ResourceDataSet
Dim validateOnly As Boolean
Dim autoCheckIn As Boolean
Dim returnValue As ResourceDataSet
returnValue = instance.CreateResources(rds, _
validateOnly, autoCheckIn)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/Resource/CreateResources", 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 CreateResources(
ResourceDataSet rds,
bool validateOnly,
bool autoCheckIn
)
Parameter
rds
Typ: WebSvcResource.ResourceDataSetDie ResourceDataSet mit den Daten für den neuen Ressourcen.
validateOnly
Typ: System.BooleanWenn true, nur die Daten überprüft und erstellt keine neuen Ressourcen.
autoCheckIn
Typ: System.BooleanWenn true, automatisch in die Ressourcendaten überprüft.
Rückgabewert
Typ: WebSvcResource.ResourceDataSet
Hinweise
Wenn Sie eine null ResourceDataSet als Rds -Parameter übergeben, CreateResources keine Ausnahme, aber keine Aktion.
Hinweis
Geben Sie zum Hinzufügen einer Arbeit oder Kosten der Ressource Verfügbarkeitsdatum, ein nur keine Zeit. Beispielsweise funktioniert DateTime dt = DateTime(2011, 06, 26) oder DateTime dt = DateTime(2011, 06, 26, 0, 0, 0) , da entweder das Datum und die Uhrzeit ist. DateTime dt = DateTime(2011, 06, 26, 9, 0, 0) bewirkt, dass eine SOAP-Ausnahme mit dem Fehler GeneralInvalidColumnValue (Fehlercode 20000) Wenn Sie versuchen, die Ressource zu erstellen.
Project Server-Berechtigungen
Berechtigung |
Beschreibung |
---|---|
Ermöglicht einem Benutzer das alle Benutzer im Unternehmen, Ressourcen und Gruppen verwalten. Die globale Berechtigung. |
|
Ermöglicht einem Benutzer das Erstellen einer neuen Ressource. Die globale Berechtigung. |
Beispiele
Das WCF-basierte CreateResourceTest Beispiel bewirkt Folgendes:
Analysiert den Befehlsargumente für Ressourcenname und Verfügbarkeit von %.
Erstellt ein ResourceDataSet -Objekt, das grundlegende Ressource und Verfügbarkeit Daten enthält.
Schreibt eine XML-Datei des Inhalts der anfänglichen ResourceDataSet .
Die CreateResources -Methode aufgerufen, und klicken Sie dann das ResourceDataSet -Objekt wird durch Aufrufen der Methode ReadResource aktualisiert.
Schreibt eine XML-Datei des Inhalts der aktualisierten ResourceDataSet . Vergleich der Werte, die Sie mit den beiden XML-Dateien festlegen, zeigt die zusätzliche Ressourcendaten, mit denen Project Server intern erstellt.
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;
}
}
}
Wenn Sie den Befehl CreateResourceTest –name "Test Res1" –units 30ausführen, schreibt die Anwendung die ResourceDataSet_BeforeCreate.xml-Datei mit dem folgenden Inhalt:
<?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>
Nach dem Erstellen der Ressource, und aktualisieren die ResourceDataSet mithilfe von ReadResource, enthält die Datei ResourceDataSet_AfterCreate.xml Folgendes:
<?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>
Vergleich zwischen die beiden Dateien angezeigt wird, z. B., dass Project Server intern wird die RES_MAX_UNITS -Eigenschaft mit einem Wert, der entspricht dem Wert der RES_AVAIL_UNITS -Eigenschaft.
Im folgenden Beispiel werden zwei Arbeitsressourcen, eine Materialressource und Kostenressource erstellt. Es wird nicht für vorhandene Ressourcen überprüft und meldet einen Fehler, wenn eine Ressource bereits vorhanden ist. Im Beispiel fügt eine ResourceAvailabilitiesDataTable für die arbeiten und Kosten Ressourcen hinzu und gibt die Werte RES_AVAIL_FROM und RES_AVAIL_UNITS auch.
Mithilfe des Beispiels in DeleteResources zu die Ressourcen zu löschen oder zu manuell löschen von Ressourcen, wechseln zu der Servereinstellungen von Ihrer Project Web App und wählen Enterprise-Objekte löschen (beispielsweise https://ServerName/pwa/_layouts/pwa/admin/admin.aspx).
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.CreateResources
{
class Program
{
[STAThread]
static void Main()
{
try
{
const string PROJECT_SERVER_URI = "http://DevDocPj12/PWA/";
const string RESOURCE_SERVICE_PATH = "_vti_bin/psi/resource.asmx";
SvcResource.ResourceDataSet resourceDs;
// Set up the Web service objects
SvcResource.Resource resourceSvc = new SvcResource.Resource();
resourceSvc.Url = PROJECT_SERVER_URI + RESOURCE_SERVICE_PATH;
resourceSvc.Credentials = CredentialCache.DefaultCredentials;
// Set up the resources
Console.WriteLine("Set up the resources");
resourceDs = new SvcResource.ResourceDataSet();
// NOTE: Resource names must be unique. Open Server Settings - Delete Enterprise Objects
// in Project Web App to delete resources, if you have previously run
// the resource code sample.
string[] resourceNames = new string[] { "Charlotte Weiss",
"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++)
{
SvcResource.ResourceDataSet.ResourcesRow resourceRow =
resourceDs.Resources.NewResourcesRow();
resourceRow.RES_UID = Guid.NewGuid();
resources[i] = resourceRow.RES_UID;
resourceRow.RES_NAME = resourceNames[i];
resourceRow.RES_INITIALS = resourceNames[i].Substring(0, 1) +
(resourceNames[i].IndexOf(" ") > 0
? resourceNames[i].Substring(resourceNames[i].IndexOf(" ") + 1, 1)
: "");
resourceRow.RES_TYPE = (int)resourceTypes[i];
resourceDs.Resources.AddResourcesRow(resourceRow);
// To add work or cost resource availability, specify a date only, not a time.
// DateTime(2011, 06, 26) or DateTime(2011, 06, 26, 0, 0, 0) is OK.
// DateTime(2011, 06, 26, 9, 0, 0) causes a Soap exception.
// The default availability is the current date, and 100 RES_AVAIL_UNITS.
if (i != 1) // Can't add availability for material resources.
{
SvcResource.ResourceDataSet.ResourceAvailabilitiesRow availRow =
resourceDs.ResourceAvailabilities.NewResourceAvailabilitiesRow();
availRow.RES_UID = resourceRow.RES_UID;
DateTime dt = new DateTime(2011, 06, 26);
dt = DateTime.SpecifyKind(dt, DateTimeKind.Local); // Optional.
availRow.RES_AVAIL_FROM = dt;
availRow.RES_AVAIL_TO = new DateTime(2011, 7, 1);
availRow.RES_AVAIL_UNITS = 100.0;
SvcResource.ResourceDataSet.ResourcesRow resRow =
(SvcResource.ResourceDataSet.ResourcesRow)resourceDs.Resources.Rows[i];
availRow.ResourcesRow = resRow;
resourceDs.ResourceAvailabilities.AddResourceAvailabilitiesRow(availRow);
}
}
Console.WriteLine("Save the data to the server");
resourceSvc.CreateResources(resourceDs, false, true);
// retrieve the data from the server for display
Console.WriteLine("Retrieve the data just created and display");
PSLibrary.Filter resourceFilter = GetResourceFilter(resources);
string filterXml = resourceFilter.GetXml();
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 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_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));
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);
}
}
}