четверг, 5 сентября 2013 г.

SPQuery scope

У объекта SPQuery существует область выполнения. Она может быть одной из:
Member name
Description
Default
Показать только файлы и вложенные папки указанной папки.
Recursive
Показать все файлы во всех папках.
RecursiveAll
Показать все файлы и все вложенные папки всех папок
FilesOnly
Показать только файлы из определенной папки.


Для примера, я буду сравнивать результаты запросов с разной областью. В листе есть папки и подпапки. Всего элементов должно быть 561:

string siteUrl = @"http://xxxxxxx&#8221";
using (SPSite site = new SPSite(siteUrl))
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["Project Documents"];
     Console.WriteLine("List: " + list.Title);
     Console.WriteLine("ReallyCount: " + list.ItemCount);
     SPQuery spQry = new SPQuery();
     spQry.RowLimit = 300;
     do
     {
           SPListItemCollection items = list.GetItems(spQry);
           Console.WriteLine("FirstQuery: " + items.Count);
           spQry.ListItemCollectionPosition = items.ListItemCollectionPosition;
} while (spQry.ListItemCollectionPosition != null);
     spQry = new SPQuery();
     spQry.ViewAttributes = "Scope=\"RecursiveAll\"";
     spQry.RowLimit = 300;
     do
     {
           SPListItemCollection items = list.GetItems(spQry);
           Console.WriteLine("SecondQuery: " + items.Count);
           spQry.ListItemCollectionPosition = items.ListItemCollectionPosition;
} while (spQry.ListItemCollectionPosition != null);
}
Console.Read();

Результат:

Как вы можете  увидеть  list.ItemCount  показывает что элементов в листе всего 8.  Но установив наиболее часто употребляемое значение области  RecursiveAll я получил 561 элемент в 2 захода. 

Получение следующего ID в списке или библиотеке

Иногда действительно хорошо знать, какой ID элемента будет следующим для листа или библиотеки.  Решение этому я нашел, путем прямого подключения к базе данных контента и выбора колонки "tp_NextAvailableId" в таблице "AllLists" для версии 2007 или "NextAvailableId" в  "AllListsAux" для версии 2010 года..
Запросы будут выглядит так:
2007:  SELECT tp_NextAvailableId FROM AllLists where tp_ID=‘{Id листа}’
2010:  SELECT NextAvailableId FROM AllListsAux where ListID=‘{Id листа}’
Наконец, вы можете использовать это расширение для определания следующего ID для кокретного списка:
///<summary>
///Extension above list which send next available item id 
///</summary>
///<returns></returns>
public static int GetNextAvailableIdFromList(this SPList list, SPSite site)
{
    Guid listId = list.ID;
    int nextAvailableId = -1;
    if (site.WebApplication.ContentDatabases.Count > 0)
    {
        string DBConnString = site.ContentDatabase.DatabaseConnectionString;
        SqlConnection con = new SqlConnection(DBConnString);
        try
        {
           con.Open();
           SqlCommand com = con.CreateCommand();
           com.CommandText = String.Format("SELECT NextAvailableId FROM AllListsAux where ListID=’{0}’",
           listId.ToString());
           nextAvailableId = (int)com.ExecuteScalar();
        }
        finally
        {
           con.Close();
        }
    }
    return nextAvailableId;
}

четверг, 22 августа 2013 г.

ListViewByQuery контрол

Введение

ListViewByQuery контрол умеет рендерит view любого листа на основе запроса.

listviewbyquery
Когда контрол покажет юзеров можно будет их отсортировать или применить к ним фильт, но эти события требуют собственной реализаци.

Синтакс

ListViewByQuery контрол это часть Microsoft.SharePoint.dll и расположен в пространстве Microsoft.SharePoint.WebControls. Обявлять нужно так:

<spuc:ListViewByQuery ID="CustomersListViewByQuery" runat="server" Width="700px" />

Так он работать не будет, свойства List и Query можно установить только из кода.
Не забывайте добавить вверху страницы:

<%@ Register TagPrefix="spuc" Namespace="Microsoft.SharePoint.WebControls"
             Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

Можно создать контрол прямо из кода:

private ListViewByQuery CustomersListViewByQuery;
private void EnsureChildControls()
{
     CustomersListViewByQuery = new ListViewByQuery();
     // The rest of the code follows here....
}
Для нормальной работы требуется установить несколько обязательных свойств: List тип которого SPList и Query тип которого SPQuery. В OnLoad или EnsureChildControls можно добавить код:

list = SPContext.Current.Web.Lists["Customers"];
CustomersListViewByQuery.List = list;
string query = null;
if (!Page.IsPostBack)
{
    query = "<OrderBy><FieldRef Name='Title' Ascending='true' /></OrderBy>";
}
else
{
    // apply filtering and/or sorting
}
SPQuery qry = new SPQuery(list.DefaultView);
qry.Query = query;
CustomersListViewByQuery.Query = qry;
Запрос обязательно должен строиться на существующем view листа или контрол не будет работать. Данные в контроле отображаются согласно переданному запросу.
Можно устанавливать ограничение на кол-во возвращаемых записей RowLimit:
qry.RowLimit = 50;

Сортировка

Юзер может сортировать колонку стандартным кликаньем на header колонки и выбрав A on Top or Z on Top.

listviewbyquery-sort2

Это генерирует post back, и данные будут переданы на серверную сторону для обработки сохраненные в Context.Request["SortField"] и Context.Request["SortDir"]. Следующий код показывает как можно работать с ними.

if (!Page.IsPostBack)
{
    query = "<Query><OrderBy><FieldRef Name='Title' Ascending='true' /></OrderBy></Query>";
}
else
{
    // apply filtering and/or sorting
   if (this.Context.Request != null && this.Context.Request["SortField"] != null)
   {
       string sortorder = BuildSortOrder(this.Context.Request["SortField"],
           (this.Context.Request["SortDir"] == "Asc" ? "true" : "false"));
       if (string.IsNullOrEmpty(query))
           query = sortorder;
       else
           query += sortorder;
   }
}
private string BuildSortOrder(string fieldName, string sortOrder)
{
    string query = null;
    if (!string.IsNullOrEmpty(fieldName))
    {
        query = string.Format("<OrderBy><FieldRef Name='{0}' Ascending='{1}' /></OrderBy>", fieldName, sortOrder);
    }           
    return query;
}

Фильтрация
Также юзер может фильтровать данные в ListViewByQuery контроле  listviewbyquery-filter После этого также происходит posting back, выбранное поле хранится в Context.Request["FilterField1"], а выбранное значение в Context.Request["FilterValue1"]. Если фильтров более чем один (например выбран ещё один фильтр в другой колонке) они будут хранится по такому же принципу с именами FilterField2 и FilterValue2. private string BuildFilter() {     string query = "{0}";     bool isFound = true;     int counter = 1;     while (isFound)     {           string filterfield = "FilterField" + counter.ToString();           string filtervalue = "FilterValue" + counter.ToString();           if (this.Context.Request[filterfield] != null && this.Context.Request[filtervalue] != null)           {                // Field type must be treated differently in case of other data type                if (counter > 1)                    query = "<And>" + query + "{0}</And>";                query = string.Format(query, string.Format("<Eq><FieldRef Name='{0}' /><Value Type='Text'>{1}</Value></Eq>",                this.Context.Request[filterfield], this.Context.Request[filtervalue]));                counter++;           }           else           {                isFound = false;           }     }     if (!string.IsNullOrEmpty(query))        query = "<Where>" + query + "</Where>";     return query; } Этот код будет работать только для текстовых полей. Если необходимы другие типы, например number, choice или lookup, необходимо использовать так: SPField field = list.Fields[filterfield]; query = string.Format(query, string.Format("<Eq><FieldRef Name='{0}' /><Value Type='{1}'>{2}</Value></Eq>",                        this.Context.Request[filterfield], field.TypeAsString, this.Context.Request[filtervalue]));

Группировка

ListViewByQuery контрол может также гррупировать элементы, для этого нужно использовать CAML GroupBy элемент: query = "<GroupBy Collapse='FALSE'><FieldRef Name='CountryRegionName' /><FieldRef Name='City' /></GroupBy>"; Этот пример группирует данные по CountryRegionName и по City. listviewbyquery-expanded Если вы решили показать сразу сгруппированый вариант, установите Collapse аттрибут в TRUE и получите: listviewbyquery-collapsed Но здесь есть проблема, если они сгруппированы по умолчанию, то при открытиии вы получити только надпись Loading и никаких данных. listviewbyquery-collapsed-expanding Эта проблема решается так: устанавливаем Collapse аттрибут в FALSE и размещаем наш ListViewByQuery контрол в DIV, затем задаём у дива ID. Ниже дива вставляем скрипт: <div id="ViewDiv" class="ms-authoringcontrols" style="width:700px">      <spuc:ListViewByQuery ID="CustomersListViewByQuery" runat="server" Width="700px" /> </div> <script language="javascript">     ExpLinkFormer = function(divId)     {          this._DivId = divId;          this._init();     }     ExpLinkFormer.prototype = {         _init: function() {          var div = document.getElementById(this._DivId);          var links = div.getElementsByTagName("a");         for (var i = 0; i < links.length; i++) {           if (links[i].href == "javascript:" && links[i].onclick.toString().indexOf("ExpCollGroup") > -1) {               //alert(links[i]);               links[i].click();            }         }      }     }     var expLnk = new ExpLinkFormer('ViewDiv'); </script> ListViewByQuery контрол загружает все данные без группировки, но при рендеринге страницы, клик метод выполняется для всех hyperlinks которые имеют вызов на ExpCollGroup в их href аттрибуте.

Как изменить имя и email адресс существующего пользователя

Можно это сделать через PowerShell

Set-SPUser -Identity 'имямашины\TestUser' -DisplayName TestUser'  -Email 'testuser@yahoo.com' -Web http:// имямашины[порт]

понедельник, 4 марта 2013 г.

Создание Timer Jobs в SharePoint 2010 ориентированных на конкретный Web-Applications

Обзор Timer Jobs в SharePoint 2010

Microsoft SharePoint 2010 timer jobs выполняют большую часть фоновых работ, которые необходимы для поддержания вашей фермы SharePoint. Они могут быть настроены работать только один раз, или на постоянной графику. SharePoint используют timer jobs для поддержания длительных рабочих процессов, например чтобы очистить старые сайты и журналы, а также для мониторинга проблем фермы. SharePoint также использует timer jobs для выполнения логики развертывания решения и функцию активации. Timer jobs имеют ряд преимуществ. Они могут работать периодически и независимо от пользователей, которые имеют доступ к вашим сайтам SharePoint.
Вы можете просмотреть задания таймера на ферме с помощью страницы Job Definitions  в SharePoint 2010 Central Administration. Чтобы получить доступ к странице Job Definitions, выберите All Programs > Microsoft SharePoint 2010 Products > SharePoint 2010 Central Administration. На сайте центра администрирования выберите Monitoring ссылке. Наконец, нажмите ссылку Review Job Definitions в разделе Timer Jobs части страницы (рисунке 1).

Рисунок 1.  

Подготовка к созданию timer jobs SharePoint

Прежде чем вы сможете создать свой SharePoint timer jobs, необходимо установить Microsoft Visual Studio 2010. SharePoint 2010 должен быть установлен ​​на компьютере разработчика.
После установки необходимого программного обеспечения, запускаем студию и создаем новый проект SharePoint Empty Project, выбрав File > New > Project. (рисунок 2). В диалоговом окне проверьте, что NET Framework 3.5 выбран в раскрывающемся списке в верхней части, а затем нажмите кнопку ОК. 

Рисунок 2.












Сразу после нажатия кнопки ОК появится диалоговое окно, как показано на рисунке 3. Введите URL вашего сайта SharePoint в текстовое поле, выберите Deploy as a farm, а затем нажмите кнопку Готово. 

Рисунок 3.














После нажатия кнопки Готово Visual Studio создает и откроет проект, как показано на рисунке 4. Теперь, когда проект создан, вы можете начать добавлять классы, которые необходимы, чтобы сформировать основу вашей работы таймера SharePoint.

Рисунок 4.













Создание рaботы Timer jobs Sharepoint

Все задания таймера, в том числе те, которые установлены с SharePoint, создаются и выполняются с помощью SPJobDefinition класса. Для создания нового таймера SharePoint работу, необходимо сначала добавить в проект класс, который наследует от SPJobDefinition класса. В следующем фрагменте кода показан пример класса, который наследует от SPJobDefinition класса.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint;

namespace ArchiveFilesJob {
    public class ArchiveJob : SPJobDefinition {

        public ArchiveJob() : base() { }

        public ArchiveJob(string jobName, SPWebApplication webApp)
            : base(jobName, webApp, null, SPJobLockType.Job) {
            this.Title = jobName;
        }

        public override void Execute(Guid targetInstanceId) {
            // Put your job's code here.
        }
    }
}

Во фрагменте кода, ArchiveJob класс наследуется от SPJobDefinition класса. Когда вы создаете свой конструктор, вы должны передать значения для четырех параметров, описанных ниже в конструктор базового класса.


Имя Название работы.
WebApplication Экземпляр SPWebApplication класса, которому принадлежит эта работа.
Сервер Экземпляр класса SPServer, связанных с этой работой. Передайте ноль, если эта работа не связана с конкретным сервером.
LockType SPJobLockType значение, которое указывает на обстоятельства, при которых несколько экземпляров задания могут быть запущены одновременно.
 
В предыдущем фрагменте кода, null передается в качестве значения для сервера, поскольку эта работа не связана с конкретным сервером. SPJobLockType.Job передается в качестве значения для LockType, чтобы предотвратить SharePoint от запуска нескольких экземпляров работу одновременно. В таблице 2 перечислены возможные значения SPJobLockType и их описания.


None Блокировка отключается. Работа выполняется на всех серверах фермы, независимо от параметра который вы передаете для SPServer объекта.
ContentDatabase Работа выполняется для каждой базы данных контента, связанного с веб-приложением.
Job Только один сервер может выполнить задание за один раз.

После создания конструкторов, необходимо переопределить метод выполнения SPJobDefinition класса и заменить код этого места на свой. Если ваш код может работать без дополнительной настройки, вы закончили создание этого класса. В противном случае, вы должны добавить конфигурацию для вашего проекта, как описано ниже.

Включение конфигурации для timer jobs  SharePoint

Для хранения данных конфигурации работы, необходимо создать классы, которые будут  содержать эту конфигурацию и хранить его в SharePoint. Во-первых, этот класс должен наследовать от класса SPPersistedObject. Далее, поля в классе должы быть открытыми, отмеченными [Persisted] атрибутом, а также встроенного типа данных (например, Guid, Int, String, и так далее), наследуется от SPAutoSerializingObject, или должен представляет собой коллекцию типа, который содержит одну из встроенных типов или тип наследования от SPAutoSerializingObject. Только поля сохраняются, а не свойства. Следующий фрагмент кода показывает два класса, которые используются для настройки ArchiveJob класса.

using Microsoft.SharePoint.Administration;
public class ArchiveJobSettings : SPPersistedObject {
    public static string SettingsName = "ArchiveFilesJobSettings";

    public ArchiveJobSettings() { }
    public ArchiveJobSettings(SPPersistedObject parent, Guid id)
        : base(SettingsName, parent, id) { }

    [Persisted]
    public Dictionary<Guid, SiteArchiveSettings> SiteArchiveSettings =
        new Dictionary<Guid, SiteArchiveSettings>();
}

public class SiteArchiveSettings : SPAutoSerializingObject {
    [Persisted]
    public Guid SiteCollectionId = Guid.Empty;
    [Persisted]
    public Guid SiteId = Guid.Empty;
    [Persisted]
    public Guid SourceDocLibId = Guid.Empty;
    [Persisted]
    public Guid DestinationDocLibId = Guid.Empty;
    [Persisted]
    public int MaxDays = 30;
    [Persisted]
    public bool Enabled = true;
Во фрагменте кода, класс ArchiveJobSettings используется для настройки ArchiveJob класса. Он наследует от SPPersistedObject, и имеет одно поле с именем SiteArchiveSettings, помеченный [Persisted] атрибутом. Поле SiteArchiveSettings позволяет выполнение заданий на любом количестве сайтов в том же веб приложении. Тип данных поля SiteArchiveSettings является коллекцией SiteArchiveSettings объектов, наследуемых  от класса SPAutoSerializingObject.
Следует отметить, что класс ArchiveJobSettings имеет два конструктора - конструктор по умолчанию, который является обязательным для всех классов сериализации, и второй конструктор, который вызывает конструктор своего базового класса. Второй конструктор передает экземпляр SPPersistedObject, который действует как родительский объект ArchiveJobSettings, и Guid, который используется, чтобы назначить ему уникальный идентификатор в SharePoint. Поскольку ArchiveJob связан с конкретным объектом SPWebApplication то тот же объект SPWebApplication становится родителем объекта ArchiveJobSettings, когда он сохраняется в SharePoint.
Класс SiteArchiveSettings содержит сайт-специфические настройки для ArchiveJob класса. Он наследует от SPAutoSerializingObject, и его поля придерживаются тех же правил, как и для класса SPPersistedObject. Поля, отмеченные [Persisted] атрибутом позволяет им сохраняться в  SharePoint.

ArchiveJobSettings jobSettings =
    new ArchiveJobSettings(webApplication, Guid.NewGuid());
// Be sure to change the URL below to one appropriate for your
// environment.
using (SPSite siteCollection = new SPSite("http://local.demo.com")) {
    using (SPWeb site = siteCollection.RootWeb) {
        SiteArchiveSettings siteSettings = new SiteArchiveSettings();
        siteSettings.SiteCollectionId = site.Site.ID;
        siteSettings.SiteId = site.ID;
        siteSettings.SourceDocLibId = site.Lists["MyDocLib"].ID;
        siteSettings.DestinationDocLibId =
            site.Lists["MyDocLibArchive"].ID;
        siteSettings.MaxDays = 30;
        siteSettings.Enabled = true;
        jobSettings.SiteArchiveSettings.Add(site.ID, siteSettings);
    }
}
jobSettings.Update(true);

Во фрагменте кода, вы создаете конфигурацию ArchiveJobSettings класса, передавая экземпляр SPWebApplication, который представляет собой объект веб-приложения SharePoint и новый Guid. После этого, можно настроить поля в классе.
Для получения конфигурации, необходимо получить экземпляр SPWebApplication, вызвать его метод GetChild, а затем передать в него класс, который у вас служит хранилищем конфигурации.
public override void Execute(Guid targetInstanceId) {
    ArchiveJobSettings jobSettings =
        this.WebApplication.GetChild<ArchiveJobSettings>(ArchiveJobSettings.SettingsName);
    if (jobSettings == null) {
        return;
    }
    // Code omitted.
}

Класс ArchiveJobSettings был извлечен из SharePoint, вызвав GetChild метод родителя SPWebApplication. Если ничего не было ранее сохранено в SharePoint, вызов GetChild метод возвращает нулевое значение. 

Развертывание задания таймера

Теперь, когда вы создали задание и конфигурации классов, вы должны добавить функцию установки решения в SharePoint сервере 

Рисунок 5
 












Добавляем новую фичу, конфигурируем её при необходимости. Добавляем обработчик для включиения и выключения фичи. Для этого в контекстном меню фичи выбираем пункт Add Event Receiver. После этого, в сгенерированном коде вы должны раскомментировать FeatureActivated и FeatureDeactivating методы. Остальные можно удалить, потому что они не используются. Далее, добавляем код в FeatureActivated метод для создания таймера и код в FeatureDeactivating метод, чтобы удалить его соответственно. В следующем примере показано, как зарегистрировать и отменить регистрацию ArchiveFilesJob объекта.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWebApplication webApplication = (SPWebApplication)properties.Feature.Parent;

    // Remove job if it exists.
    DeleteJobAndSettings(webApplication);

    // Create the job.
    ArchiveJob job = new ArchiveJob(ArchiveJob.JobName, webApplication);

    // Create the schedule so that the job runs daily, sometime between midnight and 4 A.M.
    SPDailySchedule schedule = new SPDailySchedule();
    schedule.BeginHour = 0;
    schedule.BeginMinute = 0;
    schedule.BeginSecond = 0;
    schedule.EndHour = 3;
    schedule.EndMinute = 59;
    schedule.EndSecond = 59;
    job.Schedule = schedule;
    job.Update();

    // Configure the job to archive files in a few sites in this web
    // application.
    ArchiveJobSettings jobSettings = new ArchiveJobSettings(webApplication, Guid.NewGuid());
    using (SPSite siteCollection = new SPSite("http://local.demo.com"))
    {
        SPWeb site = siteCollection.RootWeb;
        SiteArchiveSettings siteSettings = new SiteArchiveSettings();
        siteSettings.SiteCollectionId = site.Site.ID;
        siteSettings.SiteId = site.ID;
        siteSettings.SourceDocLibId = site.Lists["MyDocLib"].ID;
        siteSettings.DestinationDocLibId = site.Lists["MyDocLibArchive"].ID;
        siteSettings.MaxDays = 30;
        siteSettings.Enabled = true;
        jobSettings.SiteArchiveSettings.Add(site.ID, siteSettings);
        // Add more sites here.
    }
    jobSettings.Update(true);
}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
    SPWebApplication webApplication =  (SPWebApplication)properties.Feature.Parent;
    DeleteJobAndSettings(webApplication);
}

private void DeleteJobAndSettings(SPWebApplication webApplication)
{
    foreach (SPJobDefinition job in webApplication.JobDefinitions) {
        if (job.Name == ArchiveJob.JobName)
        {
            job.Delete();
            break;
        }
    }

    // Delete the job's settings.
    ArchiveJobSettings jobSettings =
        webApplication.GetChild<ArchiveJobSettings>(ArchiveJobSettings.SettingsName);
    if (jobSettings != null)
        jobSettings.Delete();


В примере кода, FeatureActivated метод получает экземпляр SPWebApplication класса (для которых эта функция активируется). Далее, FeatureActivated метод вызывает метод DeleteJobAndSettings, чтобы удалить существующие таймеры и настройки, если они уже существуют. Далее создайм таймер. После того, настраиваем собственное расписание запуска.

SPMinuteSchedule Выполнение задания каждую минуту.
SPHourlySchedule Выполнение задания каждый час.
SPDailySchedule Выполнение задания в день.
SPWeeklySchedule Выполнение задания в неделю.
SPMonthlySchedule Выполнение задания в месяц.
SPYearlySchedule Выполнение задания в год. 

В предыдущем примере кода, SPDailySchedule класса используется для выполнения задания в день. Указываются значения самого раннего и самого позднего времени, соответственно. Таймер служба случайным образом выбирает время, в течение этого интервала, чтобы начать работу. После того как вы установите расписание для свого таймера, необходимо вызвать обновление метода таймера. Последним шагом в методе для создания экземпляра класса ArchiveJobSettings, установливаем его свойства, а затем сохраняем.
В FeatureDeactivating методе, метод DeleteJobAndSettings вызывается, чтобы удалить ранее зарегистрированные таймеры. Метод использует DeleteJobAndSetting.

Тестирование и отладка ваших SharePoint timer jobs

При отладке кода SharePoint, устанавливается Debug режим, а затем нажмите F5 для отладки проекта. Visual Studio компилирует код, в пакете SharePoint решения (WSP-файл), а затем развертывает пакет решений в SharePoint сервере.

Для отладки задания таймера

Для отладки таймера в SharePoint, необходимо подключить к процессу, выберите Debug > Attach to proccess в строке меню Visual Studio.
В открывшемся окне проверяем, что флажки в нижней части выбраны, а затем выберираем OWSTIMER.EXE из списка доступных процессов.
Рисунок 6











  
Нажмите Присоедениться, чтобы завершить присоединение к службе таймера SharePoint. Теперь вы можете добавить точки остановки в вашем кода. 

четверг, 3 января 2013 г.

SQL Server 2008 R2. Интеграция Reporting Services и SharePoint 2010 шаг за шагом

Не секрет, что продукт фирмы Microsoft SharePoint – это один из самых динамически быстро развивающихся продуктов. В SQL Server 2008 R2 появилась долгожданная возможность интеграции Reporting Services и SharePoint 2010. Если вдуматься, это вполне логичный шаг. В обоих этих продуктах используются одни и те же технологии, так почему же не скрестить их и попробовать, что из этого получиться? В данной статье остановлюсь на процессе инсталляции Reporting Services входящий в SQL Server 2008 R2 в режиме интеграции с SharePoint 2010, и какие новые возможности предоставляются администратору баз данных.
В предыдущих версиях Reporting Services требовалось скачать дополнительный компонент для интеграции с SharePoint 2010, на сегодняшний день инсталляция этого компонента производиться автоматически. Давайте посмотрим шаг за шагом процесс установки Reporting Services в режиме интеграции с SharePoint 2010. Статья навеяна по мотивам практически исполняемой задачей интеграции этих двух продуктов. При разборе технической документации выяснилось, что написано достаточно много, но чтобы выстроить четкий план решения практической задачи интеграции Reporting Services SQL Server 2008 R2 и SharePoint 2010 – на это уходит достаточно много времени. Итак, приступим.
Посмотрим на демонстрационное окружение:

Имя компьютера
Операционная система
Службы и приложения
DC
Windows Server 2008 R2
Доменная служба Active Directory (test.local), DNS
SPS
Windows Server 2008 R2
SharePoint 2010, Microsoft SQL Server 2008 R2
Это могут быть физические серверы, могут быть виртуальные под Hyper-V. С точки зрения безопасности лучше, чтобы домен контроллер был всегда выделенным без установленного лишнего программного обеспечения. Все программные продукты русской редакции, надо отметить, что фирма Microsoft серьезно потрудилась над переводом своих продуктов.
Конечно же, для установки нам понадобиться дистрибутивы SQL Server 2008 R2 и SharePoint 2010. На первом этапе – предположим у вас уже есть установленный SharePoint 2010 на сервере SPS, начнем интеграцию с него.
1. Вставляем дистрибутив SharePoint 2010. Если автозапуск не стартовал, с компакт диска запускаем файл splash.hta. В разделе «Установить» выбираем пункт «Установить необходимое ПО». Здесь нужен компонент «Настройка служб отчетов SQL Server 2008R2». Выбираем «Далее». 
Рисунок 1. Начало установки средств интеграции.
2. Соглашаемся с лицензионным соглашением, перед этим внимательно и обстоятельно его читаем. Выбираем «Далее».
3. На этом этапе программа установки SharePoint 2010 автоматически скачивает необходимые компоненты из Интернет и конфигурирует сервер. Дожидаемся окончания установки. Выбираем «Готово».
Надо отметить, что интеграция возможна только в том случае, если программный продукт SharePoint 2010 установлен в режиме фермы. В том случае, если служба Reporting Services и сервер фермы SharePoint находятся на разных серверах, нужно произвести минимальную установку SharePoint 2010 с присоединением сервера к существующей ферме, а затем переходить к следующему этапу.
На втором этапе настроим сервер SPS, на котором уже установлен экземпляр по умолчанию SQL Server 2008 R2. Для этой цели нам понадобиться дистрибутив SQL Server 2008 R2.
1. Вставляем дистрибутив SQL Server 2008 R2. Если автозапуск не стартовал, с компакт диска запускаем файл setup.exe. Выбираем справа «Установка» – «Новая установка или добавление компонентов к существующей установке».
2. На странице «Правила поддержки установки» нажимаем «ОК». Если кнопка не доступна для нажатия нужно выбрать кнопку «Показать подробности» и посмотреть ошибки.
3. На странице «Файлы поддержки программы установки» нажимаем «Установить».
4. На странице «Правила поддержки установки» нажимаем «Далее». Если кнопка не доступна для нажатия нужно нажать «Показать подробности» и посмотреть ошибки.
5. На странице «Тип установки» выбираем «Добавление компонентов к существующему экземпляру SQL Server R2». Нажимаем «Далее».
 Рисунок 3. Выбор типа установки.
6. На странице «Выбор компонентов» отмечаем «Службы Reporting Services». Нажимаем «Далее» 3 раза.
7. На странице «Конфигурация сервера» вводим доменную учетную запись, от имени которой будет запускаться служба Reporting Services. Нажимаем «Далее».
8. На странице «Настройка служб Reporting Services» выбираем «Установить конфигурацию по умолчанию для работы в режиме интеграции с SharePoint». Нажимаем «Далее» 3 раза и затем «Установить».
9. На странице «Готово» можно убедиться, что служба Reporting Services успешно установлена и нажать «Готово».
Как видите все достаточно просто, в случае если и SharePoint 2010 и SQL Server 2008 R2 находится на одном сервере.
Если на шаге 8 (страница «Настройка служб Reporting Services») выбрано «Установить, но не настраивать сервер отчетов» то службу Reporting Services необходимо будет настроить через инструмент «Диспетчер конфигурации служб Reporting Services»:
1. Нажимаем последовательно «Пуск» – «Все программы» – «Microsoft SQL Server R2» – «Средства настройки» – «Диспетчер конфигурации служб Reporting Services» – «MSSQLServer»
2. Если сервис остановлен, то на странице «SPS\MSSQLServer» нажимаем «Запуск»
Рисунок 4. Стартовая страница диспетчера конфигурации
3. На странице «Учетная запись службы» выбираем «Использовать другую учетную запись» – вводим доменную учетную запись и пароль, нажимаем «Применить».

Рисунок 5. Страница выбора учетной записи службы.
4. На странице «URL-адрес веб-службы» можно оставить все значения по умолчанию, нажимаем «Применить».
5. На странице «База данных» настроим базу данных для режима интеграции с SharePoint:
a) Нажимаем «Изменить базу данных».
b) Выбираем «Создать новую базу данных сервера отчетов», нажимаем «Далее».
c) На странице «Сервер базы данных» набираем имя экземпляра сервера SQL (в данном случае SPS) и учетную запись обладающая административными привилегиями создания базы данных, нажимаем «Далее».
d) На странице «База данных» набираем имя базы данных, к примеру «ReportServer», и выбираем «Режим интеграции с SharePoint», нажимаем «Далее».

Рисунок 6. Выбор базы данных.
e) На странице «Учетные данные» можно выбрать учетные данные, отличные от данных текущего пользователя. От имени выбранной учетной записи SQL Server будет подключаться к базе данных сервера отчетов. По умолчанию выбирается учетная запись службы. Нажимаем «Далее»
f) На странице «Сводка» еще раз просматриваем все выбранные установки и жмем «Установить».
g) Нажимаем «Готово»
После окончания создания новой базы данных в режиме интеграции с SharePoint, нажимаем «Применить».
6. На странице «URL-адрес диспетчера отчетов» нужно указать виртуальный каталог. Можно оставить название по умолчанию «Reports». Нужно заметить, что напрямую к этому каталогу из браузера обратиться в режиме интеграции с SharePoint будет невозможно. Отчеты можно будет просматривать непосредственно с сервера SPS. Не забываем нажать «Применить». 

