Problèmes courants lors de la configuration du webpart « Operations Manager Dashboard Viewer »

by Guyot 13. juin 2012 15:14

Si l’installation du webpart qui permet l’affichage de tableaux de bord SCOM 2012 dans SharePoint est plutôt bien documentée (voir notamment l’article http://technet.microsoft.com/en-us/library/hh212924.aspx) et ne présente pas de difficulté majeure, sa configuration peut se heurter à quelques subtilités.

Je vous livre ci-dessous quelques retours d’expérience en espérant vous faire ainsi économiser des instants biens précieux.

  1. Lorsque je tente de configurer le webpart « Operation Manager Dashboard Viewer », SharePoint m’affiche une page « Accès refusé»

clip_image002

Et pan, accès refusé !

clip_image004

Cause :

Le panneau de configuration du webpart interroge une liste hébergée par le site de l’administration centrale en utilisant pour cela l’identité du pool d’application (du site où vous avez posé le webpart). Le compte du pool d’application doit déjà avoir le droit d’accéder à cette liste.

Résolution :

Il suffit d’octroyer des permissions de lecture au compte du pool d’application dans l’administration centrale, soit sur la collection de site (cas illustré ci-dessous), soit sur la liste en elle-même en cassant l’héritage.

clip_image006

Après cela, vous partez confiant, le sourire aux lèvres, rafraîchir votre page en vous disant intérieurement : « ça y est, ça va marcher, mon chef va être content et je vais pouvoir enfin rentrer chez moi rejoindre ceux que j’aime (mes pizzas et mes bières quoi !)… »

Eh ben non, perdu ! …

2. Le compte du pool d’application a suffisamment d’autorisations sur l’administration centrale mais lorsque je tente de configurer le webpart « Operation Manager Dashboard View », j’ai un autre message d’erreur (code 0x080131904)

clip_image008

Le même message d’erreur dans sa version « développeur » :

clip_image010

Cause :

Donner les droits de lecture au compte du pool d’application sur l’administration centrale, pas plus que le mettre administrateur de la collection de sites, ne s’avère suffisant. Le compte doit aussi avoir le droit d’exécuter une procédure stockée de la base de contenu de l’administration centrale.

Résolution :

Il faut donner à ce même compte du pool d’application, le droit d’exécution sur la procédure stockée « proc_EnumLists » dans la base de données de contenu de l’administration centrale (« SharePoint_AdminContent_... »).

image

Et là, enfin, Ô joie, vous pouvez enfin configurer votre webpart pour afficher votre dashboard SCOM (ceci dit, ça ne vous aura pas dispensé de configurer la liste de l’administration centrale conformément à la procédure du Technet mentionnée précédemment).

A moins que …

3. Tout à l’air correctement configuré, dans l’Administration Centrale et dans le webpart mais en lieu et place de mon tableau de bord SCOM, rien ne s’affiche à part un bel espace tout blanc. Le dashboard ne s’affiche pas et il n’y a pas de message d’erreur.

 

Cause :

Il doit y avoir bien d’autre raison, mais je vous livre ici celle que j’ai rencontrée :

La console web SCOM est publiée en https et l’url utilisée par le webpart ne correspond pas au certificat SSL déclaré.

Par exemple : le certificat SSL est valide pour les url https://monserveur.mondomain.local mais le webpart essaye d’afficher un dashboar à l’url https://monserveur/operationsmanager/#/dashboard(type=Microsoft...)

C’est ballot n’est-ce pas … !

Résolution :

Dans la liste « Operations Manager Web Console Environments » hébergée dans l’administration centrale, éditer l’item de configuration utilisé par le webpart et corriger le champ « HostURI » pour qu’il corresponde au domaine du certificat.

clip_image014

Bon à savoir et autres petites contrariétés…

  • Par défaut, le Webpart « Operations Manager Dashboard Viewer » n’utilise pas le compte identifié dans SharePoint mais bien le compte de la session Windows. C’est pourquoi le dashboard peut afficher « Accès refusé » même si vous avez fait « Se connecter avec un utilisateur différent… » dans SharePoint et que le compte affiché par SharePoint 2010 a bien les permissions dans la console Operations Manager. Une alternative à ce problème est d’utiliser le « Secure Store » de SharePoint.

 

  • Le Webpart « Operations Manager Dashboard Viewer » utilize l’url configure telle que, la resolution de celle-ci est donc faite sur le poste client. Assurer vous que les utilisateurs, dans un contexte extranet par exemple, peuvent bien résoudre l’adresse du site SharePoint ET l’adresse de la console web d’Operations Manager.

Tags:

Collaboratif | Infrastructure | SharePoint

Le modèle MVVM selon KnockOut

by NRION 10. mai 2012 18:40

1 Introduction

1.1 Contexte

 

Depuis l’apparition de WPF et de Silverlight, un nouveau modèle d’architecture est apparu, poussé par les nouvelles fonctionnalités de liaison de données propres au langage XAML : MVVM (Model – View - ViewModel).
 
Dans le principe, ce modèle accentue l’idée de séparation des métiers de designer et de développeur. Les deux acteurs ne travaillant plus sur les mêmes fichiers, ils peuvent réaliser leurs travaux indépendamment l’un de l’autre. Je ne reviendrai pas sur les avantages et inconvénients de ce modèle qui a été étudié et décortiqué dans de nombreux articles sur la toile.
 
Après avoir retourné le modèle dans tous les sens, en le mettant en place dans quelques projets Silverlight, avec ou sans Framework (Jounce, Prism, MVVMLight, …), je me suis dit qu’il serait intéressant de s’ouvrir à d’autres technologies, à des langages qui m’ont toujours rebuté : Javascript et HTML.
 
J’ai donc étudié l’implémentation du modèle à travers un Framework Javascript nommé KnockOut.
 

1.2 Contraintes


Au début, ce qui m’a motivé à m’intéresser au modèle à travers les technologies C# et XAML, c’est avant tout la compatibilité entre deux technologies et surtout l’assemblage de langages fortement typés. Autrement dit, ce que l’on ne retrouve pas entre Javascript et C#.
Comme je n’avais pas vraiment envie de développer moi-même toutes les classes permettant de mettre en place le Binding Html avec Javascript (fonctionnalité qui n’existe pas de base), j’ai décidé d’étudier le Framework KnockOut dont j’ai eu quelques retours intéressants.
 

1.3 Mise en place


Etant en train d’étudier le Framwork Asp.Net MVC, il m’a semblé intéressant de mettre en place le modèle dans une architecture MVC avec Asp.net MVC3.
L’architecture est donc définie comme suit:


2 Un simple CRUD

2.1 Quelques explications


 Il me semble important de rappeler quelques informations importantes concernant le modèle MVVM. En effet, avec les technologies Silverlight et WPF, le modèle est mis en place, en général, entre une deux classes rassemblées au même endroit : l’interface (par exemple, un UserControl constitué d’une classe XAML et d’une classe C#) et son ViewModel (une simple classe C#).
 Or ici, nous avons une problématique importante : où met-on le code métier (du ViewModel) ?
 Si l’on se réfère au modèle, ce code doit être situé au même endroit que la vue, c’est-à-dire, sur le client !
 Cela signifie que l’on doit manipuler les objets Entity Framework (du Framework .Net) avec Javascript !
 Ci-dessous le parcours de la donnée de la base de données jusqu’à son affichage dans le formulaire HTML:
 
 
Dans un sens, on s’aperçoit que le nombre de mapping est important rien que pour lier des données entre une vue et un modèle de vue (un peu trop ?). Cela dit, la mapping entre la donnée SQL et l’objet .Net est réalisé par l’Entity Framework lui-même, ne nécessitant que très peu de manipulations de la part du développeur. On peut dire de même pour la transformation en JSON.
Non, le véritable problème se trouve au niveau de la récupération au « format » Javascript de KnockOut. Ceci est dû au fait que les objets javascript du Framework Knockout doivent être « observables », c’est-à-dire : Disposer de fonctionnalités leur permettant d’identifier les changements opérés sur leurs propriétés.
 

 2.2 Le code serveur 


Pour cet article, j’ai uniquement réalisé un POST et un GET pour illustrer la transition entre les objets Knockout et les objets .NET. Par ailleurs, je fais ici abstraction du code permettant de récupérer les données de la base.

Voici donc le code C# de la méthode de récupération des produits GetAllProducts du contrôleur :

[HttpGet]
public JsonResult GetAllProducts()
{
      List<Products> lst = NorthwindModel.GetProducts().Take(10).ToList();
      JsonResult js = Json(lst);
      js.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
      return js;
}

 

Dans cette action, nous récupérons la liste des produits (les 10 premiers) qui sont des objets Entity. Nous convertissons ensuite la liste d’objets en JSON pour la retourner au client (Javascript).

A noter que nous devons permettre à notre objet JSON d’être transféré à travers une requête HTTP GET.

Ci-dessous la méthode C# permettant d’ajouter ou mettre à jour un Produit:
[HttpPost]
public JsonResult AddOrUpdate(Products p)
{
      NorthwindModel.AddOrUpdateProduct(p);
      var message = "Product " + p.ProductName + " Saved";
      JsonResult js = Json(message);

      return js;
}
 

Remarquez que le produit est passé en paramètre de la méthode et est reconnu comme un objet .Net alors qu’il est fourni par le client (toujours Javascript).

Le reste de la méthode est suffisamment simple pour ne pas nécessiter d’explications supplémentaires, simplement, un message est renvoyé au client sous forme JSON.

Les deux méthodes sont assez simples, le code de récupérations des données également. Il est aussi important de noter que les attributs de méthode HttpGet et HttpPost sont obligatoires pour le bon fonctionnement des appels.

 

 2.3 Le code javascript


Le code Javascript, écrit du côté client, va récupérer le message JSON envoyé par Asp.net et le transformer en un objet « observable » pour Knockout.

function initializeProducts() {
    $.getJSON("/Home/GetAllProducts", function (Datas) {
        var mappedProducts = $.map(Datas, function (item) {
            return new Product(item);
        })
        viewModel.products(mappedProducts);
    });
}

 

function Product(data) {
    this.ProductID = ko.observable(data.ProductID);
    this.ProductName = ko.observable(data.ProductName);
}

L’appel de la méthode initializeProducts() se fait dans le modèle de vue Produit comme ci-dessous.

var base = this;
var viewModel;

function ProductsViewModel() {
    // Data
    viewModel = this;

    base.initializeProducts();

Le code est exécuté lors du chargement de la page, ainsi, lorsque la page HTML est chargée dans le navigateur, le code Javascript qu’elle contient est exécuté par l’appel de la méthode applyBindings() du Framework Knockout.

ko.applyBindings(new ProductsViewModel());

 

Voici le récapitulatif du fonctionnement du modèle de vue :

La liste des produits est un tableau Javascript « observable :

viewModel.products = ko.observableArray([]);

 

Il ne nous reste plus qu’à afficher les données au « format » HTML.

L’ajout d’un produit se fait en deux étapes. D’abord, lors d’un clic sur le bouton ajouter, un nouveau produit est créé en Javascript :

this.newProduct = function () {
    viewModel.newProduct = ko.observable();
    viewModel.selectedProduct(new Product({ 'ProductID': 0, 'ProductName': '' }));
}

En termes de productivité, nous sommes assez loin de ce que peut nous apporter l’association de deux langages comme le XAML et le C#. Mais cela peut être dû au temps nécessaire pour s’habituer à cette syntaxe particulière et s’éloigner des technologies .Net et de leurs outils associés.

 

Il est clair qu’il y a certaines fonctionnalités supplémentaires à apporter si on veut pouvoir utiliser ce Framework dans un réel projet de grande envergure. Peut-être une implémentation dans les templates Visual Studio avec une simplification des communications entre les méthodes serveur et le code client ainsi qu’une amélioration dans le mapping entre les objets .Net et les objets Javascript.

 

Je n’ai étudié qu’une petite partie du Framework car celui-ci est tout de même assez conséquent, je le recommande à ceux qui souhaitent se lancer dans l’aventure M-V-VM tout en restant dans les environnements de type HTML/Javascript.

 

Je finirai tout de même en félicitant l’équipe de Knockout qui a parfaitement su mettre en place le modèle M-V-VM qui rajeunit deux langages qui peuvent paraître, à première vue, totalement contre-productif.

 

A suivre de près donc…

Tags: , , , ,

Développement

Intellisense avec JQuery

by brouelle 24. février 2012 00:53

Si comme moi il vous arrive de travailler avec JQuery, il est tout de même pratique de disposer de l'intellisense. Avant on pouvait l'ajouter à la main dans Visual Studio, mais maintenant je vous conseille vivement d'installer NuGet. Il existe un package qui permet d'installer automatiquement l'intellisense pour JQuery. 

Tags:

Collaboratif | Développement | SharePoint

SSRS 2008 : Générer des rapports Reporting Services multi-langues (localisation)

by ygremillon 15. février 2012 20:13
Actuellement, le multi-langues dans un rapport Reporting Services peut être géré de plusieurs façons :
  • Créer un modèle de rapport par langue. C’est la méthode la plus simple, mais elle peut devenir très contraignante s’il y a un nombre importants de rapports / langues à traiter.
  • Gérer les libellés dans la base de données.
  • Utiliser la Globalisation / Localisation du Framework .NET via une librairie de ressources.
Nous allons nous intéresser à cette dernière méthode.
En premier lieu, nous allons créer la librairie de ressources.
Dans Visual Studio, nous créons un nouveau projet de librairie de classes.
On ajoute nos fichiers de ressources au projet. Pour mon exemple, le fichier de ressources se nomme : Localization.resx
On ajoute ensuite une nouvelle classe au projet, contenant le code ci-dessous :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

    public static class LocalizedValue
    {
        public static string GetString(string cultureInfo, string resource, params object[] args)
        {
            CultureInfo ci = new CultureInfo(cultureInfo);
            string s = Localization.ResourceManager.GetString(resource, ci);
            if (args != null && args.Count() > 0)
                return string.Format(ci, s, args);
            else
                return s;
        }
    }
Une fois le projet compilé, il est nécessaire de copier l’ensemble des DLLs générées (le fichier de base et les fichiers de langues) sur le serveur SSRS.
Pour le designer (Visual Studio), les fichiers doivent être copiés dans le répertoire :
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies
Pour le serveur de reporting, les fichiers doivent être copiés dans le répertoire :
C:\Program Files\Microsoft SQL Server\MSRS.10.MonServeur\Reporting Services\ReportServer\bin
Coté rapport, notre DLL doit être référencée pour pouvoir être utilisée.
Pour cela, dans le menu « Report », on sélectionne « Report Properties » puis l’onglet « References ». Enfin, on ajoute la DLL de ressources.
Ensuite, il suffit d’ajouter l’expression suivante dans une TextBox. 
=MyLibrary.LocalizedValue.GetString(User!Language, "MaRessource")
MyLibrary est l’espace de noms définit par ma DDL de ressources (par défaut, le nom de la DLL).
LocalizedValue est le nom de la classe statique que l’on souhaite utiliser.
GetString est le nom de la méthode que l’on a défini précédemment.
User!Language est une variable prédéfinie par SSRS. Il s’agit d’une chaine de caractères contenant le code de la culture (fr-FR, en-US, …)
MaRessource est la clé de ma ressource
 

Tags: ,

Développement

Le taux d’adoption du Cloud Computing par les entreprises est plus fort en France qu’ailleurs en Europe

by Philippe Limantour 11. janvier 2012 20:29

La France est en avance dans l'adoption du Cloud Computing !
La croissance du marché Cloud en France a éé de +61% en 2011 passant à 846 millions d'euros, selon la dernière étude IDC.

 Les entreprises sont pragmatiques :

  • Le Cloud Computing est analysé comme un modèle de delivery à part entière par les entreprises. Celle-ci n'ont pas d'idées préconçues et privilégient le pragmatisme, en étudiant ce modèle selon des critères qui gouvernent l'entreprise (budget / performance / sécurité). Ce type de comportement fait le jeu des approches hybrides, avec 43% des entreprises qui privilégient ce modèle
  • A seulement 7%, la part des entreprises excluant le Cloud Computing, qu'il soit public ou privé, est faible, ce qui laisse envisager un taux de pénétration potentiel important. Les entreprises sont ainsi 78% à prévoir d'inclure au moins un service Cloud dans leur prochain contrat d'outsourcing, qu'il soit nouveau ou renouvelé.

Des attentes précises :
 
Selon les technologies évaluées ou retenues, les problématiques identifiées par les entreprises ressortent nettement:

  • Sécurité, localisation des données, manque d'auditabilité, réversibilité et intégration pour le Cloud public
  • Manque de financement, manque de compétences internes, résistance au changement ou gouvernance pour le Cloud privé.

Le Cloud public sera le modèle qui se développera le plus massivement à l'avenir (compte tenu des investissements déployés, de son potentiel de distribution, de ses coûts et de ses fonctionnalités).

La plateforme PaaS Microsoft Azure est à ce compte la solution se développant le plus rapidement, permettant d'industrialiser le développement, le test de montée en charges, et la production de solutions métiers, tout en offrant des fonctionnalités avancées de couplage avec les environnements internes à l'entreprise (synchronisation des annuaires, fédération des identités, accès aux données locales via le Service Bus, etc.)

Tags: , , ,

Cloud | Innovation

Office 365 devient le premier service majeur de productivité accessible via le Cloud à suivre les règles européennes en matière de protection et de sécurité des données à caractère personnel

by Philippe Limantour 19. décembre 2011 22:28

Office 365 devient le premier service majeur de productivité accessible via le Cloud à suivre les règles européennes et américaines en matière de protection et de sécurité des données à caractère personnel

Microsoft annonce des améliorations dans les mesures de sécurité et de protection de la vie privée mises en place dans Office 365

 
Microsoft Corp. annonce qu’Office 365, son service de nouvelle génération proposant des outils de productivité via le Cloud, est la première plate-forme d’envergure hébergée dans le Cloud à proposer des mesures de sécurité et de protection de la vie privée fortes pour les clients exerçant leur activité dans l’Union européenne et aux Etats-Unis. Dans le cadre de son engagement contractuel envers ses clients, Microsoft signera désormais les Clauses Contractuelles Types, qui permettront aux clients de s’assurer qu’ils se conforment à la Directive sur la protection des données à caractère personnel, et respectera les dispositions de la loi américaine Health Insurance Portability and Accountability Act (HIPAA).
Microsoft annonce également le lancement du site Internet Trust Center Office 365. Ce site fournit des informations approfondies sur les pratiques de sécurité et de confidentialité d’Office 365 et a subi récemment d’importants changements de conception visant à le rendre plus accessible et plus facile à comprendre. Le nouveau site est accessible à l’adresse suivante : http://trust.office365.com.

 

Mises à jour en matière de conformité

 

En février 2010, l’Union européenne a adopté des clauses contractuelles (plus connues sous le nom de « Clauses Contractuelles Types ») visant à fournir un cadre juridique au transfert de données à caractère personnel via des réseaux internationaux vers des pays situés en dehors de l’Espace Économique Européen (EEE). Lorsqu’elles sont incluses dans des contrats de prestations de services conclus avec des sous-traitants, les Clauses Contractuelles Types assurent aux clients que les mesures appropriées ont été prises afin de protéger les données à caractère personnel, quand bien même celles-ci seraient stockées dans un centre hébergeant des services de Cloud situé en dehors de l’EEE. Les autorités de contrôle européennes ont la possibilité de demander que les clients cessent toute utilisation d’un service qui n’aurait pas pris toutes les mesures requises afin de protéger les données à caractère personnel et ce, jusqu’à ce qu’elles aient procédé à un contrôle du service concerné et jugé qu’il se conformait aux règles européennes en matière de protection et de sécurité des données.

Outre l’utilisation des Clauses Contractuelles Types, Microsoft est allé plus loin que d’autres fournisseurs de services de Cloud en incluant un accord relatif au traitement des données pour les clients européens. Certains des 27 États Membres ont des exigences plus strictes que les dispositions de la Directive européenne sur la protection des données à caractère personnel. Pour rationaliser les services hébergés dans le Cloud pour les clients soumis à des obligations de conformité supplémentaires, Microsoft a prévu, outre les Clauses Contractuelles Types, un solide contrat relatif au traitement des données élaboré en tenant compte des particularités des règlementations de chaque État Membre.
 
« Le développement d’outils de productivité hébergés dans le Cloud qui répondent aux attentes des entreprises européennes représente bien plus que la simple conception d’applications sur un navigateur » a déclaré Jean-Philippe Courtois, Président de Microsoft International. « En matière de sécurité et de protection des données, Microsoft développe une approche des lois européennes plus complète que toute autre société, et nous sommes fiers du travail que nous avons accompli afin de veiller à ce que la plus large gamme d’organisations puisse passer au Cloud en toute confiance – ou opter pour une formule sur site tout aussi fonctionnelle ».
En tant que premier service majeur de productivité hébergé dans le cloud à obtenir la certification ISO/IEC 27001 - une norme internationale de système de gestion de la sécurité de l'information - Microsoft mandate, chaque année, un expert indépendant afin qu’il procède à un audit de sa politique en matière de sécurité de l’information et communique les résultats à ses clients. Par ailleurs, Microsoft a conçu ses services en ligne afin de fournir des mesures de protection physique, administrative et techniques qui permettent de se conformer totalement aux dispositions de la loi HIPAA.
 
« Jusqu’à récemment, certaines préoccupations concernant la sécurité et la confidentialité des données des patients représentaient l’obstacle le plus courant des organisations du secteur de la santé bénéficiant de tout le potentiel de leurs technologies hébergées dans le Cloud » a déclaré Michael Robinson, General Manager for U.S. Health and Life Sciences chez Microsoft. « Microsoft contribue à la suppression de cet obstacle en intégrant des fonctionnalités de confidentialité et de sécurité dans Office 365 qui permettent aux organisations du secteur de la santé de répondre aux obligations de conformité prévues par la loi HIPAA. A ce jour, Office 365 peut aider des hôpitaux, des assureurs et des cliniques à donner aux membres de leur personnel les moyens d’être efficaces et productifs, en toute confidentialité, à tout moment, en tout lieu, tout en réduisant considérablement leurs frais d’exploitation liés aux technologies de l’information ».

 

Concernant Office 365

 
Office 365 regroupe Microsoft Office, Microsoft SharePoint Online, Microsoft Exchange Online et Microsoft Lync Online au sein d’un service de Cloud constamment actualisé. Avec Office 365, le passage au Cloud n’entraine aucun changement dans les méthodes de travail car ce système repose sur des outils de productivité de pointe auxquels les gens sont habitués, qu’ils connaissent et en lesquels ils ont confiance. Les utilisateurs ont ainsi de nouveaux moyens leur permettant de travailler ensemble, facilement, sur pratiquement tout dispositif ou téléphone mobile, en utilisant des applications qui leur sont familières, telle qu’Office, qu’ils connaissent déjà et qu’ils apprécient. Le Cloud offre aux dirigeants de société la fiabilité, les mesures de sécurité et les contrôles informatiques dont ils ont besoin.
Pour toute information sur Office 365 veuillez consulter le site situé à l’adresse suivante : http://www.neos-sdi.com/fr/solutions-microsoft-et-ecosysteme/office-365/

Tags: ,

Cloud | Collaboratif | SharePoint

Développement applicative avec une base de donnée Oracle sans l'installation du client

by Charles BARJANSKY 7. novembre 2011 22:39
Le développement d'une application .Net pour un environnement Web ou Windows avec une plateforme Oracle était jusqu'à récemment problématique car il nécessitait l'installation du client Oracle sur l'environnement de développement et l'environnement finale (poste client et/ou serveur).
 
Dorénavant, la librairie Oracle ODP .NET requiert, au minimum, la présence des DLL suivantes dans l'environnement d'exécution de l'application:
  • Oracle.DataAccess.dll (ODP .NET)
  • OraOps11w.dll (DLL d'interface avec Instant Client)
  • oci.dll (Instant Client)
  • oraociicus11.dll (Instant Client)
Vous pouvez récupérer ces DLL dans l'archive "ODAC with Xcopy Deployment" sur le site d'Oracle.
Ainsi vous pouvez simplement ajouter ces fichiers dans le dossier d'exécution de l'application pour permettre le bon fonctionnement de celui-ci.

Je vous recommande bien entendu de "clarifier" ce processus. Il existe plusieurs façons d'y procéder et je vous propose la suivante:
  • Ajouter un dossier "Libraries" à votre solution
  • Copier les DLL citées ci-dessus
  • Ajouter les commandes suivantes à votre projet UI dans la liste des commandes à exécuter lors de la compilation (Project "Properties" -> "Build Events" tab -> "Post-build event command line" textbox)
xcopy "$(SolutionDir)Libraries\oci.dll" "$(TargetDir)"
xcopy "$(SolutionDir)Libraries\Oracle.DataAccess.dll" "$(TargetDir)"
xcopy "$(SolutionDir)Libraries\oraociicus11.dll" "$(TargetDir)"
xcopy "$(SolutionDir)Libraries\OraOps11w.dll" "$(TargetDir)"
Si vous avez un projet de package, veillez à ne pas les omettre de la liste des fichiers présents dans le dossier de l'application ("Application Folder" ou "Web Application Folder\bin").
 
Charles

Tags:

Développement

Déploiement et distribution du modèle objet client de SharePoint 2010

by Franck Musson 20. octobre 2011 02:35

Pour utiliser le modèle objet client de SharePoint 2010 sur une machine sur laquelle ne sont pas installés les binaires de SharePoint 2010,

il y a un petit download a réaliser : http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=21786

il vous sera alors possible d'écrire du code distant interagissant avec les web services de SharePoint

Example

using (SP.ClientContext ctx = new SP.ClientContext("http://sharepoint2010"))
            {
                SP.FormsAuthenticationLoginInfo formsLoginInfo = new SP.FormsAuthenticationLoginInfo();
                ctx.AuthenticationMode = SP.ClientAuthenticationMode.Default;
                // ctx.FormsAuthenticationLoginInfo = formsLoginInfo;

                SP.List list = ctx.Web.Lists.GetByTitle(lst);
                try
                {
                    list = ctx.Web.Lists.GetByTitle(lst);
                    SP.ListItemCreationInformation itemCreateInfo = new SP.ListItemCreationInformation();
                    SP.ListItem listItem = list.AddItem(itemCreateInfo);
                    listItem["Title"] = "Réservation N° : " + bookingid.ToString()+" le "+flightdate.ToShortDateString();
                    listItem["CustomerID"] = customerid;
                    listItem["BookingID"] = bookingid;
                    listItem.Update();
                    ctx.ExecuteQuery();
                }
                catch (SP.ServerException)
                {
                    list = null;
                }

etc...

Tags: ,

SharePoint

Fusionner plusieurs fichiers XPS

by Gilles DEHAIS 8. octobre 2011 00:23

Les fichiers XPS sont un peu l'équivalent du PDF mais version Microsoft. En effet, ce type de fichier permet l'impression d'un document avec un rendu équivalent que ça soit sur différents ordinateurs et/ou imprimantes. Il permet aussi de bloquer l'édition puisqu'un fichier XPS n'est pas éditable. Il s'agit d'une "image" des pages du document d'origine.

Cependant, il se peut que vous ayez à fusionner plusieurs fichiers XPS pour obtenir un seul fichier final. Nous allons voir que cela est possible avec quelques lignes de codes et grâce à l'API Document qui contient l'API XPS.

 

Tout d'abord, il faut créer notre fichier final qui sera la fusion de nos différents fichiers XPS.

 

dstPackage = Package.Open(dstMergedXpsFileName, FileMode.Create);
dstMergedXps = new XpsDocument(dstPackage);
FixedDocumentSequence dstDocumentSequence = new FixedDocumentSequence();
xpsWriter = XpsDocument.CreateXpsDocumentWriter(dstMergedXps);

 

On utilise l'objet Package pour créer notre fichier sur le disque dur puis nous créons notre document XPS qui contiendra la séquence des documents (nos différentes pages). Un DocumentWriter est aussi nécessaire pour pouvoir remplir notre fichier XPS et l'enregistrer.

Maintenant que notre document final est prêt à recevoir les pages des documents XPS que l'on souhaite fusionner, il suffit d'ouvrir chacun de ces documents, en récupérer les pages (leurs références) et les ajouter dans notre document final les uns après les autres.

 

srcXps = new XpsDocument(srcXpsFileName, FileAccess.Read);
FixedDocumentSequence srcDocumentSequence = srcXps.GetFixedDocumentSequence();
DocumentPaginator DocPager = srcDocumentSequence.DocumentPaginator;
printTickets.Add(srcXps.FixedDocumentSequenceReader.PrintTicket);
foreach (DocumentReference srcReference in srcDocumentSequence.References)
{
     DocumentReference dstReference = new DocumentReference();
     (dstReference as IUriContext).BaseUri = (srcReference as IUriContext).BaseUri;
     dstReference.Source = srcReference.Source;
     dstDocumentSequence.References.Add(dstReference);
}

 

Comme décrit dans le code ci-dessus, on ouvre notre document, on récupère sa séquence de pages (FixedDocumentSequence) puis pour chaque page, on ajoute une référence (DocumentReference) à notre fichier final, son adresse (sa localisation dans le fichier XPS qui n'est en faite qu'un fichier ZIP) et sa source qui est notre page en elle même.

On peut voir aussi la notion de "PrintTicket". Les "PrintTicket" dans les fichiers XPS permettent de définir si la page est en mode portrait ou paysage. Ainsi, l'imprimante pourra imprimer certaines pages en mode paysage tandis que d'autres le seront en mode portrait.

Enfin, il ne nous reste plus qu'à sauvegarder notre fichier final après avoir fusionner tous nos fichiers. Ceci se fait de la manière suivante :

 

xpsWriter.Write(dstDocumentSequence);
dstMergedXps.Close();
dstPackage.Close();

 

Voilà, notre fichier contient maintenant toutes les pages des fichiers que l'on souhaitait fusionner en un seul. Il reste cependant un petit bémol à la fusion de fichiers XPS. Ainsi, si vous avez une pagination dans chacun de vos fichiers, cette pagination n'est pas modifiée car une page dans un fichier XPS ne peut être modifiée car elle est devenu une "image". Vous pouvez modifier l'extension de vos fichiers XPS et la renommer en ".zip" pour découvrir l'architecture complète d'un fichier XPS.

Je vous joins à cette article le code source.

FusionXPS.zip (30,07 kb)

Tags:

Récupérer le nom des jobs relatifs aux abonnements Reporting Services.

by omoreau 5. octobre 2011 23:17

Le code SQL ci-dessous permet de retrouver les noms des jobs des abonnements Reporting Services.
Code bien utile quand on doit retrouver un abonnement parmi des centaines pour le rejouer à la demande.

Script pour le rejouer :

EXEC msdb..sp_start_job 'GUID DU JOB'

 

Script pour retrouver le job :

SELECT 
	ReportSchedule.ScheduleID AS JOB
	,CATALOG.Name AS Nom_Rapport
	, Subscriptions.Description AS Description
	, Subscriptions.LastStatus as Statut_Abonnement
	, Subscriptions.LastRunTime as Derniere_Execution
FROM 
	CATALOG
		JOIN Subscriptions  ON CATALOG.ItemID = Subscriptions.Report_OID
		JOIN ReportSchedule ON CATALOG.ItemID = ReportSchedule.ReportID
							AND ReportSchedule.SubscriptionID = Subscriptions.SubscriptionID
ORDER BY 	
	CATALOG.Name,
	ReportSchedule.ScheduleID

Tags:

Business Intelligence

Neos-SDI  Neos-SDI