Ricerca…


Utilizzo di CacheAttached per sovrascrivere gli attributi DAC nel grafico

A volte, è necessario eseguire l'override di uno o più attributi di un particolare campo Data Access Class (DAC) solo per una determinata schermata, senza modificare il comportamento esistente per altri schermi.

Sostituire tutti gli attributi

Supponiamo che gli attributi del campo DAC originale siano dichiarati come mostrato di seguito:

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

Il modo di base per sostituire gli attributi del campo nel grafico è dichiarare un gestore di eventi CacheAttached nel grafico che segue la convenzione standard per la denominazione degli eventi del grafico (notare l'assenza dell'argomento EventArgs). Il corpo del gestore eventi non verrà eseguito, ma tutti gli attributi posizionati sul gestore sostituiranno gli attributi nel campo DAC corrispondente:

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

Aggiunta di un nuovo attributo al campo DAC

Il set di attributi inseriti nel gestore CacheAttached ridefinirà l'intero set degli attributi inseriti nel campo nel DAC. Questo è quasi sempre eccessivo; si noti come nell'esempio precedente, per aggiungere solo un singolo attributo al campo, è stato necessario copiare tutte le altre dichiarazioni di attributo dal DAC. Ciò porta a una duplicazione indesiderata del codice e alla possibilità che il DAC e il grafico non siano sincronizzati. È molto facile immaginare una situazione in cui qualcuno modifica la logica di default di, ad esempio, PXDefaultAttribute nel DAC, ma dimentica di aggiornare tutti gli attributi corrispondenti posizionati sui gestori CacheAttached in vari grafici.

Per rimediare a questo problema, Acumatica Framework fornisce un attributo speciale chiamato PXMergeAttributesAttribute . Quando questo attributo è collocato su un gestore CacheAttached , è possibile riutilizzare gli attributi esistenti definiti nel DAC.

Aggiunta di un attributo utilizzando PXMergeAttributesAttribute :

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

Nell'esempio precedente, l'intero set di attributi del DAC originale verrà riutilizzato, aggiunto da eventuali attributi dichiarati sul gestore di eventi CacheAttached .

PXMergeAttributesAttribute ha altri comportamenti di unione, in base ai seguenti valori possibili per la proprietà Method:

  • MergeMethod.Replace sostituisce completamente gli attributi del DAC (equivalente all'assenza di PXMergeAttributesAttribute ).
  • MergeMethod.Append aggiunge gli attributi dal gestore CacheAttached agli attributi DAC originali.
  • MergeMethod.Merge è simile ad Append ; tuttavia, controlla anche se ci sono degli attributi in conflitto tra gli attributi del gestore e gli attributi del campo DAC. Se c'è un conflitto, l'attributo CacheAttached ha la precedenza e l'attributo DAC corrispondente viene scartato.

Sovrascrittura di una singola proprietà di un attributo

Uno scenario di sviluppo di applicazioni molto comune si verifica quando devi ridefinire solo una singola proprietà dell'attributo di un DAC per un particolare schermo; considera la situazione quando devi definire la proprietà DisplayName del PXUIFieldAttribute.

A tale scopo, è possibile utilizzare ancora un altro attributo speciale fornito da Acumatica Framework: PXCustomizeBaseAttributeAttribute . Il suo costruttore accetta tre valori:

  • Il tipo dell'attributo DAC di cui è necessario sovrascrivere la proprietà
  • Il nome della proprietà dell'attributo da sovrascrivere (utilizzare l'operatore nameof in C # 6.0 per la manutenibilità del codice)
  • Il nuovo valore per la proprietà specificata.

Supponiamo che sia necessario cambiare il nome visualizzato dell'interfaccia utente dall'importo della commissione alla commissione valuta di base per una sola schermata. Il seguente esempio di codice mostra come implementare il comportamento desiderato.

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

In questo esempio, PXMergeAttributes garantisce che gli attributi DAC originali siano preservati e PXCustomizeBaseAttribute consente al programmatore di sovrascrivere il nome visualizzato del campo dell'interfaccia utente per il grafico in questione.

Sostituzione di un attributo con un altro attributo

Supponiamo che sia necessario sostituire PXDefaultAttribute di un campo DAC con PXDBDefaultAttribute per una sola schermata.

Questo può essere ottenuto nel modo seguente:

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

Ordine delle applicazioni degli attributi di personalizzazione degli attributi

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow