axapta表插入/更新

时间:2010-09-01 14:16:01

标签: sql insert axapta

又一次axapta-question(在ax 2009和sql-server 2008 r2上运行): 当插入或更新的数据集存储在关注数据库中时,这恰好是时间点吗?

目标是在sql-server上调用存储过程,该存储过程将数据从ax-tables(例如,可发明的)传输到另一个(不是用axapta生成)表。通过其中一个表方法上的axapta执行存储过程(甚至在super()调用之后)触发存储过程,但是在通过smss选择时找不到刚刚在ax中添加或修改的数据(select *来自dbo.inventtable)。

我知道数据已经存储在db中的唯一地方是关于表格上数据源的方法,但这很安静,因为数据可以通过ax中的n个表单进行编辑。

那么有没有办法将调用放在表格而不是表格'数据源?

提前感谢提示!

2 个答案:

答案 0 :(得分:1)

doInsert()方法doUpdate() / super()insert()/update()调用时,AX数据“存储”在数据库中。

但是,正如Jay所提到的,其他事务不会显示记录(除非您明确允许脏/未提交的选择)。因此,您的存储过程可能无法看到它。

我不建议在insert()/update()中调用存储过程,因为这会影响性能,现在你依赖另一个数据库还活着!

要走的路:

  1. 为此目的在单独的表中插入/更新日志(考虑使用标准数据库日志记录)。
  2. 从另一个数据库定期监视日志以查找新记录(例如每15秒)。
  3. 根据日志和AX表的连接在其他数据库中进行插入/更新。
  4. 日志表布局(数百万之一):

    • LogType - 1 = insert,2 = update,3 = delete
    • LogStatus - 0 =未转移,1 =转移,2 =转移,3 =错误???
    • RefRecId - AX记录的RecId
    • RefTableId - AX表的TableId(如果需要记录多个表)
    • RefCompanyId - AX记录公司(可能是虚拟共享表)

    建议:

    1. 使用RecId作为连接键,并记住在AX表上启用RecId索引。
    2. 请记住选择DATAAREAID(也必须拼写为这种方式)。
    3. 在加入前将LogStatus更新为1,在加入和更新后将其更新为2.

答案 1 :(得分:0)

在insert()或update()表方法中调用super()之后的调用是正确的地方,但是除非你进行未提交的读取,否则存储过程中的select语句将看不到直到AX中的事务被提交之后的数据。

您是否可以使用X ++中的ODBC连接直接写入外部表而不是通过存储过程间接写入?