Category Archives: SharePoint

Como solucionar problemas de erros de SharePoint misteriosos.

Visão geral:

Depuração é difícil ao desenvolver funcionalidade personalizada para Windows SharePoint Services 3.0 (WSS) ou Microsoft Office do SharePoint Server (MUSGO). O principal culpado é que SharePoint normalmente superfícies muito pouca informação de diagnóstica sobre o navegador da web quando ocorre um erro. Esta entrada de blog descreve como localizar adicionais gerados pelo sistema de informações de diagnóstico que muitas vezes podem fornecer esse extra pouco de detalhe que um necessita para identificar causas. Isso pode então levar para resolver o problema.

Eu tenho usado esta técnica com grande sucesso para resolver erros de outra maneira misteriosos.

Abordagem:

SharePoint economiza uma grande quantidade de informações em um log de diagnóstico em um arquivo de log na 12 colméia.

A seção"12" está normalmente localizado em "C:\Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12 ". (Não sei se é possível para o 12 colméia para viver em outro lugar, Na verdade).

A idéia é localizar o arquivo de log atual, forçar o erro e, em seguida, rapidamente, abra o arquivo de log. Esses arquivos de log são caracterizados por:

  • Grandes quantidades de informações. SharePoint gera uma quantidade muito grande de informações de diagnóstico e grava-lo para esse arquivo de log muito rapidamente. Você precisa ser rápido com os dedos para capturá-lo.
  • Multiplicidade. SharePoint não grava em um único arquivo de log, mas prefiro gera vários arquivos de log em seqüência.
  • Copie e cole bem no MS Excel.

Meu método favorito:

  1. Abra um explorador de windows, apontando para o 12 hivelogs.
  2. Classificar a exibição para mostrar por data de modificação (mais recente primeiro).
  3. Realce o arquivo de log mais atual.
  4. Em uma janela do navegador da web, forçar o erro ocorra.
  5. Rapidamente, abra o arquivo de log atual e copiar seu conteúdo para o MS Excel.
  6. Pular para o final e analisar as entradas relevantes.

Outras notas:

Por padrão, o log de diagnóstico situa-se na 12 diretório de hiveLOGS.

MS Best practices (conforme Mike T. da Microsoft) Estado que os arquivos de log devem ser salvo em um disco rígido separado. Um faz isso via central admin. O administrador do sistema pode ter feito isso, Nesse caso você obviamente precisa encontrar o arquivo de log lá em vez do padrão 12 Localização de colmeia).

Esta entrada aborda questões tais como:

  • Fluxo de trabalho do SharePoint falhado ao iniciar devido a um erro interno.
  • (mais para ser adicionado ao longo do tempo)
  • Esta entrada foi útil diagnosticar erros de fluxo de trabalho (EG. "O fluxo de trabalho falhou ao iniciar devido a um erro interno").

MUSGO: Introdução eficaz de uma organização

