acumatica
Meccanismi di personalizzazione
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 diPXMergeAttributesAttribute
). -
MergeMethod.Append
aggiunge gli attributi dal gestoreCacheAttached
agli attributi DAC originali. -
MergeMethod.Merge
è simile adAppend
; 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'attributoCacheAttached
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
-
PXCustomizeBaseAttribute
-
PXRemoveBaseAttribute
-
PXMergeAttributes