Recherche…


Utilisation de CacheAttached pour remplacer les attributs DAC dans le graphique

Parfois, vous devez remplacer un ou plusieurs attributs d'un champ DAC (Data Access Class) spécifique uniquement pour un écran particulier, sans modifier le comportement existant pour les autres écrans.

Remplacement de tous les attributs

Supposons que les attributs de champ DAC d'origine soient déclarés comme indiqué ci-dessous:

public class ARInvoice : IBqlTable
{
    [PXDBDecimal(4)]
    [PXDefault(TypeCode.Decimal, "0.0")]
    [PXUIField(DisplayName = "Commission Amount")]
    public virtual Decimal? CommnAmt 
    { 
        get; 
        set; 
    }
}

La méthode de base pour remplacer les attributs du champ dans le graphique consiste à déclarer un CacheAttached événements CacheAttached dans le graphique qui suit la convention standard de dénomination des événements de graphique (notez l'absence de l'argument EventArgs). Le corps du gestionnaire d'événements ne sera pas exécuté, mais tous les attributs que vous placez sur le gestionnaire remplaceront les attributs du champ DAC correspondant:

[PXDBDecimal(4)]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Commission Amount")]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }

Ajout d'un nouvel attribut au champ DAC

L'ensemble des attributs placés sur le gestionnaire CacheAttached redéfinit l'ensemble des attributs placés sur le champ dans le DAC. C'est presque toujours exagéré; notez comment dans l'exemple précédent, pour ajouter juste un seul attribut au champ, vous deviez copier toutes les autres déclarations d'attribut du DAC. Cela entraîne une duplication de code indésirable, ainsi que la possibilité que le DAC et le graphe ne soient plus synchronisés. Il est très facile d'imaginer une situation où quelqu'un modifie la logique par défaut de, par exemple, PXDefaultAttribute dans le DAC, mais oublie de mettre à jour tous les attributs correspondants placés sur les gestionnaires CacheAttached dans différents graphiques.

Pour remédier à ce problème, le framework Acumatica fournit un attribut spécial appelé PXMergeAttributesAttribute . Lorsque cet attribut est placé sur un gestionnaire CacheAttached , vous pouvez réutiliser les attributs existants définis dans le DAC.

Ajout d'un attribut à l'aide de PXMergeAttributesAttribute :

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXAdditionalAttribute(NecessaryProperty = true)]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }

Dans l'exemple ci-dessus, l'ensemble complet des attributs du DAC d'origine sera réutilisé, ajouté par tous les attributs que vous avez déclarés sur le CacheAttached événements CacheAttached .

PXMergeAttributesAttribute a d'autres comportements de fusion, en fonction des valeurs possibles suivantes pour la propriété Method:

  • MergeMethod.Replace remplace complètement les attributs du DAC (équivalent à l'absence de PXMergeAttributesAttribute ).
  • MergeMethod.Append ajoute les attributs du gestionnaire CacheAttached aux attributs DAC d'origine.
  • MergeMethod.Merge est similaire à Append ; Cependant, il vérifie également s'il existe des attributs contradictoires entre les attributs du gestionnaire et les attributs du champ DAC. En cas de conflit, l'attribut CacheAttached est prioritaire et l'attribut DAC correspondant est ignoré.

Remplacement d'une propriété unique d'un attribut

Un scénario de développement d'applications très courant se produit lorsque vous devez redéfinir une seule propriété d'un attribut du DAC pour un écran particulier. considérez la situation lorsque vous devez définir la propriété DisplayName de PXUIFieldAttribute.

Pour cela, vous pouvez utiliser un autre attribut spécial fourni par le framework Acumatica: PXCustomizeBaseAttributeAttribute . Son constructeur accepte trois valeurs:

  • Le type de l'attribut DAC dont la propriété doit être remplacée
  • Le nom de la propriété de l'attribut à remplacer (utilisez le nameof opérateur dans C # 6.0 pour la maintenabilité du code)
  • La nouvelle valeur pour la propriété spécifiée.

Supposons qu'il soit nécessaire de changer le nom d'affichage de l'interface utilisateur de Commission Amount en Base Currency Commission pour un seul écran. L'exemple de code suivant montre comment implémenter le comportement souhaité.

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXCustomizeBaseAttribute(typeof(PXUIFieldAttribute), nameof(PXUIFieldAttribute.DisplayName), "Base Currency Commission")]
protected virtual void ARInvoice_CommnAmt_CacheAttached(PXCache sender) { }

Dans cet exemple, PXMergeAttributes garantit que les attributs DAC d'origine sont préservés et que PXCustomizeBaseAttribute permet à l'ingénieur logiciel de remplacer le nom d'affichage du champ d'interface utilisateur pour le graphique en question.

Remplacement d'un attribut par un autre attribut

Supposons qu'il soit nécessaire de remplacer PXDefaultAttribute d'un champ DAC par PXDBDefaultAttribute pour un seul écran.

Cela peut être réalisé de la manière suivante:

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(PXDefaultAttribute))]
[PXDBDefault(typeof(SOShipment.siteID), PersistingCheck = PXPersistingCheck.Nothing)]
protected void SOOrderShipment_SiteID_CacheAttached(PXCache sender) { }

Ordre d'application des attributs de personnalisation d'attribut

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow