Microsoft Partner Blog Österreich

moved to

www.partnerblog.at

Berndt Schwarzinger Christian Decker Christian Moser Cornelia Koenig Franz Kramer Katja Piwerka Leo Faltus Martin Poeckl Nicole Hiden Uschi Bernhard Geronimo Janosievics Michael Weiß

Informationen für Microsoft Partner zu Geschäftsmöglichkeiten, Lösungen, Lizenzierung, Trainings, Marketing, Veranstaltungen und dem Microsoft Partner Network.

Integration Dynamics CRM 4.0 in Word 2007 - Teil 4 Word Document - BLOG moved to http://www.partnerblog.at - Site Home - TechNet Blogs

BLOG moved to http://www.partnerblog.at

seit 1.9.2011 umgezogen auf www.partnerblog.at

Integration Dynamics CRM 4.0 in Word 2007 - Teil 4 Word Document

Integration Dynamics CRM 4.0 in Word 2007 - Teil 4 Word Document

  • Comments 2
  • Likes

Nachdem wir wissen, wie ein WordAddIn erstellt wird, die Verbindung zu Dynamics CRM herzustellen ist und Daten abgeholt werden können aus CRM, geht's nun darum, diese abgeholten Daten auch in einer möglichst praktikablen Form darzustellen.

Hier stellt sich immer die Frage, soll die Lösung möglichst generisch anwendbar sein oder wirklich speziell auf eine Anforderung abgestimmt werden. Je nachdem wie man sich entscheidet, kann der Datentransfer entweder in eigens definierte Felder erfolgen oder die Daten, beispielsweise der Kundenname, wird an der Stelle an der sich der Cursor befindet im Dokument platziert.

Für unser Beispiel gehen wir davon aus, dass es ein Dokument für einen definierten Zweck gibt, sprich eine Vorlage die an eigens definierten Stellen mit Daten befüllt wird.

Unser Dokument wird eine Projektzusammenfassung sein, die den Kundennamen, den Projektnamen und ein paar weitere Infos wie die benötigten Stunden und Aufwände in Geldwert. Neben der Möglichkeit auf Knopfdruck das Dokument dynamisch befüllen zu lassen, wollen wir zusätzlich noch dieses fertig befüllte Dokument zum jeweiligen Projektdatensatz anhängen können (mittels Upload als Dokument in das Notizfeld der Projektenität).

Unser Dokument

Bei der Erstellung unseres Visual Studio Projektes "WordDocument" werden wir gefragt, ob wir ein neues (leeres) Dokument verwenden wollen, oder ein bereits bestehendes (eine Vorlage beispielsweise). Da ich keine Vorlage zur Hand hatte, kam nur ein neues Dokument in Frage.

Auf dieses neue Dokument kann dann im Solution Explorer von Visual Studio zugegriffen werden. Nach ein paar Handgriffen, wird aus einem leeren Dokument ein nette Vorlage (siehe Bild unten).

image

Wie man vielleicht auf dem kleinen Bild erkennen kann :), besteht das Word Document aus einem Bild, ein bisschen Text und den wesentlichen Zutaten für den Datentransfer, den Content Controls. Diese finden sich im Visual Studio in der Toolbox (links) unter dem Bereich "Word Controls".

Diese Content Controls sind gleich wie alle anderen Form Controls ansteuerbar, sprich mit verschiedensten Properties und Methoden versehen die ein Verändern, Updaten, etc. ermöglichen. Ich habe für mein Beispiel einmal ein RichTextContentControl und PlainTextContentControls verwendet. Das RichTextContentControl dient mir dazu, die Kundeninformationen (Name, Straße, Ort, Plz) mehrzeilig ohne viel Aufwand zu trennen, indem ich alles in einen String verpacke und die Zeilenschaltung durch ein "\n" erledige.

Unser eigener Ribbon

Um weitere Funktionalität im Dokument zu ermöglichen, könnte ich noch weitere Steuerelemente am AddIn anbringen. Da allerdings dadurch kein "Neuigkeitseffekt" erzielt werden würde :-), mach ich einen eigenen Ribbon mit ein paar Buttons. Das ist eine denkbar einfache Aufgabenstellung denn auch hier unterstützt uns Visual Studio mit einem Item "Ribbon", das ich dem Projekt hinzufüge.

Diesem Ribbon spendiere ich drei Buttons, schön gruppiert mit Icons noch dazu und fertig ist ein weiteres UI-Element. Die Funktionalität der Buttons liegt stark an den Anforderungen die ich abdecken möchte, in meinem Fall war das die Möglichkeit die Logindaten "per Hand" eingeben zu können. Diese Option ist dann überaus nützlich, wenn ich weder in der Domäne bin, noch den "Default User" verwenden kann (wir hatten das Thema schon kurz bei den WebServices). Danach noch ein Button zum expliziten Verbinden mit dem CRM Server, könnte ja sein, dass während ich online bin plötzlich der Server doch zur Verfügung steht und ich mich verbinden möchte und als letzten Button noch die Möglichkeit, Dokumente ins CRM hochzuladen - das werden wir uns in Kürze etwas genauer ansehen.

