Donnerstag, 20. November 2008

m:m Beziehungen

Code-Schnippsel: Wie liest man Objekte aus einer m:m Beziehung aus. 

        Dim qe As New QueryExpression()
        qe.EntityName = "sk_advisor"
        qe.ColumnSet = New AllColumns()

        Dim le As New LinkEntity()
        le.LinkFromEntityName = "sk_advisor"
        le.LinkFromAttributeName = "sk_advisorid"
        le.LinkToEntityName = "sk_sk_advisor_sk_webseminar"
        le.LinkToAttributeName = "sk_advisorid"

        Dim ce As New ConditionExpression()
        ce.AttributeName = "sk_webseminarid"
        ce.Operator = ConditionOperator.Equal
        ce.Values = New Object() {New Guid(objid)}

        Dim le2 As New LinkEntity()
        le2.LinkFromEntityName = "sk_sk_advisor_sk_webseminar"
        le2.LinkFromAttributeName = "sk_webseminarid"
        le2.LinkToEntityName = "sk_webseminar"
        le2.LinkToAttributeName = "sk_webseminarid"

        le2.LinkCriteria = New FilterExpression()
        le2.LinkCriteria.Conditions = New ConditionExpression() {ce}

        le.LinkEntities = New LinkEntity() {le2}
        qe.LinkEntities = New LinkEntity() {le}

        Dim rmRequest As New RetrieveMultipleRequest()
        rmRequest.ReturnDynamicEntities = True
        rmRequest.Query = qe
        Try
            Dim response As RetrieveMultipleResponse = CType(cservice.Execute(rmRequest), RetrieveMultipleResponse)
            Return response.BusinessEntityCollection
        Catch ex As Exception
            Return Nothing
        End Try

Dienstag, 18. November 2008

crmForm.*

Eigenschaften des crmForms...

Neu erstelltes Objekt    
crmForm.FormType == 1
Objekt wird aktualisiert crmForm.FormType ==2
Objekt mit nur Leserechten   crmForm.FormType == 3
Deaktiviertes Objekt crmForm.FormType == 4
Schnellerstellungsformular crmForm.FormType == 5
Massenbearbeiten crmForm.FormType == 6
ObjektID   crmForm.ObjectId
Objekt Type    crmForm.ObjectTypeCode
Objekt Type Name crmForm.ObjectTypeName
Outlook Client crmForm.IsForOutlookClient==true
Outlook Light Client crmForm.IsForOutlookLightClient == true
Online crmForm.IsOnline==true
Wurde das Objekt geändert   crmForm.IsDirty==true

Dynamisches Nachladen einer Javascript-Lbrary

Sollte clientseitig das Nachladen von Javascript-Libraries nötig sein kann man diesen Code im onLoad Event des Formulars einbinden!


var script = document.createElement('script');
script.language = 'javascript';
script.src = '/_custom/jsLibraries/mylib.js';
document.getElementsByTagName('head')[0].appendChild(script);

Leider hat das jedoch einen gravierenden Nachteil. Da der Internet Explorer die externe Datei asynchron in den Speicher läd, stehen die Funktionen eventuell nicht sofort zur Verfügung.

Eine wesentlich elegantere Methode ist die über die Funktion Eval:

function LoadFile(url, cache) {
var httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); httpRequest.open("GET", url, false);
if (!cache) { httpRequest.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"); }
httpRequest.send(null); return httpRequest.responseText;

}

eval(LoadFile("/service/mylib.js", false));


Gesehen bei http://www.stunnware.com/

Mittwoch, 12. November 2008

Anzeigen eines Bildes, daß unter Notizen abgelegt ist...

In MS CRM werden Dokumente, die ich an ein Objekt angehängt habe im Objekt "annotation" abgelegt (wobei im Attribut objectid  die Guid des verknüpften Objekts abgespeichert wird).

Ich gehe jetzt mal davon aus, daß man sich über die Web-Services bis zur Entität, die das abgelegte Bild enthält durchgekämpft hat. 

Im Attribut filename steht nun zum Beispiel der Dateiname und mit dem Attribut isdocument kann man feststellen ob es sich um eine Datei handelt. So weit so gut... 

In documentbody steht der Inhalt der Datei und wie man schnell erkennt hat der mit dem eigentlichen Inhalt der Datei nicht mehr viel zu tun.  Das kommt daher, daß der binäre Datenstrom der Datei im Base64-Format abgelegt wurde. Wen interessiert wie das aussieht kann das im Wikipedia nachschlagen. de.wikipedia.org/wiki/Base64

Ein einfacher Einzeiler verwandelt diesen codierten String in das ürsprüngliche Byte-Array zurück: (VB.NET)

Dim bArray() as Byte = Convert.FromBase64String(base64)

Und wenn man das nun in eine ASPX Seite einbindet, kann man das Bild sogar recht einfach darstellen:

Protected Sub Page_Load(Byval sender as Object, Byval e as EventArgs ) Handles me.Load

[ ... Code um das Bild aus CRM zu laden ... ]
Dim bArray() as Byte = Convert.FromBase64String(documentbody)
response.clear()
response.contentType = "image/gif"
response.binarywrite(bArray)

End Sub

Wenn man sich hier noch ein wenig mit Parametern spielt, kann man diese aspx-Seite verwenden um dynamisch Bilder aus CRM auf Web-Seiten darzustellen.