Friday, March 21, 2008

Accélerez SharePoint: Purgez les logs !

Lorsqu'on utilise une configuration standard de SQL Server, les fichiers logs ne sont pas paramétrés au mieux. Ceci à des incidences non négligeables sur les performances à venir de SharePoint. En effet, on peut noter que le fichier log de configuration (Config) de SharePoint à tendance à prendre de l'embonpoint au fur et à mesure de son utlisation. Et bien entendu, les logs associés à votre ou vos ContentDB.

Alors si cette gestion des logs n'est pas optimisée, voici une astuce qui permettra de faire un peu de place et de gagner en rapidité. Cette astuce peut de toute façon être utilisée, même si la gestion des logs est bien faite, cela n'empêche pas! Une bonne cure de printemps, c'est le moment.

Comment faire ?

Tout d'abord, il vaut mieux arrêter quelques services, comme le timer et le search :

NET STOP SPTIMERV3

NET STOP OSEARCH

IISRESET

Puis, personnellement, je préfère faire comme si je voulais déplacer la base. Pour éviter que SharePoint se mélange les pinceaux, et inonde l'Event Viewer de messages pas très catholiques, je fais un preparetomove :

stsadm -o preparetomove -contentdb SQLSERVERNAME:CONTENTDBNAME -site http://SITENAME

Ensuite, je vais dans SQL Server Management Studio pour détacher la base CONTENTDBNAME. Assurez-vous que personne n'est connecté.
Puis je retourne dans le file system pour renommer le fichier CONTENTDBNAME.LDF en... ce que vous voulez, mais il ne faut pas l'effacer (pas encore)
Retour à nouveau dans SQL Server Management Studio pour attacher (Attach) la base CONTENTDBNAME, et, dans la fenêtre de confirmation qui apparaît, il faut mettre en surbrillance le nom du fichier log "Not Found" et cliquer sur le bouton Remove.
Ceci fait, cliquez sur Ok et la base est de retour.
Dans les propriétés de la base, vous pouvez maintenant voir que le fichier log est d'environ 1Mo (cela varie selon la configuration de la DB) et vous pouvez ajuster sont incrément ainsi que sa limite maxi.

NET START SPTIMERV3

NET START OSEARCH

Ensuite, retourner sur votre site et... tout doit fonctionner correctement ! Si ce n'est pas le cas, alors vous avez encore la possibilité de renommer à nouveau l'ancien log. Mais si tout fonctionne, alors vous pouvez supprimer les logs renommés.
Pour ma part, j'ai fait cette opération chez un client qui avait deux logs de plus de 50Go pour des DB de 10Go. Et bien, ça a fait de la place, et il y a surtout eu un gain en rapidité en lecture et écriture.

Thursday, March 20, 2008

Sharepoint: Accessing a List with it's Internal Name

Le problème pour accéder aux listes SharePoint est qu'on doit utiliser le nom "public" de la liste, le Title, et non le nom interne:

Si je crée une liste en lui donnant le nom "MaListe"  puis je renomme cette liste en "Ma Liste", alors la liste a deux noms:

  • Le nom interne, MaListe (le premier créé)
  • Le nom public, Ma Liste, suite au renommage.

Si je veux accéder à la liste par programme, je vais utiliser:

SPList list = web.Lists["Ma Liste"];

car la string demandée par la Lists correspond au champs Title de la liste

Mais si on considère que toute liste est un folder, alors on peut contourner le problème en passant par le SPFolder:

public enum ListType { CustomList, Document };
static public SPList GetListName(SPWeb web, ListType type, string InternalName) {
            try {
                SPFolder folder = null;
                switch (type) {
                    case ListType.CustomList:
                        folder = web.Folders["Lists"].SubFolders[InternalName];
                        break;
                    case ListType.Document:
                        folder = web.Folders[InternalName];
                        break;
                    default:
                        break;
                }
                SPList realList = web.Lists[folder.ParentListId];
                return realList;
            }
            catch (Exception x) {
                return null;
            }
        }

Lorsque vous créez une liste, le premier nom que vous donnez devient le nom du folder et donc le nom interne qui ne changera plus. Ensuite, vous pouvez modifier le nom de la liste, mais c'est le champ Title qui est affecté.

J'ai ici mis en avant l'accès aux listes de type "Custom List", qui sont des sous-folder de "Lists", et des listes de type "Document", dont le folder est directement en web root.
Une fois qu'on a le folder, il suffit de récupérer son ParentListId pour obtenir la liste associée.

Thursday, March 13, 2008

SharePoint Folder, Sub-Folder and Content Type (part 1)

Aujourd'hui, je vais décrypter la façon dont on peut travailler avec les Folder et sous-folders dans SharePoint, tout en leur associant des Content Type. J'ai partagé ce blog en deux :

  • Partie 1 : comment faire via l'interface utilisateur
  • Partie 2 : comment utiliser ceci par programme
Voici l'énoncé du problème :
  • Dans une Document Library, je veux avoir des folders qui ont leurs propres meta données (appelons ces folder "Folder Niveau 1")
  • Au niveau root, je ne veux qu'avoir la possiblité de créer des "Folder Niveau 1"
  • Au niveau Root je veux avoir une seule vue qui me montre ces meta données
  • En entrant dans un "Folder Niveau 1", je veux avoir la possibilité de créer des Documents de type contrat et des "Folder Niveau 2" de type Folder
  • Dans un "Folder Niveau 1", je veux avoir une seule vue qui montre les meta données de Document
  • Dans "Folder Niveau 2" je veux avoir une seule vue qui montre les meta données de Document
  • Comment gérer ces folders par programmation (partie 2)

Résolution par l'interface utilisateur

Tout d'abord, il faut créer les content type (CT). Un content type que l'on crée via l'IU va hériter de propriétés d'un parent. Habituellement ce parent est un document, mais rien n'empêche de prendre un Folder comme parent (après tout, c'est aussi un content type)

CTCreation Dans le site settings on trouve la gallerie des CT

CTFolderNiv1

Et on crée le premier CT, Folder Niveau 1. Il faut bien noter que le parent de ce CT est bien le Folder. Je mets le tout dans un group "Folder Group" (pas très inspiré aujourd'hui...)

CTFolderNiv1Cols

Ensuite, on rajoute quelques colonnes. Pour l'exemple, je les ai prises dans les colonnes existantes. Il faut faire de même pour le CT "Folder Niveau 2", mais cette fois je n'ai pas pris de colonnes supplémentaires. Ensuite, il y a le CT pour le document de type contrat

DocContract

Et les colonnes, prises aussi dans les colonnes existantes. DocContractCols Maintenant, il faut retourner dans la Document Library Settings (advanced), autoriser les Content Type, AuthoriseCT Et empêcher la création de Folder standard (si on le souhaite bien sûr) PasFolder Ensuite, il faut choisir les CT qui nous intéressent AjoutCT AllCT Puis, pour n'avoir que "Folder Niveau 1" dans le menu "New", il faut enlever les CT qui ne nous intéressent pas. Attention, cela ne veut pas dire qu'ils ne seront plus accessibles. En fait, il sont toujours attachés à la liste, mais il ne seront simplement pas visible. Vous allez voir qu'on va jouer là-dessus pour filtrer le contenu du menu "New" dans les sous-folder. ChangeDefault ChooseOnlyFn1 Ceci fait, on note dans le menu new qu'il n'y a plus grand chose, hormis la possibilité de créer un "Folder Niveau 1" ChangeMenuFolder2 Avant de créer un "Folder Niveau 1", il faut faire un tour du coté de la vue "All Documents". Cette vue affiche des données standard, et nous sommes plutôt intéressés pour voir les données du CT "Folder Niveau 1". La première étape consiste à modifier cette vue en sélectionnant les bonnes colonnes Alldocview1 puis, petite astuce, il faut aller tout en bas à la rubrique Folders pour dire que cette vue ne sera valable que lorsqu'on est dans le root folder. Cette possibilité est très intéressante car elle va justement nous permettre de sélectionner les vue que l'on souhaite en fonction du niveau de folder dans le quel on est. Alldocview2 Ceci fait, on va créer un "Folder Niveau 1". Faites New / Folder Niveau 1 et vous constatez qu'il y a bien un formulaire d'édition qui nous demande d'entrer les meta données que l'on a associé au folder NewFolderNiv1Edit Et après avoir cliqué sur OK, on a bien dans la liste un folder avec ses meta données NewFolderNiv1Display Maintenant, nous allons modifier les paramètres ce folder pour personnaliser son menu New. Il ne devra permettre que la création des "Folder Niveau 2" et des Contrats. C'est le même principe que sur la liste: dans le menu associé au nom du folder, on trouve l'option "Change New Button Order" ChangeMenuFolder qui va permettre de sélectionner les éléments que l'on souhaite voir s'afficher dans le menu New de ce folder (Folder Niveau 2 et Contrats) ChangeMenuFolder1 Le menu est bien, mais la vue n'est pas bonne ChangeMenuFolder2 En effet, on ne voit pas les meta data spécifiques aux documents contenus dans ce folder. Nous allons créer une vue qui va permettre cela. Cette vue aura un nom, sera une vue par défaut, avec des colonnes appropriées, et surtout, elle sera associée au CT "Folder Niveau 1". Cela devient donc la vue par défaut pour ce folder FolderView1 FolderView2 Et maintenant, en entrant dans ce Folder Niveau 1 la vue précédente apparaîtra. Ce qui fait qu'on maintenant deux vue par défaut, une pour le niveau Root, et une pour le niveau Folder Niveau 1.

Bien sûr, pour le Folder Niveau 2 il faut faire de même, ce qui permet d'avoir une hiérarchie de folder et de vue très intéressante. Mais l'inconvénient majeur de ce système, c'est qu'il faut faire la démarche de sélectionner le "New Button Order" pour chaque nouveau folder créé. Heureusement il existe une méthode par programmation. C'est ce que nous verrons dans la partie 2 de ce post.