AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.07.2008, 23:26   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Как сформировать RecId
Цель учебная (Далеко посылать не надо, там я была и мне там не понравилось)

Пишу в Query Anal...(Это рабочий пакет - можно запустить. Задачка выполнима на типовой Аксапте)
Тут в принципе следующее
1. На входе передаются зачения переменных (в будущем они должны передаваться из аксапты)
2. Создаю в табличке строчку RTSLSessionTrans
3. Создаю в табличке строки LedgerTrans
(Условно - это будет что-то вроде трансляции)
Как бы хорошо, но одна проблема - как получить RecId для новых строк? (Если это не единственная проблема , то скажите, чего я еще не поняла)
Я увидела таблицу SystemSequences. Не понимаю значения строк и столбцов. Подскажите, что они значат? Может я маюсь над легкой задачей.

Код:
use AxTest

DECLARE @DateFrom     dateTime,
	@DateTo       dateTime,
	@AreaIdFrom   varchar(3),
	@AreaIdTo     varchar(3),

	@DateTSL         datetime,
	@TimeTSL         int,
	@TimeTSLTo       int,
	@UserTSL         varchar(5),
	@MODIFIEDTSID    varchar(4),
	@SessionTransId  varchar(20),
	@RuleGroupId     varchar(20)

SET	@DateFrom     = '2008-1-1'
SET	@DateTo       = '2008-1-10'
SET	@AreaIdFrom   = '01d'
SET	@AreaIdTo     = 'My'

SET     @DateTSL        = '2008-1-1'
SET     @TimeTSL        = 48534
SET     @TimeTSLTo      = 48534
SET     @UserTSL        = 'myna'
SET     @MODIFIEDTSID   = 150
SET     @SessionTransId = 'NC12154'
SET     @RuleGroupId    = '2008New'


INSERT  INTO bmssa.RTSLSessionTrans
		(
		FromDate,ToDate,StatusImport,StatusExport,NumTrans,SessionTransId,RuleGroupId,
		ClassId, InDate,
		MODIFIEDDATE,MODIFIEDTIME,MODIFIEDBY,MODIFIEDTRANSACTIONID,
		CREATEDDATE,CREATEDTIME,CREATEDBY,RECID,DataAreaId	
		)
VALUES		(
		@DateTSL,@DateTSL, 1,        1,           100,    @SessionTransId,@RuleGroupId,
		16475,@DateTSL,
		@DateTSL,@TimeTSL,  @UserTSL,@MODIFIEDTSID,
		@DateTSL,@TimeTSLTo,@UserTSL,50897999,@AreaIdFrom
		)				


INSERT  INTO bmssa.LedgerTrans 
		(
		TransDate, Voucher, Txt, AmountMst, AmountCur, CurrencyCode, 
		Posting, Correct,Crediting,PeriodCode,AmountMSTSecond,BondBatchTrans_RU,BondBatch_RU,
		Dimension, Dimension3_,Dimension4_,Dimension5_,Dimension6_,Dimension7_,Dimension8_,		
		--change coloumn
		MODIFIEDDATE,MODIFIEDTIME,MODIFIEDBY,MODIFIEDTRANSACTIONID,
		CREATEDDATE,CREATEDTIME,CREATEDBY,CREATEDTRANSACTIONID,	
		inDate,
		Dimension2_,
		RTSLFromCompanyID,
		RTSLSessionTransId,
		RTSLFromTransId,
		AccountNum,
		DataAreaId,
		recId
		)

	SELECT  TransDate, Voucher, Txt, AmountMst, AmountCur, CurrencyCode, 
		Posting, Correct,Crediting,PeriodCode,AmountMSTSecond,BondBatchTrans_RU,BondBatch_RU,
		Dimension, Dimension3_,Dimension4_,Dimension5_,Dimension6_,Dimension7_,Dimension8_,	
		--change coloumn
		@DateTSL,@TimeTSL,@UserTSL,@MODIFIEDTSID,--MODIFIEDTRANSACTIONID
		@DateTSL,@TimeTSLTo,@UserTSL,@MODIFIEDTSID,--CREATEDTRANSACTIONID	
		TransDate,       	--cahnge inDate,
		@AreaIdFrom,		--change Dimension2_
		DataAreaId,		--change RTSLFromCompanyID,
		@SessionTransId,        --change RTSLSessionTransId,
		recId,			--change RTSLFromTransId,
		AccountNum,
		@AreaIdTo,		--change DataAreaId
		recId + '18000'
	FROM bmssa.LedgerTrans AS LT1
	where   LT1.TransDate >= @DateFrom
	  and   LT1.TransDate <= @DateTo
	  and   LT1.DataAreaId = @AreaIdFrom	
          and   LT1.PeriodCode = 1 
	  and   LT1.RecId NOT IN (SELECT RTSLFromTransId FROM bmssa.LedgerTrans)
