Arquivo da Categoría: SharePoint

Como solucionar erros do SharePoint misteriosas.

Visión global:

A depuración é difícil ao desenvolver función personalizada para Windows SharePoint Services 3.0 (WSS) ou Microsoft Office SharePoint Server (Moss). The main culprit is that SharePoint normally surfaces very little diagnostic information on the web browser when an error occurs. This blog entry describes how to locate additional system-generated diagnostic information that can often provide that extra bit of detail that one needs in order to identify root causes. This can then lead to solving the problem.

Eu teño usado esta técnica con gran éxito para solucionar erros doutra forma misteriosa.

Aproximación:

SharePoint salva unha gran cantidade de información nun rexistro de diagnóstico nun ficheiro de rexistro no 12 colmea.

The "12 hive" is usually located at "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12". (Eu non estou seguro se é posible para o 12 colmea para vivir noutro lugar, de feito).

A idea é atopar o ficheiro de rexistro actual, force the error and then quickly open the log file. These log files are characterized by:

  • Copious amounts of information. SharePoint generates a very large amount of diagnostic information and writes it to that log file very quickly. You need to be quick with the fingers to capture it.
  • Multiplicity. SharePoint does not write to a single log file but rather generates multiple log files in sequence.
  • Copia e pega moi ben en MS Excel.

O meu método favorito:

  1. Abre un explorador de Windows apuntando para a 12 colmea rexistros.
  2. Ordenar a exhibición para amosar por data de modificación (o último primeiro).
  3. Centrado o ficheiro de rexistro máis actual.
  4. Nunha ventá de navegador, forzar o erro ocorrer.
  5. Abrir rapidamente o ficheiro de rexistro actual e copiar o seu contido para MS Excel.
  6. Ir para o final e analizar as entradas relevantes.

Outras Notas:

Por defecto, o rexistro de diagnóstico está situado no 12 colmea directorio rexistros.

MS Mellores prácticas de (ace por Mike T. Microsoft) state that the log files should be saved to a separate hard drive. One does this via central admin. Your system administrator may have done this, Neste caso, por suposto que atopar o ficheiro de rexistro existe en vez do estándar 12 localización colmea).

Esta entrada aborda cuestións como:

  • Fluxo de traballo do SharePoint se puido iniciar debido a un erro interno.
  • (máis a ser engadido ao longo do tempo)
  • Esta entrada foi útil diagnosticar erros de fluxo de traballo (e.g. "The workflow failed to start due to an internal error").

Moss: Introdución eficaz dunha organización

