Zoeken…


CacheAttached gebruiken om DAC-kenmerken in de grafiek te overschrijven

Soms moet u een of meer attributen van een bepaald Data Access Class (DAC) -veld alleen voor een bepaald scherm vervangen, zonder het bestaande gedrag voor andere schermen te wijzigen.

Alle attributen vervangen

Stel dat de originele DAC-veldattributen worden gedeclareerd zoals hieronder wordt getoond:

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

De basismanier om de attributen van het veld in de grafiek te overschrijven, is door een CacheAttached gebeurtenishandler in de grafiek te declareren die de standaardconventie volgt voor het benoemen van grafiekgebeurtenissen (let op het ontbreken van het argument EventArgs). De hoofdtekst van de gebeurtenishandler wordt niet uitgevoerd, maar attributen die u op de handler plaatst, vervangen de attributen in het bijbehorende DAC-veld:

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

Een nieuw kenmerk toevoegen aan het DAC-veld

De set attributen die op de CacheAttached-handler zijn geplaatst, zal de hele set attributen die op het veld in de DAC zijn geplaatst opnieuw definiëren . Dit is bijna altijd overdreven; merk op hoe in het vorige voorbeeld, om slechts één kenmerk aan het veld toe te voegen, u alle andere kenmerkdeclaraties uit de DAC moest kopiëren. Dit leidt tot ongewenste codeduplicatie, evenals de mogelijkheid dat DAC en de grafiek niet synchroon lopen. Het is heel eenvoudig om je een situatie voor te stellen waarin iemand de standaardlogica van bijvoorbeeld PXDefaultAttribute in de DAC PXDefaultAttribute , maar vergeet om alle overeenkomstige attributen die op de CacheAttached handlers zijn geplaatst in verschillende grafieken bij te werken.

Om dit probleem op te lossen, biedt het Acumatica Framework een speciaal kenmerk genaamd PXMergeAttributesAttribute . Wanneer dit kenmerk op een CacheAttached handler wordt geplaatst, kunt u de bestaande kenmerken die in de DAC zijn gedefinieerd, opnieuw gebruiken.

Een kenmerk toevoegen met PXMergeAttributesAttribute :

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

In het bovenstaande voorbeeld wordt de hele set kenmerken van de oorspronkelijke DAC hergebruikt, aangevuld met kenmerken die u hebt opgegeven in de CacheAttached gebeurtenishandler.

PXMergeAttributesAttribute heeft ander samenvoeggedrag, volgens de volgende mogelijke waarden voor de eigenschap Method:

  • MergeMethod.Replace vervangt de attributen van de DAC volledig (gelijk aan de afwezigheid van PXMergeAttributesAttribute ).
  • MergeMethod.Append voegt de attributen van de CacheAttached handler toe aan de originele DAC-attributen.
  • MergeMethod.Merge is vergelijkbaar met Append ; het controleert echter ook of er tegenstrijdige attributen zijn tussen de handlerattributen en de DAC-veldattributen. Als er een conflict is, heeft het kenmerk CacheAttached voorrang en wordt het overeenkomstige DAC-kenmerk genegeerd.

Eén eigenschap van een kenmerk overschrijven

Een veel voorkomend scenario voor de ontwikkeling van toepassingen doet zich voor wanneer u slechts één eigenschap van het kenmerk van een DAC voor een bepaald scherm opnieuw moet definiëren; overweeg de situatie wanneer u de eigenschap DisplayName van het PXUIFieldAttribute moet definiëren.

Voor dat doel kunt u nog een ander speciaal kenmerk gebruiken dat door het Acumatica Framework wordt PXCustomizeBaseAttributeAttribute : PXCustomizeBaseAttributeAttribute . De constructeur accepteert drie waarden:

  • Het type van het DAC-kenmerk waarvan de eigenschap moet worden genegeerd
  • De naam van de eigenschap van het attribuut die moet worden genegeerd (gebruik de operator nameof in C # 6.0 voor onderhoud van de code)
  • De nieuwe waarde voor de opgegeven eigenschap.

Stel dat er een vereiste is om de UI-weergavenaam van Commissiebedrag te wijzigen in Basisvaluta Commissie voor slechts één scherm. Het volgende codevoorbeeld laat zien hoe het gewenste gedrag kan worden geïmplementeerd.

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

In dit voorbeeld zorgt PXMergeAttributes ervoor dat de originele DAC-kenmerken behouden blijven, en met PXCustomizeBaseAttribute kan de software-engineer de weergavenaam van het UI-veld voor de betreffende grafiek overschrijven.

Een kenmerk vervangen door een ander kenmerk

Stel dat er een vereiste is om de PXDefaultAttribute van een DAC-veld te PXDefaultAttribute door PXDBDefaultAttribute voor slechts één scherm.

Dit kan op de volgende manier worden bereikt:

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

Toepassingsvolgorde van de attributen-Attributen aanpassen

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow