[wp7] #besug app for Windows Phone 7

22. November 2011 16:35 by Renaud in   //  Tags:   //   Comments (0)

In Belgium, we have the chance to have strong developers communities organizing lots of events :) Here are the user groups I'm following :

The Besug  website is of course developed in Silverlight and because of this, most smartphone users can't access it! That's why I decided to develop a Windows Phone 7 application, to be able to check where the last events will take place and what it will be talking about. It's now available on the marketplace, and you can donwload it here:

[wp7] #besug app pour Windows Phone 7

22. November 2011 10:11 by Renaud in   //  Tags:   //   Comments (0)

On a la chance en Belgique d'avoir des communautés actives de développeurs qui proposent régulièrement des events :) Parmi les user groups que je fréquente le plus, il y a :

Le site de Besug est bien entendu logiquement développé en Silverlight, ce qui le rend inaccessible pour la plupart des utilisateurs de smartphones. Du coup, j'ai décidé de faire une application Windows Phone 7 pour pouvoir consulter de temps à autres les derniers events disponibles et tant qu'à faire, je l'ai publiée sur le marketplace:

Changement d'adresse!

20. November 2011 18:11 by Renaud in   //  Tags:   //   Comments (0)

Le 23 novembre 2011, cela fera un an depuis l'achat du nom de domaine maddev.eu. Et comme mon hébergement arrivait à son terme, j'me suis dit qu'il était temps de changer tout ça.

Depuis un an donc, j'utilisais l'offre premium gratuite de Ikoula! C'est vraiment cool pour commencer, pour tester quelques trucs, pour hoster l'un ou l'autre projet web quand on est encore student et qu'on veut impressionner le prof :) Cet hébergement m'a énormément servi, c'est une super offre! Mais au final, je ne l'ai pas vraiment utilisé complètement. Il y avait je crois 5 bases mysql et 3 bases MS SQL. Autant dire qu'il y a de quoi faire.

Bref, comme je n'en avais pas vraiment l'utilité, plutôt que de repartir pour un an, j'suis passé chez OVH. J'ai donc finalement repris deux hébergement, plus adaptés niveau taille: un perso pour mon blog, qui ne servira qu'à ça. Et puis, un hébergement windows en vis-à-vis, qui pourra me servir de labo pour mes futurs expériences .NET :)

Le 23 novembre 2011, cela fera un an depuis l'achat du nom de domaine maddev.eu. Et comme mon hébergement arrivait à son terme, j'me suis dit qu'il était temps de changer tout ça.

Depuis un an donc, j'utilisais l'offre premium gratuite de Ikoula! C'est vraiment cool pour commencer, pour tester quelques trucs, pour hoster l'un ou l'autre projet web quand on est encore student et qu'on veut impressionner le prof :) Cet hébergement m'a énormément servi, c'est une super offre! Mais au final, je ne l'ai pas vraiment utilisé complètement. Il y avait je crois 5 bases mysql et 3 bases MS SQL. Autant dire qu'il y a de quoi faire.

Bref, comme je n'en avais pas vraiment l'utilité, plutôt que de repartir pour un an, j'suis passé chez OVH. J'ai donc finalement repris deux hébergement, plus adaptés niveau taille: un perso pour mon blog, qui ne servira qu'à ça. Et puis, un hébergement windows en vis-à-vis, qui pourra me servir de labo pour mes futurs expériences .NET :)

La team de stagiaires 2011-2012 du Microsoft Innovation Center

8. November 2011 22:11 by Renaud in   //  Tags:   //   Comments (1)

Comme l'année avance à grand pas, il était temps pour les students d'informatique en fin d'études de se trouver un lieu de stage! :) Je pense que tout le monde le sais maintenant, j'ai eu moi-même la chance de faire mon stage au MIC l'année dernière. Alors je crois qu'il est bon maintenant d'accueillir les nouvelles recrues comme il se doit! Ils se sont présentés là: sur le blog du Microsoft Innovation Center. J'pense qu'il est pas inutile de commencer à les suivre parce qu'entre les projets mobile sur Windows Phone Mango, les projets de robotique avec l'ami NAO, les projets Kinect, Emotive headset, et j'en passe... ça risque d'être une année très riche et intéressante :D Bref, j'leur souhaite de bien faire ça et de profiter autant que possible! Ca se termine toujours trop vite ^^ Et puis pour rester dans l'éco-système Microsoft, n'oubliez pas le Webcafé de ce 23 novembre à Louvain ;) http://www.mswebcafe.be/en/Archive/5_webcafe-leuven [spoil] Vous y croiserez sûrement l'un ou l'autre stagiaire du MIC :) [/spoil]