image

Wie gehabt, doppelt auf den Button klicken und sofort kommt von Visual Studio im Hintergrund erzeugt, die Methode die durch den jeweiligen "Listener" aufgerufen wird (der reagiert sobald der Button gedrückt wird).

Dokument in CRM hochladen

Als nächsten Schritt wollen wir uns ansehen, wie ein Dokument ins CRM hochgeladen werden kann und an einen bestimmten Datensatz angehängt wird.

Was müssen wir hierfür alles tun?

1. Dokument mit Inhalt befüllen

2. Dokument irgendwo abspeichern

3. Das Dokument in einen 64-bit String verwandeln (ist notwendig um es ins CRM hochladen zu können)

4. Eine "Annotation" = Note erzeugen

5. Dieser Note den 64-bit String mitgeben und ihr zusätzlich noch mitteilen, dass wir zu einem bestimmten Projekt gehören

6. Fertig (hopefully :))

Ich hätte das Dokument nicht abspeichern müssen, bin aber bewusst diesen Schritt gegangen, um - falls sich mal Zeit findet - das ganze etwas abändern zu können in Richtung Ablage des Dokuments in Sharepoint statt CRM.

Folgendes Code-Snippet zeigt eine Möglichkeit, das Dokument zu speichern, zu konvertieren (deshalb wirds kopiert, könnte man im Speicher auch erledigen :-) aber was wäre Software ohne "room for improvement" ;-))

object paramMissing = System.Type.Missing; string path = System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); // build path object docName = path + "\\" + CrmConnector.getInstance().CurrentAccount.accountid.Value; string destFile = path + "\\Projektzusammenfassung.docx"; // save current document this.SaveAs(ref docName, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing, ref paramMissing); // copy file for converting the file File.Copy(docName + ".docx", destFile); // convert file to 64bit-string byte[] byteData; using (FileStream reader = new FileStream(destFile, FileMode.Open)) { byteData = new byte[reader.Length]; reader.Read(byteData, 0, (int)reader.Length); } string encodedData = System.Convert.ToBase64String(byteData); // give data to upload to CrmConnector CrmConnector.getInstance().uploadDocumentToProject(encodedData); // cleanup File.Delete(destFile);

Der "CrmConnector" ruft die Methode, deren Code im folgenden Snippet zu sehen ist, auf und erstellt eine Note, aktualisiert diese mit ein paar notwendigen Werten (dem Dokument, Name, Mime-Type) und schickt das ganze als Update ins CRM zurück. Um sicher zu gehen, dass auch tatsächlich im aktuell ausgewählten Projekt der Anhang platziert wird, muss natürlich die entsprechende GUID übergeben werden (hierfür benötigen wir ein Lookup-Objekt).

// create annotation CrmBoolean crmBool = new CrmBoolean(); crmBool.Value = true; EntityNameReference enr = new EntityNameReference(); enr.Value = EntityName.new_project.ToString(); Lookup mylookup = new Lookup(); mylookup.Value = currentProject.new_projectid.Value; annotation note = new annotation(); note.objectid = mylookup; note.objecttypecode = enr; note.subject = currentProject.new_name.ToString(); Guid guid = service.Create(note); note.filename = "Projektzusammenfassung.docx"; note.isdocument = crmBool; note.mimetype = "application/msword"; note.documentbody = encodedData; Key key = new Key(); key.Value = guid; note.annotationid = key; note.notetext = "Projektzusammenfassung"; service.Update(note);

Es gibt sicher elegantere Wege, das Dokument zu sichern und hochzuladen (da ich mir meine Kenntnisse hier iterativ erarbeiten musste, sieht auch der Code entsprechend aus :)), vor allem könnten ein paar Schritte (sichern, konvertieren bzw. Note erstellen und Dokument anhängen) verkürzt werden. Nichtsdestotrotz... so könnt's gehen :-)

Die Serie "WordAddIn" wäre somit abgeschlossen, ich hoffe, ich hab nix vergessen. Als nächstes kommt die Aufgabenstellung "InfoPath mit Dynamics CRM" verbinden. Klingt einfach, ist es auch :-), allerdings werden wir natürlich nicht den profanen Weg wählen, sondern exemplarisch einen eigenen WebService hierfür verwenden :-)...

Viel Spaß beim Ausprobieren!

____________________________________

Christian Hrubesch, Microsoft Dynamics

Comments
Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment