//Methode: Decodieren der Anlagen und Speichern in Bibliothek "Temp" im entsprechenden Unterordner public void AnlagenHochladen(XPathNodeIterator anlagen, string xanhang, string xweitergabe, XmlNamespaceManager nsmgr, string DocID, SPFolder tempfolder, string tempuploadurl, SPWeb web) { Helper helper = new Helper(); //"Moven" durch jede Zeiler der wiederholten Tabelle der Anlagen mit MoveNext while (anlagen.MoveNext()) { //Verwenden von "try" und "catch", da der Code im "try"-Block fehlschlägt und das ganze Programm abbricht, wenn KEINE Anlagen vorhanden sind. Durch try - und catch wird nicht abgebrochen. try { //Dekodieren des Anlagenfelds. Durch anlagen.current.selectsinglenode wird nicht die ganze Zeile, sondern nur das Feld in der Zeile zum Dekodieren ausgewählt. //Das ist wichtig, da noch das Boolean-Feld zur Weitergabe in jeder Zeile enthalten ist und das Dekodieren mit diesem Feld nicht möglich ist. InfoPathAttachmentDecoder decoder = new InfoPathAttachmentDecoder(anlagen.Current.SelectSingleNode(xanhang, nsmgr).Value); string fileNamewithoutextension = Path.GetFileNameWithoutExtension(decoder.Filename); Boolean weitergabe = anlagen.Current.SelectSingleNode(xweitergabe, nsmgr).ValueAsBoolean; Boolean portfolio = helper.PDFPortfolio(decoder.DecodedAttachment, fileNamewithoutextension, weitergabe, tempfolder, tempuploadurl, DocID); if (portfolio != true) { //Hochladen in /Temp/<Auftragsnummer> SPFile attachmentuploadfile = tempfolder.Files.Add(tempuploadurl + DocID + "_" + decoder.Filename, decoder.DecodedAttachment, true); SPListItem attachmentitem = attachmentuploadfile.Item; attachmentitem["Weitergabe"] = weitergabe; //Updaten des Elements damit Änderungen übernommen werden. SystemUpdate() ist eine "silent"-Änderung (dh. Änderungsdatum und Editor werden nicht erfasst). Wenn nur "Update()" verwendet wird, werden diese erfasst. attachmentitem.SystemUpdate(); } } catch { } } }
//Methode: Die Methode wird aufgerufen, wenn im Formular enthaltene Anlagen zur Weitergabe markiert wurden. Im Hauptprogramm wird überprüft, //ob das Formularfeld "WeitergabeÄnderung" auf WAHR gesetzt ist. Wenn das der Fall ist, wird KEIN neuer Auftragszettel erstellt, sondern nur diese Methode ausgeführt. //Erklärung: Wenn die VW bestimmte Anlagen zur Weitergabe auswählt, ist die Unterschrift des PL schon vorhanden. Durch die Auswahl der Anlagen, wird das Formular geändert, //was dazu führt, dass dieser Event Receiver ausgelöst wird (durch das Event "Item updated"). Da in diesem Fall genau derselbe Code ausgeführt werden würde, //wie wenn ein neuer Auftrag erstellt worden wäre, würde der Auftragszettel neu erstellt und überschrieben werden. Somit würden alle Signaturen gelöscht werden. //Deswegen muss bei Änderung des Formulars geprüft werden, ob es sich um eine inhaltliche Änderung des Auftrags handelt, oder ob "nur" Anlagen zur Weitergabe markiert wurden. public void AttachmentsToSupplier() { xIteratorAttachments = root.Select(xAttachments, nsmgr); //"attachments" ist die wiederholte Tabelle mit den Anlagen. Mit "MoveNext()" wird jede Zeile einzelnt bearbeitet. while (xIteratorAttachments.MoveNext()) { try { //Prüfen, ob das Feld in dem die Anlage "liegt" auch wirklich etwas beinhaltet if (xIteratorAttachments.Current.SelectSingleNode(xAttachment, nsmgr).Value != null) { InfoPathAttachmentDecoder decoder = new InfoPathAttachmentDecoder(xIteratorAttachments.Current.SelectSingleNode(xAttachment, nsmgr).Value); //Laden des Dateinamens der Anlage OHNE die Dateiendung. //Warum? Wenn Word-Dokumente als Anlagen hochgeladen werden, werden diese zu PDF konviertiert. Dadurch ändert sich die Dateiendung. Darum muss "dateiendungs-übergreifend" gearbeitet werden. string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(decoder.Filename); //SPQuery ist eine Abfrage; anhand dieser können Elemente in Listen und Bibliotheken in Sharepoint gefunden werden SPQuery query = new SPQuery(); //Abfrage wird auf rekursiv gestllt, damit sie auch Unterordner erfasst query.ViewAttributes = "Scope=\"Recursive\""; //Eigentlicher Abfrage-String: Es wird abgefragt, ob ein Element vorhanden ist, wessen Dateiname ('FileLeafRef') dem aktuellen Dateiname (fileNamewithoutextension) enthält. //'FileLeafRef' ist ein SharePoint-spezifischer-Name, der den Dateinamen MIT Dateiendung enthält; da wir nur nach Dateiname OHNE Dateiendung abfragen können, wird "Contains" verwendet. query.Query = "<Where><Contains><FieldRef Name='FileLeafRef'/><Value Type='Text'>" + fileNameWithoutExtension + "</Value></Contains></Where>"; //Angabe des Unterordners in Bibliothek Temp (/temp/<Auftragsnummer>), um die Abfrage nur auf die Anlagen des betroffenen Auftrags auszuführen query.Folder = tempFolder; //Mit diesem Befehl wird die zuvor erstellte Abfrage ausgeführt und das Ergebnis, nämlich alle zutreffenden Elemente, in "collListItems" abgespeichert. //SPListItemCollection ist eine Sammlung von SharePoint-Listenelementen, die später mit foreach weiterverarbeitet werden kann. SPListItemCollection collListItems = libraryTemp.GetItems(query); foreach (SPListItem oListItem in collListItems) { //Überprüfen ob aktuell ausgewählte Anlage zur Weitergabe markiert ist if (xIteratorAttachments.Current.SelectSingleNode(xAttachmentsToSupplier, nsmgr).ValueAsBoolean == true) { //Setzen des Werts der Spalte "Weitergabe" der entsprechenden Datei in Bibliothek "Temp" auf "true" oListItem[collumnTempToSupplier] = true; } else { oListItem[collumnTempToSupplier] = false; } //Updaten des Elements damit Änderungen übernommen werden. SystemUpdate() ist eine "silent"-Änderung (dh. Änderungsdatum und Editor werden nicht erfasst). Wenn nur "Update()" verwendet wird, werden diese erfasst. oListItem.SystemUpdate(); } } } catch { } } }
//Methode: Decodieren der Anlagen und Speichern in Bibliothek "Temp" im entsprechenden Unterordner public void UploadAttachments() { xIteratorAttachments = root.Select(xAttachments, nsmgr); //"Moven" durch jede Zeiler der wiederholten Tabelle der Anlagen mit MoveNext while (xIteratorAttachments.MoveNext()) { //Verwenden von "try" und "catch", da der Code im "try"-Block fehlschlägt und das ganze Programm abbricht, wenn KEINE Anlagen vorhanden sind. Durch try - und catch wird nicht abgebrochen. try { //Dekodieren des Anlagenfelds. Durch anlagen.current.selectsinglenode wird nicht die ganze Zeile, sondern nur das Feld in der Zeile zum Dekodieren ausgewählt. //Das ist wichtig, da noch das Boolean-Feld zur Weitergabe in jeder Zeile enthalten ist und das Dekodieren mit diesem Feld nicht möglich ist. InfoPathAttachmentDecoder decoder = new InfoPathAttachmentDecoder(xIteratorAttachments.Current.SelectSingleNode(xAttachment, nsmgr).Value); //Hochladen in /Temp/<Auftragsnummer> SPFile attachmentUploadFile = tempFolder.Files.Add(tempUploadUrl + decoder.Filename, decoder.DecodedAttachment, true); } catch { } } }