none
Workflow Plugin beendet sich teilweise nicht korreckt RRS feed

  • Frage

  • Hallo,
    ich hab ein Workflow Plugin geschreiben das in einer neuen Entität die Referenz zur Firma an hand der accountnumber nach tragen soll.
    Wenn eine forhandene accountnumber eingetragenn wird klappt das auch und der Workflow beendet sich mit Erfolgsmeldung.
    Aber wenn die accountnumber nicht gefunden wird beendet sich mit "Es wird gewartet".
    Eigentlich soll das dann die Referenz zur Firma löschen aber das geht nicht.

    Danke für eure Hilfe Jens

    using

     

    System;
    using System.Xml;
    using Microsoft.Crm.Workflow;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using System.Workflow.ComponentModel;

    namespace

     

    Axioma.Crm.FindFirma
    {
    [
    CrmWorkflowActivity("Firma finden", "AXIOMA")]
    public class clsFindFirma : Activity
    {
    protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
    {
    IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
    IWorkflowContext context = contextService.Context;
    ICrmService crmService = context.CreateCrmService();
    this.accountid = Lookup.Null;
    this.accountid.type = "account";

     

    if (!string.IsNullOrEmpty(this.accountnumber))
    {

     

    // Firma suchen
    string fetch = "<fetch mapping=\"logical\" count=\"1\" version=\"1.0\"><entity name=\"account\"><attribute name=\"name\" /><order attribute=\"statecode\" />";
    fetch +=
    "<order attribute=\"modifiedon\" descending=\"true\" /><filter><condition attribute=\"accountnumber\" operator=\"eq\" value=\"";
    fetch +=
    this.accountnumber;
    fetch +=
    "\" /></filter></entity></fetch>";
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(crmService.Fetch(fetch));

     

    if (doc != null)
    {
    XmlNode n;

     

    // Firma ID suchen
    n = doc.SelectSingleNode("//accountid");
    if (n != null)
    {
    this.accountid.IsNull = false;
    this.accountid.Value = new Guid(n.InnerText);
    }

     

    // Firma Namen suchen
    n = doc.SelectSingleNode("//name");
    if (n != null)
    {
    this.accountid.name = n.InnerText;
    }
    }
    }
    return ActivityExecutionStatus.Closed;
    }

     

    /// <summary>
    /// Input: Partnernummer
    /// </summary>
    public static DependencyProperty accountnumberProperty = DependencyProperty.Register("accountnumber", typeof(string), typeof(clsFindFirma));
    [
    CrmInput("Partnernummer")]
    public string accountnumber
    {
    get { return (string)base.GetValue(accountnumberProperty); }
    set { base.SetValue(accountnumberProperty, value); }
    }

     

    /// <summary>
    /// Output: Firma Id
    /// </summary>
    public static DependencyProperty accountidProperty = DependencyProperty.Register("accountid", typeof(Lookup), typeof(clsFindFirma));
    [
    CrmReferenceTarget("account")]
    [
    CrmOutput("Firma")]
    public Lookup accountid
    {
    get { return (Lookup)base.GetValue(accountidProperty); }
    set { base.SetValue(accountidProperty, value); }
    }
    }

     

    Dienstag, 1. März 2011 16:44

Antworten

  • Hallo Jens,

    wenn du die accountid mit lookup.null füllst, ist diese NULL, nicht gleich guid.empty. Ich würde an deiner Stelle die accountid mit guid.empty füllen.

    Hinweis: Guid.empty bedeutet nichts anderes, als alle Felder der Guid mit nullen zu füllen, also 00000-0000 usw.


    Viele Grüße

    Michael Sulz
    MVP für Microsoft Dynamics CRM
    Blog
    Website
    • Als Antwort markiert Michael Sulz Mittwoch, 29. Oktober 2014 07:14
    Freitag, 4. März 2011 12:49

Alle Antworten

  • Ich will meine Frage mal etwas verallgemeinern. 

    Wie kann ich per SDK eine Referenz in einem Lookup Feld löschen?

    Das Workflow Plugin oben ist nur ein kleines Beispiel das ebend nicht funktioniert.

    Gruß Jens

    Freitag, 4. März 2011 07:32
  • Indem du als Wert Lookup.Null setzt. Siehe http://msdn.microsoft.com/en-us/library/bb959618.aspx
    Existiert übrigens bei allen Properties.

     


    My Blog
    Freitag, 4. März 2011 09:48
  • Ok dann scheint es aber ein Bug in der Workflow-Engine zu geben das ein Lookup.Null nicht zurück gegeben werden kann.

    Freitag, 4. März 2011 10:50
  • Hast du dir schon das Trace angeschaut? Wenn es knallt (was es in deinem Fall tut) findest du darin auch die Exception die ausgelöst wurde.
    My Blog
    Freitag, 4. März 2011 11:00
  • Bekomme als Meldung:

    >Workflow terminated: {6C7404B9-5546-E011-B052-0050569908AE} - System.Workflow.Activities.Rules.RuleEvaluationException: Die Eigenschaft "Value" kann nicht ausgewertet werden, da ihr Zielobjekt Null ist.

    Im Programm oben Initialisiere ich die accountid bereits mit this.accountid = Lookup.Null;
    Der Value sollte also auf
    Guid.Empty stehen und nicht Null!


    Freitag, 4. März 2011 11:58
  • Hallo Jens,

    wenn du die accountid mit lookup.null füllst, ist diese NULL, nicht gleich guid.empty. Ich würde an deiner Stelle die accountid mit guid.empty füllen.

    Hinweis: Guid.empty bedeutet nichts anderes, als alle Felder der Guid mit nullen zu füllen, also 00000-0000 usw.


    Viele Grüße

    Michael Sulz
    MVP für Microsoft Dynamics CRM
    Blog
    Website
    • Als Antwort markiert Michael Sulz Mittwoch, 29. Oktober 2014 07:14
    Freitag, 4. März 2011 12:49
  • wenn du die accountid mit lookup.null füllst, ist diese NULL, nicht gleich guid.empty. Ich würde an deiner Stelle die accountid mit guid.empty füllen.

    @Michael: da accountid ein Lookup ist geht das nicht ;)

    Was passiert, wenn du accountid nur befüllst wenn du alle Daten ermitteln konntest? Du füllst den Lookup nämlich immer (wenn auch nur teilweise). Das wird dein Problem sein.


    My Blog
    Montag, 7. März 2011 07:24
  • Mann kann das Lookup = Null setzten (hab ich auch schon probiert) aber nicht ein Variable vom Typ Guid, das gibt ein Fehler.

    Also ist Lookup.Value immer gleich Guid.Empty wenn man nicht explizit ein anderen Wert zuweist.

     

    Das accountid = Lookup.Null; sollte eigentlich der richtige Weg sein siehe:

    Using Null Values http://msdn.microsoft.com/en-us/library/cc151060.aspx

    aber in dem Workflow Plugin scheint es nicht korrekt zurück geben zu werden und das ist mein Problem

    Soweit wie ich das Prog. debuggen kann sehen alle Werte korrekt aus.

     

    Ich habe den Workflow (nicht das Plugin) geändert und prüfe ob der Rückgabewert Daten enthält und lösche dann das Feld. Das ergibt dann zumindes keine Fehlermeldung auch wenn das eine Krücke ist.

     

    @ckeller

    Wenn ich die accountid nicht setzte (also ganz weg lasse) dann mach das CRM-System auch genau garnix.

    Ich möchte aber das die Referenz dann entfernt wird.

    Gruß Jens

    Montag, 7. März 2011 08:25