Anspruchsvolle Felder

20. Januar 2015 10:30

Hallo Zusammen,

ich habe aktuell folgendes Szenario im CRM abgebildet:

Ich habe eine eigene Entität "Kundenprojekt" angelegt. Diesen Kundenprojekten werden Serviceaktivitäten zugeordnet und lasse mir diese Serviceaktivitäten auch im Kundenprjekt anzeigen. Jetzt hätte ich gern ein Feld, in dem die tatsächliche Dauer der dem Kundenprojekt zugeordneten Serviceaktivitäten abhängig von einigen Parametern wie Status etc. aufsummiert angezeigt wird.

Ich wüsste nun gern, wie ich dem Feld beibringe, die Summe der tatsächlichen Dauer anzuzeigen.

Vielen Dank für eure Hilfe!

Viele Grüße
Sven

Re: Anspruchsvolle Felder

20. Januar 2015 11:37

Hallo Sven,

das geht nur über eine entsprechende Programmierung, entweder mit JavaScript oder einem PlugIn

Re: Anspruchsvolle Felder

20. Januar 2015 15:06

Hallo Michael,

Danke für die schnelle Antwort. Ich hab mir schon gedacht dass das CRM das nicht mit Bordmitteln kann. Hast Du eine Idee, in welche Richtung ich da in Sachen JScript schauen muss um so eine Lösung realisieren zu können?

Viele Grüße
Sven

Re: Anspruchsvolle Felder

20. Januar 2015 16:39

Hi Sven,

schau mal hier:
http://blog.customereffective.com/blog/2014/11/duration-calculations-in-crm-with-little-or-no-customizations.html
oder hier:
http://dynamicslollipops.blogspot.fr/2011/08/sum-activities-duration-dynamics-crm.html

vielleicht hilft dir das ja als Ansatz.

Viele Grüße
Jan

Re: Anspruchsvolle Felder

27. März 2015 15:43

Hallo Jan,

ehrlich gesagt bin ich da etwas überfordert.. Was ich suche sieht wie folgt aus (chtung, jzt kommt ein Art Pseudo-Code, damit man versteht was ich brauch


Summe = 0

for each Serviceaktivität in "EigeneEntität"
{
if erviceaktivität.status = "geschlossen" Then
{
Summe = Summe +Serviceaktivität.TatsächlicheDauer
}
}

EigeneEntität.Summenfeld = Summe

so in etwa sollt das aussehen, nur bin ich bei XRM blutiger Anfänger. Ht jemand eine Idee (vllt ja Du Jan :P ) wie ein tatsächlicher Code aussehen muss, den ich in ein OnLoad Event der EigenenEntität packen kann?

danke schon mal Vorab.

Viele Grüße
Sven

Re: Anspruchsvolle Felder

30. März 2015 13:51

Hallo Sven,

ich würde eine solche Anforderung mit einem kleinen PlugIn erfüllen, JavaScript ist da nicht so gut geeignet, da der Code auf Client-Seite ausgeführt wird und den Client-Rechner entsprechend belastet.

Re: Anspruchsvolle Felder

1. April 2015 07:28

Hallo Michael,

das hört sich nachvollziehbar an. Nun hab ich von der Implementierung eines Plugins noch weniger Ahnung als von Jscript :) Hast Du eine Idee, wie ich hier sinnvoller Weise vorgehen kann?

Danke und Grüße
Sven

Re: Anspruchsvolle Felder

1. April 2015 08:25

Hallo Sven,
ohne Vorkenntnisse ist das etwas schwierig.
Wie es geht und auch Beispiele steht im SDK für Microsoft Dynamics CRM, das du hier downloaden kannst:
http://www.microsoft.com/en-us/download ... x?id=44567

Re: Anspruchsvolle Felder

14. April 2015 10:26

Hallo Michael,

