10.11.2004, 10:28 | #1 |
Участник
|
Оборотно-сальдовая одним запросом ???
Уважаемый All, есть маленькая проблема.
Необходимо разработать оборотно-сальдовую ведомость, в которой обороты разрезаются по нескольким дополнительным аналитикам, например - по датам, по номенклатурным группам. При этом необходим режим "Только итоги по номенклатурным группам", или "Только итоги по датам". В стандартном SQL - это просто GROUP BY. В Аксапта при генерации отчета тоже можно поставить признак "Только итоги". Единственное ограничение - результирующий набор должен извлекаться одним Query. В MS SQL я могу написать оборотно сальдовую одним SQL-запросом: select ItemId, NameAlias, (select (sum(AvailPhysical) from InventSum S where S.ItemId = N.ItemId) as SaldoNow, (select sum(Qty) from InventTrans T where T.ItemId = N.ItemId and DatePhysical < @DateBegin and StatusReceipt > 0) as Obr1In, (select sum(Qty) from InventTrans T where T.ItemId = N.ItemId and DatePhysical < @DateBegin and StatusIssue > 0) as Obr1Out, ... SaldoNow - Obr1In + Obr1Out as SaldoBegin, ...... from InventTable N; Принцип понятен. Используются вложенные запросы. Каждый вложенный запрос я могу оформить отдельной функцией, тогда оборотку можно будет извлечь так: select ItemId, NameAlias, SaldoBegin(ItemId, @DateBegin), ObrIn(ItemId, @DateBegin, @DateEnd), ObrOut(ItemId, @DateBegin, @DateEnd), SaldoEnd(ItemId, @DateEnd), from InventTable; Такой запрос можно джойнить к дополнительным таблицам и получать отчеты с группировками с помощью стандартного Query. Вопрос - такое возможно в Аксапта ? Я просто смотрел код оборотки - там используется цикл, а сальдо и обороты извлекаются отдельными запросами. Соответственно - все промежуточныи итоги и группировки надо програмить явно. А это - очень грустно. Хочется простого и универсального механизма. Заранее благодарен за рассмотрение.
__________________
С уважением, Евгений. |
|
10.11.2004, 11:01 | #2 |
NavAx
|
Re: Оборотно-сальдовая одним запросом ???
Цитата:
Изначально опубликовано stavteam
Вопрос - такое возможно в Аксапта ? Цитата:
Хочется простого и универсального механизма.
P.S. "Оборотно сальдовая ведомость по складу", порочное наследие с тех времен, когда в аксапте никто толком не разбирался. И вообще, поосторожнее с кодом, имеющим суффикс RU ;-)
__________________
Isn't it nice when things just work? |
|
10.11.2004, 11:17 | #3 |
Участник
|
Re: Re: Оборотно-сальдовая одним запросом ???
Цитата:
Изначально опубликовано macklakov
Да, возможно Механизм запросов в аксапте, достаточно универсальный и не слишком сложный, но это не TSQL. P.S. "Оборотно сальдовая ведомость по складу", порочное наследие с тех времен, когда в аксапте никто толком не разбирался. И вообще, поосторожнее с кодом, имеющим суффикс RU ;-)
__________________
С уважением, Евгений. |
|
10.11.2004, 11:33 | #4 |
NavAx
|
Re: Re: Re: Оборотно-сальдовая одним запросом ???
Цитата:
Изначально опубликовано stavteam
не будете ли столь добры ответить - а как же эту простую и порочную вещь сделать средствами Аксапта ?
__________________
Isn't it nice when things just work? |
|
10.11.2004, 11:48 | #5 |
Участник
|
Мой скромный опыт программирования запросв в Axapta (чуть ментьше 2 лет) подсказывает мне что операции группировки и объединения таблиц в Axapta не перестановочны. Т.е. я хочу сказать, что сначала сгруппировать записи в таблицах а потом их объеденить с помощью простого механизма нельзя. Единственный приемлемый способ который я для себя придумал состоит в следующем: результаты вложенных запросов (с группировках) сохраняем во временной таблице, а затем объединяем эти временные таблицы. Если у кого-то есть более приемлимые варианты буду рад их узнать.
|
|
10.11.2004, 12:34 | #6 |
NavAx
|
Цитата:
Изначально опубликовано Ю-ю
Мой скромный опыт программирования запросв в Axapta (чуть ментьше 2 лет) подсказывает мне что операции группировки и объединения таблиц в Axapta не перестановочны. Т.е. я хочу сказать, что сначала сгруппировать записи в таблицах а потом их объеденить с помощью простого механизма нельзя. Единственный приемлемый способ который я для себя придумал состоит в следующем: результаты вложенных запросов (с группировках) сохраняем во временной таблице, а затем объединяем эти временные таблицы. Если у кого-то есть более приемлимые варианты буду рад их узнать.
__________________
Isn't it nice when things just work? |
|
10.11.2004, 13:08 | #7 |
Участник
|
Господа, я не могу в Query задавать вычисляемые поля, которые будут являться подзапросами. В этом вся проблема. Или можно методы таблицы включать в результирующий набор ? Если это так - то спасибо, попробую.
__________________
С уважением, Евгений. |
|
10.11.2004, 13:11 | #8 |
Участник
|
И это тоже, но общий принцип можно сформулировать примерно следующим образом.
С помощью механизма Query и оператора select нельзя таблицы сначала сгруппировать, а затем объединить (если я ошибаюсь, пусть меня поправят). |
|
10.11.2004, 13:23 | #9 |
NavAx
|
Совсем запутался, какие вычисляемые поля, какие подзапросы, зачем? Рассмотрим построение отчета на основе вашего запроса:
1. Строим запрос, в таблицах InventSum и InventTrans задаем агрегатные поля. 2. Создаем переменные, которые будем отображать и display методы для них 3. Переопределяем executeQuery на секции дизайна, а в нем из QueryRun, методами getNo() вынимаем из запроса таблицы и значения полей присваиваем нашим переменным. 4. Набрасываем display методы в дизайн. Вот собственно и все.
__________________
Isn't it nice when things just work? |
|
15.05.2006, 14:54 | #10 |
Участник
|
Цитата:
Изначально опубликовано macklakov
P.S. "Оборотно сальдовая ведомость по складу", порочное наследие с тех времен, когда в аксапте никто толком не разбирался. И вообще, поосторожнее с кодом, имеющим суффикс RU ;-) И в чем же заключается проблемма(ы)? спрашиваю не из праздного любопытства, мы активно пользуемся ОСВ по складу и прочими запросами с суффиксом RU, причем некоторые модифицированы |
|
15.05.2006, 15:13 | #11 |
злыдень
|
Цитата:
Сообщение от stavteam
Вопрос - такое возможно в Аксапта ?
Я просто смотрел код оборотки - там используется цикл, а сальдо и обороты извлекаются отдельными запросами. Соответственно - все промежуточныи итоги и группировки надо програмить явно. А это - очень грустно. Хочется простого и универсального механизма. Заранее благодарен за рассмотрение. Цитата:
Сообщение от stavteam
Хочется простого и универсального механизма.
Кстати, судя по навыкам в скуле Вас должен порадовать MS reporting services
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/ Последний раз редактировалось Recoilme; 15.05.2006 в 15:37. |
|
15.05.2006, 16:02 | #12 |
Участник
|
Подумайте, прежде чем такой запрос пытаться осуществить (на MS-SQL). У него большая вероятность получить несогласованные данные, либо надолго заблокировать работу большого кол-ва пользователей. Как не неприятен ручной механизм получения данных, он все-же позволит избежать узких мест.
С уважением, itfs. |
|
15.05.2006, 16:20 | #13 |
Administrator
|
Вообще, прежде всего надо определиться, что конкретно Вы понимаете под оборотами и сальдо в приложении к Аксапте. Обратите внимание, что в Аксапте есть физическое и финансовое движение, даты которых могут быть расположены совершенно произвольно друг относительно друга. Кроме того, в Аксапте есть два вида возвратов: по отборочной накладной и по инвойсу. Посмотрите, как эти возвраты обрабатываются стандартными отчетами по статусу склада. Вообще, разберитесь для начала с этими отчетами. Ведь в конечном итоге одним из основных критериев правильности Вашего отчета будет соответствие остатков по складу на начало и конец отчетного периода значениям в стандартных отчетах.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
17.05.2006, 17:31 | #14 |
Гость
|
Цитата:
Сообщение от Ю-ю
И это тоже, но общий принцип можно сформулировать примерно следующим образом.
С помощью механизма Query и оператора select нельзя таблицы сначала сгруппировать, а затем объединить (если я ошибаюсь, пусть меня поправят). |
|
21.05.2006, 12:00 | #15 |
Участник
|
А как получить остаток на начало периода, остаток на конец периода,себестоимость (такое же поле как и в стандартном отчете ОСВ) , если я иду по InventTrans,но оборотов за данный период не было?? Заранее благодарен.
|
|
21.05.2006, 12:43 | #16 |
Administrator
|
Тогда, очевидно, Остаток на конец периода = Остаток на начало периода = Остаток на конец предыдущего периода, в котором были обороты. Себестоимости, соответственно, тоже равны.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
21.05.2006, 14:57 | #17 |
Участник
|
2MaximGorbunov: Да это очевидно и для меня. Просто вопрос в том из какой таблицы вытащить остаток на начало и себестоимость. Можно ли из InventSum (если да, то на какую дату ориентироваться), или придется из InventTrans брать сумму до определенного периода CostAmountAdjastmеnt+ CostAmount****(какое втoрое точно не помню так как дома нохожусь и Аксапты нет под рукой)???
|
|
22.05.2006, 12:27 | #18 |
Administrator
|
Теоритически, можно и так, и так. На практике: смотрите классы InventSumPhysical и InventSumFinancial.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|