(esta cruz entrada publicou entre http://paulgalvin.spaces.live.com/blog/ e http://blogs.conchango.com)

As fotos desta web son da miña autoría e non representan necesariamente as posicións do Conchango, estratexias ou opinións.

Visión global:

Esta entrada describe unha información de fondo sobre un gran (3,000 usuarios) Microsoft Office SharePoint Server (Moss) rollout and what we did to get the project rolling in such a way that the client is happy and firmly down a path that ends with full adoption of the MOSS feature set. As of the writing of the entry, que son aproximadamente 50% complete with the first phase of the project. As things progress, Vou actualizar esa entrada e / ou escribir novas entradas.

Neste caso concreto, the company had already installed SharePoint Portal Server 2003. The IT group installed the product in a sort of "let’s see if anyone cares" fashion. It was quickly adopted by many business users and became quite popular in the enterprise at large. Como podes imaxinar, esta non foi a mellor estratexia de implementación (que o cliente admite) e cando Moss chegou ao lugar, the client resolved to "do it right" e nos contratos para axudalos.

Unha das cuestións centrais que enfrontamos cando comezamos a posta en marcha deste proxecto foi: Como é que imos introducir Moss para este cliente? Given that the client already had experience with SharePoint, nós nos preguntar — do we need to do "differential" formación ou imos comezar desde cero? After working with key users, we determined that treating this as a green field project made more sense.

That decision gave a starting point but still left us with the major requirement of figuring out a good strategy for rolling MOSS out to the enterprise. MOSS is such a big animal … it includes content management, xestión de documentos, buscar, seguridade, público-obxectivo, xestión de proxectos, "fabulous forty" templates, fluxo de traballo, conector de datos de empresas, etc. Couple this with the fact that it’s a large organization that lata realmente facer uso de practicamente todos os principais característica Moss e ten os ingredientes dun gran proxecto cun alcance empresarial e moitas cousas boas a suceder.

Estamos confrontados con este problema de vez e outra vez … Moss ten un alcance empresa co seu conxunto de recursos da empresa, pero incluso os clientes pouco sofisticados teñen un tempo duro mentalmente absorber estes recursos, e moito menos a incorporación fracción considerable deles na súa rutina diaria.

I don’t have a magic solution to the problem. I instead address just the very first steps that we’ve taken with the client to lead them down the path to successful long-term adoption.

Alcance:

As much as I wanted the team to craft a project plan that included such milestones as "PoepleSoft Integration via BDC Completed", "New Cross-Departmental Product Launch Workflow Complete" and "Executive Management KPI’s Accepted", I had to settle for something less. This is not to say that "less" está mal. En realidade, the "less" that we decided for the initial rollout was miles ahead of where they were before we started. No noso caso, the "less" converter:

  • Xestión de documentos simple usando bibliotecas de documentos, version control and content types.
  • Busca efectiva en base a tipo de contidos e busca de antelación personalizado (vía propiedades administrados, XSLT para producir resultados moi, etc).

Ademais dos recursos de toda a empresa anterior (o que significa que eles estaban a ser estendido a todos os departamentos e usuarios), engadimos o seguinte Singleton no ámbito de mini-proxectos:

  • Proba de integración BDC concepto.
  • Multi-paso e multi-filial proceso de fluxo de traballo creado a través do SPD.
  • Formulario InfoPath complexo.
  • Superficie KPI para algúns procesos de negocio (probabelmente adquisición de talentos HR no noso caso, aínda que isto pode cambiar).

O ámbito aquí non é 100% accurate but representative of our approach and sufficient for my purpose here, which is to explain what I consider to be an "effective" introdución Moss que pode definir o cliente firmemente no camiño de ouro para adopción plena Moss.

I won’t write much more about the singleton in this entry. I do want to point out that these are part of our over-arching strategy. The idea is to implement the core document management and search features to all users yet provide highly functional, high visible and highly representative examples of other core MOSS features which are simply beyond the ability of most users to absorb at this early stage. Con todo, they will be "out there" e unha espera que outras unidades de negocio vai saber ou aprender sobre eles e queren eses recursos para si, leading to greater adoption. These singleton success stories also serve to provide our sales team "ammunition" para o éxito conquistando a segunda, third and n-phase projects.

Que fixemos Introducir e por que?

Estabelecendo na xestión de documentos e de investigación como base esixencia de toda a empresa, we needed to start gathering details. As a practical matter, esta xiraba en torno de comprender os seus documentos e que finalmente mapeado para entender os tipos de contido.

I’ve found it’s difficult to explain content types without visual aides. More technical folk can walk away from a discussion about content types when CT’s are described in database terms. "A CT is similar to a database table, que ten columnas e as columnas son definidos en termos dos tipos de datos, pero os tipos de datos CT incluír máis que simple enteiro / data, but also "choice" and "lookup" and the like." We can talk about "extending" tipo de contido, much like one can inherit functionality from a base class in object oriented languages. However this is obviously not helpful for the transportation department admin person who has no technical background. É dicir,, case todo o mundo que importa nun lanzamento Moss.

Using a white board is iffy. I’ve presented the idea of a content type and drawn brilliant (ou ben parecen) imaxes de tipos de contido eo que eles fan para ti en termos de busca e como poden ser expandidas, etc. A finais, se sente como algunhas lámpadas se converteron en, but the resulting white board picture is a mess.

Isto levounos a nosa actual e ata o momento máis eficaz lugar de desembarco: un sitio Moss sandbox configurado para mostrar estas características.

Usando o sitio seguro, demostramos:

  • Tipo de contido:
    • Creando un CT con varios tipos de datos (texto, data, elección, booleana, investigación, etc).
    • Estendéndose un CT, creando un novo CT en base a un pai.
    • Busca de documentos usando metadatos CT.
  • As bibliotecas de documentos:
    • Asociándose un único CT cunha biblioteca.
    • Que pasa cando a carga de un documento para que a biblioteca?
    • Asociando múltiple CT da biblioteca cun doc.
    • Que pasa cando a carga de un documento para que a biblioteca?
    • A filtraxe e ordenación vía títulos de columnas nun doc lib.
    • Vista da biblioteca de documentos:
      • Clasificando
      • Agrupación
      • "Quick entry" (vista de folla de datos)
      • "Untagged data" (para axudar na migración a Moss doutras fontes de contidos; máis sobre iso a continuación).

O sitio Sandbox:

Nos proxectos nosa web sandbox ser unha característica permanente no ámbito de desenvolvemento a ser utilizado para fins de adestramento, moito tempo despois que rematar o proxecto e incluíu varios artefactos, como se describe:

Tipos de contido:

Foron definidos os seguintes tipos de contidos: Factura, Orde de Compra, Servizos Invoice.

Nós seleccionamos fin factura e compra, porque son máis ou menos universalmente baixo
stood entities. Everyone in business understands that an invoice is a demand for payment to a cliente para unha cantidade emitido nun correcto data a ser pago de acordo con algúns condicións de pagamento. This leads to a natural definition of a CT which we called "Training Invoice" (para distinguilo lo de calquera outro tipo de factura). The purchase order is similarly easily defined. We also created a "Training Services Invoice" by creating a new CT based upon the "Training Invoice" CT e engadiu só unha columna, "services rendered".

Co anteriormente exposto, agora podemos demostrar algunhas características clave do CT sen encallar intentando explicar un concepto abstracto primeiro; everyone already understands what we mean by "invoice" and "purchase order" e no seu lugar son capaces de concentrarse na mecánica do propio CT.

Listas personalizadas:

CT with columns of type "lookup" point to a custom list or document library. We use this extensively and for the sandbox, we created one supporting custom list that contains customers. We picked customers because it’s an easy concept to understand and easy to demonstrate. The Invoice CT has a column, "customer" that is defined of type "lookup" that points at this list.

We created a similar custom list to manage "vendors" for the "Purchase Order" CT.

As bibliotecas de documentos:

Creamos dúas bibliotecas de documentos: "Invoices" and "Mixed Documents".

We configured the invoices document library to manage only documents of CT type "Invoice".

We configured the "Mixed Documents" biblioteca para xestionar todos os tres do CT.

Crear varias visións que mostran a clasificación, filtrado, folla de datos e agrupación.

Procurar:

Definimos dúas novas propiedades administrados e mapeados eles Número de Factura e Cliente.

We created a new customized advance search site and modified it to enable users to search for "invoices" usar estas dúas propiedades mapeadas.

Modificar o XSLT para que a factura e número de cliente, cando presente, appear in an HTML table in a bright color. The objective here is to demonstrate that such formatting is possible.

Xuntando todo:

Nos arranxos para os usuarios clave para participar nunha demostración.

Seguimos este script simple:

  1. Describir o significado ea finalidade dun CT, usar notas fiscais e ordes de compra como exemplos.
  2. Amosar a definición CT factura, á vez asegurando-lles que eles non teñen que usar esas pantallas de si, coller os conceptos.
  3. Vaia á biblioteca de documentos facturas.
  4. Cargar un documento.
  5. Demostrar que o cliente desplegable é realmente provén dunha lista personalizada.
  6. Engadir un novo cliente á lista de clientes e, a continuación, actualizar os metadatos da factura pouco cargado co cliente recentemente creado.
  7. Switch to the "mixed documents" library and upload a document. Explain how the system prompts for a document type.
  8. Go back to invoices document library and show how clicking on a column name changes sort order.
  9. Demostrar a filtrado a nivel de columna.
  10. Amosar distintos puntos de vista que demostran a clasificación multi-nivel, filtrado e agrupación.
  11. Mostrar a vista de folla de datos.
  12. Explain the purpose of a "untagged documents" ver.
  13. Alterne para a investigación personalizado avanzada.
  14. Ata agora, o documento pouco cargado debería ser Rastrexar e indexado, para levar a cabo unha investigación que demostra a capacidade de atopar esa factura a través da propiedade mapeada.
  15. Nós demostramos a diferenza entre a procura por propiedades mapeadas vs. só unha investigación de texto.

Neste punto, we are more or less done with the demo. It seems to take about 30 para 45 actas, dependendo de cantas preguntas que a xente pregunta.

We then send them back to their desks with "homework". This consists of a simple excel spreadsheet where we ask them to define for us what they think they need in terms of CT’s, tanto a un alto nivel (só o nome ea finalidade da empresa) as well as columns and type of data they would store in the column. We don’t ask them to define column data types in MOSS terms, but business terms.

En resumo:

We’ve created a sandbox environment that we can use to demonstrate some core MOSS features whose appeal are enterprise-wide.

We have modeled easily understood and common business entities so that users can focus on MOSS and not get bogged down on the entities / propios exemplos.

Business users walk away from theses sessions with "homework" en forma de documentos Excel que están agora competente para encher e utilizar para proxectar os seus propios tipos de contidos de primeira corte.

Finalmente, como facemos demos ao longo do tempo, propios membros do equipo do cliente se fan máis capaces de levar adiante, facer a demostración de si e, xeralmente, libre-se do resto de nós para traballar en cuestións máis complexas, tales como taxonomía mundial, fluxos de traballo complexos, BDC e afíns.

Moss: Exemplo Funcional - tipo de datos personalizado

Escenario empresarial:

En toda a empresa a implantación de Moss para empresa de construción con 30+ sitios e unha ducia de departamentos corporativos.

Negocios Obxectivo:

A pesar de un gran número de grupos empresariais (departamentos, locais, etc), certos datos debe ser mantida a un nivel mundial. Por exemplo, unha lista mestra autorizada de todos os lugares físicos da empresa (e.g. instalacións de produción, localizacións de almacén, oficinas de vendas) a manter nun lugar central.

Problema Técnico:

A taxonomía empresa implementado empregando varios conxuntos de sitios. Teriamos gusto de crear a lista oficial de lugares físicos nunha lista personalizada WSS. Entón, cando necesitamos ter unha columna nun tipo de contidos (ou unha columna engadida a unha lista ou biblioteca doc) que as empresas locais contidos, we would create a column using the "lookup" tipo de datos e apuntar a esta lista mestra.

Desafortunadamente, lookup datatypes must access a source list "locally" o que significa que a nosa lista oficial non pode abranguer conxuntos de sitios.

Solución Técnica:

Aplicar un novo tipo de datos personalizado aplicado na base SPField e representado como un DropDownList no UI cuxo ListItems cubrir a partir da lista WSS mestre.

Creamos unha nova colección sitio chamado "http://localhost/EnterpriseData". Alí, we created a custom list named "Corporate Locations". This list just uses the standard "Title" campo para conter a lista de lugares corporativos reais.

Un segue varias etapas distintas para crear un tipo de datos personalizado na WSS. Son:

  1. Definir unha clase que herda de SPField (alguén pode herdar doutros campos, se é necesario).

Aquí está o código para que:

público clase XYZZYCorporateLocationField : SPFieldText
{
público XYZZYCorporateLocationField
(SPFieldCollection campos, corda typeName, corda displayName)
: base(campos, typeName, displayName) { }

público XYZZYCorporateLocationField
(SPFieldCollection campos, corda displayName)
: base(campos, displayName) { }

público substituír BaseFieldControl FieldRenderingControl
{
obter
{
BaseFieldControl control = novo XYZZYCorporateLocationFieldControl();
control.FieldName = este.InternalName;
volver control;
} //obter
} // fieldrenderingcontrol

público substituír corda GetValidatedString(obxecto valor)
{
se (este.Required || value.ToString().Igual(Corda.Baleiro))
{
xogar novo SPFieldValidationException ("Department is not assigned.");
}
volver base.GetValidatedString(valor);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Establecer outra clase que herda o control de campo de base, como no:

público clase XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protexido DropDownList XYZZYCorporateLocationSelector;

protexido substituír corda DefaultTemplateName
{
obter
{
volver "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

público substituír obxecto Valor
{
obter
{
EnsureChildControls();
volver este.XYZZYCorporateLocationSelector.SelectedValue;
} // obter
conxunto
{
EnsureChildControls();
este.XYZZYCorporateLocationSelector.SelectedValue = (corda)este.ItemFieldValue;
} // conxunto
} // override object Value

protexido substituír invalidar CreateChildControls()
{

se (este.Field == nulo || este.ControlMode == SPControlMode.Ver)
volver;

base.CreateChildControls();

este.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");

se (este.XYZZYCorporateLocationSelector == nulo)
xogar novo Excepción("ERROR: Cannot load .ASCX file!");

se (!este.Page.IsPostBack)
{

utilización (SPSite site = novo SPSite("Http://localhost / enterprisedata"))
{
utilización (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists["Corporate Locations"];

foreach (SPItem XYZZYCorporateLocation en currentList.Items)
{
se (XYZZYCorporateLocation["Title"] == nulo) continuar;

corda thetitle;
theTitle = XYZZYCorporateLocation["Title"].ToString();

este.XYZZYCorporateLocationSelector.Items.Add
(novo Listitem(thetitle, thetitle));

} // foreach

} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost/enterprisedata")

} // if not a postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

O código anterior, basicamente aplica a lóxica para cubrir o DropDownList cos valores da lista personalizada WSS situado na http://localhost/enterprisedata and named "Corporate Departments".

Eu define ambas clases nun arquivo de cs único., compilado-lo e colocar-lo no GAC (forte necesaria, claro).

  1. Implementar un modelo de control (.ascx) como se mostra:

<%@ Control Linguaxe="C#" Herda="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Version = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode="Always" %>
<%
@ Rexistrarse Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" Montaxe="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Rexistrarse Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montaxe="Microsoft.SharePoint, Version = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID="XYZZYCorporateLocationFieldControl" runat="server">
<Modelo>
<áspide:DropDownList ID="XYZZYCorporateLocationSelector" runat="server" />
</Modelo>
</
SharePoint:RenderingTemplate>

A descrición anterior é gardado en c:\Arquivos de programas Arquivos comúns Microsoft Shared Web Server Extensions 12 CONTROLTEMPLATES.

  1. Finalmente, creamos un arquivo XML para gardar no ..... 12 directorio XML. Este é CAML que define o noso tipo de datos personalizado e para o meu exemplo, Parece que este:

<?xml versión="1.0" codificación="utf-8" ?>
<
FieldTypes>
<
FieldType>
<
Campo Nome="TypeName">CorporateLocations</Campo>
<
Campo Nome="ParentType">Texto</Campo>
<
Campo Nome="TypeDisplayName">Corporate Locations</Campo>
<
Campo Nome="TypeShortDescription">All XYZZY Corporate locations including manufacturing or other facilities.</Campo>
<
Campo Nome="UserCreatable">TRUE</Campo>
<
Campo Nome="ShowInListCreate">TRUE</Campo>
<
Campo Nome="ShowInDocumentLibraryCreate">TRUE</Campo>
<
Campo Nome="ShowInSurveyCreate">TRUE</Campo>
<
Campo Nome="ShowInColumnTemplateCreate">TRUE</Campo>
<
Campo Nome="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Culture = neutral, PublicKeyToken=b0b19e85410990c4</Campo>
<
RenderPattern Nome="DisplayPattern">
<
Cambiar>
<
Expr>
<
Columna />
</
Expr>

<No caso de Valor=""/>

<Omisión>
<
HTML>
<![CDATA[
<span style="color:Red"><b>]]>
</
HTML>

<
Columna SubColumnNumber="0" HTMLEncode="TRUE"/>

<HTML><![CDATA[</b></van>]]></HTML>

</
Omisión>
</
Cambiar>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
This XML file adds the custom data type to the WSS "library" e compara-se contra o conxunto GAC'd.

Despois de se cambiar todos eses bits no seu lugar, iisreset no servidor e todo debe comezar a traballar moi ben.

Moss: Actualizar a lista personalizada

Hai moitos bos exemplos de actualizar as listas personalizadas a través do SDK. Aquí está aínda outra.

Problema de negocio: Formulario InfoPath foi deseñado que permite que os usuarios insiran as solicitudes de compra en liña. Números petición PO debe ser valores enteiros baseados en secuencias tradicionais e calcula automaticamente.

Business Solution: Crear unha lista MOSS personalizado que contén dúas columnas: "ControlField" and "ControlValue". O valor da columna contén o seguinte número da petición de compra. Note that the generic "control" convención de nomenclatura prevé campos de control futuros que poden ser utilizados segundo a necesidade.

Solución Técnica: Crear un servizo de web acceder polo cliente InfoPath. O servizo web devolve o seguinte número da petición de compra e actualiza o valor da lista.

Leccións aprendidas:

  • Engadindo este servizo web como fonte de datos para o formulario do InfoPath, Eu penso necesario convertelo en un UDC e almacena-lo nunha biblioteca de conexión de datos.
  • Eu tamén penso que é necesario para permitir cruz dominio script vía central de administración de servizos de // xestión de aplicacións // configuración do servidor de forma.
  • A primeira vez que o formulario intentou acceder o servizo web, leva un tempo e de cando en vez, sería o tempo de espera. Eu xogaba con as opcións de configuración do servidor de forma a ampliar a configuración de tempo de espera e que parecía axudar.

O código:

utilización Sistema;
utilización System.Web;
utilización System.Web.Services;
utilización System.Web.Services.Protocols;
utilización Microsoft.SharePoint;
utilización System.Configuration;

[WebService(Namespace = "Http://www.conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
público clase PoService : System.Web.Services.WebService
{
público PoService () {

//Uncomment the following line if using designed components
//InitializeComponent();
}

/// <resumo>
/// Obtain the next PO number from the sharepoint po number control list.
/// Increment the PO number in that list.
/// </resumo>
/// <returns></returns>
[WebMethod]
público corda GetNextPoNumber()
{
corda SpPoControlSiteName; // Name of the actual MOSS site that hosts the PO Control list.
corda SpPoControlListName; // Name of the actual MOSS list containing the Po control.

SpPoControlSiteName = ConfigurationSettings.AppSettings["PoControlListHostingSite"].ToString();
SpPoControlListName = ConfigurationSettings.AppSettings["PoControlList"].ToString();

corda nextPoReqNumber = "Xyzzy";

utilización (SPSite site = novo SPSite(SpPoControlSiteName))
{
utilización (SPWeb web = site.OpenWeb())
{

SPList currentList = web.Lists[SpPoControlListName];

foreach (SPItem controlItem en currentList.Items)
{

se (((corda)controlItem["ControlField"]).Igual("NextPoNumber"))
{
nextPoReqNumber = (corda)controlItem["ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Converter.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem["ControlValue"] = int_nextPoReqNumber;
controlItem.Update();
}

} // Locating, reading and updating the PO number in the list.


} // using spweb web = site.openweb()
} // using spsite site = new spsite("Http://localhost/mizuho")

volver nextPoReqNumber;

}
}