Рисунок 7 URL-адрес диспетчера отчетов.
7. На следующем шаге чтобы убедиться, что все настроено правильно, нужно закрыть и снова открыть «Диспетчер конфигурации служб Reporting Services». Переходим на страницу «Масштабное развертывание». Проверим что «Режим сервера отчетов» действительно «Интеграция с SharePoint» и статус состояния «Соединенный».

Рисунок 8. Проверка настройки Reporting Services.
Настройка Reporting Services успешно завершена. Как уже упоминалось ранее, управлять отчетами Reporting Services SQL Server 2008 R2 в режиме интеграции с SharePoint можно только из инструмента «Центр администрирования». На третьем этапе, перед тем как начать управление нужно произвести следующие настройки на сервере SPS:
1. Открываем «Центр администрирования» – «Пуск» – «Все программы» – «Microsoft SharePoint 2010 Products» – «Центр администрирования SharePoint 2010».
2. Переходим «Общие параметры приложения» – «Службы Reporting Services» – выбираем ссылку «Интеграция со службами Reporting Services»

Рисунок 9. Инструмент «Центр администрирования SharePoint 2010».
3. Вводим необходимую информацию:
- URL-адрес веб-службы сервера отчетов – http://sps/ReportServer
- Режим проверки подлинности – проверка подлинности Windows
- Имя пользователя – пользователь домена, обладающий административными привилегиями в ферме SharePoint 2010.
Нажимаем «ОК»

