Szukaj…


Użycie CacheAttached do przesłonięcia atrybutów DAC na wykresie

Czasami musisz zastąpić jeden lub więcej atrybutów konkretnego pola klasy dostępu do danych (DAC) tylko dla określonego ekranu, bez zmiany istniejącego zachowania dla innych ekranów.

Zastępowanie wszystkich atrybutów

Załóżmy, że oryginalne atrybuty pola DAC są zadeklarowane, jak pokazano poniżej:

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

Podstawowym sposobem na przesłonięcie atrybutów pola na wykresie jest zadeklarowanie procedury obsługi zdarzeń CacheAttached na wykresie, która jest zgodna ze standardową konwencją nazewnictwa zdarzeń na wykresie (zwróć uwagę na brak argumentu EventArgs). Treść procedury obsługi zdarzeń nie zostanie wykonana, ale wszelkie atrybuty umieszczone w procedurze obsługi zastąpią atrybuty w odpowiednim polu DAC:

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

Dołączanie nowego atrybutu do pola DAC

Zestaw atrybutów umieszczonych w module obsługi pamięci podręcznej CacheAttached przedefiniuje cały zestaw atrybutów umieszczonych w polu DAC. Jest to prawie zawsze przesada; zwróć uwagę, że w poprzednim przykładzie, aby dodać tylko jeden atrybut do pola, musiałeś skopiować wszystkie pozostałe deklaracje atrybutów z DAC. Prowadzi to do niepożądanego powielania kodu, a także do możliwości zsynchronizowania DAC i wykresu. Bardzo łatwo jest wyobrazić sobie sytuację, w której ktoś zmienia PXDefaultAttribute logikę, na przykład PXDefaultAttribute w DAC, ale zapomina zaktualizować wszystkie odpowiednie atrybuty umieszczone w CacheAttached obsługi CacheAttached podręcznej CacheAttached na różnych wykresach.

Aby rozwiązać ten problem, Acumatica Framework udostępnia specjalny atrybut o nazwie PXMergeAttributesAttribute . Po umieszczeniu tego atrybutu w CacheAttached obsługi CacheAttached podręcznej CacheAttached można ponownie użyć istniejących atrybutów zdefiniowanych w DAC.

Dołączanie atrybutu za pomocą PXMergeAttributesAttribute :

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

W powyższym przykładzie cały zestaw atrybutów z oryginalnego DAC zostanie ponownie użyty, dołączony do wszystkich atrybutów zadeklarowanych w CacheAttached obsługi zdarzeń CacheAttached .

PXMergeAttributesAttribute ma inne zachowania scalania, zgodnie z następującymi możliwymi wartościami właściwości Method:

  • MergeMethod.Replace zastępuje atrybuty DAC (równoważne brakowi PXMergeAttributesAttribute ).
  • MergeMethod.Append dołącza atrybuty z procedury obsługi CacheAttached podręcznej CacheAttached do oryginalnych atrybutów DAC.
  • MergeMethod.Merge jest podobny do Append ; sprawdza jednak również, czy między atrybutami modułu obsługi i atrybutami pola DAC nie występują sprzeczne atrybuty. W przypadku konfliktu atrybut CacheAttached ma pierwszeństwo, a odpowiadający mu atrybut DAC jest odrzucany.

Przesłanianie pojedynczej właściwości atrybutu

Bardzo częsty scenariusz tworzenia aplikacji występuje, gdy trzeba ponownie zdefiniować tylko jedną właściwość atrybutu DAC dla określonego ekranu; rozważ sytuację, w której musisz zdefiniować właściwość DisplayName PXUIFieldAttribute.

W tym celu możesz użyć jeszcze jednego specjalnego atrybutu dostarczonego przez Acumatica Framework: PXCustomizeBaseAttributeAttribute . Jego konstruktor przyjmuje trzy wartości:

  • Typ atrybutu DAC, którego właściwość należy przesłonić
  • Nazwa właściwości atrybutu do zastąpienia (użyj operatora nameof w C # 6.0 dla zachowania kodu)
  • Nowa wartość dla określonej właściwości.

Załóżmy, że istnieje konieczność zmiany nazwy wyświetlanej interfejsu użytkownika z Kwoty prowizji na Podstawową prowizję walutową tylko dla jednego ekranu. Poniższy przykład kodu pokazuje, jak zaimplementować pożądane zachowanie.

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

W tym przykładzie PXMergeAttributes zapewnia zachowanie oryginalnych atrybutów DAC, a PXCustomizeBaseAttribute pozwala inżynierowi oprogramowania zastąpić nazwę wyświetlaną pola interfejsu użytkownika dla danego wykresu.

Zamiana atrybutu na inny atrybut

Przypuśćmy, że istnieje wymóg, aby zastąpić polu DAC PXDefaultAttribute z PXDBDefaultAttribute tylko dla jednego ekranu.

Można to osiągnąć w następujący sposób:

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

Kolejność aplikacji atrybutów - dostosowywanie atrybutów

  1. PXCustomizeBaseAttribute
  2. PXRemoveBaseAttribute
  3. PXMergeAttributes


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow