Project 2003 Sviluppare Soluzioni EPM con Project Server (4/4) Massimiliano Bosco – Aliware – Torino – [email protected] Agenda • Parte 1: programmazione in ambito EPM – – – – – Alcune richieste tipiche Soluzioni stand-alone, client-server, EPM Architettura di Project Server 2003 Project Data Service (PDS) Esempio 1.1: utilizzo del PDS • Parte 2: architetture di connessione – Regole generali per i connettori – Esempio 2.1: importare le risorse con file XML • Parte 3: uso dei cubi OLAP e loro estensioni – Acquisizione dati da Sharepoint – Esempio 3.1: gestione rischi e problemi • Parte 4: estendere il PDS con codice gestito (.NET) – Schema generale di un’estensione PDS – Esempio 4.1: estensione PDS in C# Strumenti • MS Project SDK 2003 go.microsoft.com/fwlink/?linkid=21722 Estendere il PDS • E’ possibile personalizzare l’interfaccia del PDS mediante i PDS extender • Poiché si rispetta l’interfaccia standard di PDS – non c’è differenza tra le chiamate a PDS standard e quelle personalizzate e lo scambio di dati avviene mediante flussi XML – Il meccanismo garantisce la sicurezza e l’integrità dei dati perché evita l’accesso diretto alle tabelle Estendere il PDS (2) Estendere il PDS (3) • Quando PDS riceve una richiesta – Controlla l’appartenenza all’API standard e in caso affermativo la processa – Altrimenti controlla se esistono estensioni registrate e inoltra la richiesta alla prima – Se la prima non è in grado di rispondere gira la richiesta alle successive (ne sono ammesse fino a 100) – Se nessuna estensione può soddisfare la richiesta, PDS restituisce un codice di errore Estendere il PDS (4) • Implementazione del PDS extender minimo – Componente COM che implementa una classe Cmain con un solo metodo Public Function XMLRequest(ByVal sXML As String, ByVal sUser As String, ByVal sConnect As String, ByVal lDBType As Long, ByRef nHandled As Integer) As String Estendere il PDS (5) • Parametri passati a XMLRequest – sXML: stringa contenente la richiesta XML <Request> <NameOfExtenderMethod> <ExtenderParameter1>Value1</ExtenderParameter1> <ExtenderParameter2>Value2</ExtenderParameter2> ... </NameOfExtenderMethod> </Request> Estendere il PDS (6) – sUser: è il nome dell’utente di Project Server che è stato autenticato e che effettua la richiesta – lDBType: vale 1 quando il DB è SQL Server (sempre 1 nel caso di Project Server) – sConnect: dati per la connessione • Compito primario di XMLRequest – Interpretare la stringa sXML e restituire come valore di ritorno un XML con la risposta Estendere il PDS (7) • Esempio di risposta XML <Reply> <HRESULT></HRESULT> <Status></Status> <NameOfExtenderMethod> -- method-specific output </NameOfExtenderMethod> </Reply> Estendere il PDS (8) • Significato dei codici di risultato – 0: successo – HRESULT <> 0: errore di comunicazione – STATUS <> 0: errore logico nella chiamata del metodo – I codici di errore riservati a PDS sono quelli compresi tra 1 e 10000 Estendere il PDS (9) • Il parametro lHandled è essenziale nella comunicazione col PDS – Se vale 1 il PDS considera la risposta XML valida e la restituisce al client – Se vale 0 il PDS deduce che l’estensione non è in grado di soddisfare la richiesta e la passa ad altre estensioni Estendere il PDS (10) • Un PDS extender deve essere registrato – Come classe COM nelle chiavi standard del registro di sistema (HKCR…) – Come estensione di Project Server nella chiave seguente [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11. 0\MS Project\WebClient Server\<Virtual Directory>] • Dove occorre inserire il valore seguente (di tipo String) con N compreso tra 1 e 100 "PDSExtensionN"="PDSExtenderDllName.PublicInterfa ceClass" Estendere il PDS (12) • La versione 2003 introduce un’interfaccia estesa XMLRequestEx (ByVal sXML As String, ByVal sPDSInfoEx As String, ByRef nHandled As Integer) As String • Dove – sXML e nHandled hanno lo stesso significato di prima – sPDSInfoEx contiene una struttura dati XML con almeno le seguenti informazioni: • • • • Current user and connection info BasePath (for security object usage) SOAPRequestCookie HTTPRequestCreate Estensioni in .NET • Vantaggi – Approfittare delle classi .NET Framework • accesso ai dati • elaborazione dell’XML – Approccio completamente orientato agli oggetti • Miglior riuso di codice • Incapsulamento dei dettagli – Accesso semplificato a codice gestito – Approfittare di Visual Studio .NET • Svantaggi – Investimento iniziale più elevato per lo sviluppatore • Maggiori benefici nel lungo periodo • Passaggio da VBA a VB.NET più semplice rispetto a C# Esempio using System; using System.Runtime.InteropServices; // Other using directives go here; see the sample code namespace Microsoft.ProjectServer.Extension { /* attribute that enables * interoperability between COM and .NET objects */ [Guid("EAA49654-65E3-4BC5-BCC7-E465264323D5"), ComVisible(true), ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] // The General class derives from the Extender class. public class General : Extender { // … metodi } } Metodi della classe Extender [ComVisible(true)] public string XMLRequestEx(string sXML, string sPDSInfoEx, ref short nHandled) { if (IsRequestError(sXML, sPDSInfoEx, ref nHandled)) return ReplyInvalidRequestError(); switch (Command) { case "GeneralPing": return Reply("GENERAL PING WORKED!"); // Other cases go here default: return ReplyUnknownRequestError(ref nHandled); } } Riferimenti • download.microsoft.com – MS Project Server 2003 Software Development Kit (SDK) • Writing Managed PDS Extensions – MS Project 2003 Resource Kit • Componenti Per approfondire l’interoperabilità tra componenti COM e .NET http://msdn.microsoft.com/library/default.asp?url=/library/enus/vbcn7/html/vaconIntroductionToCOMInteroperability.asp MOC 2349: Programmazione col framework .NET in C# MOC 2415: Programmazione col framework .NET in VB.NET MOC 2124: Programmazione in C# MOC 2373: Programmazione in Visual Basic.NET