Sök…


Använda CacheAttached för att åsidosätta DAC-attribut i diagrammet

Ibland måste du åsidosätta ett eller flera attribut för ett visst Data Access Class-fält (DAC) bara för en viss skärm utan att ändra det befintliga beteendet för andra skärmar.

Byt ut alla attribut

Anta att de ursprungliga DAC-fältattributen deklareras som visas nedan:

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

Det grundläggande sättet att åsidosätta fältets attribut i diagrammet är att förklara en CacheAttached händelsehanterare i diagrammet som följer standardkonventionen för att namnge grafhändelser (notera frånvaron av argumentet EventArgs). Händelseshanterarens kropp kommer inte att köras, men alla attribut som du placerar på hanteraren kommer att ersätta attributen i motsvarande DAC-fält:

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

Lägga till ett nytt attribut till DAC-fältet

Uppsättningen attribut som placerats på CacheAttached-hanteraren kommer att definiera hela uppsättningen attribut placerade på fältet i DAC. Detta är nästan alltid överdrivet. Lägg märke till hur man i det föregående exemplet måste kopiera alla andra attributdeklarationer från DAC för att lägga till bara ett enda attribut i fältet. Detta leder till oönskad duplicering av koden, liksom möjligheten att DAC och diagrammet går ur synk. Det är väldigt lätt att föreställa sig en situation när någon ändrar standardlogiken för till exempel PXDefaultAttribute i DAC, men glömmer att uppdatera alla motsvarande attribut placerade på CacheAttached hanterarna i olika grafer.

För att åtgärda detta problem ger Acumatica Framework ett speciellt attribut som heter PXMergeAttributesAttribute . När detta attribut placeras på en CacheAttached hanterare kan du återanvända de befintliga attributen som definierats i DAC.

Lägga till ett attribut med PXMergeAttributesAttribute :

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

I exemplet ovan kommer hela uppsättningen attribut från den ursprungliga DAC att återanvändas, bifogas av alla attribut som du har deklarerat på CacheAttached händelseshanteraren.

PXMergeAttributesAttribute har andra sammanslagningsbeteenden, enligt följande möjliga värden för Egenskapen Metod:

  • MergeMethod.Replace ersätter DAC: s attribut fullständigt (motsvarande frånvaron av PXMergeAttributesAttribute ).
  • MergeMethod.Append lägger till attributen från CacheAttached hanteraren till de ursprungliga DAC-attributen.
  • MergeMethod.Merge liknar Append ; emellertid kontrollerar det också om det finns några motstridiga attribut mellan hanteringsattribut och DAC-fältattribut. Om det finns en konflikt har CacheAttached attributet företräde och motsvarande DAC-attribut kastas.

Att åsidosätta en enda egenskap av ett attribut

Ett mycket vanligt applikationsutvecklingsscenario uppstår när du måste omdefiniera bara en enda egenskap i en DAC: s attribut för en viss skärm; överväga situationen när du måste definiera egenskapen DisplayName i PXUIFieldAttribute.

För det ändamålet kan du använda ännu ett specialattribut som tillhandahålls av Acumatica Framework: PXCustomizeBaseAttributeAttribute . Dess konstruktör accepterar tre värden:

  • Typen av DAC-attributet vars egendom måste åsidosättas
  • Namnet på attributet egendom för att åsidosätta (använd nameof operatören i C # 6.0 för kod underhåll)
  • Det nya värdet för den angivna egenskapen.

Anta att det finns ett krav att ändra användargränssnittets visningsnamn från kommissionens belopp till basvalutakommission för endast en skärm. Följande kodexempel visar hur man implementerar önskat beteende.

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

I det här exemplet säkerställer PXMergeAttributes att de ursprungliga DAC-attributen bevaras, och PXCustomizeBaseAttribute gör att programvaruingenjören kan åsidosätta UI-fältets visningsnamn för grafen i fråga.

Byta ut ett attribut med ett annat attribut

Anta att det finns ett krav att ersätta ett DAC-fältets PXDefaultAttribute med PXDBDefaultAttribute för endast en skärm.

Detta kan uppnås på följande sätt:

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

Applikationsordning för attribut-anpassningsattribut

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow