Bonjour,
je débute en salesforce et je me pose quelques questions. J'ai essayé dans la mesure du possible de lire la doc, mais n'ai pas toujours trouvé mon bonheur. Merci d'avance de m'éclairer sur les points suivants:
- peut-on regrouper nos classes ou triggers en 'packages'? Je viens de commencer, mais j'ai déjà des dizaines de fichiers dans un peu chaque répertoire de mon projet, et j'aimerais organiser cela un peu mieux...
OLE: c'est possible pour les classes via tout simplement des nested-types (classe définie dans une classe, comme dans à peu près n'importe quel langage objet).
Cependant tu ne pourras pas déclarer de méthodes static dans les inner-classes. Il y a peut-être aussi d'autres limites mais je ne les connais pas/ou je ne les ais plus en tête.
A noter que lors du développement d'une classe de test pour une inner-classe, tu dois obligatoirement instancier un objet de la classe de premier niveau pour que le code coverage soit calculé (sinon ce n'est pas le cas) => c'est un "bug" connu chez Salesforce sous la référence W-1256149.
Pour ce qui est des triggers, je t'invite à ne jamais coder directement dedans mais plutôt d'implémenter les traitements dans une classe apex et d'ensuite appeller cette classe dans le trigger (ca te permettra d'écrire une classe de test pour vérifier le traitement associé au trigger), je pense que c'est une des bonnes pratiques de la méthode PAD.
- un truc tout bête, a-t-on des fonctions de manipulation de string avancées (autres que ce qui est dispo dans la classe string, je pense surtout à une fonction null-safe equals entre 2 strings?)
OLE: pas à ma connaissance, cependant tu peux très bien développer une classe utilitaire qui pourra, entre autre, contenir ta propre implémentation.
En général l'apex est un langage simple et il faut pas mal de fois "réinventer" la roue en codant sa propre library mais une fois que c'est fait tu pourras t'en reservir sur d'autres projets donc je t'invite à le faire.
- un de mes besoins est de traduire mes applis, pour ça j'utilise la variable globale $Label en VF et la classe Label en Apex. A-t-on un moyen d'y injecter des paramètres? Genre "Label.format('You have {0} unread mails out of {1}', 3, 27)"?
OLE: je ne pense pas. Cependant, Label.TonLabel retourne une String donc rien ne t'empêche de faire "String.format(Label.TonLabel, TaListDeParam)".
A ne pas oublier que pour tout ce qui est traduction de champs, de valeur de picklist, de helptext etc... tu as le translation workbench fait pour ça.
- je dois faire du rendu de DataTable paginée, venant d'un catalogue de produits contenant environ 200k enregistrements. J'ai cru comprendre que la classe StandardSetController gérait elle-même les dépassements des limites SF. Mais avec le code suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
private ApexPages.StandardSetController ctrl {
get {
if(ctrl==null) {
String q = 'SELECT Name, ProductCode, External_Id__c, Colour__c, PictureMini__c from Product2 WHERE VisibleOniPad__c = TRUE';
if(String.isNotBlank(actualFilterString)) {
q += ' AND (Name LIKE \'%'+String.escapeSingleQuotes(actualFilterString)+'%\' OR External_Id__c LIKE \'%'+String.escapeSingleQuotes(actualFilterString)+'%\')';
}
if(String.isNotBlank(mainProductGroupFilter)) {
q += ' AND MainProductGroup__c = \''+String.escapeSingleQuotes(mainProductGroupFilter)+'\'';
}
if(actualSort!=null) {
q += ' ORDER BY '+actualSort;
if('desc'.equalsIgnoreCase(actualSortDirection)) {
q += ' DESC';
}
}
q += ' LIMIT 10000';
System.debug('running query "'+q+'"');
ctrl = new ApexPages.StandardSetController(Database.getQueryLocator(q));
// Ne fonctionne pas ctrl = new ApexPages.StandardSetController(Database.getQueryLocator(Database.query(q)));
}
return ctrl;
}
set;
} |
je suis obligé de mettre le "LIMIT 10000", sinon je prend une LimitException. J'ai bien vu dans la doc que pour que ça marche surtout si on passe une requête soql ou une liste (de ce que j'ai compris)... Pourtant dans mon cas je dois faire une requête soql dynamique, y a-t-il une solution pour coupler les 2? Car actuellement, avec "LIMIT 10000", je ne peux pas utiliser la méthode "getCompleteResult" pour indiquer à l'utilisateur que des résultats ne sont pas disponible (elle renvoie toujours 'true').
- toujours en soql, j'aimerais utiliser des variables bindés dans la string, pour éviter tous ces appels à 'escapeSingleQuotes'. Selon la doc ça devrait marcher, mais je n'arrive pas à utiliser cela en conjonction avec le QueryLocator. Est-ce une limitation connue?
- quelqu'un voit une bonne raison à la limitation de l'instruction soql "OFFSET" à un maximum de 2000? je suis tombé dessus l'autre jour, j'ai vraiment pas compris l'intérêt de nous limiter ça?
OLE: oui je pense qu'a un moment ou un autre il faut mettre des limites sinon tu consommes trop de ressource CPU et mémoire sur la plateforme d'infra, de plus ta page/ton webservice/ton batch mettrais trop de temps à s'exécuter.
Imagine le nombre de client qu'a salesforce multiplié par le nombre d'account de ces clients... rien que sur mon projet j'ai plus de 5 millions d'Account, j'imagine pas avoir le droit de réccupérer ces 5 millions via une requête SoQL.
Voilà ce sera tout pour l'instant. Merci d'avance de tout commentaire!
Partager