Вставка / обновление таблицы axapta - PullRequest
0 голосов
/ 01 сентября 2010

и еще раз вопрос axapta (работает на ax 2009 и sql-server 2008 r2): какой именно момент времени, когда вставленные или обновленные наборы данных хранятся в соответствующей базе данных?

цель состоит в том, чтобы вызвать хранимую процедуру на sql-сервере, которая передает данные из таблиц ax (например, из списка элементов) в другую (не сгенерированную с помощью axapta) таблицу.выполнение хранимой процедуры через odbc из axapta на одном из табличных методов (даже после вызова super ()) запускает хранимую процедуру, но данные, которые были только что добавлены или изменены в ax, не найдены при выборе с помощью smss (select *из dbo.inventtable).

единственное место, где я еще знаю, где данные уже хранятся в БД, - это методы на источнике данных в соответствующей форме, но это было бы ужасно, так как данные могли бытьотредактировано через n форм от ax.

так есть ли способ поместить вызов в таблицу вместо источников данных форм?

спасибо за подсказки заранее!

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Данные AX «хранятся» в базе данных в момент вызовов doInsert() / doUpdate() или super() в методах insert()/update().

Однако, как упоминал Джей, записи не будут видны другим транзакциям (если вы явно не разрешите грязный / незафиксированный выбор).Поэтому он может быть невидим для вашей хранимой процедуры.

Я бы не рекомендовал вызывать хранимые процедуры в insert()/update() в любом случае, так как это влияет на производительность, и теперь вы зависите от еще одной действующей базы данных!

Путь:

  1. регистрация / обновление журнала в отдельной таблице для этой цели (рассмотрите возможность использования стандартного ведения журнала базы данных).
  2. Из другой базы данных регулярно следите за журналомдля новых записей (скажем, каждые 15 секунд).
  3. Выполните вставку / обновление в другой базе данных на основе объединения журнала и таблицы AX.

Расположение таблицы журнала (один из миллионов):

  • LogType - 1 = вставка, 2 = обновление, 3 = удаление
  • LogStatus - 0 = не перенесено, 1 = в процессе передачи, 2 = перенесено, 3= ошибка ???
  • RefRecId - RecId записи AX
  • RefTableId - TableId таблицы AX (если вам нужно зарегистрировать более одной таблицы)
  • RefCompanyId - Company ofAX-запись (возможно, виртуальная таблица совместно используется)

Рекомендации:

  1. Используйте RecId в качестве ключа объединения и не забудьте включить индекс RecId для таблицы AX.
  2. Не забудьте выбрать DATAAREAID (должно быть написанотакже)
  3. Обновите LogStatus до 1 до объединения и до 2 после объединения и обновления.
0 голосов
/ 01 сентября 2010

Размещение вызова после вызова super () в табличном методе insert () или update () является правильным местом для этого, однако, если вы не выполните незафиксированное чтение, оператор select в хранимой процедуре не увидит данные до тех пор, пока транзакция в AX не будет зафиксирована.

Не могли бы вы использовать соединение ODBC из X ++ для прямой записи во внешнюю таблицу, а не косвенно с помощью хранимой процедуры?

...