72
Développement Apex et Visualforce Axel KAMALAK 09/03/2013 http://axelkamalak.eu Ce document explique les points suivants : Installation IDE Force.com sous Eclipse ; Les triggers ; Les classes ; La programmation Apex et Visualforce ; Le dataloader

Développement Apex et Visualforce

Embed Size (px)

DESCRIPTION

Cours sur Apex, Visualforce Installer l'IDE force.com Utiliser le dataloader

Citation preview

Page 1: Développement Apex et Visualforce

Développement Apex et Visualforce

Axel KAMALAK

09/03/2013

http://axelkamalak.eu

Ce document explique les points suivants : Installation IDE Force.com sous Eclipse ; Les triggers ; Les classes ; La programmation Apex et Visualforce ; Le dataloader

Page 2: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

1

TABLE DES MATIERES

Table des matières ............................................................................................................................................................. 1

Installer l’IDE .................................................................................................................................................................. 3

Le jeton de sécurité ......................................................................................................................................................... 6

Plages de connexion IP ................................................................................................................................................. 6

Mode before ou Mode after .................................................................................................................................... 15

Les méthodes et les attributs : ................................................................................................................................... 20

Les méthodes sont déclarées de la manière suivante : ................................................................................... 21

Les types de variable ..................................................................................................................................................... 24

Les opérateurs .................................................................................................................................................................. 25

Les conditionnels : .......................................................................................................................................................... 25

Les répétitives : ................................................................................................................................................................ 26

Les répétitives : ................................................................................................................................................................ 29

Les collections .................................................................................................................................................................. 29

Les listes : ........................................................................................................................................................................... 29

Set .......................................................................................................................................................................................... 30

Map ....................................................................................................................................................................................... 30

Le langage SOQL .............................................................................................................................................................. 32

Supprimer un enregistrement .............................................................................................................................. 34

Les limites Salesforce .................................................................................................................................................... 35

Les méthodes de test ..................................................................................................................................................... 38

Taux de couverture du code : ................................................................................................................................ 41

Architecture d’une page Visualforce ....................................................................................................................... 43

Contenu d’une page visualforce ................................................................................................................................ 44

Voici le résultat d’affichage de ma page : .............................................................................................................. 44

Générer un PDF ............................................................................................................................................................... 45

Droit Profil ........................................................................................................................................................................ 45

Mode de Développement sous Salesforce ............................................................................................................. 46

Voici le résultat : .............................................................................................................................................................. 47

Créer un objet personnalisé ........................................................................................................................................ 47

Créer un onglet pour l’objet personnalisé ............................................................................................................ 48

Le contrôleur personnalisé ......................................................................................................................................... 50

Le constructeur ................................................................................................................................................................ 50

Afficher une variable ..................................................................................................................................................... 50

Voici le résultat d’affichage : ....................................................................................................................................... 51

Page 3: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

2

Créer un titre d’affichage dans la page visualforce ........................................................................................... 52

Afficher les enregistrements existants ................................................................................................................... 52

Lire les enregistrements .............................................................................................................................................. 53

Voici le résultat d’affichage ......................................................................................................................................... 54

Le mode Edit ..................................................................................................................................................................... 54

Sur la page Visualforce .................................................................................................................................................. 55

Le contrôleur ..................................................................................................................................................................... 57

Changer le mode d’édition........................................................................................................................................... 58

Le bouton Cancel ............................................................................................................................................................. 58

Le bouton save ................................................................................................................................................................. 59

Afficher les composants ............................................................................................................................................... 59

Créer un enregistrement .............................................................................................................................................. 59

Sauver l’enregistrement courant .............................................................................................................................. 60

Annuler la modification ................................................................................................................................................ 61

pagination avec bouton next et prev ....................................................................................................................... 62

Page 4: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

3

PARTIE 1 - INSTALLER L ’ IDE

SALESFORCE DANS ECLIPSE -

INSTALLER L’IDE

Aller dans Eclipse

• Cliquer sur Help

• Cliquer sur Eclipse Marketplace

Page 5: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

4

Dans le champ «Find », entrer « force.com » et cliquer sur le bouton « GO »

Une fois qu’Eclipse vous propose l’Ide , cliquer sur le bouton « Installer »

Sous Eclipse

• Dans la zone de gauche, cliquer droit

• Cliquer sur New

• Cliquer sur Force.com project

Page 6: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

5

Il faudra remplir le formulaire de la manière suivante :

� Project name : le nom du projet (par exemple RBX_project_ABC )

� Username : votre nom utilisateur

� Password : votre mot de passe

� Security token : votre jeton de sécurité

Pour chaque environnement, il faudra utiliser un nom d’utilisateur unique.

Pour l’environnement de test, vous pouvez avoir le nom d’utilisateur :

john,[email protected]

Pour l’environnement de production, vous pouvez avoir le nom d’utilisateur :

john.apexer @abc.com

Sur un même environnement, deux utilisateurs ne peuvent pas avoir le même nom

d’utilisateur.

Il existe différents types d’environnement :

Page 7: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

6

Sandbox : c’est un environnement de test, réservé aux développeurs. Son adresse url est

https://test.salesforce.com

Production : c’est un environnement de production : réservé aux utilisateurs : Son adresse

url est https://login.salesforce.com

LE JETON DE SECURITE

Pour obtenir un jeton de sécurité, il faudra aller sur votre environnement Salesforce.

� Cliquer sur « Mes informations personnelles »

� Cliquer sur « Réinitialiser mon jeton de sécurité »

Vous recevrez votre jeton par email.

Si vous vous connectez depuis un espace sécurisé, le jeton de sécurité n’est pas néces-

saire. Pour cela l’administrateur doit renseigner une plage d’adresses IP sécurisées sur le ou

les profils.

PLAGES DE CONNEXION IP

Page 8: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

7

Dans le profil, l’administrateur saisit une plage d’IP sécurisée.

Les utilisateurs rattaché au profil et qui se connectent depuis une adresse ip compris dans

cette plage n’auront pas besoin de jeton de sécurité.

Page 9: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

8

PARTIE 2 - STRUCTURE D’UN PRO-

JET SALESFORCE

Classes : ce sont toutes les classes du projet

Pages : ce sont les pages Visualforce

Triggers : ce sont les déclencheurs

Static ressources : ce sont les fichiers de Ressources ( js , css , image) . On charge sous

Salesforce

Salesforce.schéma : on accède à la base de données via une application graphique.

Page 10: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

9

La création des différents composants peut se faire via Eclipse

� Cliquer droit sur le nom du projet

� Cliquer sur New

� Cliquer sur le composant de votre choix

Pour supprimer un composant :

� Il faudra effectuer la suppression sous Salesforce.

� Il faudra réaliser la même action sous Eclipse.

Page 11: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

10

PARTIE 3 – DEPLOIEMENT D’UN

PROJET A PARTIR D’ECLIPSE

Il est possible de déployer sous Salesforce à partir d’Eclipse.

� Sélectionner les fichiers à déployer

� Cliquer droit sur le fichier

� Cliquer sur force.com

� Cliquer sur Save to Server

Lorsque l’on appuie sur Enregistrer, Eclipse envoie aussi automatiquement les modifications

sous Salesforce.

Page 12: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

11

Dans le cas d’un projet en équipe, le développeur AB a déployé ses modifications. Le déve-

loppeur AF veut récupérer les dernières modifications. Comment faire?

� Clic droit sur le nom du projet

� Cliquer sur force.com

� Cliquer sur « Refresh from Server »

Il est conseillé de faire cette action chaque matin afin de récupérer les modifications appor-

tées par les autres collègues.

Si un développeur ne télécharge pas la dernière version du fichier et veut enregistrer son

fichier, Salesforce va l’avertir.

� Sauvegardez votre code dans un autre fichier

� Effectuez un rafraîchissement à partir du serveur pour récupérer la dernière

version du document (Refresh from Server)

� Insérez vos modifications dans le fichier

� Vous pouvez maintenant enregistrer.

Si vous souhaitez ignorer les modifications, vous avez la possibilité d’écraser le fichier

� Clic droit sur le nom du fichier

� Cliquer sur force.com

� Cliquer sur « Save to Server »

Page 13: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

12

Il est possible de faire une livraison sur l’environnement de production

� Clic droit sur le nom du projet

� Cliquer sur « Force.com »

� Cliquer sur « Deploy to Server »

Entrez vos informations

Puis choisissez « Production/ Developer Edition »

Pour vérifier que vos modifications sont valides et peuvent être déployés sous Salesforce :

� Cliquer sur « Validate Deployment »

Page 14: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

13

Salesforce vient de valider les Modifications.

� Cliquer sur « Next » pour déployer.

La ou les modifications sont maintenant déployées sur l’environnement de production.

Page 15: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

14

PARTIE 4 – LES TRIGGERS

Un objet peut avoir des triggers :

Apex Trigger : ce sont des déclencheurs qui vont générer une ou plusieurs méthodes après ac-

tion de l’utilisateur.

Le trigger se déclenche avant ou après une action spécifique d’un utilisateur sur un objet parti-

culier.

Les différents modes :

� After update : après la mise à jour d’un objet

� After insert : après insertion d’un nouvel objet

� Before insert : avant l’insertion d’un nouvel objet

� Before update : avant la mise à jour d’un objet

� Before delete : avant la suppression d’un objet

� After delete : après la suppression d’un objet

Page 16: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

15

MODE BEFORE OU MODE AFTER

� Si je dois effectuer une action sur l’objet elle-même, je dois obligatoirement choisir un

trigger en mode before.

� Si je dois effectuer une action sur un autre objet, je dois choisir un trigger en mode after.

Par exemple, après saisie du salaire brut, le trigger doit calculer le salaire net et les charges so-

ciales pour un collaborateur.

L’action du trigger doit intervenir sur l’objet lui-même, donc je suis dans l’obligation d’utiliser un

trigger en mode before. J’ai besoin des informations avant la fin de l’enregistrement.

Après modification du salaire pour un collaborateur, Salesforce doit créer un nouvel Objet

« Historique Salaire ».

L’action du trigger va intervenir sur un autre objet, donc je dois utiliser le mode after.

Dans le second cas, si j’avais choisi un trigger en mode before. Nous pourrions avoir un problème

si l’objet Collaborateur ne se créait pas.

Pour éviter ce genre de problème, on doit prendre un trigger en mode after.

Le trigger en mode after va agir une fois que l’enregistrement de l’objet courant est terminé. Si

l’objet rencontre un problème à l’enregistrement, les actions du trigger after n’interviennent pas.

Règle de nommage conseillée pour un trigger :

TRG_NuméroTriggerUnique_NomObjet_TypeAction

Par exemple, mon premier trigger after insert sur l’objet « Account »

TRG_01_Account_beforeinsert_af

Un trigger en exemple :

Page 17: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

16

Un trigger doit comporter des appels à des méthodes d’autres classes.

Ici, on appelle la méthode « calculerSalaire » de la classe « AP01_Account »

Un utilisateur saisit les informations suivantes dans la fiche compte :

Nom : « Durand »

Téléphone : « 0101010101 »

Il appuie sur enregistrer.

Le trigger va récupérer ces informations dans un objet de type Account.

Il va les transmettre à la méthode « calculerSalaire » en utilisant « trigger.new »

Un trigger commence obligatoirement par le mot clé « trigger »

� Le nom du trigger arrive juste après

� Le nom de l’objet arrive après le mot clé « on »

� Dans les paramètres, on va spécifier le mode de trigger

Filtrer les enregistrements au niveau du trigger

trigger TR01_Rayon_beforeinsert on Rayon__c ( before insert)

{

Page 18: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

17

AP01Rayon.Traiterlesmanagers(trigger.new);

}

Dans l’exemple ci-dessus, nous appelons la méthode Traiterlesmanagers en lui fournissant en

paramètre tous les rayons.

Cependant, il faudrait filtrer les enregistrements qui doivent être traités. L’exemple suivant nous

explique comment filtrer les enregistrements au niveau du trigger.

List<Rayon__c> mesRayons = new List<Rayon__c>(); for(Rayon__c eachRayon : trigger.new) {

if( eachRayon.NbResponsable__c != null ) { mesRayons.add(eachRayon);

} }

if(!mesRayons.isEmpty()){ AP01Rayon.Traiterlesmanagers(mesRayons); }

Je vais crées une liste qui va contenir tous les rayons qui m’intéressent.

Je vais parcourir tous les rayons à traiter.

Si le nom du responsable est rempli, je vais le placer dans la liste ‘mesRayons’

List<Rayon__c> mesRayons = new List<Rayon__c>();

for(Rayon__c eachRayon : trigger.new) {

if( eachRayon.NbResponsable__c != null ) {

mesRayons.add(eachRayon);

}

}

Page 19: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

18

Si ma liste n’est pas vide, je vais appeler la methode Traiterlesmanagers en lui fournissant en

paramètre ma liste.

if(!mesRayons.isEmpty()){

AP01Rayon.Traiterlesmanagers(mesRayons);

}

Page 20: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

19

PARTIE 5 – LES CLASSES

Une classe va contenir toutes les méthodes et les variables.

Il est fortement conseillé d’utiliser une convention de nommage. On vous

conseille la suivante : AP[Numéro unique de la classe]_Objet

Par exemple, la première classe du projet pour l’objet Account s’appellera :

AP01_Account

Un exemple de classe :

Privée : la classe ne peut pas être accessible par les autres classes et les déclencheurs. Salesforce

refuse l’enregistrement.

Page 21: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

20

I.Public : accessible à toutes les classes et déclencheurs du projet courant.

II.Global : accessible par toutes les classes apex de tous les projets ( partout )

III.Virtual : la classe autorise l’héritage et la surcharge.

IV.Abstract : la classe définit des méthodes abstraites.

V.Without sharing : indique que la classe ne respecte les règles de partage

de salesforce.

VI.With sharing : indique que la classe respecte les règles de partage de Salesforce.

LES METHODES ET LES ATTRIBUTS :

Les attributs se déclarent de la manière suivante :

public String NomDuResponsable {get;set;}

private Integer TotalChiffreAffaire {get;set;}

public final Integer AgeMajorite = 18;

Niveau Accessibilité Type Nom {get;set;}

Page 22: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

21

{get; set;} : accessibilité lecture / écriture

Si vous ne mettez pas get/set , la variable ne pourra pas être utilisée.

LES METHODES SONT DECLAREES DE LA MANIERE SUIVANTE :

Accès type de retour nom (paramétre1, paramétre n){

return x ;

}

Exemple de programme :

Lors de la création d’un compte, on veut directement affecter 200€ au champ « Annual »

Page 23: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

22

Page 24: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

23

PARTIE 6 – PROGRAMMATION

APEX

Le langage Apex est un langage gouverné.

Les langages traditionnels sont très flexible et peuvent demander au système de faire l’action x,

y, z …..

Le langage Apex est un langage gouverné où vous pouvez faire tout ce que le système autorise.

Page 25: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

24

LES TYPES DE VARIABLE

Il existe différents type de données sous APEX :

� Integer : entier (-2,147,483,648 à 2,147,483,647 )

� String : Chaine de caractère

� Boolean : true ou false

� Date : les dates

� Long

� Décimal

� Double

� Blob : données binaire

� ID : identifiant

� Object : ce sont les objets

� Integer i = 50;

� String nomClient= ‘TEST_APEX’;

Page 26: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

25

LES OPERATEURS

LES CONDITIONNELS :

L’instruction if permet de faire un test booléen. Si la condition est respectée, alors on va exécuter

une ou plusieurs actions

Page 27: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

26

Si la variable AnnualRevenue est positive alors on va l’incrémenter.

L’instruction if – else permet de faire un test booléen.

Si la condition est vraie, alors on va exécuter une ou plusieurs actions.

Sinon on va exécuter d’autres actions.

Si la variable AnnualRevenue est positive alors on va l’incrémenter. Sinon on va l’initialiser à 0 ;

LES REPETITIVES :

L’instruction for permet de faire une action n fois.

Page 28: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

27

Il est possible de parcourir une liste sans avoir à gérer sa taille. Pour cela, il suffira d’écrire la

boucle for de la manière suivante.

Dans le code ci-dessous, on va récupérer tous les comptes dont le champ lieu__c est égal à Paris.

Le résultat de cette requête pourra être placé dans une liste nommée « mesAccounts »

Ensuite, on va parcourir cette liste grâce à notre boucle for afin de placer 75 dans le champ

CP__c.

Page 29: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

28

Account eachAccount : mesAccounts :

Account est le type de l’objet que l’on va manipuler.

eachAccount est le nom de la variable que l’on va utiliser pour parcourir chaque enregistre-

ment

mesAccounts est le nom de la liste que l’on va parcourir

L’instruction do while permet de faire une action tant que la condition est respectée.

L’instruction do-while exécute au moins une fois la ou les instructions avant de tester la condi-

tion.

Important : Dans la boucle do, il ne faudra pas oublier d’incrémenter la variable.

Page 30: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

29

LES REPETITIVES :

L’instruction while permet de faire une ou plusieurs actions tant que lacondition est respectée.

LES COLLECTIONS

Une collection permet de stocker des éléments de même type.

Par exemple, une collection de collaborateurs peut contenir Pierre, Martin, Jean, Alexandra, …..

LES LISTES :

Le type List hérite de la collection. Une liste permet de stocker x éléments de même type. Elle

peut avoir des doublons. Sa taille s’adapte automatiquement.

Syntaxe :

public List<Type> NomListes = new List<Type>();

Exemple :

Page 31: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

30

list< Sportif__c > mesSportifs = new list< Sportif__c >();

mesSportifs= [Select Id,Name,FirstName__c ,Age__c from Sportif__c where Age__c >18];

SET

Une collection de type Set permet de stocker un ensemble d’objet de même type. Elle refuse les

doublons. Il n’est pas possible de stocker le même objet 2 fois contrairement à une liste classique

où on pourrait stocker le même objet X fois.

Syntaxe:

public Set<Type> SetName = new Set<Type>();

Les principales méthodes pour les collections

� clear : effacer tout le contenu d’une collection

� clone : retourner une copie de la collection

� isEmpty : retourner false si la liste n’est pas vide . Sinon retourne true

� size : retourner la taille de la collection

� add : ajouter un élément dans la collection

MAP

Une map est une collection de paires clé valeurs. Chaque clé est unique pour une seule valeur. La

clé et la valeur peuvent avoir différent type.

La map suivante représente le code et le nom des produits :

Clé 01tW0000000QTRv 01tW0000000VTRv 01tW0000000QTDv

