達到預期的行爲,最簡單的方法是更換了通用查詢的預約數據錄入頁面的配置在任何給定的順序記錄進行排序:
如果有更換的約會數據錄入頁面通用查詢不是一個選項,你將不得不覆蓋下面的代碼片段中的所有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;
}
}
}
如果目標是更改導航,最好更新問題和標題,以便其他用戶可以更好地找到答案。 – Brendan