Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
Добрый день! AS2k sp3 Думаю, следует начать описание задачи со структуры данных, служащих основой для таблицы фактов куба. Вот, та часть, которая понадобится: Код: plaintext Дальше получился куб, с мерами Сумма отгрузки и Сумма опаты и измерением Дата (упрощенно). Нужно посчитать сумму просроки на конец периода. Это сумма разности мер (Сумма отгрузки - Сумма опаты) за выбранный период. Сумма считается только по строкам, у которых поле "Оплатить до" меньше поля "Дата". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 12:36 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
Простите за неточность. Не меньше поля "Дата" конечно, а меньше последнего дня выбранного члена измерения "Время", т.е. меньше конца выбранного периода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 12:41 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
Выскажу свои соображения. Поскольку строки агрегируются, вытащить их поле "Оплатить до", чтобы сравнить с концом периода в первозданном виде невозможно. Агрегировать его тоже нельзя :) Мне поможет измерение, которое сможет "достать" каждую строку по отдельности. Именно поэтому было введено поле "Ид" - уникальный идентификатор записи. По нему было построено виртуальное измерение RecId, в качестве листьев соержащее все идентификаторы строк. Дальше нужно было перебрать с помощью этого измерения все строки, сравнить даты и получить сумму разностей. Для перебора строк воспользовался функцией Generate, в надежде на конструкцию Current, но видимо я что-то пишу не так, СМ выдает ошибку на выходе. Код: plaintext 1. 38807 - это я пока для простоты, еще не думал как буду вытаскивать конец периода. Значения поля "Оплатить до" хранятся как int - число дней от 01.01.1900. Это поле я тоже внес в куб как меру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 12:56 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
пардон еще раз, что-то туплю седня крепко (надо было меньше вчера пить) Не виртуальное измерение RecId, а частное. пробовал, кстати, и так Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:00 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
не вдаваясь в подробности самой задачи, с лету, так сказать.. что Вы хотели получить вот от этой конструкции: Код: plaintext Код: plaintext которая вернет Вам сет {[Measures].[Сумма отгрузки]} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:13 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
далее, опять же не влезая сильно в Вашу проблему, а только переделать Ваш CM. Он должен выглядеть примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. а если вдаваться в проблему, то Вам грозит полный передизайн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:20 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
ну плохо я знаю mdx, плохо.. все приходится пробовать методом тыка. а как надо? при тестировании конечно все равно бы понял, что не считает разность, написал бы как-нибудь по другому, благодоря вам сделаю это раньше :) Задачу это не решает в любом случае ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:23 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
можно вдаваться, передизайн так передизайн, куб все равно еще не эксплуатируется, а в стадии разработки так сказать, так что я могу себе это позволить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:26 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
можно, к сожалению сейчас занят, чтобы глубоко влезать еще и в эту задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 13:48 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
хм.. похоже уже и не придется никуда влазить, т.к. предложенный код дал то, что было нужно. За что мерси =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 15:50 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
2 ShIgor а вот еще какой вопрос, вы большой спец по мультиселекту, скажите, можно ли получить последнюю дату в интервале (тот самый конец периода) при мультиселекте? Я написал такой запросик: Код: plaintext isEmpty почему-то не сработал, хотя данных там нет. А в целом запрос дает то, что нужно, но только при условии, что на протяжении всего выбранного периода будет мера [Measures].[Сумма отгрузки]. А в суровой действительности, меры по всему периоду может и не быть, т.е. факты к примеру могут закончиться 15-го мая, а пользователь выберет март, май. И хотелось бы получить именно 31 мая, а не 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 16:30 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
К сожалению я не знаю структуры вашей базы и исходных данных, но одно ясно: измерение multitime в этом случае должно быть построено без привязки к фактам, т.к. сами сказали, что факт может отсутствовать, а дата должна быть. Однако даже в таком случае я затрудняюсь что-либо предложить. Вся проблема в том, что мультиселект это не сет, это агрегат. Если, например из Вашего примера, я еще представляю каким способом можно получить 31 мая, то как получить его же, но при отсутствии в мае фактов вообще - это загадка. Сорри... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 17:31 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
да.. вероятно без фактов и в самом деле не обойтись, но их и вправду может не быть в последний день периода. Ладно, буду объяснять, что с мультиселектом придется распрощатся.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2006, 17:57 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
зачем так усложнять то, господа? Все намного проще. Делаем еще один показатель (либо поле в таблицу фактов добавляем, либо просто view модифицируем). Суть поля такая: newfield = datediff(d, оплатить до, дата оплаты). С помощью этого поля мы легко отфильтруем все строки с задолженностью (где newfield < 0). Далее видится два варианта: 1. В кубе делаете CM, суть которого Measure.[задолженность] = IIF(newfield < 0, сумма оплаты, 0). Автоматически получаем задолженность за месяц (квартал, год) без всяких сумм, tail и прочего неприятного времяпрепровождения. 2. Делаем то же самое в базе - добавляем еще одно поле [задолженность] по формуле, описанной в п1. После этого в кубе просто считаем сумму задолженности, суммируя поле [задолженность] из базы. Сугубо IMHO мои варианты проще в разы и быстрее. И никакого передизайна не требуется, и MDX тоже не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 02:37 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
Вот и передизайн! :) Нормальное решение, однако 31 мая и в этой ситуации не получить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2006, 09:42 |
|
||
|
Сложный CM
|
|||
|---|---|---|---|
|
#18+
К сожалению должен вновь вернуться к данной проблеме. СМ, предложенный ShIgor работает, но при порядке 60-80 тыс. записей за месяц (а в целом их около 1млн и дальше будет больше) клиент просто умирает при обновлении =( Очень долго обрабатывается.. Дело усугубляется еще и тем, что эту же формулу я применил еще к двум другим СМ. В общем караул, давайте придумаем что-нибудь побыстрее плз =) Решение от OldNov не подходит, т.к. нельзя заранее вычислить разницу между Оплатить до и концом периода (как это требовалось в условиях задачи), т.к. конец периода задает пользователь, а значит, он динамический. В целом картина такая: Дата - это дата когда клиент забирает у нас товар. Сумма отгрузки - сумма, на которую товар забрали. Оплатить до - дата, не позднее которой от клиента должны поступить деньги, Сумма оплаты - платеж клиента за товар. Пользователь хочет видеть, есть ли по клиенту просрочка за этот период, т.е. для тех строк, где Оплатить до < конца периода вычисляется разность Сумма отгрузки - Сумма оплаты. Если разность > 0, то это прсрочка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2006, 11:34 |
|
||
|
|

start [/forum/topic.php?fid=49&msg=33753986&tid=1870061]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 359ms |

| 0 / 0 |
