archivi categoria: SharePoint

Come risolvere i misteriosi Errori di SharePoint.

Panoramica:

Il debug è difficile durante lo sviluppo di funzionalità personalizzate per Windows SharePoint Services 3.0 (WSS) o Microsoft Office SharePoint Server (MUSCHIO). Il colpevole principale è che SharePoint superfici normalmente molto poco informazioni diagnostiche sul browser web quando si verifica un errore. Questo Blog viene descritto come individuare ulteriori informazioni diagnostiche generati dal sistema che possono spesso fornire che extra po ' di dettaglio che uno ha bisogno al fine di identificare le cause. Questo può quindi portare alla soluzione del problema.

Ho usato questa tecnica con grande successo di risolvere altrimenti misteriosi Errori.

Approccio:

SharePoint consente di risparmiare una grande quantità di informazioni in un log diagnostico in un file di registro nella 12 alveare.

Hive 12"" si trova di solito a "C:\Programma c:ProgrammiFile comuniMicrosoft SharedWeb Server Extensions12 ". (Non sono sicuro se è possibile per il 12 alveare di vivere in qualsiasi altro, Infatti).

L'idea è quella di individuare il file di registro corrente, forzare l'errore e quindi aprire rapidamente il file di registro. Questi file di registro sono caratterizzati da:

  • Abbondanti quantità di informazioni. SharePoint genera una grande quantità di informazioni diagnostiche e lo scrive nel file di log molto rapidamente. Devi essere veloce con le dita per catturarlo.
  • Molteplicità. SharePoint non scrive in un singolo file di registro ma piuttosto genera più file di log in sequenza.
  • Copiare e incollare piacevolmente in MS Excel.

Il mio metodo preferito:

  1. Aprire un esploratore di windows che punta alla 12 hivelogs.
  2. Ordinare la visualizzazione per mostrare da data modifica (prima i più recenti).
  3. Evidenziare il file di registro più attuale.
  4. In una finestra del browser web, forzare l'errore si verifichi.
  5. Rapidamente aprire il file di registro corrente e copiare il contenuto di MS Excel.
  6. Vai a fine e analizzare le voci pertinenti.

Altre note:

Per impostazione predefinita, diagnostico log si trova alla 12 hiveLOGS directory.

Procedure consigliate per MS (Secondo Mike T. di Microsoft) stato che i file di registro devono essere salvati su un disco rigido separato. Questo si fa tramite Amministrazione centrale. L'amministratore di sistema può aver fatto questo, nel qual caso sarebbe ovviamente necessario trovare il file di log ci invece del default 12 Ubicazione dell'alveare).

Questa voce affronta questioni quali:

  • Flusso di lavoro di SharePoint non è stato avviato a causa di un errore interno.
  • (più per essere aggiunti nel corso del tempo)
  • Questa voce è stata utile diagnosticare errori del flusso di lavoro (e. g. "Il flusso di lavoro impossibile avviare a causa di un errore interno").

MUSCHIO: Efficace introduzione a un'organizzazione

(Questa voce croce pubblicata tra http://paulgalvin.spaces.live.com/blog/ e http://blogs.conchango.com)

I commenti su questo sito sono mie e non rappresentano necessariamente le posizioni di Conchango, strategie o pareri.

Panoramica:

Questa voce descrive alcune informazioni di base su un grande (3,000 utenti) Microsoft Office SharePoint Server (MUSCHIO) Rollout e quello che abbiamo fatto per ottenere il progetto di rotolamento in modo tale che il cliente è felice e saldamente giù un percorso che termina con piena adozione del set di funzionalità di muschio. Al momento della stesura della voce, Ci sono circa 50% completare con la prima fase del progetto. Come progresso di cose, Potrai aggiornare questa voce e/o scrivere nuove voci.

In questo caso specifico, l'azienda aveva già installato SharePoint Portal Server 2003. Il gruppo IT installato il prodotto in una sorta di "Andiamo a vedere se qualcuno si prende cura" moda. Esso è stato rapidamente adottato da molti utenti aziendali e divenne molto popolare nell'impresa in generale. Come si può immaginare, Questo non era la migliore strategia di implementazione (che il client ammette prontamente) e quando la MOSS è arrivato sulla scena, il client ha deliberato di "do it right" e assunto in noi per aiutarli a.

Una delle domande centrali rivolto verso di noi quando abbiamo iniziato l'attuazione di questo progetto è stato: Come si introduce il muschio a questo client? Dato che il client ha già avuto esperienza con SharePoint, ci siamo chiesti — Abbiamo bisogno di fare "differenziale" formazione o non che partiamo da zero fino? Dopo aver lavorato con gli utenti chiave, Abbiamo determinato che trattare questo come un progetto di campo verde aveva più senso.

Tale decisione ha dato un punto di partenza, ma comunque ci ha lasciato con il requisito principale di capire una buona strategia per rullare MOSS all'impresa. MOSS è un grosso animale … Esso comprende la gestione dei contenuti, gestione documentale, ricerca, sicurezza, pubblico di targeting, gestione di progetto, "favoloso quaranta" modelli, flusso di lavoro, connettore dati business, ecc. Coppia questo con il fatto che è una grande organizzazione che può veramente fanno uso di praticamente ogni MOSS maggiori funzionalità e si ha la stoffa di un grande progetto con un'impresa di portata e tante buone cose accadendo.

Noi stiamo di fronte a questo problema ancora una volta … MOSS ha un'impresa di raggiungere con il suo set di funzionalità enterprise, ancora clienti anche un po' sofisticati hanno un tempo difficile assorbire mentalmente quelle caratteristiche, lasciate solo che incorporano una frazione apprezzabile di loro nella loro routine quotidiana.

Non ho una soluzione magica al problema. Rivolgo invece solo i primi passi che abbiamo preso con il cliente per condurli verso il basso il percorso di adozione di successo a lungo termine.

Ambito di applicazione:

Come avrei voluto la squadra a un piano di progetto che ha incluso tali pietre miliari come "PoepleSoft integrazione via BDC completato" del mestiere, "Nuovo prodotto trasversale lancio flusso di lavoro completo" e "Executive Management KPI accettato", Ho dovuto accontentarsi di qualcosa di meno. Questo non è per dire che "meno" non è male. Infatti, meno"" che abbiamo deciso per il lancio iniziale era miglia davanti a dove erano prima abbiamo iniziato. Nel nostro caso, meno"" trasformato in:

  • Gestione documentale semplice utilizzando le librerie di documenti, tipi di contenuto e di controllo di versione.
  • Ricerca efficace basato sui tipi di contenuto e personalizzato di ricerca avanzata (tramite la proprietà gestite, XSLT per produrre risultati piuttosto, ecc).

Oltre alle funzionalità di livello aziendale sopra (significato che dovevano essere applicati a tutti i reparti e gli utenti), Abbiamo aggiunto i seguenti singleton nell'ambito mini-progetti:

  • Prova di concetto integrazione BDC.
  • Processo di flusso di lavoro multi-step e multi-ramo creato tramite SPD.
  • Complesso modulo di InfoPath.
  • Affioramento di KPI per qualche processo di business (probabilmente HR acquisizione talenti nel nostro caso, però che possono cambiare).

Il campo di applicazione non è 100% preciso ma rappresentativo del nostro approccio e sufficiente per il mio scopo qui, che è quello di spiegare ciò che considero per essere un efficace"" introduzione di muschio che verrà impostato il client saldamente giù per il sentiero dorato adozione piena di muschio.

Non voglio scrivere molto di più sul singleton in questa voce. Voglio sottolineare che questi sono parte della nostra strategia onnicomprensiva. L'idea è di implementare le funzionalità di gestione e ricerca di documento delle principali per tutti gli utenti ancora fornire altamente funzionale, alti visibili ed altamente rappresentativi esempi di altre caratteristiche di muschio di nucleo che sono semplicemente di là della capacità della maggior parte degli utenti di assorbire in questa fase iniziale. Tuttavia, essi saranno "là fuori" e si spera che altre business unit SA di o imparare su di loro e vogliono quelle caratteristiche per se stessi, per una maggiore adozione. Queste storie di successo di singleton anche servono a fornire il nostro team di vendita "munizioni" per vincere con successo secondo, progetti di terzi e n-fase.

Che cosa ha fatto introdurre e perché?

Avendo depositato sulla gestione dei documenti e la ricerca come un requisito di base aziendale, Abbiamo bisogno di iniziare a raccogliere dettagli. Come una questione pratica, Questo ruotava intorno a comprendere i loro documenti e che in definitiva mappato a capire i tipi di contenuto.

Ho trovato che è difficile spiegare i tipi di contenuto senza supporti visivi. Folk più tecnico può camminare lontano da una discussione sui tipi di contenuto quando CT sono descritti in termini di database. "A CT è simile a una tabella di database, ha le colonne e le colonne sono definite in termini di tipi di dati, ma i tipi di dati CT includono più di un semplice numero intero/data, ma anche "scelta" e ricerca"" e così via." Possiamo parlare di "tavolo allungabile" tipi di contenuto, molto simile a uno può ereditare funzionalità da una classe base in linguaggi ad oggetti. Tuttavia questo non è ovviamente utile per la persona admin di reparto di trasporto che non ha nessun background tecnico. Vale a dire, quasi tutti che conta in un lancio MOSS.

Utilizzando una scheda bianca è incerto. Ho presentato l'idea di un tipo di contenuto e trafilati brillante (o almeno così sembrano) immagini di tipi di contenuto e quello che fanno per voi in termini di ricerca e come può essere ampliati, ecc. Alla fine, si sente come alcune lampadine hanno acceso, ma il quadro di bordo bianco risultante è un pasticcio.

Questo ci ha portato al nostro posto di atterraggio attuale e finora più efficace: un sito di sandbox MOSS configurato per mostrare queste caratteristiche.

Utilizzando il sito sandbox, Dimostriamo:

  • Tipi di contenuto:
    • Creazione di un CT con più tipi di dati (Testo, Data, scelta, Boolean, ricerca, ecc).
    • Estendendo un CT creando un nuovo CT basato su un genitore.
    • Ricerca di documenti tramite metadati CT.
  • Raccolte documenti:
    • Associando un singolo CT con una libreria.
    • Cosa succede quando si carica un documento per quello Biblioteca?
    • Associando più CT con una libreria di doc.
    • Cosa succede quando si carica un documento per quello Biblioteca?
    • Filtraggio e ordinamento tramite le intestazioni di colonna in un lib doc.
    • Documento libreria visualizzazioni:
      • L'ordinamento
      • Raggruppamento
      • "Immissione rapida" (visualizzazione Foglio dati)
      • "Senza tag dati" (per assistere con la migrazione a MOSS da altre origini di contenuto; ulteriori informazioni su questo qui sotto).

Il sito di Sandbox:

Abbiamo progettato il nostro sito sandbox una caratteristica permanente nell'ambiente di sviluppo per essere usato per gli scopi di addestramento lunghi dopo abbiamo completato il progetto e comprendeva diversi manufatti come descritto:

Tipi di contenuto:

Abbiamo definito i seguenti tipi di contenuto: Fattura, Ordine di acquisto, Fattura di servizi.

Abbiamo selezionato la fattura, ordine di acquisto perché sono più o meno universalmente sotto
entità levato in piedi. Tutti nel settore capisce che una fattura è una richiesta di pagamento per un cliente per un importo rilasciato su un certo Data essere pagati secondo alcuni termini di pagamento. Questo porta ad una definizione naturale di un CT che abbiamo chiamato "formazione fattura" (per distinguerlo da qualsiasi altro tipo di fattura). L'ordine di acquisto allo stesso modo facilmente è definito. Abbiamo anche creato una fattura di servizi di formazione"" creando un nuovo CT basato sulla "formazione fattura" CT e aggiunta solo una colonna, "servizi resi".

Con il suddetto, possiamo ora dimostrare alcune caratteristiche chiave di CT senza impantanarsi cercando di spiegare un concetto astratto prima; tutti già capiscono ciò che intendiamo per "fattura" e "ordine di acquisto" e invece sono in grado di concentrarsi sulla meccanica del CT stessa.

Elenchi personalizzati:

CT con colonne di tipo "ricerca" scegliere una libreria personalizzata di elenco o documento. Usiamo questo ampiamente e per la sandbox, Abbiamo creato un elenco personalizzato contenente i clienti di supporto. Abbiamo scelto i clienti perché è un concetto facile da capire e facile da dimostrare. Il CT di fattura ha una colonna, "cliente" che è definita di tipo "ricerca" che punta a questa lista.

Abbiamo creato un simile elenco personalizzato per gestire fornitori"" per l'ordine di acquisto"" CT.

Raccolte documenti:

Abbiamo creato due raccolte di documenti: "Fatture" e "Mescolato documenti".

Abbiamo configurato la raccolta di documenti fatture per gestire solo i documenti di tipo CT "Fattura".

Abbiamo configurato i documenti misti"" libreria per gestire tutti i tre CT.

Creare diverse visualizzazioni che mostrano l'ordinamento, filtraggio, raggruppamento e data sheet.

Ricerca:

Abbiamo definito due nuove proprietà gestite e li mappato al numero della fattura e del cliente.

Abbiamo creato un nuovo sito di ricerca personalizzati anticipo e modificato per consentire agli utenti di cercare "fatture" utilizzando queste due proprietà mappata.

Modificare il XSLT affinché il numero di fattura e cliente, Quando il presente, vengono visualizzati in una tabella HTML in un colore luminoso. L'obiettivo è quello di dimostrare che tale formattazione è possibile.

Mettere tutto insieme:

Organizziamo per chiave agli utenti di partecipare a una demo.

Seguiamo questo semplice script:

  1. Descrivere il significato e lo scopo di un CT, utilizzando come esempi fatture e ordini di acquisto.
  2. Visualizza la definizione di CT fattura mentre contemporaneamente assicurando loro che non hanno bisogno di utilizzare quei schermi stessi, Basta prendere i concetti.
  3. Vai alla raccolta documenti fatture.
  4. Caricare un documento.
  5. Dimostrare che il cliente discesa veramente ' provenienti da un elenco personalizzato.
  6. Aggiungere un nuovo cliente per la lista dei clienti e quindi aggiornare i metadati di fattura recente caricato con il cliente appena creato.
  7. Passare ai documenti misti"" Biblioteca e caricare un documento. Spiegare come il sistema richiede un tipo di documento.
  8. Vai indietro alla raccolta documenti di fatture e visualizza come facendo clic sul nome di una colonna Cambia ordinamento.
  9. Dimostrare il filtraggio a livello di colonna.
  10. Mostrare diversi punti di vista che dimostrano l'ordinamento multilivello, filtro e raggruppamento.
  11. Mostrare la visualizzazione Foglio dati.
  12. Spiegare lo scopo di un "documenti senza tag" vista.
  13. Passa alla ricerca avanzata su misura.
  14. Da ora, il documento recentemente caricato dovrebbe sono stato scansionato e indicizzato, quindi eseguire una ricerca che dimostra la capacità di individuare tale fattura tramite la proprietà mappata.
  15. Dimostriamo la differenza tra la ricerca tramite proprietà mappata vs. Basta una ricerca di testo.

A questo punto, Abbiamo più o meno finito con la demo. Sembra prendere circa 30 A 45 minuti, a seconda di quante domande chiedono.

Abbiamo poi rimandarli a loro scrivanie con "compiti a casa". Si tratta di un semplice foglio di calcolo excel dove chiediamo loro di definire per noi quello che pensano di cui hanno bisogno in termini di CT, entrambi ad alto livello (scopo solo nome e business) così come le colonne e il tipo di dati immagazzinano nella colonna. Non chiediamo loro di definire tipi di dati di colonna in termini di muschio, ma termini di business.

In sintesi:

Abbiamo creato un ambiente sandbox che possiamo usare per illustrare alcune funzionalità MOSS core cui fascino sono aziendale.

Noi abbiamo modellato entità aziendali facilmente comprensibile e comune affinché gli utenti possono concentrarsi sul muschio e non impantanarsi sulle entità / esempi se stessi.

Gli utenti aziendali allontanarsi da sessioni di tesi con "compiti a casa" sotto forma di documenti di excel, che ora sono competenti a compilare e utilizzare per progettare i propri tipi di contenuto del primo taglio.

Infine, come eseguiamo demo nel tempo, membri del team del cliente se stessi diventa più in grado di portare avanti, non la demo di se stessi e generalmente gratuito il resto di noi fino a lavorare su problemi più complessi, come tassonomia globale, flussi di lavoro complessi, BDC e simili.

MUSCHIO: Esempio funzionale – tipo di dati personalizzati

Scenario business:

Implementazione Enterprise-wide di MOSS per società di produzione con 30+ siti e qualche dozzina dipartimenti aziendali.

Obiettivo aziendale:

Nonostante una moltitudine di gruppi aziendali (dipartimenti, posizioni, ecc), alcuni dati devono essere mantenuti a livello globale. Per esempio, un autorevole elenco principale di tutti i luoghi fisici dell'azienda (e. g. impianti di produzione, posizioni di magazzino, uffici vendite) dovrebbe essere mantenuto in una posizione centrale.

Problema tecnico:

La tassonomia aziendale è stata implementata utilizzando più raccolte siti. Ci sarebbe piaciuto creare l'elenco autorevole dei luoghi fisici in un elenco personalizzato di WSS. Poi, Quando abbiamo bisogno di avere una colonna in un tipo di contenuto (o aggiunta di una colonna in un elenco o doc libreria) che conteneva le posizioni aziendali, si creerebbe una colonna utilizzando la ricerca"" DataType e punto di questo elenco master.

Purtroppo, ricerca datatypes deve accedere a un elenco di origine "localmente" significa che il nostro autorevole elenco non può occupare più raccolte siti.

Soluzione tecnica:

Implementare un nuovo tipo di dati personalizzata implementata sulla base di SPField e rappresentato come un oggetto DropDownList nell'interfaccia utente di cui ListItems popolare dall'elenco principale di WSS.

Abbiamo creato una nuova collezione di sito chiamata "http://localhost/EnterpriseData". Ci, Abbiamo creato un elenco personalizzato denominato "Sedi aziendali". Questo elenco viene utilizzato solo il titolo"standard" campo per contenere l'elenco delle sedi aziendali reali.

Uno segue diversi passaggi discreti per creare un tipo di dati personalizzati in WSS. Essi sono:

  1. Definire una classe che eredita da SPField (uno può ereditare da altri campi, se richiesto).

Ecco il codice per questo:

pubblica classe XYZZYCorporateLocationField : SPFieldText
{
pubblica XYZZYCorporateLocationField
(SPFieldCollection campi, stringa typeName, stringa displayName)
: base(campi, typeName, displayName) { }

pubblica XYZZYCorporateLocationField
(SPFieldCollection campi, stringa displayName)
: base(campi, displayName) { }

pubblica eseguire l'override BaseFieldControl FieldRenderingControl
{
Ottieni
{
BaseFieldControl controllo = Nuovo XYZZYCorporateLocationFieldControl();
controllo. FieldName = Questo.InternalName;
ritorno controllo;
} //Ottieni
} // fieldrenderingcontrol

pubblica eseguire l'override stringa GetValidatedString(oggetto valore)
{
Se (Questo.Obbligatorio || valore. ToString().È uguale a(Stringa.Vuoto))
{
Throw Nuovo SPFieldValidationException ("Il dipartimento non è assegnato.");
}
ritorno base.GetValidatedString(valore);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Definire un'altra classe che eredita dal controllo campo base, come in:

pubblica classe XYZZYCorporateLocationFieldControl : BaseFieldControl
{
protetti DropDownList XYZZYCorporateLocationSelector;

protetti eseguire l'override stringa DefaultTemplateName
{
Ottieni
{
ritorno "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

pubblica eseguire l'override oggetto Valore
{
Ottieni
{
EnsureChildControls();
ritorno Questo.XYZZYCorporateLocationSelector. SelectedValue;
} // Ottieni
impostare
{
EnsureChildControls();
Questo.XYZZYCorporateLocationSelector.SelectedValue = (stringa)Questo.ItemFieldValue;
} // impostare
} // eseguire l'override object valore

protetti eseguire l'override void Metodo CreateChildControls()
{

Se (Questo.Campo = = null || Questo.ControlMode = = SPControlMode.Visualizzazione)
ritorno;

base.Metodo CreateChildControls();

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

Se (Questo.XYZZYCorporateLocationSelector = = null)
Throw Nuovo Eccezione("ERRORE: Impossibile caricare. File ASCX!");

Se (!Questo.IsPostBack pagina.)
{

utilizzando (SPSite sito = Nuovo SPSite("http://localhost/enterprisedata"))
{
utilizzando (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Elenchi["Sedi aziendali"];

foreach (SPItem XYZZYCorporateLocation in currentList.Items)
{
Se (XYZZYCorporateLocation["Title"] == null) continuare;

stringa theTitle;
Titolo = XYZZYCorporateLocation["Title"].ToString();

Questo.XYZZYCorporateLocationSelector.Items.Add
(Nuovo ListItem(theTitle, theTitle));

} // foreach

} // utilizzando spweb web = site.openweb()
} // utilizzando il sito spsite = nuovo spsite("http://localhost/enterprisedata")

} // Se non un postback

} // Metodo CreateChildControls

} // XYZZYCorporateLocationFieldControl

Il codice sopra fondamentalmente implementa la logica per popolare la DropDownList con i valori dall'elenco personalizzato WSS situato presso http://localhost/enterprisedata e denominato "reparti aziendali".

Entrambe le classi definito in un file singolo con estensione., compilato e messo in GAC (necessaria forte, Naturalmente).

  1. Implementare un modello di controllo (.ascx) come illustrato:

<%@ Controllo Lingua= "C#" Eredita="Microsoft.SharePoint.Portal.serveradmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versione = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Sempre" %>
<%
@ Registro TagPrefix= wssawc"" Namespace="Microsoft.SharePoint.WebControls" Assemblea="Microsoft.SharePoint, Versione = 12.0.0.0, Cultura = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Registro TagPrefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assemblea="Microsoft.SharePoint, Versione = 12.0.0.0, Cultura = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= XYZZYCorporateLocationFieldControl"" runat= "server">
<Modello>
<ASP:DropDownList ID= XYZZYCorporateLocationSelector"" runat= "server" />
</Modello>
</
SharePoint:RenderingTemplate>

Quanto sopra viene salvato in c:\programma c:ProgrammiFile comuniMicrosoft sharedweb server extensions12controltemplates.

  1. Infine, Creiamo un file XML per salvare nella... 12XML directory. Questo è CAML che definisce il nostro tipo di dati personalizzato e per il mio esempio, assomiglia a questo:

<?XML Versione="1.0" codifica="UTF-8" ?>
<
FieldTypes>
<
FieldType>
<
Campo Nome="TypeName">CorporateLocations</Campo>
<
Campo Nome="ParentType">Testo</Campo>
<
Campo Nome="TypeDisplayName">Sedi aziendali</Campo>
<
Campo Nome="TypeShortDescription">Tutte le località XYZZY aziendale, compresi gli impianti di fabbricazione o di altri.</Campo>
<
Campo Nome="UserCreatable">VERO</Campo>
<
Campo Nome="ShowInListCreate">VERO</Campo>
<
Campo Nome="ShowInDocumentLibraryCreate">VERO</Campo>
<
Campo Nome="ShowInSurveyCreate">VERO</Campo>
<
Campo Nome="ShowInColumnTemplateCreate">VERO</Campo>
<
Campo Nome="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Version = 1.0.0.0, Cultura = neutral, PublicKeyToken = b0b19e85410990c4</Campo>
<
RenderPattern Nome="DisplayPattern">
<
Interruttore>
<
Expr>
<
Colonna />
</
Expr>

<Caso Valore=""/>

<Predefinito>
<
HTML>
<![CDATA[
<span style = "color:Rosso"><b>]]>
</
HTML>

<
Colonna SubColumnNumber="0" HTMLEncode="VERO"/>

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

</
Predefinito>
</
Interruttore>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Questo file XML aggiunge il tipo di dati personalizzati per il WSS "biblioteca" e fiammiferi esso contro il GAC ha avuto Assemblea.

Dopo lo spostamento di tutti questi bit in luogo, iisreset sul server e si dovrebbe iniziare tutti a lavorare piacevolmente.

MUSCHIO: L'aggiornamento di un elenco personalizzato

Ci sono molti buoni esempi di aggiornamento elenchi personalizzati tramite il SDK. Qui è ancora un altro.

Problema aziendale: Modulo di InfoPath è stato progettato che permette agli utenti di immettere online acquistano requisizioni. Requisizione PO numeri dovrebbero essere la sequenza tradizionale basato su valori integer e calcolati automaticamente.

Soluzione di business: Creare un elenco personalizzato di MOSS contenente due colonne: "ControlField" e "ControlValue". Colonna valore contiene il numero della richiesta di acquisto successivo. Si noti che il generico "controllo" Convenzione di denominazione fornisce i campi di controllo futuro che possono essere utilizzati come necessario.

Soluzione tecnica: Creare un servizio web accessibile dal client InfoPath. Il servizio web restituisce indietro il successivo numero della richiesta di acquisto e aggiorna il valore della lista.

Lezioni apprese:

  • Quando si aggiunge questo servizio web come origine dati per il modulo di InfoPath, Ritenuto necessario convertirlo in un udc e memorizzarlo in una raccolta connessioni dati.
  • Anche trovato necessario attivare tra domini scripting tramite Amministrazione centrale servizi // gestione applicazioni // configurazione del server di forma.
  • La prima volta il modulo provato ad accedere al servizio web, ci vuole un po' di tempo e in occasione, sarebbe tempo fuori. I giocherellava con le impostazioni nella configurazione del server di forma per espandere le impostazioni di timeout e che sembrava di aiutare.

Il codice:

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

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

//Decommentare la seguente riga se utilizza componenti progettati
//InitializeComponent();
}

/// <Riassunto>
/// Ottenere il numero di PO successivo dall'elenco sharepoint po numero controllo.
/// Incrementare il numero di PO in quella lista.
/// </Riassunto>
/// <restituisce></restituisce>
[WebMethod]
pubblica stringa GetNextPoNumber()
{
stringa SpPoControlSiteName; // Nome del sito MOSS effettivo che ospita l'elenco di controllo di PO.
stringa SpPoControlListName; // Nome dell'elenco effettivo di MOSS che contiene il controllo di Po.

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

stringa nextPoReqNumber = "xyzzy";

utilizzando (SPSite sito = Nuovo SPSite(SpPoControlSiteName))
{
utilizzando (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Elenchi[SpPoControlListName];

foreach (SPItem controlItem in currentList.Items)
{

Se (((stringa)controlItem["ControlField"]).È uguale a("NextPoNumber"))
{
nextPoReqNumber = (stringa)controlItem["ControlValue"];

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

int_nextPoReqNumber ;

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

} // Individuazione, lettura e l'aggiornamento il numero di PO nell'elenco.


} // utilizzando spweb web = site.openweb()
} // utilizzando il sito spsite = nuovo spsite("http://localhost/mizuho")

ritorno nextPoReqNumber;

}
}