{"id":786,"date":"2019-06-22T09:43:37","date_gmt":"2019-06-22T08:43:37","guid":{"rendered":"http:\/\/wollef.org\/?p=786"},"modified":"2019-06-22T09:43:37","modified_gmt":"2019-06-22T08:43:37","slug":"le-module-de-gestion-de-la-connexion-de-salesforce-vers-mercedes-cloud-22-la-recuperation-des-informations-des-voitures","status":"publish","type":"post","link":"https:\/\/wollef.org\/blog\/le-module-de-gestion-de-la-connexion-de-salesforce-vers-mercedes-cloud-22-la-recuperation-des-informations-des-voitures\/","title":{"rendered":"Le module de gestion de la connexion de Salesforce vers Mercedes Cloud (3\/3) : La r\u00e9cup\u00e9ration des informations des voitures"},"content":{"rendered":"<h1><a name=\"_Toc6859851\"><\/a>1.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Utilisation pour stocker \/ mettre \u00e0 jour la liste des cars dans SF<\/h1>\n<h4>a)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Un objet en m\u00e9moire pour r\u00e9cup\u00e9rer le contenu de la r\u00e9ponse du serveur<\/h4>\n<p>Quand on demandait la voiture \u00e0 la main avec Curl, on obtenait la r\u00e9ponse suivante<\/p>\n<pre><code>[\n{\n\"id\":\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"00338353A46599799B\",\n\"licenseplate\":\u00a0\u00a0\u00a0\u00a0 \"S-GG-9041\",\n\"finorvin\":\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"1HM8CE2A6H6CEC802\"\n}\n]\n<\/code><\/pre>\n<p>C\u2019est un texte qui d\u00e9crit la liste de voitures. Dans ce cas une seule voiture.<\/p>\n<p>Pour pouvoir la manipuler, il faut d\u00e9finir un objet en m\u00e9moire dans Salesforce pour Apex.<\/p>\n<pre><code>class <strong>Vehicule<\/strong> {\npublic String salesforceId \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { get; set; }\npublic String vehiculeId { get; set; }\npublic String licenseplate \u00a0\u00a0\u00a0\u00a0\u00a0 { get; set; }\npublic String finorvin \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { get; set; }\n}\n<\/code><\/pre>\n<p>Et on va transformer chaque voiture de la liste dans un de ses objets.<\/p>\n<h4>b)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Le code qui analyse le contenu de la r\u00e9ponse du serveur et cr\u00e9e les voitures en m\u00e9moire<\/h4>\n<p>Du coup on va utiliser l\u2019outil\u00a0de Salesforce qui sert \u00e0 lire un message JSON<\/p>\n<pre><code>JSON.deserializeUntyped( <em>leMessage<\/em> );<\/code><\/pre>\n<p>Et stocker en m\u00e9moire les voitures dans une liste<\/p>\n<pre><code>public List&lt;<strong>Vehicule<\/strong>&gt; vehicules { get; set; }<\/code><\/pre>\n<p>Comme pour l\u2019appel \u00e0 l\u2019API pr\u00e9c\u00e9dente (session), on peut maintenant \u00e9crire le code qui appelle Mercedes, analyse la r\u00e9ponse et m\u00e9morise les voitures<\/p>\n<pre><code>public void loadVehiculesFromServer() {<\/code><\/pre>\n<ul>\n<li><strong>Pr\u00e9paration de la requ\u00eate<\/strong><\/li>\n<\/ul>\n<pre><code>\/\/Set HTTPRequest Method\nHttpRequest req = new HttpRequest();\nreq.setMethod('GET');\nreq.setHeader('authorization', 'Bearer '+access_token );\nreq.setHeader('accept', 'application\/json');\nreq.setEndpoint(API_URL_Vehicules);<\/code><\/pre>\n<ul>\n<li><strong>Appel de la requ\u00eate<\/strong><\/li>\n<\/ul>\n<pre><code>\/\/Execute web service call here\nHttp http = new Http();\nHTTPResponse res = http.send(req);<\/code><\/pre>\n<ul>\n<li><strong>R\u00e9cup\u00e9ration de la r\u00e9ponse<\/strong><\/li>\n<\/ul>\n<pre><code>vehiculesJson = res.getBody();\nSystem.debug('response:' + vehiculesJson);<\/code><\/pre>\n<ul>\n<li><strong>D\u00e9codage de la r\u00e9ponse<\/strong><\/li>\n<\/ul>\n<pre><code>List&lt;Object&gt; results =\n(List&lt;Object&gt;)JSON.deserializeUntyped(vehiculesJson);\n\nvehicules = new List&lt;Vehicule&gt;();\n\nfor(Object o:results)\u00a0 {\nMap&lt;String,Object&gt; m = (Map&lt;String,Object&gt;)o;\nVehicule v = new Vehicule();\nv.vehiculeId = (String) m.get('id');\nv.licenseplate = (String)\u00a0 m.get('licenseplate');\nv.finorvin =\u00a0\u00a0 (String) m.get('finorvin');\nvehicules.add(v);\n}\n}<\/code><\/pre>\n<h4>c)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Le code qui met \u00e0 jour \/ cr\u00e9e les voitures dans la base SF \u00e0 partir des voitures en m\u00e9moire<\/h4>\n<p>&nbsp;<\/p>\n<p>Ce qu\u2019on veut maintenant c\u2019est d\u2019enregistrer les voitures qu\u2019on vient d\u2019obtenir dans Salesforce (mais sans cr\u00e9er des double \u00e0 chaque appel). Pour \u00e7a on doit v\u00e9rifier si la voiture est d\u00e9j\u00e0 l\u00e0 ou pas.<\/p>\n<p>Cela se fait avec un programme qui \u00a0:<\/p>\n<ol>\n<li>lit les id Mercedes des voitures retourn\u00e9es par l\u2019api Mercedes (ce qu\u2019on vient de coder)<\/li>\n<li>charge les voitures de la base SF avec ces ID Mercedes pour cette connexion, et les place dans une carte<\/li>\n<li>pour chaque voiture retourn\u00e9e par l\u2019API Mercedes\n<ol>\n<li>regarde si elle est d\u00e9j\u00e0 dans la base salesforce<\/li>\n<li>sinon\u00a0; il pr\u00e9pare la cr\u00e9ation<\/li>\n<li>si oui\u00a0; il pr\u00e9pare la mise \u00e0 jour des donn\u00e9es dans la base salesforce<\/li>\n<\/ol>\n<\/li>\n<li>il met \u00e0 jour toutes les voitures qui existaient d\u00e9j\u00e0<\/li>\n<li>il cr\u00e9e toutes celles qui n\u2019existaient pas<\/li>\n<\/ol>\n<pre><code>public void storeVehiculesInSalesforce() {\n\n\/\/\u00a0 Etape 1\nSet&lt;String&gt; vehiculeMBIds = new Set&lt;String&gt;();\nfor (Vehicule v:vehicules) {\nvehiculeMBIds.add(v.vehiculeId);\n}\n\n\/\/\u00a0 Etape 2\nList&lt;Car__c&gt; listSFCars = [\nSELECT Id, Mercedes_ID__c, Mercedes_API_Connection__c, Car_number__c\nFROM Car__c\nWHERE\u00a0\u00a0 Mercedes_API_Connection__c = :salesforceConnectionId\nAND Mercedes_ID__c in :vehiculeMBIds\n];\n\nMap&lt;String,Car__c&gt; mapSFCars = new Map&lt;String,Car__c&gt;();\nfor (Car__c c:listSFCars) {\nmapSFCars.put(c.Mercedes_ID__c, c);\n}\n\n\/\/\u00a0 Etape 3\nList&lt;Car__c&gt; carsToCreate = new List&lt;Car__c&gt;();\nList&lt;Car__c&gt; carsToUpdate = new List&lt;Car__c&gt;();\n\nfor (Vehicule v:vehicules) {\n\/\/\u00a0 Etape 3a\nCar__c theSFCar =\u00a0 mapSFCars.get(v.vehiculeId);\n\nif (theSFCar == null) {\n\n\/\/\u00a0 Etape 3b\ncarsToCreate.add(\nnew Car__c(\nMercedes_API_Connection__c = salesforceConnectionId,\nMercedes_ID__c = v.vehiculeId,\nCar_number__c = v.licenseplate\n)\n);\n\n} else {\n\n\/\/\u00a0 Etape 3c\ntheSFCar.Car_number__c = v.licenseplate;\ncarsToUpdate.add(theSFCar);\n}\n\n}\n\ninsert carsToCreate;\nupdate carsToUpdate;\n\n}<\/code><\/pre>\n<p>Maintenant \u00e0 chaque fois qu\u2019on appelle ce code, la liste des voitures dans Salesforce est mise \u00e0 jour avec la r\u00e9ponse de Mercedes.<\/p>\n<h1><a name=\"_Toc6859852\"><\/a>2.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Utilisation pour demander la position de toutes les voitures et les stocker dans la base SF<\/h1>\n<p>On va faire la m\u00eame chose pour l\u2019appel qui demande \u00e0 Salesforce o\u00f9 se trouve chaque voiture.<\/p>\n<h4>a)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 La r\u00e9ponse du serveur<\/h4>\n<p>En Curl, on obtenait la r\u00e9ponse suivante<\/p>\n<pre><code>{\n\"longitude\": {\"value\":11.372609,\"retrievalstatus\":\"VALID\",\"timestamp\":1548425864},\n\"latitude\":\u00a0 {\"value\":47.90321,\"retrievalstatus\":\"VALID\",\"timestamp\":1548425864},\n\"heading\":\u00a0\u00a0 {\"value\":52.520008,\"retrievalstatus\":\"VALID\",\"timestamp\":1548425864}\n}\n<\/code><\/pre>\n<h4>b)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Un objet en m\u00e9moire pour r\u00e9cup\u00e9rer le contenu de la r\u00e9ponse du serveur<\/h4>\n<p>On va aussi cr\u00e9er un objet Apex pour r\u00e9cup\u00e9rer le r\u00e9sultat<\/p>\n<pre><code>class VehiculeLocation {\nDateTime requestedOn { get; set; }\nDecimal longitude\u00a0\u00a0\u00a0 { get; set; }\nDecimal latitude\u00a0\u00a0\u00a0\u00a0 { get; set; }\nDecimal heading { get; set; }\n}<\/code><\/pre>\n<h4>c)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Un objet dans SF pour stocker la position<\/h4>\n<p>A chaque fois qu\u2019on appelle la demande de position, on veut stocker cela comme enregistrement en plus. On a besoin de cr\u00e9er un nouvel objet dans Salesforce.<\/p>\n<p>On l\u2019appelle \u00ab\u00a0Car Status\u00a0\u00bb, et il a les champs Position, Direction et date d\u2019observation.<\/p>\n<p>Voici ce que cela donne dans l\u2019Object Manager.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-791\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2019\/06\/modcar1-300x180.png\" alt=\"\" width=\"472\" height=\"283\" \/><\/p>\n<h4>d)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Des champs sur la voiture pour m\u00e9moriser la derni\u00e8re position<\/h4>\n<p>On va en profiter aussi pour enregistrer la derni\u00e8re position de la voiture dans l\u2019objet voiture lui-m\u00eame\u00a0: un champ<strong> \u00ab\u00a0Last Position\u00a0\u00bb<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-790\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2019\/06\/modcar2-300x90.png\" alt=\"\" width=\"480\" height=\"144\" \/><\/p>\n<h4>e)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Le code qui analyse le contenu de la r\u00e9ponse du serveur<\/h4>\n<p>Comme auparavant, on va appeler la requ\u00eate et analyser le r\u00e9sultat. En rouge ce qui est particulier pour ce cas.<\/p>\n<pre><code>public VehiculeLocation getVehiculeLocation(String aVehiculeMbId) {\n\n\/\/Set HTTPRequest Method\nHttpRequest req = new HttpRequest();\nreq.setMethod('GET');\nreq.setHeader('authorization', 'Bearer '+access_token );\nreq.setHeader('accept', 'application\/json');\nreq.setEndpoint(<strong>API_URL_Vehicules+'\/'+aVehiculeMbId+'\/location'<\/strong>);\n\n\/\/Execute web service call here\nHttp http = new Http();\nHTTPResponse res = http.send(req);\n\n\/\/Helpful debug messages\nString jsonResponse = res.getBody();\nSystem.debug('response:' + jsonResponse);\n\nMap&lt;String, Object&gt; results =(Map&lt;String, Object&gt;)JSON.deserializeUntyped(jsonResponse);\n\nVehiculeLocation vl = new VehiculeLocation();\nvl.requestedOn = System.now();\nvl.longitude= (Decimal) ((Map&lt;String, Object&gt;) results.get('longitude')).get('value');\nvl.latitude= (Decimal) ((Map&lt;String, Object&gt;) results.get('latitude')).get('value');\nvl.heading=(Decimal) ((Map&lt;String, Object&gt;) results.get('heading')).get('value');\nSystem.debug('pos:'+vl);\n\nreturn vl;\n}<\/code><\/pre>\n<h4>f)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Le code qui stocke dans la base SF les positions des voitures r\u00e9cup\u00e9r\u00e9es<\/h4>\n<p>Comme pour la liste des voitures, on va enregistrer les positions obtenues.<\/p>\n<p>On va donc \u00e9crire un programme qui<\/p>\n<ol>\n<li>pour chaque v\u00e9hicule\n<ol>\n<li>appelle le serveur pour obtenir la position (le code du paragraphe pr\u00e9c\u00e8dent)<\/li>\n<li>retrouve la voiture dans la base SF<\/li>\n<li>cr\u00e9e en m\u00e9moire l\u2019objet Car_Status__c \u00e0 stocker dans SF<\/li>\n<li>m\u00e9morise sur la voiture sa derni\u00e8re position<\/li>\n<\/ol>\n<\/li>\n<li>enregistre tous les objets Car_Status__c en une fois<\/li>\n<li>met \u00e0 jour toutes les voitures (nouvelles positions) en une fois<\/li>\n<\/ol>\n<pre><code>\npublic void getAndStoreVehiculeLocations() {\n\nlist&lt;Car_Status__c&gt; statusToInsert = new list&lt;Car_Status__c&gt;();\n\n\/\/\u00a0 Etape 1\nfor (Vehicule v:vehicules) {\n\n\/\/\u00a0 Etape 1a\nVehiculeLocation vl = getVehiculeLocation(v.vehiculeId);\n\n\/\/ Etape 1b\nCar__c theCar = [\nSELECT\nId,\nMercedes_ID__c,\nMercedes_API_Connection__c,\nCar_number__c\nFROM Car__c\nWHERE Mercedes_API_Connection__c = :salesforceConnectionId\nAND Mercedes_ID__c = :v.vehiculeId\n];\n\n\/\/ Etape 1c\nstatusToInsert.add(\nnew Car_Status__c(\nCar__c = theCar.id,\nHeading__c = vl.heading,\nLocation__longitude__s = vl.longitude,\nLocation__latitude__s = vl.latitude,\nRequested_On__c = vl.requestedOn\n)\n);\n\n\/\/ Etape 1d\ntheCar.Last_Position__longitude__s = vl.longitude;\ntheCar.Last_Position__latitude__s = vl.latitude;\ncarsToUpdate.add(theCar);\n}\n\n\/\/ Etape 2\ninsert statusToInsert;\n\n\/\/ Etape 3\nupdate(carsToUpdate);\n\n}<\/code><\/pre>\n<h1><a name=\"_Toc6859853\"><\/a>3.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Enregistrer automatiquement toutes les 5 \u2018 la position de la voiture<\/h1>\n<p>Si on veut suivre les voitures en permanence, il faut r\u00e9p\u00e9ter l\u2019enregistrement de la position r\u00e9guli\u00e8rement.<\/p>\n<p>Ceci est le code pour une seule connexion qu\u2019on veut ex\u00e9cuter toutes les 5 minutes\u00a0(le code Apex qu\u2019on a \u00e9crit avant, dans la classe Mercedes API, avec &#8216;a011t00000ByCf5AAF&#8217; qui est l\u2019identifiant de l\u2019objet pour la connexion \u00e0 Mercedes) :<\/p>\n<pre><code>MercedesAPI api = new MercedesAPI(<strong>'a011t00000ByCf5AAF'<\/strong>);\napi.loadVehiculesFromServer();\napi.getAndStoreVehiculeLocations();<\/code><\/pre>\n<p>Pour cela, on doit le placer dans une classe Apex programmable qui\u00a0:<\/p>\n<ol>\n<li>Charge la liste des connexions, et pour chacune<\/li>\n<li>Fait les appels pour la liste des positions<\/li>\n<\/ol>\n<pre><code>global class <strong>MercedesStatusRequestScheduler<\/strong> implements <strong>Schedulable<\/strong> {\n\nglobal void execute(SchedulableContext SC) {\n\/\/\u00a0 Etape 1\nfor (Mercedes_API_Connection__c c : [SELECT Id FROM Mercedes_API_Connection__c]) {\n\/\/\u00a0 Etape 2\ndoRequest(c.id);\n}\n\n}\n\n<strong>\u00a0\u00a0\u00a0 @future(callout=true)<\/strong>\n<strong>\u00a0\u00a0\u00a0 <\/strong><strong>public static void doRequest(String theConnectionId) {<\/strong>\n<strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MercedesAPI api = new MercedesAPI(theid);<\/strong>\n<strong>\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/strong><strong>api.loadVehiculesFromServer();<\/strong>\n<strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 api.getAndStoreVehiculeLocations();<\/strong>\n<strong>\u00a0\u00a0 }<\/strong>\n\n}\n<\/code><\/pre>\n<p>Pour chaque ex\u00e9cution souhait\u00e9e (toutes les 5 \u2018 d\u2019une heure,\u00a0donc 12 fois), on doit enregistrer l\u2019ex\u00e9cution dans le tableau d\u2019ex\u00e9cution SF.<\/p>\n<p>Voici le code qui permet d\u2019enregistrer une ex\u00e9cution<\/p>\n<pre><code>public static void schedule(String name, String cron) {\nMercedesStatusRequestScheduler leJob =\nnew MercedesStatusRequestScheduler();\nString jobID = system.schedule(name,cron,leJob);\n}\n<\/code><\/pre>\n<p>Pour le programmer toutes les 5\u2019 on doit enregistrer 12 programmations ainsi<\/p>\n<pre><code>schedule('Mercedes-Status xh00m', '0 0 * * * ? *');\nschedule('Mercedes-Status xh05m', '0 5 * * * ? *');\nschedule('Mercedes-Status xh10m', '0 10 * * * ? *');\nschedule('Mercedes-Status xh15m', '0 15 * * * ? *');\nschedule('Mercedes-Status xh20m', '0 20 * * * ? *');\nschedule('Mercedes-Status xh25m', '0 25 * * * ? *');\nschedule('Mercedes-Status xh30m', '0 30 * * * ? *');\nschedule('Mercedes-Status xh35m', '0 35 * * * ? *');\nschedule('Mercedes-Status xh40m', '0 40 * * * ? *');\nschedule('Mercedes-Status xh45m', '0 45 * * * ? *');\nschedule('Mercedes-Status xh50m', '0 50 * * * ? *');\nschedule('Mercedes-Status xh55m', '0 55 * * * ? *');<\/code><\/pre>\n<h1><a name=\"_Toc6859854\"><\/a>4.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Am\u00e9lioration : indiquer quelle connexion ou quelle voiture on veut suivre<\/h1>\n<p>Pour le moment, on ne peut pas activer d\u00e9sactiver l\u2019enregistrement des positions.<\/p>\n<p>Pour d\u00e9cider\u00a0\u00e0 chaque ex\u00e9cution :<\/p>\n<ul>\n<li>si on veut charger les voitures d\u2019une connexion<\/li>\n<li>quelle voiture on veut interroger<\/li>\n<\/ul>\n<p>On ajoute une checkbox\u00a0:<\/p>\n<ul>\n<li>\u00e0 l\u2019objet custom connection\u00a0: Scheduled_Job_Execution__c<\/li>\n<li>\u00e0 l\u2019objet custom car\u00a0: Record_Status__c<\/li>\n<\/ul>\n<p>Et on modifie le code ainsi<\/p>\n<ul>\n<li>Quand on charge l\u2019objet de connexion (Mercedes API connection) en m\u00e9moire, on m\u00e9morise si on doit faire l\u2019enregistrement des positions<\/li>\n<\/ul>\n<pre><code>public boolean scheduledJobsExecution {get; set;\u00a0 }\npublic MercedesAPI(Id aSalesforceConnectionId) {\n\u2026\n\nscheduledJobsExecution = theConnection.Scheduled_Job_Execution__c;\n}<\/code><\/pre>\n<ul>\n<li>Dans le code programm\u00e9 toutes les 5 minutes, on v\u00e9rifie si la connexion doit \u00eatre enregistr\u00e9e<\/li>\n<\/ul>\n<pre><code>@future(callout=true)\npublic static void doRequest(String theid) {\nMercedesAPI api = new MercedesAPI(theid);\nif (api.scheduledJobsExecution) {\napi.loadVehiculesFromServer();\napi.getAndStoreVehiculeLocations();\n}\n}<\/code><\/pre>\n<p>Dans le code d\u2019interrogation et de stockage des statuts, on v\u00e9rifie si la voiture doit \u00eatre suivie pour sa position<\/p>\n<pre><code>public void getAndStoreVehiculeLocations() {\nlist&lt;Car_Status__c&gt; statusToInsert = new list&lt;Car_Status__c&gt;();\nfor (Vehicule v:vehicules) {\nCar__c theCar = [\nSELECT\nId,\nMercedes_ID__c,\nMercedes_API_Connection__c,\nCar_number__c,\n<strong>Record_Status__c<\/strong>\nFROM Car__c\nWHERE Mercedes_API_Connection__c = :salesforceConnectionId\nAND Mercedes_ID__c = :v.vehiculeId\n];\n\u00a0\n<strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (theCar.Record_Status__c==true) {<\/strong>\nVehiculeLocation vl = getVehiculeLocation(v.vehiculeId);\nstatusToInsert.add(new Car_Status__c(\nCar__c = theCar.id,\nHeading__c = vl.heading,\nLocation__longitude__s = vl.longitude,\nLocation__latitude__s = vl.latitude,\nRequested_On__c = vl.requestedOn\n));<strong>\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/strong>\n\n}\n\ninsert statusToInsert;\n}\n\n\u00a0\n<\/code><\/pre>\n<p>Et voil\u00e0 maintenant, quand le code s\u2019ex\u00e9cute, on n\u2019acc\u00e8de \u00e0 la connexion et on n\u2019appelle l\u2019enregistrement des voitures que si les cases sont coch\u00e9es pour cette connexion et cette voiture.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Utilisation pour stocker \/ mettre \u00e0 jour la liste des cars dans SF a)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Un objet en m\u00e9moire pour r\u00e9cup\u00e9rer le contenu de la r\u00e9ponse du serveur Quand on demandait la voiture \u00e0 la main avec Curl, on obtenait la r\u00e9ponse suivante [ { &#8220;id&#8221;:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;00338353A46599799B&#8221;, &#8220;licenseplate&#8221;:\u00a0\u00a0\u00a0\u00a0 &#8220;S-GG-9041&#8221;, &#8220;finorvin&#8221;:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8220;1HM8CE2A6H6CEC802&#8221; } ] C\u2019est un <a class=\"read-more\" href=\"https:\/\/wollef.org\/blog\/le-module-de-gestion-de-la-connexion-de-salesforce-vers-mercedes-cloud-22-la-recuperation-des-informations-des-voitures\/\">Continue Reading<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30,33,49,18,20],"tags":[],"class_list":["post-786","post","type-post","status-publish","format-standard","hentry","category-cars-and-clouds","category-apex","category-mercedes","category-salesforce","category-soql"],"_links":{"self":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/comments?post=786"}],"version-history":[{"count":0,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/786\/revisions"}],"wp:attachment":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/media?parent=786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/categories?post=786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/tags?post=786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}