konto usunięte
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
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
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.
Podobne tematy
-
Sharepoint » Szukam pomocy - sharepoint web tools dla bazy danych plików -
-
Sharepoint » Baza danych konfiguracji -
-
Sharepoint » Sharepoint - interfejs do bazy skanow -
-
Sharepoint » Uzupełnianie danych -
-
Sharepoint » Szkolenia z baz danych w SharePoint -
-
Sharepoint » InfoPath - wydruk danych z formularza -
-
Sharepoint » Wyświetlane danych o użytkowniku po otwarciu nowego... -
-
Sharepoint » Wyciąganie danych z witryny podrżednej do nadrzędnej -
-
Sharepoint » Automatyczne zaciąganie danych do SP -
-
Sharepoint » [SP-2010] Automatyczne uzupełniane danych z Hiperłącza -
Następna dyskusja: