2016-08-01 17 views
0

Nachdem ich den Code unten angepasst habe und ich SLA durch AssignDateTime aktualisieren möchte. Aber mit der Änderung des Schweregrads hat sich mein SLA geändert, um auch datetime von createdDateTime zu erhalten. Ich denke, es sollte andere Ereignisse haben, die angepasst werden müssen.Was ist das Ereignis zum Ändern des Schweregrades auf dem Bildschirm Case (ScreenID: CR306000)?

protected virtual void CRCase_RowUpdated(PXCache cache, PXRowUpdatedEventArgs e, PXRowUpdated InvokeBaseHandler) 
{ 
    if (InvokeBaseHandler != null) 
     InvokeBaseHandler(cache, e); 
    var row = e.Row as CRCase; 
    var oldRow = e.OldRow as CRCase; 
    CRCaseExt rowExt = PXCache<CRCase>.GetExtension<CRCaseExt>(row); 

    if (row == null || oldRow == null) return; 

    if (row.OwnerID == null) 
    { 
     row.AssignDate = null; 
     row.SLAETA = null; 
    } 
    else if (oldRow.OwnerID == null) 
    { 
     row.AssignDate = PXTimeZoneInfo.Now; 
     if (row == null || row.AssignDate == null) return; 

     if (row.ClassID != null && row.Severity != null) 
     { 
      var severity = (CRClassSeverityTime)PXSelect<CRClassSeverityTime, 
          Where<CRClassSeverityTime.caseClassID, Equal<Required<CRClassSeverityTime.caseClassID>>, 
          And<CRClassSeverityTime.severity, Equal<Required<CRClassSeverityTime.severity>>>>> 
          .Select(Base, row.ClassID, row.Severity); 
      if (severity != null && severity.TimeReaction != null) 
      { 
       row.SLAETA = ((DateTime)row.AssignDate).AddMinutes((int)severity.TimeReaction); 
      } 
     } 
     if (row.Severity != null && row.ContractID != null) 
     { 
      var template = (Contract)PXSelect<Contract, Where<Contract.contractID, Equal<Required<CRCase.contractID>>>>.Select(Base, row.ContractID); 
      if (template == null) return; 
      var sla = (ContractSLAMapping)PXSelect<ContractSLAMapping, 
        Where<ContractSLAMapping.severity, Equal<Required<CRCase.severity>>, 
        And<ContractSLAMapping.contractID, Equal<Required<CRCase.contractID>>>>> 
        .Select(Base, row.Severity, template.TemplateID); 
      if (sla != null && sla.Period != null) 
      { 
       row.SLAETA = ((DateTime)row.AssignDate).AddMinutes((int)sla.Period); 
      } 
     } 
    } 
} 

Antwort

1

SLAETA Feld ist mit PXFormulaAttribute dekoriert FieldDefaulting Ereignis jedes Mal ändern, um eine der folgenden Felder wird zu erhöhen:

  • CRCase.contractID
  • CRCase.severity
  • CRCase.caseClassID

    public partial class CRCase : IBqlTable, IAssign, IAttributeSupport, IPXSelectable 
    { 
        ... 
    
        #region SLAETA 
        public abstract class sLAETA : IBqlField { } 
    
        [PXDBDate(PreserveTime = true, DisplayMask = "g")] 
        [PXUIField(DisplayName = "SLA")] 
        [PXFormula(typeof(Default<CRCase.contractID, CRCase.severity, CRCase.caseClassID>))] 
        public virtual DateTime? SLAETA { get; set; } 
        #endregion 
    
        ... 
    
    } 
    

Es ist ein Weg besser, nur CRCase_SLAETA_FieldDefaulting Handler in der CRCaseMaint BLC Erweiterung anstelle der Implementierung CRCase_RowUpdated anpassen:

public class CRCaseMaint : PXGraph<CRCaseMaint, CRCase> 
{ 
    ... 

    protected virtual void CRCase_SLAETA_FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e) 
    { 
     CRCase row = e.Row as CRCase; 
     if (row == null || row.CreatedDateTime == null) return; 

     if (row.ClassID != null && row.Severity != null) 
     { 
      var severity = (CRClassSeverityTime)PXSelect<CRClassSeverityTime, 
                Where<CRClassSeverityTime.caseClassID, Equal<Required<CRClassSeverityTime.caseClassID>>, 
                And<CRClassSeverityTime.severity, Equal<Required<CRClassSeverityTime.severity>>>>>. 
                Select(this, row.ClassID, row.Severity); 
      if (severity != null && severity.TimeReaction != null) 
      { 
       e.NewValue = ((DateTime)row.CreatedDateTime).AddMinutes((int)severity.TimeReaction); 
       e.Cancel = true; 
      } 
     } 

     if (row.Severity != null && row.ContractID != null) 
     { 
      var template = (Contract)PXSelect<Contract, Where<Contract.contractID, Equal<Required<CRCase.contractID>>>>.Select(this, row.ContractID); 
      if (template == null) return; 

      var sla = (ContractSLAMapping)PXSelect<ContractSLAMapping, 
               Where<ContractSLAMapping.severity, Equal<Required<CRCase.severity>>, 
               And<ContractSLAMapping.contractID, Equal<Required<CRCase.contractID>>>>>. 
               Select(this, row.Severity, template.TemplateID); 
      if (sla != null && sla.Period != null) 
      { 
       e.NewValue = ((DateTime)row.CreatedDateTime).AddMinutes((int)sla.Period); 
       e.Cancel = true; 
      } 
     } 
    } 

    ... 
} 
+0

Also wenn ich bei der Änderung des Schweregrades aktualisieren möchte, sollte ich die gleiche Codierung am CRCase_RowUpdated Event anpassen? – YSP

+0

FieldDefaulting wird für das Feld SLAETA immer dann ausgelöst, wenn CRCase.severity aufgrund der Implementierung von PXFormulaAttribute geändert wird. Um SLAETA zu aktualisieren, "wenn der Schweregrad geändert wird", sollten Sie CRCase_SLAETA_FieldDefaulting nur überschreiben und e.NewValue einen neuen Wert zuweisen. Zum Ausführen Ihrer Aufgabe sind keine zusätzlichen Handler wie CRCase_RowUpdated erforderlich. – RuslanDev

+0

Wie auch immer, wie kann ich den Max-Wert und Min-Wert von DateTime mit BQL-Struktur festlegen? – YSP

-1

Sie können entweder das FieldUpdated-Ereignis verwenden oder in dem Zeile aktualisiert-Ereignis können Sie nach der Änderung Ihres Felds suchen.

Eg: row.Severity = oldRow.Severity

+0

Ja, ich habe bereits dieses Ereignis verwenden, aber ich verwenden, um die gleiche Codierung wie CRCase_SLAETA_FieldDefaulting. – YSP