Старый 04.07.2008, 23:51   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
А что-то типа такого не пойдет для генерации RecId?

Код:
-- Генерация RecId. На выходе не 0 если всё Ok и 0, если что-то не так
-- Входные параметры: код компании и шаг
-- Пример: exec AX_GETRECID 'dat', '25'

CREATE PROCEDURE [dbo].[AX_GETRECID] (@dataAreaId VARCHAR(3), @hop INT)
AS
SET NOCOUNT ON
DECLARE @RecID INT
SET @RecID = NULL
UPDATE SYSTEMSEQUENCES SET  @RecID = A.NextVal,
    NextVal = A.NextVal + @HOP
FROM SYSTEMSEQUENCES A WHERE A.Id = -1 AND A.DATAAREAID = @dataAreaId
SELECT ISNULL(@RecID, 0) AS RecId
RETURN ISNULL(@RecID, 0)
GO
За это сообщение автора поблагодарили: SHiSHok (2), aidsua (1), driller (1).
Старый 07.07.2008, 10:57   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Тут в принципе следующее
1. На входе передаются зачения переменных (в будущем они должны передаваться из аксапты)
2. Создаю в табличке строчку RTSLSessionTrans
3. Создаю в табличке строки LedgerTrans
Как бы хорошо, но одна проблема - как получить RecId для новых строк?
Про выделение RecId давным-давно писалось тут: Вставка строк в таблицы Аксапты сторонними средствами
Но расскажите, пожалуйста, зачем вы в LedgerTrans что-то создаете из SQL, минуя фигову тучу бизнес-логики, которая связана с созданием финансовых проводок? Чего вы такого хорошего планируете получить от вставки записей средствами SQL, что хотите отказаться от штатных аксаптовских механизмов?
К слову, у вас реально куплено 8 финансовых аналитик? А если потом 9-ю купите, то что, будете переписывать код вставки?

PS. К слову, при "ручном" выделении себе RecId для той или иной компании с целью вставки новой записи в табличку нужно учесть, что DataAreaId в SystemSequences может отличаться от DataAreaId для создаваемой записи, если табличка, в которой создается запись, относится к виртуальной компании. Разруливать, для какой именно компании в том или ином случае выделять RecId, вы будете тоже в хранимой процедурке? Оно, конечно, несложно, только вот стоит ли овчинка выделки...

Последний раз редактировалось gl00mie; 07.07.2008 в 11:04. Причина: дополнение
Старый 07.07.2008, 11:26   #4  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
Но расскажите, пожалуйста, зачем вы в LedgerTrans что-то создаете из SQL, минуя фигову тучу бизнес-логики
Согласен с gl00mie. Опишите вашу задачу подробнее. Возможно вам необходимо работать с бизнес-коннектором, используя уже готовые классы Аксапты.

"Ручное" создание строк - это очевидная, однако, тупиковая идея.
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 07.07.2008, 11:32   #5  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Есть штатная функциональность, которая создаёт проводки по ГК "без излишеств" - консолидация. Можно её поковырять или даже взять за основу.
__________________
Михаил Андреев
https://www.amand.ru
Старый 07.07.2008, 11:36   #6  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Я отвечал исходя из того, что у формирования записи вручную - "Цель учебная". Просто научиться их формировать. Полностью согласен, что в LedgerTrans ни в коем случае нельзя формировать записи вручную. Записи средствами SQL вручную обычно можно вставлять только в какие-либо относительно отдельные (не участвующие в бизнес-логике) таблицы, которые специально для этого сделаны. Я такие таблицы использовал, например, при интеграции с какими-либо внешними системами.
Старый 07.07.2008, 11:45   #7  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Цитата:
Записи средствами SQL вручную обычно можно вставлять только в какие-либо относительно отдельные (не участвующие в бизнес-логике) таблицы, которые специально для этого сделаны.
Золотые слова
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 07.07.2008, 11:48   #8  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Полностью согласен. А для специально созданной таблицы и генерировать RecId "по уму" необязательно
__________________
Михаил Андреев
https://www.amand.ru
Старый 07.07.2008, 12:02   #9  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Скажу больше: даже для специально созданной таблицы/таблиц, логичней пользоваться методами и классами Аксапты и уже коннектором манипулировать ими.

