none
Wo ist der (Denk-)Fehler? RRS feed

  • Frage

  • Hallo,

    ich habe ein kleines Plug In geschrieben,
    welches mir aus einem Nummernkreis die aktuelle Nummer ziehen soll und damit einen account bei der Neuanlage damit versehen soll.

    Was klappt (getestet):
    - Nummer wird gezogen und korrekt übergeben.

    Was nicht klappt:
    - die Update-Methode funktioniert nicht, es wird eine Exception generiert Fehler: "Server was unable to process request." 
            public void Execute(IPluginExecutionContext context)
            {
                ICrmService crmService = context.CreateCrmService(false);
    
                // Gibt es eine Entität, mit der gearbeitet werden kann?
                if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is DynamicEntity)
                {
                    // Abrufen des aktuellen Entitäts-Objekts
                    DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"];
    
                    // Handelt es sich um eine Firma?
                    if (entity.Name == EntityName.account.ToString())
                    {
                        // If Account Number was not set, generate a new Account Number
                        // Use "contains" because the indexer will throw if the column is not found
                        if (entity.Properties.Contains("accountnumber") == false)
                        {
                            try
                            {
                                String freie_nummer = GetAktuelleFirmennummer();
                                entity["accountnumber"] = freie_nummer;
                                crmService.Update(entity);
     
                            }
                            catch (Exception ex)
                            {
                                WriteLog("account", "Create", "Das Objekt konnte nicht mit der neuen Nummer gespeichert werden.", ex);
                            }
                        }
                        else
                        {
                            // Der Benutzer hat anscheinend eine Nummer selber eingegeben
                            throw new InvalidPluginExecutionException("Die Firmennummer darf nur vom System gesetzt werden.");
                        }
                    }
                }
            }
    Kann mir jemand helfen? Ich finde dafür keine Lösung.

    Grüße, cfrosch
    Donnerstag, 17. Dezember 2009 09:23

Antworten

  • Hallo,

    es gibt nur zwei Möglichkeiten. Entweder wird das Update durchgeführt oder es wird eine Exception ausgelöst.
    Wenn der Datensatz nicht aktualisiert wurde und auch keine exeption ausgelöst wird, ist wahrscheinlich die Variable freie_nummer leer.

    Schreib doch einmal direkt vor dem Update den Inhalt der Variable in das Log.

    Gibt es eventuell einen Workflow oder ein anderes Plugin, das den Datensatz verändert?
    Viele Grüße

    Michael Sulz
    axcentro GmbH
    MVP für Microsoft Dynamics CRM
    • Als Antwort markiert Michael Sulz Mittwoch, 2. Februar 2011 16:47
    Donnerstag, 17. Dezember 2009 13:40
  • Hallo cfrosch,

    ist Dein Problem mittlerweile gelöst?

    Viele Grüße,
    Jürgen
    Jürgen Beck

    Dipl. Kfm./Wirtschaftsinformatik
    MVP, MCSD.NET, MCITP DBA, MCDBA, MCSE
    Microsoft Certified Business Management Solutions Professional
    Microsoft Certified CRM Developer
    Microsoft Certified Trainer

    ComBeck IT Services & Business Solutions
    Microsoft Gold Certified Partner
    Microsoft Small Business Specialist

    Developing & Supporting Business Applications from small business to big enterprises covering scores of sectors

    http://www.combeck.de
    Donnerstag, 7. Januar 2010 12:44
    Moderator

Alle Antworten

  • Hi,

    - fange die SoapException ab und schau dir die Detail-Eigenschaft an. Hier steht eine genauere Beschreibung des Fehlers.
    - Wie hast du das Plugin registriert? Pre-/Post-Updat, synchron/asynchron?
    Donnerstag, 17. Dezember 2009 10:36
  • Hallo,

    das Plug In ist Post auf Create, synchron.

    Der aktuelle Code ist:

    public void Execute(IPluginExecutionContext context)
            {
                ICrmService crmService = context.CreateCrmService(true);
    
                // Gibt es eine Entität, mit der gearbeitet werden kann?
                if (context.OutputParameters.Properties.Contains("Target") && context.OutputParameters.Properties["Target"] is DynamicEntity)
                {
                    // Abrufen des aktuellen Entitäts-Objekts
                    DynamicEntity entity = (DynamicEntity)context.OutputParameters.Properties["Target"];
    
                    // Handelt es sich um eine Firma?
                    if (entity.Name == EntityName.account.ToString())
                    {
                        // If Account Number was not set, generate a new Account Number
                        // Use "contains" because the indexer will throw if the column is not found
                        if (entity.Properties.Contains("accountnumber") == false)
                        {
                            try
                            {
                                String freie_nummer = GetAktuelleFirmennummer();
    
                                StringProperty accountnumber = new StringProperty("accountnumber", freie_nummer);
                                entity.Properties.Add(accountnumber);
    
                                crmService.Update(entity);
                            }
     
                            catch (Exception ex)
                            {
                                WriteLog("account", "Create", "Das Objekt konnte nicht mit der neuen Nummer gespeichert werden.", ex);
                            }
                        }
                        else
                        {
                            // Der Benutzer hat anscheinend eine Nummer selber eingegeben
                            throw new InvalidPluginExecutionException("Die Firmennummer darf nur vom System gesetzt werden.");
                        }
                    }
                }
            }
    Er gibt jetzt keine Fehlermeldung mehr aus, aber das Feld wird auch nicht gefüllt.
    Donnerstag, 17. Dezember 2009 11:32
  • Hallo,

    es gibt nur zwei Möglichkeiten. Entweder wird das Update durchgeführt oder es wird eine Exception ausgelöst.
    Wenn der Datensatz nicht aktualisiert wurde und auch keine exeption ausgelöst wird, ist wahrscheinlich die Variable freie_nummer leer.

    Schreib doch einmal direkt vor dem Update den Inhalt der Variable in das Log.

    Gibt es eventuell einen Workflow oder ein anderes Plugin, das den Datensatz verändert?
    Viele Grüße

    Michael Sulz
    axcentro GmbH
    MVP für Microsoft Dynamics CRM
    • Als Antwort markiert Michael Sulz Mittwoch, 2. Februar 2011 16:47
    Donnerstag, 17. Dezember 2009 13:40
  • Hallo,

    die exceptions werden geloggt und die LogFile bleibt leer, bei provozierten Fehlern funktioniert das logging.

    Der Hinweis mit der freie_nummer == null || "" werde ich direkt mal testen.

    Danke für die Antwort!
    Freitag, 18. Dezember 2009 08:04
  • Hallo cfrosch,

    ist Dein Problem mittlerweile gelöst?

    Viele Grüße,
    Jürgen
    Jürgen Beck

    Dipl. Kfm./Wirtschaftsinformatik
    MVP, MCSD.NET, MCITP DBA, MCDBA, MCSE
    Microsoft Certified Business Management Solutions Professional
    Microsoft Certified CRM Developer
    Microsoft Certified Trainer

    ComBeck IT Services & Business Solutions
    Microsoft Gold Certified Partner
    Microsoft Small Business Specialist

    Developing & Supporting Business Applications from small business to big enterprises covering scores of sectors

    http://www.combeck.de
    Donnerstag, 7. Januar 2010 12:44
    Moderator