jetzt muss ich nochmal kurz nachfragen. Kannst Du mir den entsprechenden Codeschnipsel basteln, mit dem ich von einer Entität auf ein Feld einer zugeordneten Entität zugreifen kann? also in diesem Beispiel die Dauer der zugehörigen Serviceaktivität? Das das per JScript den Client-Rechner belastet würde ich gerne in Kauf nehmen, da wir das nur sehr unregelmäßig verwenden würden und es sich hier auch nur um einige wenige Serviceaktivitäten handelt. Das ganze per Plugin zu lösen ist vermutlich der elegante und korrekte Weg, für mich aber nicht praktikabel, da ich damit noch weniger Erfahrung hab als mit dem Einsatz von JScript.

Danke schon Vorab für deine Hilfe.

Viele Grüße
Sven

Re: Anspruchsvolle Felder

17. April 2015 14:50

Hallo Sven,

nein, ein Codeschnipsel habe ich nicht, da ich schon lange meine eigenen Bibliotheken verwende, die das ganze deutlich vereinfachen und leichter wartbar machen.

Re: Anspruchsvolle Felder

2. Juni 2015 16:00

Hmmm...
das müsste doch mit einem RollUp-Field gehen, da braucht man keine Programmierung.

VG
Dennis

Re: Anspruchsvolle Felder

3. Juni 2015 08:16

Hi Dennis,
hier ein Beispiel wie man ein Plugin erstellt:
https://msdn.microsoft.com/de-de/library/gg594416.aspx
BeispielCode:
QueryExpression query = new QueryExpression();
query.EntityName = "serviceactivity";
query.ColumnSet = new ColumnSet(true); [Anstatt true kannst du auch die entsprechenden Felder nehmen, ist dir überlassen]
query.Criteria.AddCondition("regardingobjectid", ConditionOptions.Equal, entity.Id);
EntityCollection coll = service.RetrieveMultiple(query);
Int summe = 0;
foreach(Entity ent in coll.Entities)
{
if(((OptionSetValue)ent["statecode"]).Value == 0) [hier deine prüfung auf geschlossen]
{
summe += ent["dauerfeld"]; [hier dein feld eintragen, vllt noch zu einem bestimmten type (int, double,etc) konvertieren
}
}
entity.Summenfeld = summe;

JScriptCode würde in etwa so aussehen:
function SetFields()
// diese Methode dann angeben im OnLoad angeben
{

var lookupObject = Xrm.Page.getAttribute("feldid");
if (lookupObject != null)
{
var lookUpObjectValue = lookupObject.getValue();
if ((lookUpObjectValue != null))
{
var lookupid = lookUpObjectValue[0].id;
}
}
var id = lookupid;
retrieveRecord(id, "ServiceAppointmentSet", retrieveCompleted, null);
}

function retrieveCompleted(data, textStatus, XmlHttpRequest)
{
var servicAct = data;
}


function retrieveRecord(id, odataSetName, successCallback, errorCallback)
{
var context = Xrm.Page.context;
var serverUrl = context.getServerUrl();
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
if (!id)
{
alert("record id is required.");
return;
}
if (!odataSetName)
{
alert("odataSetName is required.");
return;
}
$.ajax({
type: "GET",
contentType: "application/json; charset=utf-8",
datatype: "json",
url: serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "(guid'" + id + "')",
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("Accept", "application/json");
},
success: function (data, textStatus, XmlHttpRequest) {
if (successCallback) {
successCallback(data.d, textStatus, XmlHttpRequest);
RetrieveMultipleEntities(data.d.results);
}
},
error: function (XmlHttpRequest, textStatus, errorThrown) {
if (errorCallback)
errorCallback(XmlHttpRequest, textStatus, errorThrown);
else
errorHandler(XmlHttpRequest, textStatus, errorThrown);
}
});
}

function RetrieveMultipleEntities(data)
{
var summe = 0;
for(int i = 0; i < data.Length; i++)
{
//hier noch die Prüfung auf den Status alla: var status = data[i].statusfeld; if(status = "0") // aber wie oben deinen Wert setzen
summe += data[i].feld;
}
Xrm.Page.getAttribute(summe).setValue(feld); // trägt in deiner aktuellen Datensatz die Zeit ein
}

Grüße
gE3z