Valeur Informatique Fruits et Légumes Boulangerie

Une map peut être déclarée de la manière suivante :

map<Id, String> mapProduits = new map<Id, String>();

Page 32: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

31

Exemple d’utilisation d’une map :

Cette méthode va nous permettre de remplir le nom du rayon pour chaque produit.

public static void RemplirNameOfRayon (List<produitsAliementaires__c> ProduitsAli-

mentaires)

{

Set<Id> mesproduitsIds = new Set<Id>();

for(produitsAliementaires__c eachProduit : ProduitsAlimentaires)

{

mesproduitsIds.add(eachProduit.IdRayon);

}

map<Id,Rayon__c> mapRayons = new map<Id,Rayon__c>([Select Id,Name from Rayon__c

where Id in: mesproduitsIds]);

for(produitsAliementaires__c eachproduits : ProduitsAlimentaires)

{

eachproduits.NameRayon__c = mapRayons.get(eachproduits.IdRayon).Name ;

}

}

Set<Id> mesproduitsIds = new Set<Id>();

for(produitsAliementaires__c eachProduit : ProduitsAlimentaires)

{

mesproduitsIds.add(eachProduit.IdRayon);

}

Je vais parcourir la liste ProduitsAlimentaires afin d’éxtraire tous les identifiants de rayon dont

je vais avoir besoin pour mes produits.

map<Id,Rayon__c> mapRayons = new map<Id,Rayon__c>([Select Id,Name from Rayon__c

where Id in: mesproduitsIds]);

Page 33: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

32

Je vais récupérer tous les enregistrements de type Rayon qui m’intéressent. Je réalises cette ac-

tion par le biais de la clause where. Comme j’ai récupérés les identifiants rayons dont j’avais

besoin pour mes produis alimentaires.

for(produitsAliementaires__c eachproduits : ProduitsAlimentaires)

{

eachproduits.NameRayon__c = mapRayons.get(eachproduits.IdRayon).Name ;

}

Je vais parcourir ma liste de produits par le biais de la boucle for. La ligne suivante va me per-

mettre de récupérer le nom du rayon dans la map. Je vais remplir le champ NameRayon__c de

mon enregistrement.

LE LANGAGE SOQL

•Il est similaire au langage SQL.

•Il permet de faire des opérations dans la base de données Salesforce.

� Insert : créer un nouvel enregistrement

� Update : mettre à jour un enregistrement existant

� •Upsert : Créer si inexistant sinon mettre à jour l’enregistrement

� Delete : Supprimer un enregistrement Il est possible de construire les requêtes à partir d’eclipse :

Page 34: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

33

L’écran Salesforce schéma dispose de 3 zones :

- Requête

- Zone d’affichage des résultats

- Objet

La construction d’une requête se réalise de la manière suivante :

- Choisir l’objet

- Cliquer sur les champs souhaités

La requête est automatiquement affichée.

Cliquer sur « Run me » pour voir les résultats dans la zone d’affichage des résultats.

Page 35: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

34

Cette requête risque de ne pas marcher sous Apex :

Select a.Phone, a.Name, a.Id From Account a

Il faudra supprimer les annotations “a”

La requête devient :

Select Phone Name , Id From Account

SUPPRIMER UN ENREGISTREMENT

Page 36: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

35

public static void SupprimerPlayerEtatSupprimer(List<Player__c> players)

{

List<Player__c> playersToDelete = new List<Player__c>();

for(Player__c eachplayers: players)

{

if(eachplayers.Etat__c == ‘To be deleted’ )

{

Player__c tempPlayer=new Player__c(id=eachplayers.id);

playersToDelete.add(tempPlayer);

}

}

delete playersToDelete;

}

Si vous tentez de supprimer un enregistrement, Salesforce va refuser la suppression si celui ci

se fait sur l’enregistrement actif. Donc pour éviter ce problème, il faudra écrire le code suivant :

Player__c tempPlayer=new Player__c(id=eachplayers.id);

playersToDelete.add(tempPlayer);

Ici on va créer un nouveau objet de type Player__c qui va recevoir le même Id que notre enregis-

trement actif. On va placer cet objet dans une liste. A la fin de la méthode, on va supprimer tous

les enregistrements.

LES LIMITES SALESFORCE

Page 37: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

36

Tout code Apex est confronté à un certain nombre de règles. Si vous ne respectez pas ces règles,

votre code est invalide. Vous ne pourrez pas passer en production. Salesforce ne vous répondra

pas suite à une action, il dira limite X non respectée.

Le code suivant présente un default

for(Integer i=0 ; i<maListeContactnew.size() ; i++)

{

if(maListeContactnew[i].Phone != maListeContactold[i].Phone || maListeContact-

new[i].Phone != null && maListeContactold[i].Phone ==null) {

Contact c = new Contact();

c.Phone = maListeContactnew[i].Phone;

c.LastName= maListeContactnew[i].Name;

c.AccountId= maListeContactnew[i].Id;

insert c ;

}

}

Salesforce limite le nombre de requête SOQL à 100. Autrement dit, il ne faudra pas effectuer plus

de 100 reqûetes SOQL. Sinon Salesforce bloque l’exécution.

NB : Dans les environnements libres, la limite SOQL est 150.

Pour résoudre ce problème, il faudra effectuer les actions suivantes :

� On crée une liste de contact.

� On ajoute tous les contacts à créer dans cette liste.

� On effectue l’insertion de nos contacts à la fin du traitement.

� Même s’il y a 20 000 contacts à créer, Salesforce considère ce code comme 1 seul re-

quête.

List<Contact> ContactToCreate = new List<Contact>();

Page 38: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

37

for(Integer i=0 ; i<maListeContactnew.size() ; i++)

{

if(maListeContactnew[i].Phone != maListeContactold[i].Phone

|| maListeContactnew[i].Phone != null && maListeContactold[i].Phone ==null)

{

Contact c = new Contact();

c.Phone = maListeContactnew[i].Phone;

c.LastName= maListeContactnew[i].Name;

c.AccountId= maListeContactnew[i].Id;

ContactToCreate.add(c);

}

}

insert ContactToCreate ;

Page 39: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

38

LES METHODES DE TEST

Il est possible d’écrire les méthodes de test dans la classe. Pour une meilleure ergonomie et or-

ganisation, il est conseillé de créer une nouvelle classe.

