共用方式為


TimeSheet.ReadTimesheetByPeriod 方法

會取得時程表標題、 明細項目,並根據指定的期間,然後資源時段式資料。

命名空間:  WebSvcTimeSheet
組件:  ProjectServerServices (在 ProjectServerServices.dll 中)

語法

'宣告
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/TimeSheet/ReadTimesheetByPeriod", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/TimeSheet/",  _
    ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/TimeSheet/",  _
    Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Function ReadTimesheetByPeriod ( _
    resUID As Guid, _
    periodUID As Guid, _
    select As Navigation _
) As TimesheetDataSet
'用途
Dim instance As TimeSheet
Dim resUID As Guid
Dim periodUID As Guid
Dim select As Navigation
Dim returnValue As TimesheetDataSet

returnValue = instance.ReadTimesheetByPeriod(resUID, _
    periodUID, select)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/TimeSheet/ReadTimesheetByPeriod", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/TimeSheet/", 
    ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/TimeSheet/", 
    Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public TimesheetDataSet ReadTimesheetByPeriod(
    Guid resUID,
    Guid periodUID,
    Navigation select
)

參數

  • periodUID
    類型:System.Guid

    時間週期的唯一識別碼。

傳回值

類型:WebSvcTimeSheet.TimesheetDataSet

備註

此方法會使用QueueSystem物件。此工作的CorrelationGUID屬性等於TS_UID屬性的值。

Project Server 權限

權限

描述

非標準

目前的使用者是時程表擁有者。

ViewResourceTimesheet

可讓使用者檢視資源時程表。僅適用於目前的使用者不是時程表擁有者。通用權限。

AcceptTimesheets

可讓使用者接受時程表核准。只有在目前的使用者不是時程表管理員適用。通用權限。

範例

下列程式碼範例會判斷第一個開啟的期間內是否存在時程表。若是如此,此範例會讀取時程表。如果時程表不存在,範例會建立具有預設指定伺服器的時程表列的時程表。

For critical information about running this code sample, see Prerequisites for Reference Code Samples.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Data;
using System.Web.Services.Protocols;
using PSLibrary = Microsoft.Office.Project.Server.Library;

namespace Microsoft.SDK.Project.Samples.CreateTimesheet
{
   class Program
   {
      [STAThread]
      static void Main()
      {
         try{
            #region Setup
            const string PROJECT_SERVER_URI = "http:// ServerName/ProjectServerName/"; // <<--Change to be the name of your server running Project Server and the name of your directory.
            const string TIMESHEET_SERVICE_PATH = "_vti_bin/psi/timesheet.asmx";
            const string RESOURCE_SERVICE_PATH = "_vti_bin/psi/resource.asmx";
            const string ADMIN_SERVICE_PATH = "_vti_bin/psi/admin.asmx";
            TimeSheetWebSvc.TimesheetDataSet timesheetDs;

            // Set up the services.
            TimeSheetWebSvc.TimeSheet timeSheetSvc = new TimeSheetWebSvc.TimeSheet();
            timeSheetSvc.UseDefaultCredentials = true;
            timeSheetSvc.Url = PROJECT_SERVER_URI + TIMESHEET_SERVICE_PATH;

            ResourceWebSvc.Resource resourceSvc = new ResourceWebSvc.Resource();
            resourceSvc.Url = PROJECT_SERVER_URI + RESOURCE_SERVICE_PATH;
            resourceSvc.UseDefaultCredentials = true;

            AdminWebSvc.Admin adminSvc = new AdminWebSvc.Admin();
            adminSvc.Url = PROJECT_SERVER_URI + ADMIN_SERVICE_PATH;
            adminSvc.UseDefaultCredentials = true;

            Guid myUid = resourceSvc.GetCurrentUserUid();

            #endregion
            #region Read Timesheet
            // Time periods must be created by the admin to use timesheets.
            // We are just reading the first open period here.
            AdminWebSvc.TimePeriodDataSet timeperiodDs = adminSvc.ReadPeriods(AdminWebSvc.PeriodState.Open);
            Guid periodUid = timeperiodDs.TimePeriods[0].WPRD_UID;

            // If timesheet already exists, read it.
            // (To delete an existing unsubmitted timesheet,
            //   go to the My Timesheet area of the Project Web Access site.)
            timesheetDs = timeSheetSvc.ReadTimesheetByPeriod(myUid,periodUid,TimeSheetWebSvc.Navigation.Current);
            #endregion
            #region CreateTimesheet if it doesn't exist, then read it
            // If the timesheet does not exist, create it.
            if(timesheetDs.Headers.Count<1)
            {
               timesheetDs = new TimeSheetWebSvc.TimesheetDataSet();
               TimeSheetWebSvc.TimesheetDataSet.HeadersRow headersRow = timesheetDs.Headers.NewHeadersRow();
               headersRow.RES_UID = myUid;
               headersRow.TS_UID = Guid.NewGuid();
               headersRow.WPRD_UID = periodUid;
               headersRow.TS_CREATOR_RES_UID = myUid;
               headersRow.TS_NAME = "Timesheet ";
               headersRow.TS_COMMENTS = "Random comment text here";
               headersRow.TS_ENTRY_MODE_ENUM = (byte)PSLibrary.TimesheetEnum.EntryMode.Weekly; 
               timesheetDs.Headers.AddHeadersRow(headersRow);

               // Create the timesheet with the default line types that are specified by the admin.
               timeSheetSvc.CreateTimesheet(timesheetDs, TimeSheetWebSvc.PreloadType.Default);
               timesheetDs = timeSheetSvc.ReadTimesheet(headersRow.TS_UID);
            }
            CodeSampleUtilities.WriteTablesFormated("Timesheet after create:" ,timesheetDs.Tables);
            #endregion
         }
         catch (SoapException ex)
         {
            ExceptionHandlers.HandleSoapException(ex);
         }
         catch (WebException ex)
         {
            ExceptionHandlers.HandleWebException(ex);
         }
         catch (Exception ex)
         {
            ExceptionHandlers.HandleException(ex);
         }
         finally
         {
            ExceptionHandlers.ResetConsole();
         }
      }
      class ExceptionHandlers
      {

         public static void HandleSoapException(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);
         }

         public static void HandleWebException(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);
         }

         public static void HandleException(Exception ex)
         {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Error: " + ex.Message);
         }

         public static void ResetConsole()
         {
            Console.ResetColor();
            Console.WriteLine("\r\n\r\nPress any key...");
            Console.ReadKey();
         }
      }
      class CodeSampleUtilities
      {
         // Write all contents of a table collection to the console.
         public 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 that it will not 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();
         }
         // A helper function for WriteTablesToConsole.
         private static int GetColumnWidth(DataColumn column)
         {
            // Note: Might 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 maxlength.
            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);
         }
         public static void WriteTablesFormated(string Title, System.Data.DataTableCollection theTables)
         {
            Console.ForegroundColor = ConsoleColor.DarkYellow;
            Console.WriteLine("".PadRight(Console.BufferWidth, '='));
            Console.ResetColor();
            Console.WriteLine(Title);

            CodeSampleUtilities.WriteTablesToConsole(theTables);
         }
         public static void WriteSeparator()
         {
         }
      }
   }
}

請參閱

參照

TimeSheet 類別

TimeSheet 成員

WebSvcTimeSheet 命名空間