Benutzer mit den meisten Antworten
Plugin Code C# - bitte einmal drüber schauen

Frage
-
Hallo,
ich habe gestern schon Thread eröffnet. Da es aber langsam in eine andere Richtung ging, dachte ich mir, dass ich ein neues Eröffne.
Kurz vorweg, ich bin absoluter Neuling in CRM. Hab eschon viele nützliche Links bekommen und auch schon mehr oder weniger verstanden. Ich bitte Euch nur nochmal über mein Code zu schauen, ob ich es so richtig verstanden habe.
Hier ist erstmal meine Anforderung:
Die erste Anforderung die jetzt erstmal besteht ist folgende. Ich gebe in der Entität BRIEF meine Daten an wie: Absender, Empfänger Betreff etc.! Anschliessend soll dann in der Entität BRIEF in der Notiz(Annotation) ein Dokument (das auf meinem Rechner liegt) abgelegt werden.
Das kann man doch mit dem Plugin realieren können, oder?
Hier ist mein Code, habe mein Code auch dokumentiert wie ich es verstehe:
public void Execute(IPluginExecutionContext context) { // Prüfen, ob Entität das Ziel ist if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is DynamicEntity) { ICrmService service = context.CreateCrmService(true); DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"]; // Prüfen, ob Entität ein Brief darstellt if (entity.Name == EntityName.letter.ToString()) { //Guid annoLetterID = ((Key)entity["activityid"]).Value; // Die Guid holen von Entität Brief in der man ist Guid annoLetterID = new Guid(context.OutputParameters.Properties["id"].ToString()); SaveInAnnotation(annoLetterID,service); } else { return; } } } public void SaveInAnnotation(Guid activLetterID, ICrmService service) { RetrieveLetter(activLetterID,service); } public void RetrieveLetter(Guid letterID, ICrmService service) { // Alle Spalten vom Brief holen ColumnSet cols = new ColumnSet(EntityName.letter.ToString()); try { // Daten ausm aktuellen Brief holen letter annoLeter = (letter)service.Retrieve(EntityName.letter.ToString(), letterID, cols); // Neue Annotation erstellen für den Breif annotation lAnnotation = new annotation(); lAnnotation.notetext = "6 Hallo World xml zweiter"; lAnnotation.subject = annoLeter.subject; lAnnotation.objectid = new Lookup(); lAnnotation.objectid.type = EntityName.letter.ToString(); lAnnotation.objectid.Value = letterID; lAnnotation.objecttypecode = new EntityNameReference(); lAnnotation.objecttypecode.Value = EntityName.letter.ToString(); // Öffnet die Datei und liest die Bytes aus FileStream stream = File.OpenRead("C:\\Dokumente und Einstellungen\\Administrator\\Desktop\\testWWmit Property.xml");// + "\\Crm" + accountID.ToString() + ".xml"); byte[] byteData = new byte[stream.Length]; stream.Read(byteData, 0, byteData.Length); string fileName = Path.GetFileName(stream.Name); stream.Close(); // Encodiert das Databyte string encodedData = System.Convert.ToBase64String(byteData); lAnnotation.documentbody = encodedData; lAnnotation.filename = fileName; lAnnotation.mimetype = @"text/xml"; TargetCreateAnnotation annoUpdate = new TargetCreateAnnotation(); annoUpdate.Annotation = lAnnotation; CreateRequest create = new CreateRequest(); create.Target = annoUpdate; CreateResponse updated = (CreateResponse)service.Execute(create); } catch (SoapException ex) { throw new Exception(ex.Message.ToString()); } }
Wäre sehr nett, wenn mir jemand dazu Kommentare zu geben kann, ob es so richtig ist.
Gruß
Antworten
-
Hi,
du musst zwischen Server- und Clientseite unterscheiden (ich weiß ich wiederhole mich). Ein Plugin wird immer auf dem Server ausgeführt (Offline-Modus lasse ich außen vor). Wie soll das Plugin auf dem Server, an die Datei auf deinem Desktop kommen?
Stell dir mal vor, dein CRM-Server steht in den USA in einem Rechenzentrum: dein Plugin ist registriert und wird ausgeführt, wenn du einen Brief anlegst. Wie soll das Plugin auf deinen Client in Deutschland zugreifen? Auf welchen Rechner soll das Plugin zugreifen? Das Plugin wird auch ausgeführt, wenn beispielsweise per Workflow ein Brief angelegt wird.
Ich würde das Konzept nochmal überdenken - mit einem Plugin lässt sich die Anforderung nicht (sinnvoll) lösen. Die einfachste Variante wäre doch, die Datei von Hand anzuhängen. Soll das Anhängen der Datei automatisch geschehen, dann muss dies auf Seite des Anwenders geschehen, da er die Datei erstellt hat oder in einem bestimmten Verzeichnis abgelegt hat. Falls die Datei beispielsweise mit Word erstellt wurde, kann man ein Addin dafür schreiben. Alternativ eine eigenständige Anwendung.
Noch kurz zu deinem Plugin
- du mischst InputParameter und OutputParameter. Diese sind aber nie zur gleichen Zeit gefüllt. InputParameter beinhalten die Informationen aus einer Anfrage (Request) an das CRM, OutputParameter enthalten die Antwort (Response) einer Anfrage.
- dein Catch-Block macht dir die Fehlersuche unnötig schwer. In der Eigenschaft Detail der SoapException stehen weitere Informationen über den Fehler, diese solltest du auswerten. Wenn du eine neue Exception aus einem Catch-Block wirfst, solltest du die gefangene Exception als InnerException weiter reichen. Dir gehen ansonsten wertvolle Informationen verloren. In Plugins solltest du eine InvalidPluginExecutionException (Siehe http://msdn.microsoft.com/en-us/library/cc151084.aspx) werfen, da diese in der Oberfläche ausgegeben wird und auf dem Server gelogged wird.- Als Antwort markiert JuergenBeckModerator Dienstag, 5. Januar 2010 17:02
Alle Antworten
-
Hi,
du musst zwischen Server- und Clientseite unterscheiden (ich weiß ich wiederhole mich). Ein Plugin wird immer auf dem Server ausgeführt (Offline-Modus lasse ich außen vor). Wie soll das Plugin auf dem Server, an die Datei auf deinem Desktop kommen?
Stell dir mal vor, dein CRM-Server steht in den USA in einem Rechenzentrum: dein Plugin ist registriert und wird ausgeführt, wenn du einen Brief anlegst. Wie soll das Plugin auf deinen Client in Deutschland zugreifen? Auf welchen Rechner soll das Plugin zugreifen? Das Plugin wird auch ausgeführt, wenn beispielsweise per Workflow ein Brief angelegt wird.
Ich würde das Konzept nochmal überdenken - mit einem Plugin lässt sich die Anforderung nicht (sinnvoll) lösen. Die einfachste Variante wäre doch, die Datei von Hand anzuhängen. Soll das Anhängen der Datei automatisch geschehen, dann muss dies auf Seite des Anwenders geschehen, da er die Datei erstellt hat oder in einem bestimmten Verzeichnis abgelegt hat. Falls die Datei beispielsweise mit Word erstellt wurde, kann man ein Addin dafür schreiben. Alternativ eine eigenständige Anwendung.
Noch kurz zu deinem Plugin
- du mischst InputParameter und OutputParameter. Diese sind aber nie zur gleichen Zeit gefüllt. InputParameter beinhalten die Informationen aus einer Anfrage (Request) an das CRM, OutputParameter enthalten die Antwort (Response) einer Anfrage.
- dein Catch-Block macht dir die Fehlersuche unnötig schwer. In der Eigenschaft Detail der SoapException stehen weitere Informationen über den Fehler, diese solltest du auswerten. Wenn du eine neue Exception aus einem Catch-Block wirfst, solltest du die gefangene Exception als InnerException weiter reichen. Dir gehen ansonsten wertvolle Informationen verloren. In Plugins solltest du eine InvalidPluginExecutionException (Siehe http://msdn.microsoft.com/en-us/library/cc151084.aspx) werfen, da diese in der Oberfläche ausgegeben wird und auf dem Server gelogged wird.- Als Antwort markiert JuergenBeckModerator Dienstag, 5. Januar 2010 17:02
-
Hi,
das erste leuchte mir vollkommen ein, da hast Du natürlich recht, dass es nicht funktionieren würde, wenn das Dokument aufm Client ist. Aber würde es funktionieren, wenn das Dokument aufm Server liegen würde?
Ich weiß, dass es die einfachste Möglichkeit wäre es per Hand anzuhängen, aber das sollte möglichst automatisch gehen, wenn man den "Speichern" bzw. "Speichern und Schliessen" Button betätigt. So soll es letztendlich passieren. Meine Anforderung sind nur die ersten Schritte mit CRM, um mich damit auseinander zu setzen.
Man kann auch ein AddIn schreiben? Da muss ich ja mal forschen oder steht da was in der SDK drin?
Wie meinst Du das mit einer eigenständige Anwendung? Sorry, dass ich so merkwürdige fragen stelle, aber ich dachte man kann nur per Script (was ich sehr gerne umgehen würde:-) ) oder per Plugin auf CRM irgenwelche programmier technische Anforderungen umsetzen?
Ok, das mit dem OutPutParameter und InPutParameter habe dann wohl doch noch nicht ganz verstanden, wenn man die beiden nicht mischen darf oder kann. Ich dachte, dass ich mit dem InputParameter erstmal prüfen muss bzw. kann, dass es wirklich die Entität BRIEF ist, auf der ich stehe bzw. geöffnet habe im CRM. Und das ich dann mit dem OutPutParameter mir die Guid holen kann von der Entität BRIEF?!?!
Das mit dem Catch- Block werde ich mir dann auch nochmal genauer anschauen!
Auf jeden Fall schon mal vielen Dank für die guten Hinweise und Ratschläge
Gruß