Konkreter Anwendungsfall für Webservice

16. August 2011 12:48

Hallo zusammen,

in der Entität der Verkaufschance kann per Lookup-Attribut eine Firma ausgewählt werden. Dieser zuvor erfassten Firma sind weitere Informationen hinterlegt (u.a. deren Anschrift inkl. Postleitzahl). Abhängig von dieser PLZ der ausgewählten Firma, möchte ich nun ein weiteres Attribut der Verkaufschance befüllen. Wenn ich nicht irre, benötige ich bei Dynamics CRM 4.0 dazu einen Webservice.

In Michaels Blog gibt es dazu eine erste Beschreibung (vgl. Link).
Allerdings benötige ich dazu weitere Hilfe.

Zurzeit plane ich im OnChange()-Ereignis des Feldes Firma in der Entität Verkaufschance die PLZ der Firma auszulesen. Anschließend soll die PLZ auf die erste Stelle gekürzt werden. Danach erfolgt eine switch/case-Anweisung, welche abhängig von der Ziffer einem Attribut einen konkreten Wert zuordnet.

Doch ist mir immer noch unklar:
- Wo füge ich den Webservice am besten ein? Auch im OnChange()-Ereignis? Wenn ja, leidet darunter die Performance nicht zu sehr?
- Welche Begriffe muss ich in dem Code ändern, damit ich das Attribut "address1_postalcode" auslesen kann?
- Wie kann ich das ausgelesene Attribut weiterverwenden?

Vielleicht kann mir jemand von Euch das Vorgehen (inkl. konkreten Beispielen) einmal genau aufführen?

Gruß & Dank
Frank

Re: Konkreter Anwendungsfall für Webservice

19. August 2011 15:01

Hallo Frank,

du musst das Attribut "q1:new_number" austauschen.
Den Webservice benötigst du im OnLoad des Formulares, da sich ja die Daten der Firma geändert haben können.

Re: Konkreter Anwendungsfall für Webservice

24. August 2011 10:37

Hallo Michael,

leider funktioniert mein Anwendungsfall für einen Webservice immer noch nicht. Dieser soll folgenden Sachverhalt lösen:

Als Endanwender öffne ich ein neues Formular für eine Verkaufschance. Hier kann ich in dem Lookup-Feld "customerid" eine Firma auswählen. Diese Firma ist eine Instanz der Entität "account". Sobald ich eine Firma ausgewählt habe, soll ein Feld des verlinkten Lookup's ausgelesen werden. Dabei handelt es sich um das Standard-Feld "address1_postalcode". Dieser Wert soll dann in einem Feld des Verkaufschancen-Formulars angezeigt werden. Dieses Feld heißt "TEST-SE".

Folgenden Code habe ich sowohl in das OnLoad()-Ereignis des Formulars als auch in das OnChange()-Ereignis des Feldes "customerid" eingefügt:

Code:
// Prüfen, ob das LookUp Feld überhaupt Daten enthält
if (crmForm.all.customerid.DataValue != null)
{
   // Die ID des Datensatzes zuweisen
   var myId = crmForm.all.customerid.DataValue[0].id;
   
   // Definieren der SOAP XML Message für den Zugriff auf den CRM Webservice
   // Hier wird auch die Funktion GenerateAuthenticationHeader verwendet, die automatisch die korrekte Anmeldung ermittelt
   var xml = "" +
   "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
   "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
   GenerateAuthenticationHeader() +
   " <soap:Body>" +
   "    <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
   "      <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
   "        <q1:EntityName>account</q1:EntityName>" +
   "        <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
   "          <q1:Attributes>" +
   "            <q1:Attribute>new_number</q1:Attribute>" +
   "          </q1:Attributes>" +
   "        </q1:ColumnSet>" +
   "        <q1:Distinct>false</q1:Distinct>" +
   "        <q1:PageInfo>" +
   "          <q1:PageNumber>1</q1:PageNumber>" +
   "          <q1:Count>50</q1:Count>" +
   "        </q1:PageInfo>" +
   "        <q1:Criteria>" +
   "          <q1:FilterOperator>And</q1:FilterOperator>" +
   "          <q1:Conditions>" +
   "            <q1:Condition>" +
   "              <q1:AttributeName>accountid</q1:AttributeName>" +
   "              <q1:Operator>Equal</q1:Operator>" +
   "              <q1:Values>" +
   "                <q1:Value xmlns:q2=\"http://microsoft.com/wsdl/types/\" xsi:type=\"q2:guid\">" + myId + "</q1:Value>" +
   "              </q1:Values>" +
   "            </q1:Condition>" +
   "          </q1:Conditions>" +
   "        </q1:Criteria>" +
   "      </query>" +
   "    </RetrieveMultiple>" +
   "  </soap:Body>" +
   "</soap:Envelope>" +
   "";
   
   // Eine Instance des XMLHTTP Objektes erzeugen
    var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
    xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
    xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
    xmlHttpRequest.send(xml);
   if(xmlHttpRequest.status == 200)
    {
      var resultXml = xmlHttpRequest.responseXML;
      var entityNodes = resultXml.selectNodes("//RetrieveMultipleResult/BusinessEntities/BusinessEntity");
      for (var i = 0; i < entityNodes.length; i++)
      {
         var entityNode = entityNodes[i];

         var new_numberNode = entityNode.selectSingleNode("address1_postalcode");
         var new_number = (new_numberNode == null) ? null : new_numberNode.text;
     
         crmForm.all.TEST-SE.DataValue = new_number;
      }
    }
}

Ohne eine Fehlermeldung o.ä. wird mir die gewünschte PLZ leider nicht angezeigt.

Wie sieht der Quellcode korrekt aus?

Gruß
Frank

Re: Konkreter Anwendungsfall für Webservice

28. August 2011 10:41

Hallo Frank,

wenn ich das richtig sehe, holst du dir mit dieser Zeile

Code:
<q1:Attribute>new_number</q1:Attribute>" +


nur das Feld new_number. Du musst dir aber das Feld address1_postalcode holen. Versuch es einmal mit folgender Zeile

Code:
<q1:Attribute>address1_postalcode</q1:Attribute>" +


dann sollte es funktionieren.