2014-11-08 51 views
1

我有一个客户同步内置的AX客户与外部系统的客户同步。如何确定何时从AIF插入/更新记录?

在外部系统上执行更新/插入操作时,会转储处理的AIF文件。

我想在表方法CustTable.insert()CustTable.update()中加入一些逻辑,这样当插入/更新任何东西时,它将推高外部系统,这可以正常工作。

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

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

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

两点建议: *检查谁创造了该领域的用户(CreatedBy)是商务用户的连接。 http://msdn.microsoft.com/en-us/library/aa871620.aspx *在CustTable中创建一个新的布尔型字段,并修改AX

类以始终向该字段写入“true”。 http://technet.microsoft.com/en-us/library/bb496530.aspx – 2014-11-10 08:18:20

+0

虽然AIF根据设置进行模拟,所以CreatedBy可能不起作用。 – 2014-12-01 23:04:28

回答

1

这是一个非常棘手的问题。由于@ian_socho说你可以创建一个只有AIF设置的自定义标志。 “createdby”用户不会工作,因为AIF会模仿。

我做了实验并发现了一些有趣的属性。看起来AIF操作在CIL中作为工作线程执行,但工作线程似乎由AOS驱动,所以我没有看到masterSessionId

这段代码会告诉你是否有可能从AIF调用的东西。我使用SysOpFramework进行了测试,它可以使工作线程加速,并且它们都有一个主线程。我使用Visual Studio项目进行了测试,它有一个主会话。把我的头顶部

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 
} 
相关问题