2017-10-11 65 views
0

我試圖通過添加視圖代表這樣對視圖進行排序:排序查看在委託

public class AppointmentEntry_Extension:PXGraphExtension<AppointmentEntry> 
    { 
    protected virtual IEnumerable appointmentRecords() 
    { 
     PXView select = new PXView(Base, true, Base.AppointmentRecords.View.BqlSelect); 
     int totalrow = 0; 
     int startrow = PXView.StartRow; 
     select.OrderByNew<OrderBy<Desc<FSAppointment.createdDateTime>>>(); 
     List<object> result = select.Select(PXView.Currents, PXView.Parameters, PXView.Searches, PXView.SortColumns, PXView.Descendings, PXView.Filters, ref startrow, PXView.MaximumRows, ref totalrow); 
     PXView.StartRow = 0; 
     return result; 
    } 
} 

它加載了最新紀錄(按日期),但是當我瀏覽到下一個記錄它顯示相同的記錄。當我點擊最後一個記錄時它只顯示不同的一個。

enter image description here

+0

如果目標是更改導航,最好更新問題和標題,以便其他用戶可以更好地找到答案。 – Brendan

回答

-1

您可以簡單地添加在您的擴展所需的視圖如果使用相同的名稱(不需要這樣的觀點代表工作)。例如,如果基本圖視圖有這樣的事情...

public PXSelect<SomeDac> AppointmentRecords; 

在您的擴展圖譜可以爲圖做到這一點...

public PXSelect<SomeDac, OrderBy<SomeNewOrder>> AppointmentRecords; 

編輯:壓倒一切的觀點代表或者使用視圖重寫不會改變主視圖的順序。如果有其他人試圖做同樣的事情,請留下這個答案。這樣做可能會更改鏈接到網格的視圖的順序。

+0

嗨! 我使用您提供給我的代碼更新了圖表。但由於某種原因,沒有效果。 'public PXSelect >>> AppointmentRecords;' 而奇怪的部分是即使我刪除舊的代碼,代碼的效果仍然存在意味着導航工作不正常,過去正常工作。並確認我將相同的代碼放在新鮮的實例中。無論如何,可能會產生影響的是數據視圖永久? –

+0

順便說一句,我已經跟着這個博客:http://asiablog.acumatica.com/2016/06/using-pxview-in-dataview-delegate.html 其中說,最好是使用dataview委託來覆蓋dataview本身。 –

+0

我假設您在進行更改後發佈了這些內容嗎?你在6.1還是2017R2?我沒有配置現場服務來嘗試此操作。然而,我可以測試,以確認這在另一個頁面,如銷售訂單導航工程...我沒有這個改變排序順序在過去的網格,但不會影響導航,因爲它不是主要視圖 – Brendan

0

達到預期的行爲,最簡單的方法是更換了通用查詢的預約數據錄入頁面的配置在任何給定的順序記錄進行排序: enter image description here enter image description here

如果有更換的約會數據錄入頁面通用查詢不是一個選項,你將不得不覆蓋下面的代碼片段中的所有4個導航按鈕(插入和刪除按鈕應該沒有任何問題,因爲它與以前的代碼示例一樣)。另外請記住,Appointment Nbr選擇器仍然按Appointment Nbr字段降序排列FSAppointment記錄。這是由於PXSelectorAttribute允許僅通過其外鍵或替代鍵(如果已定義)對記錄進行排序。

using PX.Data; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 

namespace FieldService.ServiceDispatch 
{ 
    public class AppointmentEntryExt : PXGraphExtension<AppointmentEntry> 
    { 
     public PXFirstCst<FSAppointment> First; 
     public PXPreviousCst<FSAppointment> Previous; 
     public PXNextCst<FSAppointment> Next; 
     public PXLastCst<FSAppointment> Last; 

     public class PXFirstCst<TNode> : PXFirst<TNode> 
      where TNode : class, IBqlTable, new() 
     { 
      public PXFirstCst(PXGraph graph, string name) 
       : base(graph, name) 
      { 
      } 
      public PXFirstCst(PXGraph graph, Delegate handler) 
       : base(graph, handler) 
      { 
      } 

      [PXUIField(DisplayName = ActionsMessages.First, MapEnableRights = PXCacheRights.Select)] 
      [PXFirstButton] 
      protected override IEnumerable Handler(PXAdapter adapter) 
      { 
       adapter = PrepareCustomNavAdapter(this, adapter); 
       return base.Handler(adapter); 
      } 
     } 

