L'une des sessions les plus appréciées de notre DevCon virtuelle a été celle de Sergey Marenich sur les conseils et astuces de l'Advanced Framework. Il a fait un travail magistral en présentant un certain nombre d'activités très utiles qu'un développeur sur notre plateforme peut faire pour être plus efficace et productif, ainsi que quelques bonnes pratiques de codage. Comme les individus apprennent et bénéficient d'une variété de modalités, nous avons pensé qu'il serait bon de partager la sagesse de Sergey sous forme écrite également. Je distribuerai le contenu en petits morceaux au cours des prochains articles de blog.
La semaine dernière, je me suis concentré sur la configuration de vos outils et la désactivation de la compilation des sites Web. Aujourd'hui, je vais passer du temps à explorer les conseils de Sergey sur les meilleures pratiques de programmation : Automatiser les calculs en utilisant l'attribut PXFormula pour simplifier votre code - Astuce # 6.
En guise de rappel, voici les conseils dont nous discutons dans cette série. Pour rappel, je passe sur l'astuce 3, Trouver plus d'informations grâce aux communautés, car j'ai déjà abordé ce sujet dans un article précédent. J'ai également abordé l'astuce 5, Déboguer le code Acumatica, dans un article précédent.
Astuce 1 - Configurer votre instance Acumatica
Conseil 2 - Configurer vos outils
Conseil 3 - Trouver plus d'informations auprès des communautés
Conseil 4 - Désactiver la compilation des sites web
Conseil 5 - Déboguer le code Acumatica
Conseil 6 - Calcul automatique avec des formules
Conseil 7 - Minimiser les doublons
Conseil 8 - Avantages de l'utilisation des événements
Conseil 9 - Réutilisation des requêtes BQL
Conseil 10 - Modifier les sélecteurs
Conseil 11 - Champs de différentes vues
La première série d'astuces de programmation à mettre à profit lorsque vous codez est l'utilisation de formules pour simplifier votre code. Grâce à l'attribut PXFormula, vous pouvez utiliser un champ du même enregistrement de données ou des ensembles dans une expression d'agrégation pour calculer un champ de l'enregistrement de données parent à partir des champs de l'enregistrement de données enfant. Ces calculs sont effectués au moment de l'exécution. Le Framework utilise largement les attributs et nous abordons donc la programmation d'une manière très déclarative. En plaçant les attributs aux bons endroits, ils simplifient vos tâches de programmation, réduisant les lignes de code que vous devez écrire. En clair : moins de code, moins d'erreurs.
Attribut de validation de la formule
Un exemple facile à illustrer est celui de l'attribut Validate formula qui déclenche l'événement FieldVerifying pour le champ auquel l'attribut PXFormula est attaché dès que le champ spécifié est modifié.
Exemple de code :
//Validate
[PXFormula(typeof(Validate))]
public virtual void Batch_Date_CacheAttached(PXCache sender) { }
L'attribut Valider la formule augmente automatiquement la validation du champ lorsque le champ courant est modifié et que la formule est attachée.
Autre exemple :
//Validate
[PXFormula(typeof(Validate<ContractItem.maxQty, ContractItem.minQty>))]
Pour plus de références et d'exemples, voir la Référence API de l'Acumatica Framework Developer Guide .
Le constructeur parent et le paramètre courant
Rappelez-vous que vous pouvez placer un attribut sur n'importe quel champ du CED enfant. L'objectif principal de l'attribut est d'effectuer une suppression en cascade des enregistrements enfants lorsqu'un enregistrement de données parent est supprimé. En général, la requête comprend une clause Where (où) pour que les champs clés du parent soient égaux aux champs clés de l'enfant. Dans ce cas, les valeurs des champs clés de l'enregistrement de données enfant sont spécifiées à l'aide du paramètre Current.
Utilisation de méthodes statiques pour récupérer des données parent ou des enregistrements de données enfant spécifiques, ou pour obtenir et définir certains paramètres d'attributs. Une fois que l'attribut PXParent est ajouté à un champ du CED, vous pouvez utiliser l'attribut PXFormula pour définir des calculs d'ensemble pour les champs de l'enregistrement de données parent à partir des champs de l'enregistrement de données enfant.
L'attribut PXParent récupère la valeur du champ de l'enregistrement de données parent tel que défini par l'attribut PXParentAttribute résidant dans le CED actuel. Il initialise une nouvelle instance qui définit l'enregistrement de données parent à l'aide de la requête BQL fournie.
Par exemple :
//Parent
PXParent(typeof(Select<INRegister,
Where<INRegister.docType, Equal<Current>
And<INRegister.refNbr, Equal<Current>>>>))]
[PXFormula(typeof(Parent))]
public virtual void INTran_OrigModule_CacheAttached(PXCache sender) { }
Pour le paramètre Current, l'exemple ci-dessous spécifie une requête permettant de sélectionner l'enregistrement de données Document parent pour un enregistrement de données DocTransaction enfant donné.
//Current
[PXParent(typeof(Select<Document,
Where<Document.docNbr, Equal<Current>,
And<Document.docType, Equal<Current>>>>))]
public virtual string DocNbr {get; set;}
Cela vous permet d'accéder à la classe d'accès aux données (DAC) qui n'est pas votre DAC actuelle. L'utilisation du paramètre Current avec l'attributFormulaAttribute vous permet de trouver le cache en utilisant le type de document ou le numéro de référence.
Le code ci-dessous l'illustre bien :
//Current
PXFormula(typeof(Switch>,
And<ARAdjust.adjgRefNbr, Equal<Current>>>,
ERActivity.classIcon>,
EPActivity.classIcon>))]
protected virtual void ARAdjust_ClassIcon_CacheAttached(PXCache sender) { }
Au lieu d'utiliser l'événement FieldUpdated ou un autre événement, vous pouvez utiliser l'attribut formula dans ce cas.
Pour plus d'informations, voir la section API Reference du Acumatica Framework Developer Guide. .
Paramètre IsTableEmpty
Pour déterminer si une table est vide, vous pouvez utiliser le paramètre IsTableEmpty avec PXFormula qui renvoie la valeur true si la table DB correspondant au DAC spécifié ne contient aucun enregistrement.
//IsTableEmpty
PXFormula(typeof (Swich, Equal>, True,
Case<Where<APRegister.requestApproval, Equal>, False>>, True>
))]
public virtual void APRegister_ContApprove_CacheAttached(PXCache sender) { }
Le paramètre de sélection
Lorsque vous utilisez le paramètre de sélection avec l'attribut de formule, vous pouvez sélectionner l'enregistrement associé. Dans le CAD APVendorPrice, sélectionnez l'InventoryID à l'aide du sélecteur et du champ InventoryItem any. Au lieu d'utiliser FieldUpdating ou RowUpdating et d'écrire le code pour obtenir les données liées dans la classe d'accès aux données, vous pouvez utiliser des formules.
Voici le code simple illustrant ce point :
//Selector
PXFormula(typeof(Selector<APVendorPrice.inventoryID, InventoryItem.purchaseUnit>))]
public virtual void APVendorPrice_UOM_CacheAttached(PXCache sender) { }
}
}
Ces exemples, qui utilisent des attributs et des paramètres de formule, illustrent la manière dont vous pouvez rationaliser et simplifier votre code. La prochaine fois, je poursuivrai l'exploration du thème des meilleures pratiques de programmation de Sergey et j'aborderai les moyens de minimiser la duplication dans votre code à l'aide de notre cadre.