Рисунок 10. Страница «Интеграция со службами Reporting Services».
4. В случае успешного ввода необходимой информации, процесс интеграции успешно завершается. Выбираем «Закрыть»
Рисунок 11. Сводка информации по интеграции со службами Reporting Services.
На последнем этапе остается задача создание отчетов прямо из необходимых библиотек. Здесь есть два подхода. Первый подход это создать узел SharePoint 2010 с использованием шаблона «BI Center». Этот подход не требует дополнительных усилий, на уровне библиотеки на таком узле уже доступны необходимые типы контента при создании нового документа. На втором подходе давайте остановимся поподробней, так как чаще всего встречается именно такая практическая задача. Подход заключается в том, чтобы в существующей библиотеке добавить, например новый тип контента, позволяющий создавать отчет Reporting Services. Итак, по шагам:
1. Открываем необходимый узел SharePoint, например http://sps.
2. Переходим в библиотеку «Общие документы» на ленте выбираем – «Библиотека» – «Параметры» – «Параметры библиотеки» (Если на ленте нет меню «Параметры» значит, пользователь под которым вы зашли не обладает необходимыми административными привилегиями). 
Рисунок 12. Навигация на ленте библиотеки SharePoint.
3. В разделе «Общие параметры» переходим по ссылке «Дополнительные параметры» – В разделе «Типы контента» устанавливаем «Да». Тем самым мы разрешаем управление типами контента для текущей библиотеки. Выбираем внизу экрана «ОК»