Convention de nommage conseillée :

TEST_NomDeLaClasse

Pour créer une classe de test,

� Cliquer sur classes

� Cliquer sur new

� Cliquer sur Apex Class

� Entrer le nom de la méthode de test

� Dans la liste de sélection Template : Sélectionner Test Class

Page 40: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

39

Une méthode de test reproduit le même comportement qu’une ou plusieurs actions de

l’utilisateur.

Dans le code précédent, la méthode createContact va créer un nouveau contact a chaque fois que

le numéro de téléphone d’un compte va changer.

Pour valider ce code, nous devons écrire ce cas. Ici nous testons la mise à jour d’un compte. Le

code est validé.

Il est conseillé de faire les tests avec plus de 100 données pour voir si notre code sera confronté

à la limite SOQL 101

La méthode ci-dessous nous permet de valider notre code. Une autre méthode pour écrire les

méthodes de test consiste à utiliser une classe factory.

Page 41: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

40

Nous allons créer une classe factory_test comme suit

Factory_Test.cls

public static Account createAccount()

{

account acc = new Account();

acc.Name=’TEST Account’;

acc.Phone=’0150120000’

return acc;

}

Public static Film__c createFilm()

{

Film__c film = new Film__c

film.Name = ‘ LE HEROS DES TEST’;

film.Type__c =’Animation’ ;

film.Prix_du_ticket__c = 12 ;

return film ;

}

Account_Test