(Esta entrada postada cruzado entre http://paulgalvin.spaces.live.com/blog/ and http://blogs.conchango.com)

As postagens neste site são minhas e não necessariamente representam as posições da Conchango, estratégias ou opiniões.

Visão geral:

Esta entrada descreve algumas informações de fundo sobre um grande (3,000 usuários) Microsoft Office SharePoint Server (MUSGO) implantação e o que fizemos para obter o projeto de tal forma que o cliente está satisfeito e firmemente por um caminho de rolamento que termina com a completa adoção de conjunto de recursos do MOSS. Como a escrita da entrada, Nós somos aproximadamente 50% completa com a primeira fase do projeto. Como as coisas progridem, Eu vou atualizar esta entrada e/ou escrever novas entradas.

Neste caso específico, a empresa já tinha instalado o SharePoint Portal Server 2003. O grupo de ti instalado o produto em uma espécie de "Vamos ver se alguém se importa" moda. Rapidamente foi adotado por muitos usuários de negócios e se tornou bastante popular na empresa em geral. Como você pode imaginar., Esta não foi a melhor estratégia de implantação (que o cliente admite) e quando MOSS chegou na cena, o cliente resolveu "fazer direito" e nos contratou para ajudá-los.

Uma das questões centrais com que nos confrontamos quando começamos a implementação deste projecto foi: Como nós introduzimos MOSS para este cliente? Dado que o cliente já tinha experiência com SharePoint, Gostaríamos de saber — Precisamos fazer "diferencial" formação ou fazer que começamos do zero até? Depois de trabalhar com usuários-chave, determinamos que tratar isto como um projeto de campo verde, fazia mais sentido.

Essa decisão deu um ponto de partida, mas ainda nos deixou com a grande exigência de descobrir uma boa estratégia para MOSS desenrolando a Enterprise. MOSS é um animal tão grande … Ele inclui o gerenciamento de conteúdo, gestão de documentos, pesquisa, segurança, público alvo, gerenciamento de projetos, "fabuloso quarenta e" modelos, fluxo de trabalho, conector de dados de negócios, etc. Junte isso com o fato de que é uma organização de grande porte que pode realmente fazer uso de praticamente todos os principais MOSS recurso e você tem as qualidades de um grande projeto com um empresa de alcance e muitas coisas boas acontecendo.

Nós estamos confrontados com esta questão e outra vez … MOSS tem uma empresa que chegam com seu conjunto de recursos de empresa, ainda até um pouco sofisticados clientes têm dificuldade em absorver mentalmente esses recursos, Deixe em paz, incorporando uma fração apreciável deles em sua rotina diária.

Não tenho uma solução mágica para o problema. Dirijo-me ao invés disso apenas os primeiros passos que tomamos com o cliente para levá-los para o caminho para adoção bem sucedida a longo prazo.

Âmbito de aplicação:

Como eu queria que a equipe para criar um plano de projeto que incluía tais Marcos como "PoepleSoft integração via BDC concluída", "Novo produto interdepartamental lançamento fluxo de trabalho completo" e "Gestão executiva KPI aceitos", Tive que me contentar com algo menos. Isto não é dizer que "menos" é ruim. Na verdade, Quanto menos"" que decidimos para a implantação inicial foi milhas à frente de onde eles estavam antes de começar. No nosso caso, Quanto menos"" transformou-se:

  • Gestão de documentos simples usando bibliotecas de documentos, tipos de conteúdo e controle de versão.
  • Pesquisa eficientes com base em tipos de conteúdo e personalizado pesquisa avançada (através de propriedades gerenciadas, XSLT para produzir resultados muito, etc).

Além das características acima de toda a empresa (significa que eles estavam a ser desenrolado para todos os departamentos e usuários), Nós adicionamos os seguintes singleton no escopo mini-projetos:

  • Prova de conceito de integração de BDC.
  • Processo de várias etapas e multi-filial de fluxo de trabalho criado através do SPD.
  • Complexo formulário do InfoPath.
  • Aplainando KPI para algum processo de negócios (Provavelmente HR aquisição de talentos no nosso caso, Mas isso pode mudar).

O escopo aqui não é 100% precisos mas representativo de nossa abordagem e suficiente para o meu propósito aqui, que é explicar o que eu considero para ser um eficaz"" introdução de musgo que irá definir o cliente com firmeza para baixo o caminho dourado para adoção cheia de musgo.

Eu não vou escrever muito mais sobre o singleton nesta entrada. Quero salientar que estes são parte de nossa estratégia de over-arching. A idéia é implementar os núcleo documento gestão e busca recursos para todos os usuários, no entanto, fornecer altamente funcional, altos visíveis e altamente representativos exemplos de outras características de musgo do núcleo que estão simplesmente além da capacidade da maioria dos usuários de absorver nesta fase inicial. No entanto, Eles serão "lá fora" e espera-se que outras unidades de negócios irão saber de ou aprender sobre eles e querem esses recursos para si, levando a maior adoção. Estas histórias de sucesso de singleton também servem para nossa equipe de vendas "munição" para com sucesso ganhando segundo, projetos de terceiros e n-fase.

O que apresentamos e por?

Tendo resolvido na gestão de documentos e pesquisa como uma exigência de toda a empresa de linha de base, Precisamos começar a reunir detalhes. Por uma questão prática, este girava em torno de compreensão de seus documentos e que, finalmente, mapeado para a compreensão de tipos de conteúdo.

Descobri que é difícil de explicar os tipos de conteúdo sem ajudas visuais. Folclórica mais técnicas pode andar longe de uma discussão sobre tipos de conteúdo, quando CT é descritos em termos de banco de dados. "A tomografia é semelhante a uma tabela de banco de dados, tem colunas e colunas são definidas em termos de tipos de dados, Mas os tipos de dados de CT incluem mais do que simples inteiro/data, Mas também "escolha" e "pesquisa" e afins." Podemos falar sobre a "extensão" tipos de conteúdo, muito parecido com um pode herdar a funcionalidade de uma classe base em linguagens orientada a objeto. No entanto isto obviamente não é útil para a pessoa de admin de departamento de transporte que não tem nenhum fundo técnico. Ou seja, quase todo mundo que importa em uma distribuição de musgo.

Usar um quadro branco é duvidoso. Apresentei a idéia de um tipo de conteúdo e brilhante desenhada (ou então eles parecem) fotos de tipos de conteúdo e o que eles fazem para você em termos de pesquisa e como eles podem ser expandidos, etc. No final, Parece que algumas lâmpadas transformaram-se, Mas a imagem de quadro branco resultante é uma bagunça.

Isto levou-ao nosso lugar de pouso atual e tão longe, mais eficaz: um site de sandbox MOSS configurado para mostrar esses recursos.

Usando o site da caixa de areia, Demonstramos:

  • Tipos de conteúdo:
    • Criando um CT com vários tipos de dados (texto, Data, escolha, Boolean, pesquisa, etc).
    • Estendendo um CT através da criação de um novo CT com base em um pai.
    • À procura de documentos usando metadados de CT.
  • Bibliotecas de documentos:
    • Associando um único CT com uma biblioteca.
    • O que acontece quando nós fazer upload de um documento para a biblioteca?
    • Associando vários CT é uma biblioteca de doc.
    • O que acontece quando nós fazer upload de um documento para a biblioteca?
    • Filtrando e classificando através de títulos de coluna em uma lib doc.
    • Visualizações de biblioteca de documentos:
      • Classificação
      • Agrupamento
      • "Entrada rápida" (vista de folha de dados)
      • "Sem marcas de formatação de dados" (para ajudar com a migração para MOSS de outras fontes de conteúdo; mais sobre isso abaixo).

O Site de Sandbox:

Projetamos nosso site sandbox para ser uma característica permanente no ambiente de desenvolvimento deve ser usado para fins de treinamento muito tempo depois de terminar o projeto e incluiu vários artefatos conforme descrito:

Tipos de conteúdo:

Definimos os seguintes tipos de conteúdo: Fatura, Ordem de compra, Factura de serviços.

Nós selecionamos ordem de compra e faturas, porque eles são mais ou menos universalmente sob
entidades se levantou. Todos no negócio entendem que uma factura é um pedido de pagamento de uma cliente para um quantidade emitido em um determinado Data a ser pago como por alguns condições de pagamento. Isto leva a uma definição natural de um CT que chamamos de "formação factura" (para distingui-lo de qualquer outro tipo de factura). A ordem de compra é definida da mesma forma facilmente. Também criamos uma factura de serviços de formação"" Criando um novo CT baseado a factura de treinamento"" CT e adicionada apenas uma coluna, "serviços prestados".

Com o acima, Podemos agora demonstrar algumas características-chave do CT sem perder-se tentando explicar um conceito abstracto primeiro; todos já entendem o que queremos dizer com "factura" e "ordem de compra" e em vez disso são capazes de concentrar-se na mecânica de CT em si.

Listas personalizadas:

CT com colunas do tipo "pesquisa" aponte para uma personalizado lista ou biblioteca de documentos. Nós usamos isso extensivamente e para a caixa de areia, criamos uma lista personalizada que contém clientes de apoio. Escolhemos os clientes porque é um conceito fácil de entender e fácil de demonstrar. O CT fatura tem uma coluna, "cliente" definido do tipo "pesquisa" isso aponta para esta lista.

Criamos uma lista semelhante personalizada para gerenciar fornecedores"" para a ordem de compra"" CT.

Bibliotecas de documentos:

Criamos duas bibliotecas de documentos: "Facturas" e "Misto de documentos".

Configuramos a biblioteca de documentos faturas para gerenciar somente documentos do tipo CT "Fatura".

Configuramos os documentos mistos"" biblioteca para gerenciar todos os três CT.

Criar vários modos de exibição que mostram a classificação, filtragem, Agrupamento e folha de dados.

Pesquisa:

Nós definidas duas novas propriedades gerenciadas e mapeados os ao número da factura e do cliente.

Criamos um novo site de busca personalizado avanço e modificado para permitir que os usuários procurar por "facturas" usando essas duas propriedades mapeadas.

Modificar o XSLT para que o número da factura e do cliente, Quando apresentam, aparecem em uma tabela HTML em uma cor brilhante. O objetivo aqui é demonstrar que tal formatação é possível.

Colocando tudo junto:

Nós arranjamos para usuários-chave participar de uma demonstração.

Seguimos este script simples:

  1. Descrever o significado e o propósito de um CT, usando notas fiscais e ordens de compra como exemplos.
  2. Mostrar a definição de CT de factura enquanto simultaneamente assegurando-lhes que eles não precisam usar aquelas telas se, Basta pegar os conceitos.
  3. Vá para a biblioteca de documentos faturas.
  4. Fazer upload de um documento.
  5. Demonstrar que o cliente suspensa realmente é originária de uma lista personalizada.
  6. Adicionar um novo cliente para a lista de clientes e em seguida, atualizar dados de meta a factura recentemente carregado com o cliente recém-criado.
  7. Mudar para os "documentos mistos" biblioteca e upload de um documento. Explicar como o sistema solicita um tipo de documento.
  8. Vai voltar para a biblioteca de documentos faturas e mostrar como clicar em um nome de coluna altera a ordem de classificação.
  9. Demonstrar a filtragem no nível de coluna.
  10. Mostrar diferentes pontos de vista que demonstram a classificação multi-nível, filtragem e agrupamento.
  11. Mostrar a vista de folha de dados.
  12. Explicar a finalidade de um "documentos sem marcas de formatação" Exibir.
  13. Alterne para a personalizado pesquisa avançada.
  14. Por agora, o documento recentemente carregado deve ter sido rastreado e indexado, Então, realizar uma pesquisa que demonstra a capacidade de localizar essa factura através a propriedade mapeada.
  15. Vamos demonstrar a diferença entre pesquisa através de propriedades mapeadas vs. Basta uma pesquisa de texto.

Neste ponto, Terminamos mais ou menos com o demo. Parece demorar sobre 30 Para 45 minutos, dependendo de quantas perguntas as pessoas perguntam.

Então enviamo-los de volta para sua mesa de trabalho com "dever de casa". Este consiste de uma simples planilha excel onde pedimos-lhes para definir para nós que eles pensam que eles precisam em termos de CT, ambos de alto nível (finalidade apenas nome e negócio) assim como o tipo de dados e colunas guardariam na coluna. Não pedimos para definir tipos de dados de coluna em termos de musgo, Mas termos de negócios.

Em resumo:

Nós criamos um ambiente seguro que podemos usar para demonstrar alguns recursos do MOSS núcleo cujo apelo são toda a empresa.

Podemos ter modelado entidades empresariais facilmente compreendida e comum para que os usuários podem se concentrar em musgo e não atolar sobre as entidades / exemplos próprios.

Usuários de negócios afastar sessões de teses com "dever de casa" sob a forma de documentos do excel que eles agora são competentes para preencher e usar para projetar seus próprios tipos de conteúdo do primeiro corte.

Finalmente, Como podemos realizar demonstrações ao longo do tempo, Membros da equipe do cliente se tornar-se mais capazes de levar adiante, fazer o demo se e geralmente liberam o resto de nós para trabalhar em questões mais complexas, como taxonomia global, fluxos de trabalho complexos, BDC e afins.

MUSGO: Exemplo funcional – tipo de dados personalizados

Cenário de negócios:

Implementação de toda a empresa de musgo para empresa de fabricação com 30+ algumas dúzias de departamentos corporativos e sites.

Objetivo de negócio:

Apesar de uma infinidade de grupos empresariais (departamentos, locais, etc), alguns dados devem ser mantidos a um nível global. Por exemplo, uma lista mestre autoritária de todos os locais físicos da empresa (EG. instalações de fabricação, localizações de armazém, escritórios de vendas) deve ser mantido em um local central.

Problema técnico:

A taxonomia corporativa foi implementada usando vários conjuntos de sites. Gostaríamos que criar a lista autoritária de locais físicos em uma lista personalizada de WSS. Em seguida, quando precisávamos de ter uma coluna em um tipo de conteúdo (ou uma coluna é adicionada a uma biblioteca lista ou doc) que continha locais corporativos, criaríamos uma coluna usando a pesquisa"" DataType e ponto para esta lista mestre.

Infelizmente, tipos de dados de pesquisa devem acessar uma lista de fonte "localmente" significa que nossa lista autoritária não abrangem conjuntos de sites.

Solução técnica:

Implementar um novo tipo de dados personalizados implementado baseado em SPField t: Microsoft.SharePoint.SPField e representado como um DropDownList na interface do usuário cujos ListItems popular da lista mestra de WSS.

Nós criamos um novo conjunto de sites chamado "http://localhost/EnterpriseData". Lá, criamos uma lista personalizada chamada "Corporate locais". Esta lista só usa o padrão "título" campo para conter a lista de locais corporativos reais.

Um segue várias etapas distintas para criar um tipo de dados personalizados no WSS. Eles são:

  1. Definir uma classe que herda de SPField t: Microsoft.SharePoint.SPField (um pode herdar de outros campos, se necessário).

Aqui está o código para que:

público Classe XYZZYCorporateLocationField : SPFieldText
{
público XYZZYCorporateLocationField
(SPFieldCollection campos, Cadeia de caracteres typeName, Cadeia de caracteres displayName)
: base(campos, typeName, displayName) { }

público XYZZYCorporateLocationField
(SPFieldCollection campos, Cadeia de caracteres displayName)
: base(campos, displayName) { }

público substituir BaseFieldControl FieldRenderingControl P:Microsoft.SharePoint.SPField.FieldRenderingControl
{
Obter
{
BaseFieldControl controle = Novo XYZZYCorporateLocationFieldControl();
controle. FieldName = Isso.InternalName;
Voltar controle;
} //Obter
} // FieldRenderingControl p:Microsoft.SharePoint.SPField.FieldRenderingControl

público substituir Cadeia de caracteres GetValidatedString(objeto valor)
{
se (Isso.Necessário || valor. ToString().É igual a(Seqüência de caracteres.Vazio))
{
jogar Novo SPFieldValidationException ("O departamento não está atribuído.");
}
Voltar base.GetValidatedString(valor);
} // GetValidatedString

} // XYZZYCorporateLocation

  1. Definir outra classe que herda do controle de campo base, como em:

público Classe XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protegido DropDownList XYZZYCorporateLocationSelector;

protegido substituir Cadeia de caracteres DefaultTemplateName
{
Obter
{
Voltar "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

público substituir objeto Valor
{
Obter
{
EnsureChildControls();
Voltar Isso.XYZZYCorporateLocationSelector. SelectedValue;
} // Obter
conjunto
{
EnsureChildControls();
Isso.XYZZYCorporateLocationSelector.SelectedValue = (Cadeia de caracteres)Isso.ItemFieldValue;
} // conjunto
} // substituir o objeto de valor

protegido substituir privatevoid CreateChildControls()
{

se (Isso.Campo = = nulo || Isso.ControlMode = = SPControlMode.Exposição)
Voltar;

base.CreateChildControls();

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

se (Isso.XYZZYCorporateLocationSelector = = nulo)
jogar Novo Exceção("ERRO: Não é possível carregar. Arquivo ASCX!");

se (!Isso.IsPostBack página.)
{

usando (SPSite t: Microsoft.SharePoint.SPSite local = Novo SPSite t: Microsoft.SharePoint.SPSite("http://localhost/enterprisedata"))
{
usando (SPWeb Web = site. OpenWeb())
{

SPList t: Microsoft.SharePoint.SPList currentList = web. Listas de["Empresas locais"];

foreach (SPItem XYZZYCorporateLocation em currentList.Items)
{
se (XYZZYCorporateLocation["Título"] == nulo) continuar;

Cadeia de caracteres theTitle;
theTitle = XYZZYCorporateLocation["Título"].ToString();

Isso.XYZZYCorporateLocationSelector.Items.Add
(Novo ListItem(theTitle, theTitle));

} // foreach

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

} // Se não for um postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

O código acima basicamente implementa a lógica para preencher o DropDownList com os valores da lista personalizada do WSS localizado no http://localhost/enterprisedata e nomeado "departamentos corporativos".

Eu defini a ambas as classes em um arquivo único. cs, compilou e colocá-lo no GAC (forte exigido, É claro).

  1. Implementar um modelo de controle (.ascx) como mostrado:

<%@ Controle Língua= "C#" Herda="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versão = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Sempre" %>
<%
@ Registre-se TagPrefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Montagem="Microsoft.SharePoint, Versão = 12.0.0.0, Cultura = neutro, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registre-se TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Montagem="Microsoft.SharePoint, Versão = 12.0.0.0, Cultura = neutro, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" runat= "servidor">
<Modelo>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" runat= "o servidor" />
</Modelo>
</
SharePoint:RenderingTemplate>

O acima é salvos em c:\programa filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Finalmente, Criamos um arquivo XML para salvar para o... diretório 12XML. Este é o CAML que define o tipo de dados personalizados e para o meu exemplo, se parece com isso:

<?XML Versão="1.0" codificação="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Campo Nome="TypeName">CorporateLocations</Campo>
<
Campo Nome="ParentType">Texto</Campo>
<
Campo Nome="TypeDisplayName">Empresas locais</Campo>
<
Campo Nome="TypeShortDescription">Todos os locais XYZZY corporativa, incluindo instalações de fabricação ou outras.</Campo>
<
Campo Nome="UserCreatable">VERDADE</Campo>
<
Campo Nome="ShowInListCreate">VERDADE</Campo>
<
Campo Nome="ShowInDocumentLibraryCreate">VERDADE</Campo>
<
Campo Nome="ShowInSurveyCreate">VERDADE</Campo>
<
Campo Nome="ShowInColumnTemplateCreate">VERDADE</Campo>
<
Campo Nome="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Versão = 1.0.0.0, Cultura = neutro, PublicKeyToken = b0b19e85410990c4</Campo>
<
RenderPattern Nome="DisplayPattern">
<
Interruptor>
<
Expr>
<
Coluna />
</
Expr>

<Caso Valor=""/>

<Padrão>
<
HTML>
<![CDATA[
<span style = "color:Vermelho"><b>]]>
</
HTML>

<
Coluna SubColumnNumber="0" HTMLEncode="VERDADE"/>

<HTML><![CDATA[</b></extensão>]]></HTML>

</
Padrão>
</
Interruptor>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Este arquivo XML adiciona o tipo de dados personalizados para o WSS "biblioteca" e corresponde a ele contra o GAC tinha montagem.

Depois de todos esses bits se posicionando, iisreset no servidor e ele deve começar a trabalhar muito bem.

MUSGO: Atualizando uma lista personalizada

Há muitos bons exemplos de atualizar listas personalizadas através do SDK. Aqui está mais um.

Problema de negócios: Formulário do InfoPath foi concebido que permite aos usuários para entrar on-line compra requisições. Requisição de PO números devem ser seqüência tradicional com base em valores inteiros e calculados automaticamente.

Solução de negócios: Criar uma lista personalizada de musgo contendo duas colunas: "ControlField" e "ControlValue". A coluna de valor contém o próximo número de requisição de compra. Observe que o genérico "controle" Convenção de nomenclatura prevê campos de controle futuras que podem ser usados conforme necessário.

Solução técnica: Criar um web service acessado pelo cliente do InfoPath. O serviço da web retorna para o próximo número de requisição de compra e atualiza o valor da lista.

Lições aprendidas:

  • Ao adicionar esse serviço web como uma fonte de dados para o formulário do InfoPath, Achei necessário para convertê-lo para um udc e armazená-lo em uma biblioteca de conexão de dados.
  • Eu também achei necessário para ativar os scripts de domínio cruzado através de administração de serviços centrais // gerenciamento de aplicativos // configuração do servidor de forma.
  • A primeira vez que o formulário tentou acessar o serviço web, demora um pouco e de vez em quando, seria o tempo. Eu brincava com as configurações em configuração do servidor para expandir a forma de configurações de tempo limite e que pareceu ajudar.

O código:

usando Sistema;
usando System. Web;
usando System.Web.Services;
usando Protocols;
usando Microsoft. SharePoint;
usando System. Configuration;

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

//Descomente a linha a seguir se usando componentes concebidos
//InitializeComponent();
}

/// <Resumo>
/// Obter o número de PO a próxima da lista do sharepoint po número controle.
/// Incrementar o número de PO nessa lista.
/// </Resumo>
/// <Retorna></Retorna>
[WebMethod]
público Cadeia de caracteres GetNextPoNumber()
{
Cadeia de caracteres SpPoControlSiteName; // Nome do site do musgo real que hospeda a lista de controle de PO.
Cadeia de caracteres SpPoControlListName; // Nome da lista de musgo real que contém o controle de Po.

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

Cadeia de caracteres nextPoReqNumber = "xyzzy";

usando (SPSite t: Microsoft.SharePoint.SPSite local = Novo SPSite t: Microsoft.SharePoint.SPSite(SpPoControlSiteName))
{
usando (SPWeb Web = site. OpenWeb())
{

SPList t: Microsoft.SharePoint.SPList currentList = web. Listas de[SpPoControlListName];

foreach (SPItem controlItem em currentList.Items)
{

se (((Cadeia de caracteres)controlItem["ControlField"]).É igual a("NextPoNumber"))
{
nextPoReqNumber = (Cadeia de caracteres)controlItem["ControlValue"];

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

int_nextPoReqNumber ;

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

} // Localização de, ler e atualizar o número da OC na lista.


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

Voltar nextPoReqNumber;

}
}