Рисунок 13. Включение выбора типа контента на уровне библиотеки.
4. На странице «Библиотека документов» в разделе «Типы контента» переходим по ссылке «Добавление из существующих типов контента». В выпадающем списке выбираем «Типы содержимого сервера отчетов». Есть три типа – «Источник данных отчета», «Модель в построителях отчетов» и Отчет в построителях отчетов. Выбираем необходимые кнопкой «Добавить». Нажимаем «Ок». 

Рисунок 14. Выбор нужного типа контента на уровне библиотеки.
Давайте проверим правильность произведенных настроек. На уровне библиотеки «Общие документы» на ленте выбираем «Документы» – «Создать документ». На ряду со стандартными типами контента, появилось три новых элемента «Источник данных контента», «Модель в построителе отчетов» и «Отчет в построителе отчетов».

Рисунок 15. Создание нового отчета как документа библиотеки.
Как можно убедиться, настройки прошли успешно теперь на уровне библиотеки «Общие документы» можно создать, к примеру, отчеты в Reporting Services. Нужно отметить, что построитель отчетов Report Builder 3.0 уже присутствует в системе и его устанавливать отдельно нет необходимости. Данная статья не охватывает работу с этим инструментом, полагаю, этот материал больше подойдет для отельной следующей статьи.
Очевидно, что жизнь администраторов баз данных, которые занимаются построением отчетов с помощью Reporting Services, значительно облегчается с выходом Microsoft SQL Server 2008 R2, за счет унификации интерфейса и полной интеграции с продуктом Microsoft SharePoint 2010.

среда, 19 декабря 2012 г.

Получение коллекция хранимых свойств в SPWeb

Некоторые вещи в рабочем проекте хранятся именно в SPWeb.Properties, и довольно часто возникает необходимость быстро посмотреть, что сейчас там лежит. Иногда - изменить какое-нибудь значение. Для этого я использую Power Shell. Набираем:
$s = Get-SPSite http://имя сайта
$w = $s.OpenWeb()
$w.Properties
А можно ещё так
Get-SPWeb -Identity http://server | Select -ExpandProperty AllProperties
Или еще проще
(Get-SPWeb -Identity http://server).Properties
А для изменения свойства используем:
$web = Get-SPWeb "http://SITE_URL"
$web.SetProperty("property_name", "property_value"); 

$web.Update(); 
Restart-Service W3SVC -force

Взято  из: http://omlin.blogspot.com/2011/01/spweb.html