1

我有一个客户同步系统,可以将 AX 客户与外部系统的客户同步。

在外部系统上执行更新/插入时,它会转储一个经过处理的 AIF 文件。

我想在 table 方法中添加一些逻辑,CustTable.insert()以便CustTable.update()在插入/更新任何内容时,它会推高外部系统,这工作正常。

问题是当用户在外部系统中进行更改时,它会生成 AIF 文件,然后在 AX 中插入/更新,然后将更改推送回外部系统。

如何确定何时从 AIF 进程执行 custTable 插入/更新?我正在寻找的伪代码将是这样的Tables\CustTable\Methods\insert()

// Pseudo code
if (this.isFromAIF() == false)
{
   this.syncRecordToExternalSystem();
}
4

1 回答 1

1

这是一个非常困难的问题。正如@ian_socho 所说,您可以创建一个只有 AIF 设置的自定义标志。“createdby”用户无法工作,因为 AIF 会进行模拟。

我做了实验,发现了一些有趣的特性。似乎 AIF 操作在 CIL 中作为工作线程执行,但工作线程似乎是由 AOS 启动的,所以masterSessionId我无法确定。

此代码将告诉您是否可能从 AIF 调用了某些内容。我使用启动工作线程的 SysOpFramework 进行了测试,它们都有一个主线程。我用一个视觉工作室项目进行了测试,它有一个主会话。

xSession    xSession = new xSession(sessionId());

if (xSession.masterSessionId()  == 0        &&
    xSession.isWorkerThread()   == true     &&
    xSession.clientKind()       == ClientType::WorkerThread)
{
    // Appears to have been called from AIF
    return true; // AIF call
}
于 2014-12-02T20:53:20.703 回答