Romeo Pruno

Sharepoint: Condividere dati tra siti

Questo post è frutto del "barbatrucco" o come si dice più elegantemente work-around realizzato dai miei due tesisti, Michele Ciampichetti e Michele Conti, i quali si sono adoperarti efficacemente nella risoluzione di un problema di non poco conto!

A volte, mentre si utilizza Microsoft SharePoint può essere utile creare una Web part in un sottosito, e renderla disponibile il suo contenuto anche in altri siti, o per lo meno renderla disponibile anche nel sito padre; questa funzionalità non è presente in SharePoint, infatti, ogni elenco rimane ancorato al sito in cui è stato creato.
Esistono almeno un paio di modi per riuscire a risolvere questa situazione, uno evasivo ed uno più invasivo, ossia che va più a toccare le parti fondamentali del sistema. In questa parte affronteremo come al solito quello pi invasivo, poichè realizzare quello più evasivo sembrava troppo facile!

Questo metodo implica l'utilizzo di MSSQLServer, più precisamente il DB dei contenuti del sito WSS o almeno di strumenti che permettano la visualizzazione e la modifica dei database creati da SharePoint (solitamente SharePoint utilizza MSDE o WMSDE, ma è possibile anche specificare un DB diverso, anche SQLServer). Una volta collegati al DB si possono visualizzare  diverse tabelle, fra cui Lists, Sites, Webs, WebParts, Docs, UserInfo, UserData ecc... ognuna con diversi compiti e campi, ma per risolvere il nostro problema sarà sufficiente utilizzare la tabella Lists.

-- List tables, indexes & filegroups
SELECT OBJECT_NAMEi."idAS TableName 
FROM sysindexes AS i
WHERE i.indid IN ( ) Or i.indid 255 ) And -- Tables & indexes only
      
OBJECTPROPERTYi."id'IsUserTable' ) = And -- User tables only
      
OBJECTPROPERTYi."id'IsMSShipped' ) = And -- No system tables
      
COALESCEINDEXPROPERTYi."idi."Name'IsStatistics' ) , ) = And -- No Statistics / Auto-Create stats
      
COALESCEINDEXPROPERTYi."idi."Name'IsHypothetical' ) , ) = 0   -- No Hypothetical statistics
ORDER BY TableName 
/*
Categories
Categories
ComMd
Deps
Deps
DiskWarningDate
Docs
Docs
DocVersions
EventCache
EventLog
HT_Cache
HT_Settings
ImmedSubscriptions
ImmedSubscriptions
ImmedSubscriptions
ImmedSubscriptions
Links
Links
Lists
NavNodes
NavNodes
NavNodes
Personalization
Personalization
Personalization
SchedSubscriptions
SchedSubscriptions
SchedSubscriptions
SchedSubscriptions
SiteGroupMembership
SiteGroupMembership
SiteGroups
SiteGroups
Sites
SystemVersion
TimerLock
UserData
UserInfo
UserInfo
UserInfo
WebCat
WebGroupMembership
WebGroupMembership
WebGroups
WebGroups
WebMembers
WebParts
WebParts
WebParts
WebParts
Webs
Webs
Webs
WelcomeNames
*/



A questo punto creiamo quindi un'altra web part nel sito (o sottosito) di destinazione, ossia a quello in cui vogliamo linkare la nostra web part (l'operazione di creazione deve essere fatta in tutti quei siti dove vogliamo rendere disponibili i dati !), dopo di ché apriamo la nostra tabella Lists e  selezioniamo all'interno della tabella il record corrispondente all'elenco sorgente (basta guardarne il nome nel campo tp_Title), e ne estraiamo l'identificatore (tp_ID).

SELECT tp_Titletp_ID
FROM lists

--Results
/*
Contacts                  51D3D304-4104-42DF-B2E9-2C990EF439A2
Shared Documents          DD255EFE-D14E-4B50-9F09-31FCA8F1405E
General Discussion        93B6F51B-FF07-4013-A596-47C5C229BB85
Announcements             34E9AE77-BFC0-4582-A05A-606664A08C4C
Events                    8742A0F3-023A-4779-9589-68879C63AD62
A                         3420BFEF-646C-4836-86C2-BFDD67BA86DC
Tasks                     8DC1525D-F70C-40DE-AADD-D5CFB02B2763
Links                     C48092D2-D9F0-418A-B784-DBE6E329AEFD
Contacts                  05618C7A-00C9-4470-8ACE-10835F08E056
as                        B8CFA72F-1375-4AB5-A119-17025FAD6723
Shared Documents          E2B830BF-61DE-4A13-A5AC-20CEF636E022
Site Template Gallery     E3047651-5837-472A-B895-33E5D9ECB8DF
Tasks                     8865A113-D995-44A6-A428-3BC1AE1799CC
Web Part Gallery          A4C9CBE5-0797-410D-AED2-40F60CCFAA4B
Events                    2BE0A74E-F29F-405B-9B98-569960A91583
List Template Gallery     6FAC61FE-9A82-435B-A184-6DDE52388E09
Announcements             5BED23D5-53CF-4DDA-9C7E-814EA4C17616
A                         3420BFEF-646C-4836-86C2-BFDD67BA86DC
Links                     BF68CBE7-9B87-44FD-BB7E-D3CF5B9906E0
General Discussion        88CFF469-848B-44EC-9F99-D9E641595790

*/


A questo punto, copiamo l'identificatore trovato, e cerchiamo il record corrispondente all'elenco sorgente, e sostituiamo l'identificatore di tale elenco con quello calcolato in precedenza.

A questo punto l'elenco destinazione sarà collegato all'elenco sorgente, per quello che riguarda il contenuto, purtroppo, se si cambia lo schema dell'elenco sorgente, e si volessero vedere le modifiche in quello destinazione, forse sarà necessario eliminare la web part destinazione e ripetere il procedimento dall'inizio.

Inoltre, un altro problema utilizzando questo metodo è costituito dall'indicizzazione che SharePoint applica ai campi tp_ID e tp_WebID; sono presenti due indici: uno che viene calcolato sulla somma dei sue campi, e con esso non si creano problemi, ed uno che viene calcolato solamente su tp_ID e che obbliga a non avere duplicati su quel campo.  Come è chiaro ottenere il nostro risultato, seguendo questa procedura, non sarà possibile se si manterrà tale indice con la proprietà "duplicati non ammessi" sul campo.

Inoltre, problema principale in tutta questa storia, Microsoft lascia cadere il contratto di assistenza nei casi in cui si va oltre quanto è consentito, e garantito, quindi prima di arrivare a tanto, cercate sempre altre vie!!

Ancora un grazie a Michele & Michele.... forse ci scappa un articoletto su ugishareoffice???

powered by IMHO 1.2

Posted: giu 09 2005, 08.44 by romeo | with 6 comment(s)
Filed under:

Comments

romeo said:

E quello piu' evasivo qual'e'?

Ciao,
Ivan P.
# giugno 10, 2005 10.54

romeo said:

Ciao Ivan, quello più evasivo è senz'altro la creazione di una WebPart da codice che faccia da intermediaria tra tutte le WebParts dei siti WSS con le quali si vuole condividere i dati... In questo modo non destrutturi il DB (anche se in questo caso non ho apportato ingenti danni....)!!
# giugno 10, 2005 4.00

romeo said:

Io avevo letto (http://weblogs.asp.net/jan/archive/2004/04/07/109134.aspx) anche di un metodo possibile tramite Frontpage. Semplicemente inserire nel sito di destinazione una Data View della risorsa dati presente sul sito di origine.

Non è piu' semplice?

Saluti,
Ivan P.
# giugno 10, 2005 5.21

romeo said:

Ciao Ivan, si hai ragione... Quello è senzadubbio il metodo più "evasivo" :-)
# giugno 10, 2005 7.58

romeo said:

UPDATE:: X Ivan, ho approfondito la soluzione da te proposta, si in efetti è efficace ma solo per quanto riguarda la "visualizzazione dei dati" nel senso che quei dati che io visualizzo non li posso utilizzare in qualsiasi altro elenco, interno al sito, per effettuare delle ricerche sui campi..... Esempio pratico: Ho un elenco di dipendenti su un sito sharepoint, a questo punto creo un altro sito sharepoint e collego la webpart alla sorgente per visualizzare i records... fino a qui ok! Ma quando ho la necessità sul nuovo sito di creare un elenco che pesci atumaticamente i nominativi dalla web part che ho importato non posso farlo, in quanto la il dataview la rende solo visibile ma non rende disponbile i suoi dati.....Quindi la tua soluzione proposta è realmente applicabile solo in un caso di semplice "visualizzazione" e non come fonte dati per altre web parts connesse.
# giugno 13, 2005 4.37

romeo said:

Ok, ho capito. Speriamo SharePoint v3 renda tutto più semplice :-) Ciao!
# giugno 15, 2005 5.35