В идеале: избегать бизнес-логики вне Аксапты.
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 07.07.2008, 12:09   #10  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Это если коннектор куплен.
Старый 08.07.2008, 17:39   #11  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
1. Коннектора нет
2. Цель реально учебная - на данный момент
3. В реальности хотелось попробывать создать замену трансляции. У нас счет - в счет, ну это почти. Есть отклонения и они впоследствии из базы-приемника не выковыриваются.
4. Не до конца понимаю проблем. Я просто сделаю копию проводок, поменяв идентификатор - dataAreaId на нужную компанию. Пересчитаю итоги. Типа готово.
Попутно заполню табличку RTSLTRANSLOG, ledgertrans and SYSTEMSEQUENCES.
Почему вы говорите, что это плохо. Какие еще выполняются операции при Трансляции?
А что касается консолидации - так она делается медленно тоже, а переделав ее, я получу фактически трансляцию по времени. Средства SQL выполняют данную операцию за 10 секунд.

Последний раз редактировалось Arahnid; 08.07.2008 в 17:42.
Старый 08.07.2008, 19:04   #12  
egorych is offline
egorych
Участник
Самостоятельные клиенты AX
Oracle
 
761 / 154 (7) ++++++
Регистрация: 09.11.2006
Адрес: Краснодарский край
SYSDATABASELOG не заполняете? Или историю по этим табличкам не ведете ?
Старый 09.07.2008, 16:01   #13  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Цитата:
Сообщение от egorych Посмотреть сообщение
SYSDATABASELOG не заполняете? Или историю по этим табличкам не ведете ?
мы не ведем.

Товарищи, которые не рекомендовали так делать, объясните - почему вы все же не рекомендуете так делать?
Пока не увидела ни одной веской причины, что у меня не будет работать.
Старый 09.07.2008, 16:18   #14  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Arahnid Посмотреть сообщение
объясните - почему вы все же не рекомендуете так делать?
В условиях работоспособности вашего варианта решения слишком много "если":
  • если не вести логирование И
  • если правила трансляции останутся счет - в счет И
  • если не понадобится навесить доп.логику на создание проводок в LedgerTrans И
  • если ...
плюс, оно "дороже" в плане сопровождения - тому, кто будет поддерживать такое решение, надо будет:
  • уметь писать хранимки на T-SQL или PL/SQL;
  • иметь соотв. доступ к базам (разработческой, тестовой, рабочей);
  • не забывать переносить отдельно еще и эти хранимки при обновлениях кода;
  • не забыть перенести их на новую базу, если понадобится тиражировать ваше решение;
  • etc...
А в остальном, никто, конечно, не утверждает, что ваше решение не будет работать. Работать оно будет - вопрос лишь, при каких условиях и ценой каких затрат...

PS. Вот еще, вспомнились Безболезненные функциональные спецификации Джоэла Спольски:
Цитата:
Хуже всего, что программист, который потратил 2 недели на написание определенного кода, привязывается к нему душой, независимо от того, насколько тот неправильный. Неважно, что скажут начальник и заказчики Быстряковой. Они не убедят ее выбросить прекрасный код конвертера, даже если он имеет не самую лучшую архитектуру. В результате конечный продукт имеет тенденцию становиться компромиссом между изначально неправильной разработкой и идеальной разработкой. Это было «лучшей разработкой, которую мы могли получить, учитывая то, что мы уже написали весь этот код, и мы просто не хотим его выбрасывать». Это звучит не так хорошо, как «самая лучшая разработка, которую мы могли получить. Точка».
Так что не торопитесь реализовывать ваше решение, подумайте...

Последний раз редактировалось gl00mie; 09.07.2008 в 16:27. Причина: дополнение
За это сообщение автора поблагодарили: oip (2).
Старый 10.07.2008, 11:54   #15  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Все мило. Но какова альтернатива трансляции?

Если даже вообще убрать все условия и просто отмножить проводки, то получается порядка 40 минут. Если использовать SQL время идет секундами. Мне не хотелось лезть в СКУЛЬ, но альтернатива где? Не вижу. Как не изощеряйся средствами аксапты , вставка строк идет очень медленно.

Может кто пдскажет тогда альтернативное решение трансляции с полученим того же результата, что и трансляция. ПРоблема ремени стоит у нас остро.
Старый 10.07.2008, 12:22   #16  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Если даже вообще убрать все условия и просто отмножить проводки, то получается порядка 40 минут. Если использовать SQL время идет секундами. Может кто пдскажет тогда альтернативное решение трансляции с полученим того же результата, что и трансляция. Проблема ремени стоит у нас остро.
Обычно на вставке кучи записей тормоза в Аксапте бывают по нескольким причинам:
  • куча тяжеловесных проверок или сопутствующей логики на insert();
  • настроенное логирование таблицы;
  • выполнение кода, переключающегося в другую компанию (на удивление тормозная операция);
Видимо, в вашем случае дело в последнем пункте, если вы не написали кучу кода в LedgerTrans.insert() и не включали логирование этой таблицы. Тогда выходом может быть оптимизация алгоритма трансляции с тем, чтобы он работал не по одной проводке за раз, а сразу на пачке проводок (с использованием, к примеру, RecordInsertList как буфера-накопителя создаваемых проводок), тем самым сокращая число переключений между компаниями. Посмотрите, к примеру, на методы validateTrans() в классах-наследниках RTSLLedgerConvert (RTSLLedgerTransConvert, RTSLDimensionConvert, RTSLCurrencyConvert) - там дергается changecompany(), и это, получается, происходит по несколько раз для каждой транслируемой проводки. Неудивительно, что процесс трансляции при этом даже на простейших правилах проходит очень долго.
Старый 10.07.2008, 12:36   #17  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,317 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Немного философии
Если смотреть с т.з. консалтинговой конторы - то чем меньше модификаций придется делать - тем это менее затратно (более рентабельно). Т.е. чем больше решение для одного клиента подходит для другого - тем лучше.
Соответственно - чем ближе к стандартному функционалу решение - тем лучше (более обще) - т.к. каждый клиент начинает отталкиваться от стандарта (он известен).
Поэтому консалтинговая контора не заинтересована финансово в таком решении.
Однако вариант - удовлетворить клиента и уйти - тоже не исключен - если это единственный способ избежать убыточности проекта.

Если смотреть с т.з. клиента - то часто распространена позиция "главное шоб работало". Клиенту неважна какая система у него работает - главное - что работает. Однако часто при этом забывается - что при отклонении от стандарта - затрудняется дальнейшее обновление версии. Т.е. получается, что обновить версию становится дороже, чем вручную запрограммировать то, что запрограммировали в Микрософте в новой версии, при условии что это вообще сделать можно (ядро не перепишешь).

Т.е. Ваше решение - оно правильное, работоспособное - и приведет к сиюминутному результату. Вот только все должны адекватно понимать - что оно будет лишено развития со стороны Микрософта. Т.е. это будет не Аксапта - а решение, сделанное на платформе Аксапты.

С другой стороны - конечно - на это можно наплевать. Но через несколько лет - это аукнется совместимостью и отсутствием специалистов по "архаичной" системе (если не тратиться на обновление). Если конечно данный бизнес планирует жить еще несколько лет
__________________
Возможно сделать все. Вопрос времени
Старый 14.07.2008, 11:00   #18  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Что проблема в смене компаний - посмотрю,но мне не удалось поменять трансляцию так, чтобы использовать массовый ввод. Проще переписать.
Старый 14.07.2008, 15:02   #19  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Arahnid Посмотреть сообщение
мне не удалось поменять трансляцию так, чтобы использовать массовый ввод.
Посмотрите в метод \Classes\RTSLLedgerTranslation\processRules. Там идет, насколько я понимаю, выборка исходных проводок LedgerTrans в соответствии с заданными критериями, затем формируется запись во временной таблице и передается на обработку в метод processTransaction(). Этот метод, в свою очередь, делает по большому счету следующее:
  1. проверяет исходную запись по переданному правилу;
  2. проверяет по логу RTSLTransLog, что запись LedgerTrans, на которую ссылается переданная на обработку запись временной таблицы, не была уже обработана;
  3. собственно выполняет трансляцию в соответствии с указанным правилом, формируя новую запись во временной таблице;
  4. обновляет лог RTSLTransLog по обработанной записи.
Здесь пункты 1, 2, 4 выполняются в текущей компании, а вот п.3 (конвертирование с проверками) как раз приводит к многчисленным переключениям в другую компанию (одну и ту же). Какие тут могут быть варианты:
  • накапливать все записи, выбираемые в цикле метода processRules(), перед их последующей обработкой;
  • в таблицу RTSLTransLog добавить поле "код компании", а у самой таблицы сделать SaveDataPerCompany == No, чтобы вести лог можно было, не заботясь о переключениях между компаниями;
  • выполнять одним этапом проверку накопленных ранее записей по переданному правилу и отсеивать записи, не прошедшие проверку;
  • выполнять одним этапом конвертирование записей, прошедших проверку, переключившись предварительно в нужную компанию.
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Проще переписать.
Это кажущаяся простота. Пока правила трансляции у вас остаются "счет - в счет", можно, конечно, нарисовать что-то свое "сбоку", но если понадобится усложнять правила трансляции, то вы фактически будете писать заново то, что уже реализовано в стандартном функционале.
Теги
recid, systemsequences, t-sql, интеграция

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
if (record) vs if (record.RecId) kashperuk DAX: Программирование 18 27.11.2008 18:53
поля, содержащие RecId somebody DAX: Программирование 15 16.05.2008 17:50
Что лучше select RecId или select TableId Logger DAX: Программирование 9 02.06.2007 15:13
aEremenko: Дефрагментация RecID Blog bot DAX Blogs 2 06.03.2007 22:25
Два RecId у одной записи таблицы sparur DAX: Программирование 33 18.12.2006 15:56

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:41.