static testMethod void myAccountTest() {

Account acc = Factory_Test.createAccount();

insert acc;

Film__c film = Factory_Test.createFilm();

Insert film;

Il est possible d’écrire toutes les tests méthodes dans une classe factory. Ainsi, il suffira de faire à

la méthode createAccount() pour créer un account. Cette méthode de développement permet de

centraliser la création des objets. Ainsi à l’avenir si un champ devient obligatoire, il suffira de

corriger la méthode de test dans la classe test_factory.

Page 42: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

41

TAUX DE COUVERTURE DU CODE :

Pour mettre notre code en production, il nous faudra avoir 75% de couverture minimum.

Pour vérifier le taux de couverture du code actuel, il faudra effectuer la manipulation suivante :

� Cliquer sur Setup

� Cliquer sur Develop

� Cliquer sur Apex Class

Pour mieux comprendre le rapport :

Page 43: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

42

� Tests Run : nombre de test lan-

cés

� Test failure : nombre d’erreurs

� Code Coverage : taux de cou-

verture

� Test Success: liste les tests OK

� Code Coverage : Taux de cou-

verture par classe et trigger

Page 44: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

43

PARTIE 7 – VISUALFORCE

Visualforce est un langage balisé pour permettre la conception d’applications. Il est possible de créer

des interfaces avec un style personnalisé où bien avec le style salesforce. Chaque page Visualforce

peut contenir jusqu’à 1Mo de texte, soit 1 million de caractère. Tous les pages Visualforce commen-

cent avec le tag <apex:page>

ARCHITECTURE D’UNE PAGE VISUALFORCE

1. L’utilisateur va consulter une page visualforce

2. La page visualforce appel les méthodes du contrôleur

3. Les résultats sont retournés à la page visualforce

4. L’utilisateur peut consulter les résultats sur la page visualforce

Page 45: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

44

CONTENU D’UNE PAGE VISUALFORCE

<apex:page >

<!-- Ceci est un commentaire -->

//Juste un texte de bienvenue

<h1>Félicitations, vous venez de réaliser votre 1ère page. </h1> <p/>

</apex:page>

1. Une page visualforce commence toujours par le tag <apex:page> et se termine par le tag

</apex:page>

2. Un commentaire commence toujours avec <!-- et se termine par -- >

3. On peut mettre des commentaires de la manière suivante :

<!-- Ceci est un commentaire -->

4. Une page Visualforce s’obtient à l’adresse suivante :

Adresse de l’environnement + /apex/ + Nom de la page Visualforce

5. Pour la page VF01_PageBienvenue sur l’environnement de test : on aura comme adresse :

https://test.salesforce.com/apex/VF01_PageBienvenue

VOICI LE RESULTAT D’AFFICHAGE DE MA PAGE :

Page 46: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

45

GENERER UN PDF

Il est possible d’afficher la page sous forme d’un fichier pdf :

Il suffit d’utiliser le mot clé : RenderAs="PDF"

<apex:page RenderAs="PDF">

<!-- Ceci est un commentaire -->

//Juste un texte de bienvenue

<h1>Félicitations, vous venez de réaliser votre 1ère page. </h1> <p/>

</apex:page>

DROIT PROFIL

Pour permettre à un utilisateur de voir la page Visualforce, il faudra donner l’accès à son profil :

� Aller dans le profil

� Dans la partie « Accès à la page Visualforce Page activé » et cliquer sur « Modifier »

Ajouter la page dans la liste des pages accessibles.

Page 47: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

46

MODE DE DEVELOPPEMENT SOUS SALESFORCE

Il est possible de faire du développement directement sous Salesforce.

Pour cela, il faudra activer le mode développeur dans la fiche profil de l’utilisateur.

1- Cliquer sur « Mes informations personnelles »

2- Cliquer sur « Informations personnelles »

3- Cocher la case « Mode de développement »

Page 48: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

47

VOICI LE RESULTAT :

L’icône situé à droite permet d’activer l’outil de développement. Pour modifier votre code, il faudra

cliquer sur la disquette. Tout enregistrement est définitif.

CREER UN OBJET PERSONNALISE

Nous allons créer un objet personnalisé

1. Cliquer sur « Créer »

2. Cliquer sur « Objets »

Page 49: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

48

3. Cliquer sur « Nouvel objet personnalisé »

La création des champs personnalisés se réalise au niveau de la section « Champs personnalisés et

rélations »

CREER UN ONGLET POUR L’OBJET PERSONNALISE

Il faudra cliquer sur « Créer » puis « Onglet »

Page 50: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

49

Dans la section « Onglets de l’objet personnalisé », il faudra cliquer sur « Nouveau »

Dans la liste de sélection Objet, il faudra choisir votre objet. Puis il faudra choisir un style d’onglet.

La description n’est pas obligatoire mais plutôt conseillé.

Page 51: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

50

LE CONTROLEUR PERSONNALISE

Un contrôleur personnalisé va nous permettre de programmer des actions personnalisées.

Sur la page visualforce, il faudra déclarer le contrôleur standard et personnalisé.

Le contrôleur standard se déclare avec le mot clé : Standardcontroller

Le contrôleur personnalisé se déclare avec le mot clé : extensions

<apex:page Standardcontroller="film__c" extensions="ControllerFilm">

</apex:page>

Important : Il ne faudra pas oublier de mentionner le contrôleur standard. Si vous ne mentionnez pas

le contrôleur standard, alors vous ne pourrez pas utiliser votre page visualforce pour créer un onglet,

surcharger une action , ….

LE CONSTRUCTEUR

Dans le contrôleur, il faudra avoir obligatoirement un constructeur. Ce constructeur aura pour argu-

ment le contrôleur standard. Le constructeur s’exécute au lancement de la page.

public class ControllerFilm{

private ApexPages.StandardController mycontroller;

list<film__c> monfilm{get;set;} public ControllerFilm(ApexPages.StandardController controller) {

mycontroller = controller;

}

}

AFFICHER UNE VARIABLE

Page 52: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

51

public class ControllerFilm{

private ApexPages.StandardController mycontroller;

list<film__c> monfilm{get;set;}

public Integer i{get;set;}

public ControllerFilm(ApexPages.StandardController controller) {

mycontroller = controller;

i=5;

}

}

Dans le contrôleur, nous allons définir une valeur entière. Il ne faudra pas oublier de préciser

get ;set ;

public Integer i{get;set;}

Dans le constructeur, nous allons lui affecter une valeur soit 5.

public ControllerFilm(ApexPages.StandardController controller) {

mycontroller = controller;

i=5;

}

Sur la page visualforce, il faudra écrire la commande suivante :

<apex:page Standardcontroller="film__c" extensions="ControllerFilm">

Bienvenue au Cinema Axel Apex Formation<br/>

Le nombre de film en vision aujourd'hui est : {!i}

</apex:page>

VOICI LE RESULTAT D’AFFICHAGE :

Page 53: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

52

CREER UN TITRE D’AFFICHAGE DANS LA PAGE VISUALFORCE

<apex:page Standardcontroller="film__c" extensions="ControllerFilm">

<fieldset>

<legend>Bienvenue au Cinema Axel Apex Formation</legend>

Le nombre de film en vision aujourd'hui est : {!i}

</fieldset>

</apex:page>

Le composant fieldset et legend permettent de faire un affichage avec un titre et un cadre au tour du

contenu.

AFFICHER LES ENREGISTREMENTS EXISTANTS

Sur la page visualforce, il faudra ajouter plusieurs composants

<apex:page Standardcontroller="film__c" extensions="ControllerFilm">

<apex:pageBlock >

Page 54: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

53

<apex:pageBlockTable value="{!monfilm}" var="film">

<apex:column value="{!film.Name}"/>

<apex:column value="{!film.Prix_du_ticket__c}"/>

<apex:column value="{!film.Type__c}"/>

<apex:column value="{!film.Date_de_sortie__c}"/>

<apex:column value="{!film.Nombre_de_jours_restant_en_vision__c}"/>

<apex:column value="{!film.is3D__c}"/>

</apex:pageBlockTable>

</apex:pageBlock>

</apex:page>

<apex:pageBlockTable value="{!monfilm}" var="film"> : ce composant permet de traiter le contenu

de la liste monfilm. Pour chaque élément de la liste monfilm, on utilisera la variable film. Le compo-

sant apex :pageBlock doit obligatoirement être mentionné avant le composant apex :pageBlock.

Le composant <apex :column> permet de choisir l’attribut à afficher. Par exemple, { !film.Name}

permet d’afficher le nom du film.

Pour afficher les enregistrements sur la page visualforce, il est fortement conseillé d’utiliser

les composants standards Visualforce. Ainsi vous n’aurez pas besoin d’écrire les feuilles de

style css.

LIRE LES ENREGISTREMENTS

Sur le contrôleur, il faudra créer une méthode qui va récupérer les enregistrements à partir de la

base de données.

public class ControllerFilm{

private ApexPages.StandardController mycontroller;

public list<film__c> monfilm{get;set;}

Page 55: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

54

public ControllerFilm(ApexPages.StandardController controller) {

mycontroller = controller;

monfilm = RetournerListeFilm();

}

public list<film__c> RetournerListeFilm(){

return [Select Name,Prix_du_ticket__c,Type__c,Nombre_de_jours_restant_en_vision__c,

Date_de_sortie__c, is3D__c from film__c ];

}

}

VOICI LE RESULTAT D’AFFICHAGE

Nous venons de voir que le composant « <apex :column> » nous a permis d’afficher les enregistre-

ments. Nous allons voir d’autres types de composant dans la suite du tutoriel.

LE MODE EDIT

L’exemple suivant va nous permettre de consulter, modifier et créer des enregistrements.

Page 56: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

55

SUR LA PAGE VISUALFORCE

<apex:page Standardcontroller="film__c" extensions="ControllerFilm"> <apex:form > <apex:commandButton action="{!changeEditMode}" value="edit" rendered="{!!isEditMode}" /> <apex:commandButton action="{!cancelEdit}" value="cancel" rendered="{!isEditMode}"/> <apex:commandButton action="{!saveFilm}" value="Save" rendered="{!isEditMode}"/> <apex:commandButton action="{!createFilm}" value="Create" rendered="{!!isEditMode}"/> <apex:pageBlock > <apex:pageBlockSection columns="3" title="Liste des films" > <apex:repeat value="{!monfilm}" var="film"> <apex:inputField value="{!film.Name}" rendered="{!isEditMode}" /> <apex:outputField value="{!film.Name}" rendered="{!!isEditMode}" /> <apex:inputField value="{!film.Prix_du_ticket__c}" rendered="{!isEditMode}" /> <apex:outputField value="{!film.Prix_du_ticket__c}" rendered="{!!isEditMode}" /> <apex:inputField value="{!film.Type__c}" rendered="{!isEditMode}" /> <apex:outputField value="{!film.Type__c}" rendered="{!!isEditMode}" /> </apex:repeat> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page>

< apex:pageBlockSection columns="3" title="Liste des films"> : permet de spécifier une page en 3

colonnes avec un titre.

<apex:repeat value="{!monfilm}" var="film"> on va lire le contenu de la liste nommée monfilm. La

variable de lecture de la liste s’appelle film. C’est-à-dire, on va automatiquement accéder à chaque

élément avec la variable film.

Page 57: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

56

<apex:inputField value="{!film.Name}" rendered="{!isEditMode}" /> <apex:outputField value="{!film.Name}" rendered="{!!isEditMode}" />

Le composant apex:inputField : l’utilisateur pourra modifier le contenu de la variable Name du film.

Ce composant s’affichera en mode edit uniquement. rendered="{!isEditMode}" permet de spécifier

le mode d’affichage.

Le composant apex :outputField permet d’afficher le contenu de la variable Name du film. Il

s’affichera en mode lecture. rendered="{!!isEditMode}" permet de spécifier l’affichage en mode lec-

ture.

<apex:commandButton action="{!changeEditMode}" value="edit" rendered="{!!isEditMode}" />

Le bouton edit s’affichera en mode lecture. Il va appeler la méthode changeEditMode.

<apex:commandButton action="{!createFilm}" value="Create" rendered="{!!isEditMode}"/>

Le bouton Create s’affichera en mode lecture. Il va appeler la méthode createFilm.

<apex:commandButton action="{!cancelEdit}" value="cancel" rendered="{!isEditMode}"/> Le bouton cancel s’affichera en mode edit Il va appeler la méthode cancelEdit.

<apex:commandButton action="{!saveFilm}" value="Save" rendered="{!isEditMode}"/> Le bouton Save s’affichera en mode edit. Il va appeler la méthode saveFilm.

Page 58: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

57

LE CONTRÔLEUR

public class ControllerFilm{ public list<film__c> monfilm{get;set;} public ControllerFilm(ApexPages.StandardController controller) { monfilm = RetournerListeFilm(); } public list<film__c> RetournerListeFilm() { return [Select Name,Prix_du_ticket__c,Type__c,Nombre_de_jours_restant_en_vision__c,

Date_de_sortie__c, is3D__c from film__c ORDER BY Name ASC ]; } public boolean isEditMode { get { if (isEditMode == null){ isEditMode = false; } return isEditMode; } set; } public PageReference createFilm() { isEditMode = true; film__c f = new film__c(); monfilm.clear(); monfilm.add(f); return null; } public PageReference changeEditMode() { isEditMode = true; return null; } public PageReference saveFilm() { isEditMode = false; upsert monfilm; monfilm = RetournerListeFilm(); return null; } public PageReference cancelEdit() { isEditMode = false; monfilm = RetournerListeFilm(); return null; } }

Page 59: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

58

CHANGER LE MODE D’EDITION

public boolean isEditMode { get { if (isEditMode == null){ isEditMode = false; } return isEditMode; } set; }

Nous aurons une variable boolean qui aura une valeur « true » où « false »

public PageReference changeEditMode() { isEditMode = true; return null; }

Lorsque l’utilisateur appuie sur le bouton « edit », la méthode changeEditMode va être exécutée.

Ainsi, la variable isEditMode va recevoir la valeur true.

LE BOUTON CANCEL

public PageReference cancelEdit() { isEditMode = false; monfilm = RetournerListeFilm(); return null; }

Lorsque l’utilisateur va appuyer sur le bouton cancel, la méthode cancelEdit va être exécutée. Ainsi,

la variable isEditMode va recevoir la valeur false. La liste sera rafraichit et le mode lecture seule sera

affiché.

Page 60: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

59

LE BOUTON SAVE

public PageReference saveFilm() { isEditMode = false; upsert monfilm; monfilm = RetournerListeFilm(); return null; }

Lorsque l’utilisateur va appuyer sur le bouton save, la méthode saveFilm va être exécutée. Ainsi, la

variable isEditMode va recevoir la valeur False.

AFFICHER LES COMPOSANTS

<apex:commandButton action="{!saveFilm}" value="Save" rendered="{!isEditMode}"/> Le bouton Save s’affichera en mode edit. Il va appeler la méthode saveFilm.

Le mot clé rendered permet d’afficher le composant sur la page. Ici { !isEditMode} permet d’afficher

le composant en mode edit.

Pour afficher le composant en mode lecture seule, il faudra spécifier rendered="{ !!isEditMode}"/>

CREER UN ENREGISTREMENT

La création d’un nouvel enregistrement se réalise par le biais du bouton create .

Page 61: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

60

Si l’utilisateur appuie sur le bouton create, la méthode CreateFilm va s’exécuter.

public PageReference createFilm() { isEditMode = true; film__c f = new film__c(); monfilm.clear(); monfilm.add(f); return null; }

isEditMode = true; // on passe en mode edit

film__c f = new film__c(); // on va créer un nouveau film

monfilm.clear(); // on vide le contenu de la liste d’affichage

monfilm.add(f); // on ajoute le nouveau élément à la liste d’affichage

SAUVER L’ENREGISTREMENT COURANT

A l’appui du bouton save, la méthode saveFilm va s’exécuter

public PageReference saveFilm() { isEditMode = false; upsert monfilm; monfilm = RetournerListeFilm(); return null; }

isEditMode = false // on passe en mode lecture seule

upsert monfilm : // on va effectuer l’insertion où la mise à jour en base de donnée

monfilm = RetournerListeFilm // on va rafraichir la liste d’affichage.

Page 62: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

61

ANNULER LA MODIFICATION

A l’appuie sur le bouton cancel, on va exécuter la méthode cancelEdit

public PageReference cancelEdit() { isEditMode = false; monfilm = RetournerListeFilm(); return null; }

isEditMode : on passe en mode lecture seule

monfilm = RetournerListeFilm : on va rafaichir la liste d’affichage.

Page 63: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

62

Nous avons affiché tous les enregistrements sous forme de tableau. Nous allons maintenant voir

comment paginer d’un élément à l’autre.

PAGINATION AVEC BOUTON NEXT ET PREV

public class ControllerFilm{ public list<film__c> monfilm{get;set;} public Integer indexDepart {get;set;} public Integer indexFin{get;set;} public ControllerFilm(ApexPages.StandardController controller) { monfilm = RetournerListeFilm(); indexDepart=0; indexFin=monfilm.size(); }

Il faudra créer deux variables pour l’index de départ et index de fin.

Une liste peut être parcourue par le biais d’un index.

indexDepart aura comme valeur 0. Ainsi, nous afficherons le premier élément.

indexFin aura comme valeur l’index du dernier élément de la liste. Ainsi taille-1.

Page 64: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

63

Il va falloir créer 2 méthodes pour le bouton « Next » et « Previous »

public PageReference next() { isEditMode = false; //si on est pas sur le dernier élément if(indexDepart<indexFin-1) {

indexDepart++; // on va incrémenter } else indexDepart=0; // sinon on va revenir au premier élément return null; } public PageReference prev() { isEditMode = false; //si on n’est pas sur le dernier element, on va décrémenter if(indexDepart>0) { indexDepart--; } else indexDepart=indexFin-1; // sinon on va revenir sur le dernier élément return null; } public PageReference saveFilm() { isEditMode = false; upsert monfilm; monfilm = RetournerListeFilm(); indexFin=monfilm.size(); return null; }

Dans la méthode SaveFilm, il faudra mettre à jour la valeur de la variable « indexFin » après rafrai-

chisssement de la liste.

public PageReference createFilm() { isEditMode = true; indexDepart=0; film__c f = new film__c(); monfilm.clear(); monfilm.add(f);

Page 65: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

64

return null; }

Dans la méthode createFilm, il faudra se positionner au début de la liste pour créer le nouvel élé-

ment. Ainsi, nous n’allons pas écraser les autres éléments.

Sur la page Visualforce, il faudra faire quelques modifications.

<apex:pageBlock > <apex:pageBlockSection columns="1" collapsible="false" title="Liste des films" > <apex:inputField value="{!monfilm[indexDepart].Name}" ren-dered="{!isEditMode}" /> <apex:outputField value="{!monfilm[indexDepart].Name}" ren-dered="{!!isEditMode}" /> <apex:inputField value="{!monfilm[indexDepart].Prix_du_ticket__c}" ren-dered="{!isEditMode}" /> <apex:outputField value="{!monfilm[indexDepart].Prix_du_ticket__c}" ren-dered="{!!isEditMode}" /> <apex:inputField value="{!monfilm[indexDepart].Type__c}" ren-dered="{!isEditMode}" /> <apex:outputField value="{!monfilm[indexDepart].Type__c}" ren-dered="{!!isEditMode}" /> </apex:pageBlockSection> </apex:pageBlock>

Nous allons supprimer le composant <apex :repeat>.

Nous allons changer le champ value pour chaque composant : value="{!monfilm[indexDepart].Name}"

Ajouter les deux boutons

<apex:commandButton action="{!prev}" value="Previous" rendered="{!!isEditMode}"/> <apex:commandButton action="{!next}" value="Next" rendered="{!!isEditMode}"/>

Page 66: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

65

Page 67: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

66

PARTIE 8 – LE DATALOADER

Le Dataloader est une application Client que Salesforce propose pour permettre la manipulation

des données. Vous pouvez importer, exporter, supprimer ou bien mettre à jour vos données par

le biais des fichiers CSV.

Le DataLoader peut être utilisé en deux modes :

- Le mode graphique

- Le mode ligne de commande

Il est possible de manipuler jusqu’à 5 millions d’enregistrement avec le dataloader pour les ob-

jets standards et personnalisés. A la fin de chaque exécution, Il permet d’avoir un rapport. Le

fichier success.csv va contenir tous les enregistrements dont l’exécution s’est bien déroulée. Le

fichier error.csv va contenir tous les enregistrements dont l’exécution a causé une erreur. De

plus, le motif de l’erreur sera placé dans ce fichier.

Pour télécharger le dataloader :

� Cliquer sur Setup

� Cliquer sur Data Management

� Cliquer sur DataLoader

Page 68: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

67

Page 69: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

68

� Cliquer sur DownLoad the DataLoader

� Lancer le DataLoader

� Cliquer sur Settings puis Settings

Au niveau du Server host, Indiquer l’adresse de l’environnement

Pour une sandbox, on écrira https://test.salesforce.com

Pour un environnement de production, on écrira https://login.salesforce.com

Use European date format : si vous cochez cette case, le fichier csv pourra contenir des

dates sous format européen. C’est-à-dire dd/mm/yyyy

Batch size : C’est le nombre de ligne que Salesforce envoie à la fois.

Salesforce recommande une valeur entre 50 et 100. Le maximum que vous pouvez entrer

est 200.

Page 70: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

69

Si vous utilisez le mode « if the Use Bulk API option is selected.’ , la valeur maximum est

10000. Dans le mode bulk, si une ligne est rejetée lors du chargement, alors aucune ligne ne

sera enregistrée.

Proxy host : c’est l’adresse du server de votre proxy si un proxy existe.

Proxy port : c’est le port du proxy

Proxy username : le nom d’utilisateur pour l’authentification au niveau du proxy

Proxy password : le mot de passe de l’utilisateur pour l’authentification au niveau du proxy.

Start at row : pour faire démarrer le dataloader à une ligne précise.

Pour le timeZone : Europe/Paris

Après importation des dates dans Salesforce, vous pouvez constater que les dates affichées dans

Salesforce et votre fichier csv ne sont pas conforme.

Autrement dit, dans votre fichier csv vous avez indiqué 23 avril 2012 pour la date de facture. Sales-

force affiche 22 avril 2012.

Pour corriger ce problème, il faudra placer Havai au niveau du timeZone.

Avant de faire les opérations, il faudra s’authentifier

Page 71: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

70

Username : il faudra indiquer le nom d’utilisateur

Password : il faudra indiquer le mot de passe.

Si vous devez saisir un jeton de sécurité, il faudra le placer à la suite de votre mot de passe.

Chaque bouton permet de faire une action spécifique.

Insert : insertion des enregistrements via un fichier csv

Update : mettre à jour les enregistrements via un fichier csv

Upsert : mettre à jour les enregistrements si existant sinon insertion de l’enregistrement

Delete : supprimer les enregistrements.

Page 72: Développement Apex et Visualforce

Axel KAMALAK Salesforce tutoriel __________________________________________________________________________________

Axel KAMALAK http://axelkamalak.eu

71

Export : exporter les enregistrements sous forme d’un fichier csv.

Export All : exporter tous les enregistrements.