【发布时间】:2018-02-22 12:00:09
【问题描述】:
问题摘要:
我的新屏幕上的处理逻辑正在运行,但页面没有向用户显示任何反馈(例如,计时器没有显示,没有红色/绿色复选框,复选框没有被禁用)
问题详情:
我正在创建一个处理屏幕,它需要来自用户的单独信息以供处理委托使用。业务逻辑有效,但用户体验与其他处理屏幕不同。当您单击处理时,不会向用户显示任何内容。通常,页面会通过禁用并仅显示正在处理的选定项目来刷新网格,此外还会添加长操作计时器(然后根据进程是成功还是失败替换为绿色检查或红色 x)。当我单击处理时,检查了整个网格的所有选定列,但没有其他任何变化(例如,没有计时器、状态,也没有禁用网格)。最终,流程和流程都执行业务逻辑,但用户看不到任何表明成功/失败的信息。
屏幕显示所有客户位置,因为该过程正在更新我们根据每个位置存在的订单为每个位置保留的一些统计信息。
我的图表
public class CalculateLocationStatsProcess : PXGraph<CalculateLocationStatsProcess>
{
public PXCancel<LocationStatsFilter> Cancel;
public PXFilter<LocationStatsFilter> filterLocStat;
public PXFilteredProcessingJoin<Location,
LocationStatsFilter,
InnerJoin<Customer, On<Customer.bAccountID, Equal<Location.bAccountID>>>,
Where<True, Equal<True>>,
OrderBy<Asc<Customer.acctCD, Asc<Location.locationCD>>>> processLocations;
public CalculateLocationStatsProcess()
{
}
public virtual void LocationStatsFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
processLocations.SetProcessDelegate(
delegate (List<Location> list)
{
var newList = new List<Location>();
foreach (Location locLp in list)
{
newList.Add(locLp);
}
CalculateLocationStatsProcess.updateLocationStats(newList, filterLocStat.Current);
}
);
}
public static void updateLocationStats(List<Location> locations, LocationStatsFilter filter)
{
var graph = new PXGraph();
var locStats = new StatsHelper(graph, filter.TargetDate);
bool erred = false;
for (int iLp = 0; iLp < locations.Count; iLp++)
{
Location locationLp = locations[iLp];
PXProcessing<Location>.SetCurrentItem(locationLp);
try
{
locStats.setCommStats(locationLp);
}
catch (Exception ex)
{
erred = true;
PXProcessing<Location>.SetError(iLp, ex.Message);
}
}
locStats.StatCache.Persist(PXDBOperation.Insert);
locStats.StatCache.Persist(PXDBOperation.Update);
if (erred)
{
throw new PXException("Location(s) failed during recalculation process. View individual lines to see their specific error.");
}
}
}
我的页面
<%@ Page Language="C#" MasterPageFile="~/MasterPages/FormDetail.master" AutoEventWireup="true" ValidateRequest="false" CodeFile="SO509503.aspx.cs" Inherits="Page_SO509503" Title="Calculate Location Stats" %>
<%@ MasterType VirtualPath="~/MasterPages/FormDetail.master" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" runat="Server">
<px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" PrimaryView="filterLocStat" TypeName="exampleNS.CalculateLocationStatsProcess">
<CallbackCommands>
</CallbackCommands>
</px:PXDataSource>
</asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phF" runat="Server">
<px:PXFormView ID="formFilter" runat="server" DataMember="filterLocStat" DataSourceID="ds" Style="z-index: 100" Width="100%" >
<Template>
<px:PXLayoutRule runat="server" ID="PXLayoutRule1" ControlSize="M" LabelsWidth="M" StartRow="true" />
<px:PXDateTimeEdit runat="server" ID="edTargetDate" DataField="TargetDate" />
</Template>
</px:PXFormView>
</asp:Content>
<asp:Content ID="cont3" ContentPlaceHolderID="phG" runat="Server">
<px:PXGrid ID="gridLocations" runat="server"
AdjustPageSize="Auto" AllowPaging="True" AllowSearch="true" DataSourceID="ds" FilesIndicator="false"
Height="400px" NoteIndicator="false" SkinID="Inquire" Style="z-index: 100" SyncPosition="true" Width="100%" >
<AutoSize Container="Window" Enabled="True" MinHeight="200" />
<Levels>
<px:PXGridLevel DataMember="processLocations">
<Columns>
<px:PXGridColumn DataField="Selected" Type="CheckBox" AllowCheckAll="true" Width="40px" />
<px:PXGridColumn DataField="Customer__AcctCD" Width="125px" />
<px:PXGridColumn DataField="LocationCD" Width="75px" />
<px:PXGridColumn DataField="Descr" Width="175px" />
</Columns>
</px:PXGridLevel>
</Levels>
</px:PXGrid>
</asp:Content>
我的过滤器 DAC
public class LocationStatsFilter : IBqlTable
{
#region TargetDate
public abstract class targetDate : IBqlField { }
[PXDate()]
[PXUIField(DisplayName = "Target Month and Year")]
public virtual DateTime? TargetDate { get; set; }
#endregion
}
我的附加地址信息 DAC
[PXTable(typeof(Location.locationID), typeof(Location.bAccountID), IsOptional = false)]
public class LocationExt : PXCacheExtension<Location>
{
#region Selected
public abstract class selected : IBqlField { }
[PXBool()]
[PXDefault(false)]
[PXUIField(DisplayName = "Selected")]
public virtual bool? Selected { get; set; }
#endregion
#region DateFirstService
public abstract class dateFirstService : IBqlField { }
[PXDBDate()]
[PXUIField(DisplayName = "Date of First Service")]
public virtual DateTime? DateFirstService { get; set; }
#endregion
}
我根据我找到的几个处理屏幕对我的解决方案进行了建模,但是我查看了很多我无法说出我使用哪些作为示例的屏幕。我在 RowSelected 事件和构造函数之间移动了 SetProcessDelegate 调用,但没有成功。我尝试将 updateLocationStats 函数设为静态而不是静态(使用现有图表),但没有成功。
更新:
- 直接调用 updateLocationStats 方法而不是创建一个 列表的副本没有改变结果。
- 将 PXFilterable 添加到 PXFilteredProcessingJoin 并没有改变结果
- 删除对 locStats 的调用(creation、setCommStats(locationLp)、Persist)并没有改变结果
- 添加了缺失的位置 DAC
- 已尝试将 Selected 从 LocationExt DAC 移动到新的 LocationAlt:Location DAC 结果没有变化。
- 向页面中的选定字段添加了 DataType="Boolean"。行为没有改变
- 在 PXGrid 标记中添加了 BatchUpdate="True"。行为没有变化。
- 添加了 PXProcessing.SetProcessed();在 locStats.setCommStats(locationLp) 之后;行为没有改变。
替代测试
public class LocationAlt : Location
{
#region Selected
public abstract class selected : IBqlField { }
[PXBool()]
[PXDefault(false)]
[PXUIField(DisplayName = "Selected")]
public virtual bool? Selected { get; set; }
#endregion
}
public class CalculateLocationStatsProcess : PXGraph<CalculateLocationStatsProcess>
{
public PXCancel<LocationStatsFilter> Cancel;
public PXFilter<LocationStatsFilter> filterLocStat;
[PXFilterable()]
public PXFilteredProcessingJoin<LocationAlt,
LocationStatsFilter,
InnerJoin<Customer, On<Customer.bAccountID, Equal<LocationAlt.bAccountID>>>,
Where<True, Equal<True>>,
OrderBy<Asc<Customer.acctCD, Asc<LocationAlt.locationCD>>>> processLocations;
public CalculateLocationStatsProcess()
{
}
public virtual void LocationStatsFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
processLocations.SetProcessDelegate(
delegate (List<LocationAlt> list)
{
CalculateLocationStatsProcess.updateLocationStats(list, filterLocStat.Current);
}
);
}
public static void updateLocationStats(List<LocationAlt> locations, LocationStatsFilter filter)
{
var graph = new PXGraph();
var locStats = new CommStatsHelper(graph, filter.TargetDate);
bool erred = false;
for (int iLp = 0; iLp < locations.Count; iLp++)
{
LocationAlt locationLp = locations[iLp];
PXProcessing<LocationAlt>.SetCurrentItem(locationLp);
try
{
locStats.setCommStats(locationLp);
}
catch (Exception ex)
{
erred = true;
PXProcessing<LocationAlt>.SetError(iLp, ex.Message);
}
}
locStats.StatCache.Persist(PXDBOperation.Insert);
locStats.StatCache.Persist(PXDBOperation.Update);
if (erred)
{
throw new PXException("Location(s) failed during recalculation process. View individual lines to see their specific error.");
}
}
}
请注意,备用测试也不起作用。
【问题讨论】:
-
我注意到在您的 Persist 上您正在使用 DataView。您是否尝试过直接使用图形全局缓存。例如:“graph.Persist();”另外,您能否提供有关 StatsHelper() 和 setCommStats() 方法的详细信息? (不清楚您是否坚持在静态方法上声明的相同图或“locStats”是否属于另一个图。
-
@cbetabeta 我理解这个问题,但即使我注释掉所有包含 locStats 的 4 行,页面的行为也是一样的。它没有放置计时器,没有放置绿色/红色状态指示器,也没有禁用/缩小网格。
-
作为一个仅供参考,StatsHelper 是一个将图形作为参数的类(将其存储为属性,然后将其用于需要执行的任何选择/持久化)。 StatCache 只是获取 graph.Caches[typeof(LocationStat)] 的只读属性
-
我认为您应该分别处理所有问题。例如,计时器可能会被隐藏,因为您没有在委托中做任何重要的工作。尝试将 Thread.Sleep 放在那里而不是评论实际过程。
-
代码中有很多可能出错的地方,但我们不知道,因为我们没有看到它。更直接的方法将消除歧义。例如,不要为已处理的记录创建列表副本 'var newList',直接使用委托 'List
list'。尝试直接修改和保存记录,例如:list[0].Active = false; sender.Caches[typeof(Location)].Update(list[0]); sender.Caches[typeof(Location)].Persist(PXDBOperation.Update);.
标签: acumatica