[CRM 2011] Gérer l'événement OnRefresh d'un subgrid avec une relation 1:N

7. November 2011 16:38 by Renaud in   //  Tags:   //   Comments (0)

Si vous utilisez un Subgrid pour afficher une liste d'entité associées, vous pourriez avoir envie d'afficher également une valeur relative à toutes ces entités! Par exemple, si on imagine une entité Facture, qui a une relation 1 à N avec une entité Détail. Sur la form Facture, on peut afficher un subgrid reprenant la liste des Détails. On peut également vouloir afficher un nouveau champs sur la facture, pour y indiquer le Montant total, qui serait la somme de l'attribut Montant de chaque Détail. Ce champs serait readonly, et calculé automatiquement sur base des Détails. Pour calculer la valeur de ce champs, il est bien entendu conseillé d'utiliser un plugin ou un workflow. Avec des plugins, et en considérant qu'une fois un Détail créé il n'est plus possible de changer la Facture associée, cela donnerait ceci:

- Message: Create / Primary entity: Détail / Execution : Post-operation
- Message: Update / Primary entity: Détail / Attributes filter: Montant / Execution : Post-operation
- Message: Delete / Primary entity: Détail / Execution: Pre-operation

Dans chacun de ces cas, le plugin devra retrouver la Facture associée à l'entité Détail, récupérer la liste des Détails associés à cette Facture, et calculer le Montant total pour le mettre à jour. La marche à suivre est assez basique: On récupère dans le context l'Id du Détail qui a déclenché l'exécution du Plugin. On va ensuite récupérer l'Id de la Facture parent. Et finalement on va récupérer la liste de tous les détails ayant cette Facture pour parent. Une fois qu'on a la liste, qui contiendra par ailleurs notre Détails fraichement mis à jour, on peut calculer le montant total de la facture. (Notez que pour le message Delete, c'est un cas particulier: on utilise le Pre-operation. Premièrement, dans ce cas, l'InputParameters du context d'exécution ne contiendra pas un objet de type Entity derrière la clé Target, mais un objet de type EntityReference. Deuxièmement, si l'on essayait de retrouver l'id de la Facture associée à ce Détail dans l'OrganizationService, une exception serait lancée car ce détail n'existerait déjà plus.) Bref, nous voici avec un champs Montant Total, correctement mis à jour à chaque modification, chaque création, ou chaque suppression de détail. Toutefois, ce n'est pas encore parfait :) Si vous ouvrez un Détail depuis le subgrid d'une Facture, que vous modifiez la valeur de son Montant, et que vous sauvez les modifications, le Montant total de la Facture restera inchangé tant que vous n'aurez pas rafraîchis la page de la Facture. Il existe toutefois une solution pour rendre le tout plus dynamique! Appelons le Subgrid "Details"! Nous allons utiliser deux évènements de ce subgrid: onreadystatechange et onrefresh. En fait, le but ici est d'appeler une méthode pour récupérer la nouvelle valeur du Montant Total de facture à chaque fois que le l'évènement onrefresh est déclenché. Le problème est que ce subgrid est chargé de manière asyncrhone! On va appeler la méthode ci-dessous une fois la fenêtre loadée. On va d'abord vérifier l'état actuel du grid. S'il est déjà complètement chargé, on s'abonne à l'évènement onrefresh. Dans le cas contraire, on va attacher une fonction à l'évènement onreadystatechange, pour être sûr qu'une fois la grille complètement chargée l'eventhandler UpdateTotalAmount soit attaché à l'event onrefresh.

