SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Datenbankspeicherort Prozesse

Geprüfte Antwort Dieser Beitrag hat 11 Antworten

Ohne Rang
18 Beiträge
jorothke erstellt 29 Nov. 2010 15:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Guten Tag Community.

Ich schreibe momentan ein WebPart, in dem verwaiste Prozesse ausgegeben werden sollen.

Mein Plan war dafür:

- Alle vorhandenen Prozesse auslesen

- Alle zugewiesenen Prozesse auslesen

- Die beiden Listen vergleichen und Differenzen ausgeben.

Da ich neu im SP Umfeld bin: Mit Prozessen meine ich diese Zuordnung für Dokumente:

 

Nun weiß ich aber nicht wo genau diese Prozesse hinterlegt werden. Mit Sicherheit in der Datenbank, aber die ist ja gar nicht so klein :-)

 

Für Anregungen bin ich dankbar.

Mit freundlichen Grüßen

Joachim

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Nov. 2010 16:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Man sollte niemals direkt auf die SharePoint Datenbanken zugreifen. Zur Interaktion mit SharePoint-Inhalten gibt es ein dokumentiertes Objektmodell. Schau Dir zu Beginn erstmal das SDK an:
http://msdn.microsoft.com/library/ee557253(office.14).aspx

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
jorothke Als Antwort am 30 Nov. 2010 09:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Warum sollte man nie direkt drauf zugreifen? Wegen Änderungen in der Struktur/Seiteneffekten?

Könntest du mir ein Stichwort geben, in welche Richtung ich im SDK lesen muss?

 

Dank & Gruß

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Nov. 2010 11:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="jorothke"]Warum sollte man nie direkt drauf zugreifen? Wegen Änderungen in der Struktur/Seiteneffekten?[/quote]

Weil die DB nicht dokumentiert ist und Microsoft ohne Ankündigung jederzeit mit Hotfixes oder SPs Änderungen daran vornehmen kann. Der zugriff über das Objektmodell ist dagegen dokumentiert und es ist gewährleistet, daß er auch nach Updates noch genauso funktioniert. Außerdem ist es deutlich einfacher.

[quote user="jorothke"]Könntest du mir ein Stichwort geben, in welche Richtung ich im SDK lesen muss?[/quote]

Nicht wirklich. Ich weiß ja nicht, welche Vorkenntnisse Du hast. Zum Zugriff auf SharePoint brauchst Du grundsätzlich SPSite (Websitesammlung) und SPWeb (Website). Außerdem SPList (Listen und Bibliotheken) und SPListItem (Listenelemente). An die aktuelle Umgebung, z.B. das aktuelle Web, kommst Du über SPContext.Current.*

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
jorothke Als Antwort am 30 Nov. 2010 11:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Vielen Dank.

Ich habe kaum Vorkenntnisse, ich werde mich wohl dann durch die Doku hangeln.

Danke,

Jo

Ohne Rang
18 Beiträge
jorothke Als Antwort am 8 Dez. 2010 12:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

So, ich greife das Thema noch einmal auf.

Ich habe jetzt erste Erfahrungen mit der Bibliothek sammeln können und kann auch Zugriffe auf Dokumente steuern und diverse Attribute auslesen.

Doch wie ich an das Prozessfeld komme erschließt sich mir noch immer nicht ganz.

Ich habe folgenden Code um an die Felder meiner Dokumente ranzukommen (Konsolenanwendung):

 


String siteURL = "http://derServer/";
String library = "Shared Documents";
debugMessage("Connecting to " + siteURL);
using (SPSite siteCollection = new SPSite(siteURL))
{
    debugMessage("Opening web ");
    using (SPWeb web = siteCollection.OpenWeb())
    {
        debugMessage("Reading sites");
        SPListCollection listWebs = web.Lists;
        foreach (SPList site in listWebs)
        {
            Console.WriteLine(site.Title);
        }
        debugMessage("Reading Fields for \""+library+"\"");
        SPList list = web.Lists[library];
        for (int i = 0; i < list.ItemCount; i++)
        {
            for (int a = 0; a < list.Items[i].Fields.Count; a++)
            {
                Console.WriteLine(list.Items[i].Fields[a].InternalName);
            }
        }
        debugMessage("Reading Items \"" + library + "\"");
        for (int i = 0; i < list.ItemCount; i++)
        {
                Console.WriteLine(list.Items[i].Name);
        }
                   
    }
    Console.Write("Press ENTER to continue");
    Console.ReadLine();
}

Die Ausgabe ist dann eine Übersicht meiner Seiten, der auswählbaren Felder und anschließend meine hinterlegten Dokumente.

Doch wie komme ich nun weiter auf meine Prozessinformationen? Ist der Weg so in der Art richtig oder laufe ich in die falsche Richtung?

 

Gruß und Danke

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Dez. 2010 12:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Grundsätzlich paßt das schon. Allerdings machst Du einen riesigen Performacefehler: bei jedem Zugriff auf SPList.Items werden alle Elemente der Liste aus der Datenbank geladen. Also besser zwischenspeichern!

SPListItemCollection items = myList.Items;
foreach (SPListItem item in items) {
  // jetzt kannst Du mit den einzelnen Elementen etwas anstellen. Z.B. den Titel auslesen
  string title = item.Title;
}

Du bekommst auf alle Metadaten Zugriff über
object value = SPLIstItem["Feldname"];

Dabei mußt Du nur den Datentyp der Felder beachten (und prüfen, ob der Wert evtl. null ist).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
jorothke Als Antwort am 8 Dez. 2010 15:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, danke, das erklärt warum die Abfrage so lahm ist :-D

Aber wie finde ich denn dann das gesuchte Attribut Process?

Ein Feld mit dem Feldnamen "Process" gibt es nicht und auch nichts was sich so ähnlich anhört.

 

Bei dem Code

Console.WriteLine(item.Name);  

bekomme ich den Dateinamen. Nun habe ich aber ein (Custom?)* Property namens "Prozesse", dies kann ich auch ansprechen:

item.Fields["Prozesse"]

Wie kann ich mir denn hier dann den Wert von Prozesse ausgeben lassen?  Ein Feld wie Value o.ä. finde ich nicht. Damit geht es nicht:

item.Prozesse

Oder habe ich da einen Denkfehler?

 

Danke für die Bemühung!

 

*Ich weiß nicht ob Prozesse ein Standardwert /-attribut ist, da alle anderen Attribute aber auf Englisch sind denke ich, dass jemand das hinzugefügt hat.

 

 

Edit: Oder geht das so?

foreach (SPListItem item in items)
{
    //SPField spfc = item.Fields["Prozesse"];
    SPField myField = item.Fields["Prozesse"];
    object result = myField.GetProperty("Prozesse");
    if (result != null)
    {
       Console.WriteLine((String)result);
    }
}

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Dez. 2010 16:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="jorothke"]item.Fields["Prozesse"][/quote]

Genau damit bekommst Du den Wert (als object). Da ich nicht weiß, von welchem Typ das Feld ist, kann ich Dir auch nicht sagen, wie Du an den "richtigen" Wert kommst. Im Fall von Text z.B. einfach durch ToString().

Edit: sorry, vergiß das. Da habe ich zu schnell geantwortet.

Du bekommst den Wert mit

item["Prozesse"]

also ohne das .Fields

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
jorothke Als Antwort am 9 Dez. 2010 10:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Super, funktioniert einwandfrei :-)

 

Nun habe ich noch eine weitere Frage. Der Inhalt des Feldes "Prozesse" ist mit einem Picker* verbunden (siehe Screenshot). Wie kann ich rausfinden welche Optionsfelder im Picker auswählbar sind?

Ich suche quasi die Datengrundlage auf der die Pickerdaten ausgewählt werden können und weiß gerade nicht in welche Richtung ich da gehen sollte:

.

 

Vielen Dank

 

*Heißt das Picker?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Dez. 2010 10:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist wohl eine Spalte vom Typ "Managed Metadata". In den Spalteneinstellungen (erreichbar über die Listeneinstellungen) kann man angeben, was zur Auswahl stehen soll.

[quote user="jorothke"]Heißt das Picker?[/quote]

Jawollja :-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
jorothke Als Antwort am 9 Dez. 2010 11:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

ich glaube ich hab was missverstanden und/oder komme nicht ganz mit :-)

Ich möchte die Elemente des Pickers im Quellcode auslesen, so dass ich am Besten ein Objekt/Liste bekomme, in dem ich die Namen aller Prozesse anzeigen kann (idealerweise auch die hierarchische Struktur, aber das ist nicht so wichtig).

 

Wo finde ich die von dir genannten Spalten- bzw. Listeneinstellungen? Ist das im SharePoint (also im Browser) oder komme ich da über meinen Quellcode ran?

 

Mal wieder vielen Dank für deine Bemühungen

 

Edit:

Ich habe jetzt etwas gefunden, ich glaube das geht in die richtige Richtung:


TaxonomyFieldValue myField = (TaxonomyFieldValue)item["Prozesse"];
TaxonomyFieldValueCollection myCollection = new TaxonomyFieldValueCollection(spfc);

TaxonomySession session = new TaxonomySession(siteCollection);

TermStore termStore = session.TermStores["Managed Metadata Service"];

Group group = termStore.Groups["Prozesse"];

TermSetCollection termSet = group.TermSets;

 

Nun müsste ich über das termSet doch eigentlich auf meine vorhandenen Terms zugreifen können oder? Wenn ja, wie sollte man da vorgehen? Eine Iterative Aufzählung?

Edit2:

Ich glaub ich habs:

TaxonomySession session = new TaxonomySession(siteCollection);
TermStore termStore = session.TermStores["Managed Metadata Service"];
Group group = termStore.Groups["Prozesse"];
TermSetCollection termSet = group.TermSets;
foreach (TermSet term in termSet)
{
    foreach (Term ter in term.Terms)
    {
        Console.WriteLine( ter.Name);
    }
}

Gruß

 

Edit: Läuft perfekt mit diesem Code. Danke für deine Hilfe!