     public class PXPreviousCst<TNode> : PXPrevious<TNode> 
      where TNode : class, IBqlTable, new() 
     { 
      public PXPreviousCst(PXGraph graph, string name) 
       : base(graph, name) 
      { 
      } 
      public PXPreviousCst(PXGraph graph, Delegate handler) 
       : base(graph, handler) 
      { 
      } 

      private PXAdapter origAdapter; 

      [PXUIField(DisplayName = ActionsMessages.Previous, MapEnableRights = PXCacheRights.Select)] 
      [PXPreviousButton] 
      protected override IEnumerable Handler(PXAdapter adapter) 
      { 
       origAdapter = adapter; 
       adapter = PrepareCustomNavAdapter(this, adapter, true); 
       return base.Handler(adapter); 
      } 

      protected override IEnumerable InsertAndGet(PXAdapter adapter) 
      { 
       if (!_inserted) 
       { 
        return base.InsertAndGet(origAdapter); 
       } 
       else 
       { 
        return base.InsertAndGet(adapter); 
       } 
      } 
     } 

     public class PXNextCst<TNode> : PXNext<TNode> 
      where TNode : class, IBqlTable, new() 
     { 
      public PXNextCst(PXGraph graph, string name) 
       : base(graph, name) 
      { 
      } 
      public PXNextCst(PXGraph graph, Delegate handler) 
       : base(graph, handler) 
      { 
      } 

      private PXAdapter origAdapter; 

      [PXUIField(DisplayName = ActionsMessages.Next, MapEnableRights = PXCacheRights.Select)] 
      [PXNextButton] 
      protected override IEnumerable Handler(PXAdapter adapter) 
      { 
       origAdapter = adapter; 
       adapter = PrepareCustomNavAdapter(this, adapter, true); 

       var primaryCache = Graph.Views[Graph.PrimaryView].Cache; 
       object current = primaryCache.Current; 
       if (current != null && primaryCache.GetStatus(current) == PXEntryStatus.Inserted) 
       { 
        adapter.StartRow--; 
       } 
       return base.Handler(adapter); 
      } 

      protected override IEnumerable InsertAndGet(PXAdapter adapter) 
      { 
       if (!_inserted) 
       { 
        return base.InsertAndGet(origAdapter); 
       } 
       else 
       { 
        return base.InsertAndGet(adapter); 
       } 
      } 
     } 

     public class PXLastCst<TNode> : PXLast<TNode> 
      where TNode : class, IBqlTable, new() 
     { 
      public PXLastCst(PXGraph graph, string name) 
       : base(graph, name) 
      { 
      } 
      public PXLastCst(PXGraph graph, Delegate handler) 
       : base(graph, handler) 
      { 
      } 
      [PXUIField(DisplayName = ActionsMessages.Last, MapEnableRights = PXCacheRights.Select)] 
      [PXLastButton] 
      protected override IEnumerable Handler(PXAdapter adapter) 
      { 
       adapter = PrepareCustomNavAdapter(this, adapter); 
       return base.Handler(adapter); 
      } 
     } 

     public static PXAdapter PrepareCustomNavAdapter(PXAction action, 
      PXAdapter adapter, bool prevNextAction = false) 
     { 
      var select = adapter.View.BqlSelect; 
      select = select.OrderByNew<OrderBy< 
       Desc<FSAppointment.createdDateTime, 
       Desc<FSAppointment.srvOrdType, 
       Desc<FSAppointment.refNbr>>>>>(); 

      var newAdapter = new PXAdapter(new PXView(action.Graph, true, select)) 
      { 
       MaximumRows = adapter.MaximumRows 
      }; 

      object current = action.Graph.Views[action.Graph.PrimaryView].Cache.Current; 
      if (prevNextAction) 
      { 
       var sortColumns = new string[adapter.SortColumns.Count() + 1]; 
       adapter.SortColumns.CopyTo(sortColumns, 1); 
       sortColumns[0] = "CreatedDateTime"; 
       newAdapter.SortColumns = sortColumns; 

       var descendings = new bool[adapter.Descendings.Count() + 1]; 
       adapter.Descendings.CopyTo(descendings, 1); 
       descendings[0] = true; 
       newAdapter.Descendings = descendings; 

       var searches = new object[adapter.Searches.Count() + 1]; 
       adapter.Searches.CopyTo(searches, 1); 
       if (current != null && current is FSAppointment) 
        searches[0] = ((FSAppointment)current).CreatedDateTime; 
       newAdapter.Searches = searches; 
      } 
      else if (current != null) 
      { 
       adapter.Currents = new object[] { current }; 
      } 

      return newAdapter; 
     } 
    } 
} 
+0

非常感謝您在此提供的幫助,但仍然使用通用頁面替換約會頁面不會。而且,即使這些代碼適用於導航功能,我也更擔心其他操作。例如,刪除操作也不起作用。那些其他的行爲呢,我認爲去所有的地方代替所有的代碼是不明智的。 http://www.screencast.com/t/yBPRs1W93 對不起,如果我太天真了。 –

+0

@BikashLama,你不需要重載/定製其他動作。您能否在您的機器上創建一個全新的Acumatica實例並僅應用上面的代碼片段?如果您需要進一步的幫助,這必須轉向Acumatica的支持案例...... – RuslanDev