konto usunięte

Temat: Struktura bazy danych

Witam, mam za zadanie wykonać aplikację pracująca na bazie danych sharepointa. Problem polega na tym, że nie bardzo rozumiem zasadę działania sharepointa w jego własnej bazie. W sumie udało mi się za pomocą dwóch widoków odnaleźć dane zapisane, ale nie mogę znaleźć połączeń między listami rozwijalnymi oraz powiązań między "tabelami". Proszę o pomoc. Pozdrawiam.

konto usunięte

Temat: Struktura bazy danych

Nie istnieje opublikowana struktura bazy danych SharePoint.

Generalnie - producent uznaje, że jakiekolwiek zmiany bezpośrednio wykonane na bazie danych SharePoint są równoznaczne z utratą wsparcia dla tego produktu, stąd też brak opublikowanej struktury.

Wykorzystaj SDK: http://msdn.microsoft.com/en-us/library/ms550992.aspx
Jakub Gutkowski

Jakub Gutkowski Software
Developer/Architect
Microsoft MVP

Temat: Struktura bazy danych

Marcin Zawadzki:

Generalnie - producent uznaje, że jakiekolwiek zmiany bezpośrednio wykonane na bazie danych SharePoint są równoznaczne z utratą wsparcia dla tego produktu, stąd też brak opublikowanej struktury.

Wykorzystaj SDK: http://msdn.microsoft.com/en-us/library/ms550992.aspx

zmiany tak, ale pobieranie danych nie.

Struktura sama w sobie jest prosta jak konstrukcja cepa, ale trzeba troche nad nia posiedziec by ja zrozumiec - to znaczy poznac na jakiej zasadzie to dziala "jedna tabela o okreslonej nazwie to zbior wszystkich elementow danego typu na SharePoint"

Webs - tabela zawiera wszystkie SPWeb ktore zostaly stworzone
Sites - tabela zawiera wszystkie site collections potworzone
Lists - tabela zawiera wszystkie listy stworzone w SharePoint

Sites zawiera SiteId, Webs zawiera WebId, Lists zawiera ListId, sa to guidy, ktore sa potem prawie wszedzie wykorzystywane.

Teraz masz tabela AllUserData (czy jakos tak, pamiec moze mnie zawodzic).

Ta tabla zawiera prawie wszystkie elementy, ktora sa trzymane na listach. jej konstrukcja jest dosc banalna:
pierwsze 29 kolumn opisuja element podajac jego id, gdzie sie znajduje, z jakiego content type pochodzi, jaki jest do niego adres, czy jest jakis workflow przypisany czy element jest usuniety i znajduje sie w koszu itp itd
kolejne kolumny to wartosci pol. W zaleznosci od tego ile masz kolumn na liscie i jakiego sa typu dane beda w roznych kolumnach. Warto tutaj odwolac sie do XML definiujacego liste lub content type dostepnego w bazie w tabeli Lists lub ContentTypes bo tam bedziesz mial info ze pole na przyklad Title bedzie pod nvarchar10. wiec jak chcesz naprawde sie pobawic to mozesz wyciagac z XMLa dane na temat kolumn, i nastepnie dynamicznie tworzyc zapyania SQL bazujac na informacji wyciagnietej z XMLa.

latwiej by mi bylo Ci pomoc jakbym dokladnie wiedzial co potrzebujesz wyciagnac :) bo opisywanie struktury do fajnych rzeczy nie nalezy. Nie rozumiem zbytnio co masz na mysli "listy rozwijane" :) chodzi Ci o lookups?

Zas co do dokumentacji... to do tabel z tego co pamietam nie ma ale do SP jest :)
http://msdn.microsoft.com/en-us/library/cc313081.aspx

Gutek
http://zine.net.pl/blogs/gutek/Jakub Gutkowski edytował(a) ten post dnia 05.06.09 o godzinie 19:44

konto usunięte

Temat: Struktura bazy danych

Dzięki za zainteresowanie,
Piszę program odczytujący te dane w celach szybszego wyszukiwania, filtrowania i raportowania.

Otóż mam 7 tabel wszystko z jednego chyba site.

pierwsza z nich NZ ma jedno pole
- Nazwa

2 tabelka/lista ID
- Klucz obcy do NZ
- kilka pól tekstowych
- jedno pole typu ComboBox

3 IB
- kilka pól tekstowych
- klucz obcy do ID

4 IO
- kilka pól tekstowych
- Klucz obcy do ID
- Klucz obcy do IB
- klucz obcy do IT
- klucz obcy do ITNZ

5 tableka ITNZ
- kilka pól tekstowych
- klucz obcy do ID
- klucz obcy do IO
- klucz obcy do IU

6 IT
- kilka pól tekstowych
- Klucz obcy do IB
- klucz obcy do IO
- klucz obcy di IU

7 IU
- znowu kilka poł tekstowych
- Klucz obcy do IB
- klucz obcy do IO
- klucz obcy do IT
- klucz obcy do ITNZ

Moim zmartwieniem jest znaleźć te powiązania i tej jednej listy rozwijalnej z pierwszej tabelki oraz wszystkich kluczy obcych. Przez to nie mogę nawet przełączać się między tabelami w programie bo nie mam po czym.

Co ciekawe niektóre dane, które udało mi się pozyskać z pól tekstowych również podczas edycji są dostępne z pola combo.

Wszystkie dane, które udało mi się pozyskać pozyskałem z widoków

dla przykładu tabelka NZ


select
nvarchar1 as 'Nazwa Zaplecza Lokalna'
from Docs d
join UserData u on (u.tp_ListID=d.ListID) and (d.DocLibRowID=u.tp_ID)

where d.SiteID = '84A51969-7547-4314-A0D2-8FF17E7C87F8'
and d.dirname = 'pbt/Lists/Nazwa Zaplecza lokalna'
and d.DocLibRowID is not null

order by d.DocLibRowID


Pozdrawiam
Jakub Gutkowski

Jakub Gutkowski Software
Developer/Architect
Microsoft MVP

Temat: Struktura bazy danych

Hejka,

To masz troche tych rzeczy do zrobiebia ;)

Po pierwsze, jezeli chcesz przyspieszyc wyszukiwanie i filtrowanie, to moze warto zastanowic sie nad wykozystaniem indeksow dostepnych z SharePoint. W ustawieniach listy mozesz zdefiniowac jakie kolumny maja byc indeksowane. Do tego w Central Administration, w sieci jest wiele art jak to zrobic na przyklad:
http://www.wrox.com/WileyCDA/Section/Searching-in-WSS-...
http://www.sharepointblogs.com/roni/archive/2007/09/26...
http://blogs.msdn.com/scaravajal/archive/2007/04/04/mo...

to jest tylko kilka przykladow, odpowiednio zdefiniowane zapytanie w google zwroci mase innych. Ja bym napierw na tym sie skoncetrowal, ale tylko z jednego wzgledu.

Selecty na bazie danych mozna wykonywac, jednak czasami mozesz spowodowac ze zalozysz niechcacy locka na obiekt do ktorego SharePoint bedzie chcial sie odwolac i user dostanie blad. Dziwilem sie swojego czasu dlaczego tak sie moze dziac, ale bylem swiadkiem kilku takich przypadkow i po przeanalizowaniu ich juz sie nie dziwilem, ale bylo to rok temu i teraz wsnioskow nie przytocze bo nie pamietam - pamietam tylko wynik - UWAGA na locki :)

Co do Twojego konrketnego problemu, to ja bym porobil sobie VIEW, to znaczy na kazda table osobne view, dzieki czemu bedzie Ci latwiej tym zarzadzac. Glowne view bedzie mogla czerpac dane z innych view, ktore bedziesz mogl dowolnie konfigurowac i zmieniac wraz ze zmieniajaca sie struktura bazy danych - na przyklad nowa klumna, lub zaisntalowanie ponowne rozwiazania bez content types co moze spowodowac ulokowaniem fieldow w innych kolumnach (moze ale nie musi).

