我有一个我正在尝试安排的流程。当计划运行时,我收到以下错误:
Message: Error #199: You are not currently logged in.
Date/Time: 09/06/2015 10:20
Platform:
Browser:
Source: PX.Data
Target Site: Int32 GetCurrentCompany()
Stack Trace: at PX.Data.PXDatabaseProviderBase.GetCurrentCompany()
at PX.Data.PXDatabaseProviderBase.getCompanyID(String tableName, companySetting& setting)
at PX.Data.PXDatabaseProviderBase.getRestriction(String table, String alias, Boolean mainRestriction, Boolean isRightJoin, Nullable`1 effectiveCid)
at PX.Data.PXDatabaseProviderBase.alterText(String text, Int32 start, Int32 stop, Boolean isTopLevelQuery)
at PX.Data.PXDatabaseProviderBase.alterText(String text, Int32 start, Int32 stop, Boolean isTopLevelQuery)
at PX.Data.PXDatabaseProviderBase.Select(PXGraph graph, BqlCommand command, Int32 topCount, PXView view, PXDataValue[] pars)
at PX.Data.PXGraph.ProviderSelect(BqlCommand command, Int32 topCount, PXView view, PXDataValue[] pars)
at PX.Data.PXView.GetResult(Object[] parameters, PXFilterRow[] filters, Boolean reverseOrder, Int32 topCount, PXSearchColumn[] sorts, Boolean& overrideSort, Boolean& extFilter)
at PX.Data.PXView.Select(Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows)
at PX.Data.PXSelectBase`1.selectBound[Resultset](BqlCommand command, Boolean readOnly, PXGraph graph, Int32 startRow, Int32 totalRows, Object[] currents, Object[] pars)
at PX.Data.PXSelectBase`1.select[Resultset](BqlCommand command, Boolean readOnly, PXGraph graph, Int32 startRow, Int32 totalRows, Object[] pars)
at PX.Data.PXSelectReadonly`2.SelectWindowed[Resultset](PXGraph graph, Int32 startRow, Int32 totalRows, Object[] pars)
at PX.Data.PXSelectReadonly`2.Select[Resultset](PXGraph graph, Object[] pars)
at Exosoft.MP.MikePero.Graphs.RexApiMaint.GetCustomerByCD(String id)
当我通过流程屏幕运行流程时,流程运行正常,但不是在自动计划下运行。
当我拨打以下内容时发生错误...
PXSelectReadonly<PX.Objects.AR.Customer, Where<PX.Objects.AR.Customer.acctCD, Equal<Required<PX.Objects.AR.Customer.acctCD>>>>.Select(this, id);
它调用进程的图形和图形是基于我创建的自定义表自定义的。我已将CompanyID和其他审核字段添加到自定义表中。这就是我的称呼方式
public class SyncRexApiProcess : PXGraph<SyncRexApiProcess>
{
public PXCancel<RexApiLogin> Cancel;
public PXProcessing<RexApiLogin> RexApiLogins;
public SyncRexApiProcess()
{
RexApiLogins.SetProcessCaption("Sync From Rex Api Login");
RexApiLogins.SetProcessAllCaption("Sync From All Rex Api Logins");
RexApiLogins.SetProcessDelegate<RexApiMaint>(
delegate(RexApiMaint graph, RexApiLogin login)
{
graph.Clear();
Func<Task> task = async () =>
{
await graph.SyncAPIDataAsync(login);
};
task().Wait();
});
}
}
答案 0 :(得分:1)
通过使用async / await,您的代码将在不同的线程中运行,不能保证使用会话变量正确初始化。我不相信Acumatica可以保证图形或任何缓存的任何线程安全性,因此您应该将与其交互的任何代码与异步操作分开。
此外,我认为没有任何理由使用异步操作;在这种情况下,它只会让你的生活更加困难 - 只需从主线程运行你的API同步。如果要一次运行多个操作,并等待它们返回,则将这些操作与图形和缓存隔离。