04.07.2008, 23:26 | #1 |
Участник
|
Как сформировать 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 |
Axapta
|
А что-то типа такого не пойдет для генерации 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 |
Участник
|
Цитата:
Но расскажите, пожалуйста, зачем вы в LedgerTrans что-то создаете из SQL, минуя фигову тучу бизнес-логики, которая связана с созданием финансовых проводок? Чего вы такого хорошего планируете получить от вставки записей средствами SQL, что хотите отказаться от штатных аксаптовских механизмов? К слову, у вас реально куплено 8 финансовых аналитик? А если потом 9-ю купите, то что, будете переписывать код вставки? PS. К слову, при "ручном" выделении себе RecId для той или иной компании с целью вставки новой записи в табличку нужно учесть, что DataAreaId в SystemSequences может отличаться от DataAreaId для создаваемой записи, если табличка, в которой создается запись, относится к виртуальной компании. Разруливать, для какой именно компании в том или ином случае выделять RecId, вы будете тоже в хранимой процедурке? Оно, конечно, несложно, только вот стоит ли овчинка выделки... Последний раз редактировалось gl00mie; 07.07.2008 в 11:04. Причина: дополнение |
|
07.07.2008, 11:26 | #4 |
MCTS
|
Цитата:
Но расскажите, пожалуйста, зачем вы в LedgerTrans что-то создаете из SQL, минуя фигову тучу бизнес-логики
"Ручное" создание строк - это очевидная, однако, тупиковая идея.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
07.07.2008, 11:32 | #5 |
Участник
|
Есть штатная функциональность, которая создаёт проводки по ГК "без излишеств" - консолидация. Можно её поковырять или даже взять за основу.
|
|
07.07.2008, 11:36 | #6 |
Axapta
|
Я отвечал исходя из того, что у формирования записи вручную - "Цель учебная". Просто научиться их формировать. Полностью согласен, что в LedgerTrans ни в коем случае нельзя формировать записи вручную. Записи средствами SQL вручную обычно можно вставлять только в какие-либо относительно отдельные (не участвующие в бизнес-логике) таблицы, которые специально для этого сделаны. Я такие таблицы использовал, например, при интеграции с какими-либо внешними системами.
|
|
07.07.2008, 11:45 | #7 |
MCTS
|
Цитата:
Записи средствами SQL вручную обычно можно вставлять только в какие-либо относительно отдельные (не участвующие в бизнес-логике) таблицы, которые специально для этого сделаны.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
07.07.2008, 11:48 | #8 |
Участник
|
Полностью согласен. А для специально созданной таблицы и генерировать RecId "по уму" необязательно
|
|
07.07.2008, 12:02 | #9 |
MCTS
|
Скажу больше: даже для специально созданной таблицы/таблиц, логичней пользоваться методами и классами Аксапты и уже коннектором манипулировать ими.
В идеале: избегать бизнес-логики вне Аксапты.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
07.07.2008, 12:09 | #10 |
Axapta
|
Это если коннектор куплен.
|
|
08.07.2008, 17:39 | #11 |
Участник
|
1. Коннектора нет
2. Цель реально учебная - на данный момент 3. В реальности хотелось попробывать создать замену трансляции. У нас счет - в счет, ну это почти. Есть отклонения и они впоследствии из базы-приемника не выковыриваются. 4. Не до конца понимаю проблем. Я просто сделаю копию проводок, поменяв идентификатор - dataAreaId на нужную компанию. Пересчитаю итоги. Типа готово. Попутно заполню табличку RTSLTRANSLOG, ledgertrans and SYSTEMSEQUENCES. Почему вы говорите, что это плохо. Какие еще выполняются операции при Трансляции? А что касается консолидации - так она делается медленно тоже, а переделав ее, я получу фактически трансляцию по времени. Средства SQL выполняют данную операцию за 10 секунд. Последний раз редактировалось Arahnid; 08.07.2008 в 17:42. |
|
08.07.2008, 19:04 | #12 |
Участник
|
SYSDATABASELOG не заполняете? Или историю по этим табличкам не ведете ?
|
|
09.07.2008, 16:01 | #13 |
Участник
|
|
|
09.07.2008, 16:18 | #14 |
Участник
|
В условиях работоспособности вашего варианта решения слишком много "если":
PS. Вот еще, вспомнились Безболезненные функциональные спецификации Джоэла Спольски: Цитата:
Хуже всего, что программист, который потратил 2 недели на написание определенного кода, привязывается к нему душой, независимо от того, насколько тот неправильный. Неважно, что скажут начальник и заказчики Быстряковой. Они не убедят ее выбросить прекрасный код конвертера, даже если он имеет не самую лучшую архитектуру. В результате конечный продукт имеет тенденцию становиться компромиссом между изначально неправильной разработкой и идеальной разработкой. Это было «лучшей разработкой, которую мы могли получить, учитывая то, что мы уже написали весь этот код, и мы просто не хотим его выбрасывать». Это звучит не так хорошо, как «самая лучшая разработка, которую мы могли получить. Точка».
Последний раз редактировалось gl00mie; 09.07.2008 в 16:27. Причина: дополнение |
|
|
За это сообщение автора поблагодарили: oip (2). |
10.07.2008, 11:54 | #15 |
Участник
|
Все мило. Но какова альтернатива трансляции?
Если даже вообще убрать все условия и просто отмножить проводки, то получается порядка 40 минут. Если использовать SQL время идет секундами. Мне не хотелось лезть в СКУЛЬ, но альтернатива где? Не вижу. Как не изощеряйся средствами аксапты , вставка строк идет очень медленно. Может кто пдскажет тогда альтернативное решение трансляции с полученим того же результата, что и трансляция. ПРоблема ремени стоит у нас остро. |
|
10.07.2008, 12:22 | #16 |
Участник
|
Цитата:
Сообщение от Arahnid
Если даже вообще убрать все условия и просто отмножить проводки, то получается порядка 40 минут. Если использовать SQL время идет секундами. Может кто пдскажет тогда альтернативное решение трансляции с полученим того же результата, что и трансляция. Проблема ремени стоит у нас остро.
|
|
10.07.2008, 12:36 | #17 |
Administrator
|
Немного философии
Если смотреть с т.з. консалтинговой конторы - то чем меньше модификаций придется делать - тем это менее затратно (более рентабельно). Т.е. чем больше решение для одного клиента подходит для другого - тем лучше.
Соответственно - чем ближе к стандартному функционалу решение - тем лучше (более обще) - т.к. каждый клиент начинает отталкиваться от стандарта (он известен). Поэтому консалтинговая контора не заинтересована финансово в таком решении. Однако вариант - удовлетворить клиента и уйти - тоже не исключен - если это единственный способ избежать убыточности проекта. Если смотреть с т.з. клиента - то часто распространена позиция "главное шоб работало". Клиенту неважна какая система у него работает - главное - что работает. Однако часто при этом забывается - что при отклонении от стандарта - затрудняется дальнейшее обновление версии. Т.е. получается, что обновить версию становится дороже, чем вручную запрограммировать то, что запрограммировали в Микрософте в новой версии, при условии что это вообще сделать можно (ядро не перепишешь). Т.е. Ваше решение - оно правильное, работоспособное - и приведет к сиюминутному результату. Вот только все должны адекватно понимать - что оно будет лишено развития со стороны Микрософта. Т.е. это будет не Аксапта - а решение, сделанное на платформе Аксапты. С другой стороны - конечно - на это можно наплевать. Но через несколько лет - это аукнется совместимостью и отсутствием специалистов по "архаичной" системе (если не тратиться на обновление). Если конечно данный бизнес планирует жить еще несколько лет
__________________
Возможно сделать все. Вопрос времени |
|
14.07.2008, 11:00 | #18 |
Участник
|
Что проблема в смене компаний - посмотрю,но мне не удалось поменять трансляцию так, чтобы использовать массовый ввод. Проще переписать.
|
|
14.07.2008, 15:02 | #19 |
Участник
|
Цитата:
|
|
Теги |
recid, systemsequences, t-sql, интеграция |
|
Похожие темы | ||||
Тема | Ответов | |||
if (record) vs if (record.RecId) | 18 | |||
поля, содержащие RecId | 15 | |||
Что лучше select RecId или select TableId | 9 | |||
aEremenko: Дефрагментация RecID | 2 | |||
Два RecId у одной записи таблицы | 33 |
|