Pojedyncze View potrafisz stworzyc jak widze nizej, ja dla przykladu robilem tak swojego czasu:


SELECT DISTINCT
SUBSTRING(dbo.UserInfo.tp_Login, CHARINDEX('\', dbo.UserInfo.tp_Login) + 1, LEN(dbo.UserInfo.tp_Login) - CHARINDEX('\', dbo.UserInfo.tp_Login) + 1) AS EmployeeNumber,
surveys.tp_ID AS SurveyId,
surveys.tp_ListId AS SurveyListId,
dbo.AllLists.tp_Title AS SurveyName,
surveys.tp_Created AS SurveyCreateDate,
surveys.nvarchar3 AS Score
FROM
dbo.AllUserData AS surveys
INNER JOIN dbo.UserInfo ON surveys.tp_Author = dbo.UserInfo.tp_ID
INNER JOIN dbo.AllLists ON surveys.tp_ListId = dbo.AllLists.tp_ID
WHERE
(
surveys.tp_ListId IN (
'035CDEB5-AAD6-4D28-A3EB-0F21C1FCDCB6',
'F04B4E6E-A629-4260-B088-261687A32A62',
'45191386-09A1-446B-911B-2642FD8456F9',
'349C6CA6-5690-404C-B045-37457464B9B2',
'F378430C-7DAF-468F-BF2B-5688CACB0B71',
'FB6CAD96-CC48-4A80-AC18-8BE6BF31AB3A',
'D596782E-FFBC-4E13-A4E6-F6CC6B691CD0'
)
)
AND
surveys.tp_DeleteTransactionId = 0x -- not deleted
AND
surveys.tp_Level = 1 -- completed


ale mozesz oczywiscie zrobic inner join na AllUserData na AllUserData po odpowiednich wartosciach.

Czyli tworzysz sobie 6 view i potem juz operujesz jak na normalnych "tabelach", tak jakby "SharePoint" nie istnial.

Gorzej jest jak musisz wyciagac dane z XML'a (na temat kolumn w ktorych sa dane) ale to Ci chyba nie grozi? jezeli jednak bys chcial to tutaj masz przyklad - uwaga jest dlugi i mozlolny ale pokazauje jak z XML wyciagnac nazwy kolumn a nastepnie dynamicznie zbudowac zapytanie ktore wyciaga dane za pomoca nazw tych kolumn:


CREATE PROCEDURE [dbo].[impaq_proc_GetSurveysWithQuestions]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @surveyListId UNIQUEIDENTIFIER

DECLARE surveys_cursor CURSOR FOR
SELECT
tp_ID
FROM
AllLists
WHERE
tp_BaseType = 4
AND
tp_ServerTemplate = 102
AND
tp_DeleteTransactionId = 0x

OPEN surveys_cursor

FETCH NEXT FROM surveys_cursor
INTO @surveyListId

WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE @xml AS NVARCHAR(MAX)

SELECT
@xml = tp_Fields
FROM
AllLists
WHERE
tp_ID = @surveyListId
SET @xml = SUBSTRING(@xml, CHARINDEX('<', @xml), LEN(@xml) - CHARINDEX('<', @xml) + 1)

SET @xml = '<ROOT>' + @xml + '</ROOT>'

DECLARE @hdoc INT
DECLARE @question NVARCHAR(1000)
DECLARE @column NVARCHAR(20)

EXEC sp_xml_preparedocument @hdoc OUTPUT, @xml

DECLARE
@surveyQuestions
TABLE
(
Question NVARCHAR(1000),
[Column] NVARCHAR(20),
SurveyListId UNIQUEIDENTIFIER
)

INSERT INTO @surveyQuestions
(
Question,
[Column]
)
SELECT
Question,
[Column]
FROM
OPENXML(@hdoc, 'ROOT/Field', 1)
WITH
(
Question NVARCHAR(1000) './@DisplayName/text()',
[Column] NVARCHAR(20) './@ColName/text()'
)
WHERE
[Column] IS NOT NULL
AND
[Column] NOT LIKE 'tp_%'

UPDATE
@surveyQuestions
SET
SurveyListId = @surveyListId
WHERE
SurveyListId IS NULL

FETCH NEXT FROM surveys_cursor
INTO @surveyListId

END

CLOSE surveys_cursor
DEALLOCATE surveys_cursor

DECLARE @currentCulumn AS NVARCHAR(40)
DECLARE @columns AS NVARCHAR(MAX)

SET @columns = ''

DECLARE column_cursor CURSOR FOR
SELECT DISTINCT
[Column]
FROM
@surveyQuestions

OPEN column_cursor

FETCH NEXT FROM column_cursor
INTO @currentCulumn

WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE @n AS NVARCHAR(MAX)

SET @n = @columns + @currentCulumn
--SELECT @n

SET @columns = @currentCulumn + ',' + @columns

FETCH NEXT FROM column_cursor
INTO @currentCulumn
END

CLOSE column_cursor
DEALLOCATE column_cursor

DECLARE @sql1 AS NVARCHAR(MAX)
DECLARE @sql2 AS NVARCHAR(MAX)

SET @sql1 =
'
SELECT
SUBSTRING(dbo.UserInfo.tp_Login, CHARINDEX(''''\'''', dbo.UserInfo.tp_Login) + 1, LEN(dbo.UserInfo.tp_Login) - CHARINDEX(''''\'''', dbo.UserInfo.tp_Login) + 1) AS EmployeeNumber,
surveys.tp_ID AS SurveyId,
surveys.tp_ListId AS SurveyListId,
AllLists.tp_Title AS SurveyName,
surveys.tp_Created AS SurveyCreateDate,
surveys.nvarchar3 AS Score,
' + @columns + '
CASE
surveys.tp_Level
WHEN
1
THEN
1
ELSE
0
END AS Completed
'
SET @sql2 =
'
FROM
dbo.AllUserData AS surveys
INNER JOIN UserInfo ON surveys.tp_Author = UserInfo.tp_ID
INNER JOIN AllLists ON surveys.tp_ListId = AllLists.tp_ID
WHERE
surveys.tp_ListId IN
(
''''035CDEB5-AAD6-4D28-A3EB-0F21C1FCDCB6'''',
''''F04B4E6E-A629-4260-B088-261687A32A62'''',
''''45191386-09A1-446B-911B-2642FD8456F9'''',
''''349C6CA6-5690-404C-B045-37457464B9B2'''',
''''F378430C-7DAF-468F-BF2B-5688CACB0B71'''',
''''FB6CAD96-CC48-4A80-AC18-8BE6BF31AB3A'''',
''''D596782E-FFBC-4E13-A4E6-F6CC6B691CD0''''
)
AND
surveys.tp_DeleteTransactionId = 0x '

EXEC('EXEC sp_executesql N''' + @sql1 + @sql2 + '''')

END


Pozd...,
Gutek
http://zine.net.pl/blogs/gutek/

konto usunięte

Temat: Struktura bazy danych

Dzięki za pomoc Jakubie.
Po staraniach zdobycia więzów między tabelami znalazłem inne rozwiązanie, na szczęście użytkownik ten jest dobry w Accessie a w MSO2007 jest super opcja SharePoint Lists. Po podłączeniu działam jak na zwykłych tabelach. Więc problem rozwiązany przejściowo. Jak będę miał więcej czasu to się temu jeszcze przyglądnę. Opublikuję rozwiązanie jak je znajdę.

Pozdrawiam i dziękuję za pomoc.

Następna dyskusja:

Szukam pomocy - sharepoint ...




Wyślij zaproszenie do