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.




Items aus SP External List nach SP Custom List kopieren (SPTimerJob Visual C#)

Geprüfte Antwort Dieser Beitrag hat 8 Antworten

Ohne Rang
282 Beiträge
MStel erstellt 19 Sept. 2016 11:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

ich bin derzeit in SP2010 einen SPTimerJob am entwickeln, der alle Objekte aus einer Externen Liste in eine Benutzerdefinierte Liste auf der gleichen Site kopieren soll, die dort noch nicht bestehen.
Sinn dahinter ist es in der Custom List zusätzliche Informationen zu vermerken ohne die ursprüngliche Liste anzupassen(diese kommt aus einer SQL Datenbank)

Zu erst habe ich dazu die externe Liste ins System eingebunden, eine Custom List angelegt und in diese Custom List identische Spalten wie in der external List erstellt. (in einer foreach schleife mit fields, funktionierte problemlos)

Als ich nun jedoch versuchte die Items in einer foreach Schleife in meine Custom List hinzuzufügen ist mir aufgefallen, dass mein Visual Studio sich an dieser Stelle stört und aufhört weiter zu debuggen (vorherige Breakpoints wurden erreicht, bin an den OWSTimer gebunden und gehe schrittweise mit F11 durch).

Beim ersten Versuch

foreach(SPListItem i in Liste1.Items)
{
Liste2.Items.Add(i);
}
erhalte ich die Fehlermeldung "Fehler 2 1-Argument: Kann nicht von "Microsoft.SharePoint.SPListItem" in "Microsoft.SharePoint.SPListItemCreationInformation" konvertiert werden. "

Da frage ich mich warum ich bei beiden Listen die ich innerhalb meines Codes mit = web.Lists["Listenname"] unterschiedliche SPListItem Objekte erhalte?

Der Zweite Ansatz war ein umfangreicheres Snippet aus dem Netz, hier überprüfe ich zuerst, ob die ID des Items bereits vorhanden ist, Anhänge angefügt sind und die Felder ReadOnly sind oder nicht. Bei diesem Ansatz weigert sich mein visual Studio ebenfalls schrittweise zu debuggen, sobald ich in die erste foreach schleife komme geht es nicht mehr voran und der TimerJob beginnt erst beim nächsten Start (testhalber interval von 59 Sekunden) wieder von vorn, bis er sich an dieser Stelle erneut "aufhängt".

foreach ( SPListItem item in src . Items )
   
{
       
if ( isUnique ( item . UniqueId ))
       
{
          newDestItem
= DestinationList . Items . Add ();

         
foreach ( SPField field in src . Fields )
         
{  
               
if ((! field . ReadOnlyField ) && ( field . InternalName != "Attachments" ))
                  newDestItem
[ field . InternalName ] = item [ field . InternalName ];  
          
}
           newDestItem
. Update ();   
       
}
      
}

Zuletzt konnte ich auch mithilfe der SPListItem.CopyTo Methode konnte ich keine erfolge erzielen. Gibt es eine spezielle Vorgehensweise wie man dieses Problem lösen sollte? Ich verstehe nicht warum es so kompliziert sein sollte, auf der gleichen Website Daten von Liste A nach Liste B zu kopieren.
Kann aber auch sein, dass ich einfach nur in die falsche Richtung denke.
Würde mich jedenfalls um jegliche Hilfestellungen freuen.

Mfg
Mstel
"

Alle Antworten

Ohne Rang
391 Beiträge
Frank Daske Als Antwort am 19 Sept. 2016 12:35
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

Ein etwas einfacheres Verfahren bietet hier Layer2:

http://www.layer2solutions.com/de/produkte/Seiten/SharePoint-Business-Data-List-Connector.aspx

Da werden gleich "normale" SharePoint Listen verwendet, um SharePoint Daten mit externen Daten synchron zu halten.

Beste Grüße, Frank

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Sept. 2016 12:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo MStel,

externe Listen sind einfach keine normalen Listen und man muß die Items deshalb etwas anders behandeln. Der zweite Ansatz mit der foreach über alle Fields sollte allerdings funktionieren. Mit dieser Zeile kann ich allerdings nichts anfangen:

[quote user="MStel"]if ( isUnique ( item . UniqueId ))[/quote]

Was soll die machen? Kann man die nicht einfach weglassen?

Noch zwei Anmerkungen zu SPList.Items. Dieses Property ist gefährlich, weil es wirklich bei jedem Aufruf alle Elemente aus der Datenbank abruft. Besser ist, es gar nie zu benutzen, weil es immer bessere Möglichkeiten gibt. Zum Abrufen von Daten kann man SPList.GetItems(SPQuery) verwenden - auch mit einem leeren SPQuery. Auf die Art läßt sich auch Paging umsetzen, also das Abrufen von Daten in z.B. 100er-Päckchen.
Aber viel schlimmer ist es bei der Neuanlage von Listitems. Bitte niemals SPList.Items.Add() verwenden!. Das ruft jedesmal zum Anlegen eines neuen Elementes alle bestehenden ab. Benutze SPList.AddItem().

 

Und dann noch zum eigentlichen Problem: woher kommen denn die zusätzlichen Informationen, die zu den externen Daten gepflegt werden sollen? Durch Benutzereingabe? Ich würde jedenfalls die externen Daten einfach gar nicht kopieren, sondern eine Liste mit den zusätzlichen Feldern und einem Feld vom Typ "Externe Daten" anlegen. Dieses Feld fungiert als Lookup auf externe Daten und kann so die Verbindung herstellen. Und ebenfalls wie ein Lookup kann es zusätzliche Spalten der externen Liste darstellen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
282 Beiträge
MStel Als Antwort am 19 Sept. 2016 13:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja die erste Zeile war dazu da um zu überprüfen ob das Item bereits hinzugefügt wurde um zu verhindern dass dasselbe Element mehrmals hinzugefügt wird, das kann ja beim SPTimerJob durchaus sein. Aber im ersten Anlauf wäre es natürlich erstmal schön überhaupt Daten ins System zu bekommen.

Hab jetzt wie du es empfohlen hast SPList.Items.Add durch SPList.AddItem(ersetzt) und anstatt SPList.Items SPList.GetItems(SPQuery) eingesetzt.
Mein Code sieht wie folgt aus.

                    SPQuery query = new SPQuery();
                    foreach (SPListItem item in quellListe.GetItems(query))
                    {
                        SPListItem itemToAdd = zielListe.AddItem();

                            foreach (SPField field in quellListe.Fields)
                            {
                                if ((!field.ReadOnlyField) && (field.InternalName != "Attachments"))
                                    itemToAdd[field.InternalName] = item[field.InternalName];
                            }
                            itemToAdd.Update();                     
                    }
                    zielListe.Update();

Allerdings hört auch hier mein Visual Studio auf weiter zu debuggen wenn ich F11 drücke um die einzelschritte durchzugehen. Auch ein Breakpoint vor und nachher hat nur zu Folge dass der Breakpoint hinterher nicht erreicht wird. Anscheinend hat mein Visual Studio noch irgend ein Problem, welches nichts mit der Syntax zutun hat.
Habe auch vorher die Projektmappe neu erstellt und den Timer neu gestartet.

Irgend eine Idee? Ausgeführt wird nichts, die Liste auf der Website hat nach wie vor 0 Einträge.
Falls ich gar nicht mit diesem Ansatz weiter komme werde ich die LookUp Methode von dir austesten. Danke schonmal für die ausführliche Antwort!

MFG

 

EDIT:

foreach (SPListItem item in quellListe.GetItems(query)) <- Das ist die Zeile an der mein VS sich stört. Ab dieser Zeile wird nichts weiter ausgeführt, alles was zuvor kommt funktioniert problemlos.

 

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Sept. 2016 14:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="MStel"]Allerdings hört auch hier mein Visual Studio auf weiter zu debuggen [/quote]

Wenn das "einfach so" mittendrin passiert, hast Du entweder ein Release-Build bereitgestellt oder, was sehr viel wahrscheinlicher ist, der vom Timer ausgeführte Code ist veraltet. Hast Du nach den letzten Codeänderungen wirklich die Solution neu bereitgestellt, gewartet bis sie verteilt ist und dann den Timerdienst neu gestartet?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
282 Beiträge
MStel Als Antwort am 19 Sept. 2016 14:58
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, wie gesagt bis zu dem Zeitpunkt werden auf der Website bereits andere Aktionen ausgeführt vollständig & korrekt vom TimerJob ausgeführt. VS bricht den Debugg Vorgang auch nicht ab, allerdings friert es quasi ein, bis der Timer von vorn beginnt. Aber immer erst ab der foreach für SPListItems.

Habe definitiv Projektmappe & TimerJob neu erstellen lassen, anschließend bereitgestellt, im Task Manager für Alle Benutzer den OWSTimer beendet, neu gestartet und anschließend unter Extras -> An Prozess anhängen ->  OWSTimer (nachdem dieser wieder da war) gedebuggt. Pc Neustart hat ebenfalls nichts bewirkt.
Ich frage mich wirklich warum diese Zeile so Probleme bereitet...

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 19 Sept. 2016 16:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann hat irgendwas beim Bereitstellen nicht funktioniert. Prüfe mal den Zeitstempel bei der Solution in der Zentraladministration (System settings - Manage farm solutions). Dieses Verhalten kenne ich nur in dem Zusammenhang wenn Code in Visual Studio und auf dem Server nicht übereinstimmen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
282 Beiträge
MStel Als Antwort am 20 Sept. 2016 08:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ergebnis des letzten Vorgangs: Die Lösung wurde erfolgreich bereitgestellt.

Zeitpunkt des letzten Vorgangs: 9/20/2016 7:57 AM

Mir ist allerdings eben beim testen aufgefallen, dass das "Einfrieren" nur bei der external List auftritt, bei jeder x-beliebigen Custom List funktioniert alles einwandfrei. Alles muss dies ja die Ursache sein. Jetzt ist nur meine Frage wie sich die SPListItem Typen beider Listen unterscheiden, da ich nicht in den Breakpoint komme kann ich mir dies aus VS Seite aus nicht genauer anschauen..

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Sept. 2016 09:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Tut mir leid, aber an der Stelle bin ich überfragt. Es ist zu lange her, daß ich das mal gemacht habe und ich weiß es nicht mehr.

Viele Grüße
Andi
af @ evocom de
Blog