function Subpolicies_OnReadyRefresh(){
    var targetgrid = document.getElementById("Details");

    // If already loaded
    if (targetgrid.readyState == 'complete')
    {
        targetgrid.attachEvent("onrefresh", UpdateTotalAmount);
    }
    else
    {
        targetgrid.onreadystatechange = function applyRefreshEvent() {
            var targetgrid = document.getElementById("Details");
            if (targetgrid.readyState == 'complete') {
                targetgrid.attachEvent("onrefresh", UpdateTotalAmount);
            }
        }
    }
}

Il ne vous reste plus qu'à implémenter la méthode UpdateTotalAmount pour récupérer l'attribut Montant Total de la Facture :) Sources: http://blog.xrm-services.co.uk/?p=150

[CRM 2011] Handle the OnRefresh event on a subgrid with 1:N relationship

7. November 2011 09:11 by Renaud in   //  Tags:   //   Comments (4)

If you use a Subgrid to display a list of related entities, you would like to display a value related to this list. For example, let's imagine a Billing entity, which have a relation 1:N with a Detail entity. On the Billing form, we can display a subgrid containing the Details. We may also want to display a new field Total Amount on the form, which would  be the sum of all the Details. This field would  be readonly and automatically updated when a related Detail is modified. To calculate the value of this field, we should use plugins or workflows. Here is what the plugin solution would look like (assuming that we cannot change the billing related to a detail):

- Message: Create / Primary entity: Detail / Execution : Post-operation
- Message: Update / Primary entity: Detail / Attributes filter: Amount / Execution : Post-operation
- Message: Delete / Primary entity: Detail / Execution: Pre-operation

In each case, the plugin will retrieve the Billing related to the Detail. Then it will retrieve all the Details related to this Billing, and and calculate the new total amount. (Notice that for the Delete message, it's a bit different: First, the "Target" object in the InputParameters is an EntityReference and not an Entity. And then, if you use a post-operation step, you won't be able to retrieve the billing related to this Detail because it won't exist in the database. ) Now, the total amount field is correctly updated for each creation/modification/deletion of a Detail. However, it's not good enough! If you try to open a Detail from the subgrid of a billing form, change its amount value and save it, the Total amount of the billing form will stay unchanged, until you refresh the page! Here is a solution to make your form more dynamic :) Let's call the subgrid "Details"! We are going to use two events from this subgrid: onreadystatechange and onrefresh. The purpose of the following code is to retrieve the new total amount value each time the onrefresh event of the subgrid is triggered. The main problem is that the subgrid is loaded asynchronously! We will call the following method once the form is loaded. We will first check the state of the subgrid. If the state is "completed", then we can add an eventhandler to the onrefresh event. If it's not completely loaded, we have to wait. And for this, we will attach a function to the onreadystatechange. This function will check the new state of the subgrid and attach the UpdateTotalAmount function to the onrefresh event once the subgrid state will be complete.

function Subpolicies_OnReadyRefresh(){
    var targetgrid = document.getElementById("Details");

    // If already loaded
    if (targetgrid.readyState == 'complete')
    {
        targetgrid.attachEvent("onrefresh", UpdateTotalAmount);
    }
    else
    {
        targetgrid.onreadystatechange = function applyRefreshEvent() {
            var targetgrid = document.getElementById("Details");
            if (targetgrid.readyState == 'complete') {
                targetgrid.attachEvent("onrefresh", UpdateTotalAmount);
            }
        }
    }
}

Now you just have to implement the UpdateTotalAmount function to retrieve the Total amount of the Billing :) Sources: http://blog.xrm-services.co.uk/?p=150

TextBox

About the author

I'm a developer, blog writer, and author, mainly focused on Microsoft technologies (but not only Smile). I'm Microsoft MVP Client Development since July 2013.

Microsoft Certified Professional

I'm currently working as an IT Evangelist with an awesome team at the Microsoft Innovation Center Belgique, where I spend time and energy helping people to develop their projects. I also give training to enthusiastic developers and organize afterworks with the help of the Belgian community.

MIC Belgique

Take a look at my first book (french only): Développez en HTML 5 pour Windows 8

Développez en HTML5 pour Windows 8

Membre de l'association Fier d'être développeur

TextBox

Month List