Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Добрый вечер! Есть таблица с полями ID, Klassificator_Type, Name, Parent_ID. Реально это несколько классификаторов товаров в одной таблице. У одного кода товара (ID) может быть несколько Parent_ID, например: 1, 1, Пиво Балтика, 7 1, 2, Пиво Балтика, 62 1, 3, Пиво Балтика, 184 2, 2, Пиво Fosters, 63 (7 - Пиво Российское, 62 - Пиво Дешевое, 63 - Пиво Дорогое, 184 - Пиво Светлое). Также разумеется есть таблица фактов с полями Date, Item_ID, Qty, Price. Поддерживает ли какой-нибудь аналитический программный продукт (OLAP, Query & Reporting) возможность работы с подобной таблицей? Особенно интересны мнения специалистов по MS AS, BusinessObjects, Cognos и Microstrategy. В данном примере нужно сделать 3 независимых иерархических измерения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2005, 21:37 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Уважаемый Programmer_Ortodox, если не можете ответить на вопрос, потрудитесь писать в другой форум. Здесь таким сообщениям не место. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2005, 23:00 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
На мой взгляд независимо от OLAP инструмента структуру справочника товаров придется привести к виду: ID, Klassificator_Type, Name, Parent_ID, Hierarchy1_ID, Hierarchy2_ID, Hierarchy3_ID. Сделать это можно либо с помощью view, либо физически перестроив таблицу справочника товаров. Я бы рекомендовал последний способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2005, 01:11 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Описание задачи выглядит как классическое many-to-many relationship между аттрибутами, и главная тонкость здесь не столько в том чтобы промоделировать это в OLAP кубе без дупликации членов измерений, а в том чтобы это аггрегировалось как DISTINCT SUM. Делать many-to-many и DISTINCT SUM может Analysis Services 2005. Подробнее об этом например здесь: http://sqljunkies.com/WebLog/sqlbi/archive/2004/10/04/4447.aspx Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2005, 03:29 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
2 Андрей Прохоров: Сделать это можно либо с помощью view, либо физически перестроив таблицу справочника товаров. Этот справочник с иерархией является таблицей в учетной системе, и разработчики системы не позволяют менять ее структуру. Вьюшку тоже не сделать - используется экзотическая СУБД Progess. Есть только доступ через ODBC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2005, 11:59 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
используется экзотическая СУБД Progess. Есть только доступ через ODBC Наверное, на Gestori работаете или на чём-то подобном? Тогда, в любом случае, всё равно придётся данные выгружать в выделенное хранилище на нормальной СУБД. В таком случае, можно спроектировать под любое средство OLAP. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2005, 20:22 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
А в чём проблема? в MS AS 2k можно создать три parent-child измерения, у каждого свой Source Table Filter. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2005, 11:10 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Константин ЛисянскийВ таком случае, можно спроектировать под любое средство OLAP. Dmitry Biryukovв MS AS 2k можно создать три parent-child измерения, у каждого свой Source Table Filter. Мне кажется что Вы все таки упускаете из виду вопрос правильного аггрегирования. В предложенном Вами решениях Балтика будет фигурировать в 3-х разных измерениях и соответсвенно не будет аггрегироваться как DISTINCT SUM. Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 22:38 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
МошаМне кажется что Вы все таки упускаете из виду вопрос правильного аггрегирования. В предложенном Вами решениях Балтика будет фигурировать в 3-х разных измерениях и соответсвенно не будет аггрегироваться как DISTINCT SUM. Не совсем так. Я имел в виду одно измерение товар, в котором три точки входа (три верхних уровня) и один общий уровень - товар. Для Microstrategy это будет одно измерение, поскольку в таблице фактов внешний ключ будет только один (ID товара). В таблице товаров будет три внешних ключа, ссылающихся на три разных таблицы (или иерархии таблиц). Ну, а агрегация в этом случае будет просто SUM. Если вам надо посчитать, сколько продали дешёвого российского пива, делаете фильтр на два атрибута-родителя товара (ценовой диапазон и страна производителя), третье не трогаете. SQL получится тривиальный. По крайней мере так я имел в виду. Очевидно, ошибся по поводу "любого" OLAP-средства. Однако в Cognos и в BO будет то же самое. При чём тут DISTINCT SUM я не понял. Может, объясните вкратце? Да, и неужели AS не умеет работать с разветвляющимися измерениями? С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 23:23 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Константин ЛисянскийВ таблице товаров будет три внешних ключа, ссылающихся на три разных таблицы (или иерархии таблиц). Если бы было 3 разных аттрибута, то конечно проблем нет. Но Guest_321 в своем примере указал, что аттрибут только один. Я правда упустил что в таблице есть еще поле Klassificator_Type, которое в известной мере упрощает задачу. Когда я говорил что есть проблема DISTINCT SUM и double counting, то я имел в виду что если просто наивно создать иерархию с членами "Дешевое", "Российское", "Светлое" - то тогда будет double-counting на уровне All, т.к. пиво может быть и дешевым и светлым и российским. Интересно как Microstrategy решает такую задачу. Впрочем я за Microstrategy не волнуюсь - это ROLAP tool, и у нее не должно быть проблем генерить правильный SQL, даже если выбран multi-select "Дешевое" или "Светлое". А вот как с этим справляется Cognos - действительно интересно. Константин ЛисянскийДа, и неужели AS не умеет работать с разветвляющимися измерениями? Откровенно говоря, AS2K действительно не очень хорошо справляется с такими моделями. Можно конечно сделать, но надо будет сильно постараться. А вот AS2005 - без проблем. Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 00:09 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Guest_3212 Андрей Прохоров: Сделать это можно либо с помощью view, либо физически перестроив таблицу справочника товаров. Этот справочник с иерархией является таблицей в учетной системе, и разработчики системы не позволяют менять ее структуру. Вьюшку тоже не сделать - используется экзотическая СУБД Progess. Есть только доступ через ODBC. Если строить кубы прямо на оперативной системе, то да, а если иметь все это в хранилище, то там можно сделать все как надо вам, а не разработчикам OLTP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 02:52 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Mosha Откровенно говоря, AS2K действительно не очень хорошо справляется с такими моделями. Можно конечно сделать, но надо будет сильно постараться. А вот AS2005 - без проблем. Имел я с AS2K как раз почти такую задачу. Деиствительно пришлось попотеть. Достаточно нетривиальный дизайн измерения, посему с тривиальным клиентом в том кубе делать нечего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 02:58 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
MoshaОписание задачи выглядит как классическое many-to-many relationship между аттрибутами, и главная тонкость здесь не столько в том чтобы промоделировать это в OLAP кубе без дупликации членов измерений, а в том чтобы это аггрегировалось как DISTINCT SUM. Делать many-to-many и DISTINCT SUM может Analysis Services 2005. Подробнее об этом например здесь: http://sqljunkies.com/WebLog/sqlbi/archive/2004/10/04/4447.aspx Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights Тоже самое могу вам продемострировать и в AS2K. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 03:04 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
МошаА вот как с этим справляется Cognos - действительно интересно В Cognos тоже, на самом деле, не так уж всё гладко. Там создать разветвляющееся измерение можно легко (правда, ограничение таково, что общий уровень может быть только один). Однако есть проблемы с наложением фильтров сразу на несколько веток в клиенте PowerPlay (то есть, дешёвое и светлое в нашем примере). Юрий меня поправит, если это не так. С уважением, Константин Лисянский http://lissianski.narod.ru P.S. Так уж получилось, что орфография заимствованных слов агрегация и атрибут такова, что в них по одной букве г и т. Впрочем, даже многие люди, постоянно говорящие на русском языке тоже делают такую ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 10:00 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
backfireТоже самое могу вам продемострировать и в AS2K. Тем самым осчастливите не одного участника форума. Можно на примере двух измерений времени: Год-неделя-день и год-месяц-день отношение неделя:месяц - many-to-many Либо регион-город-магазин и регион-територия-магазин. отношение город:територия - many-to-many, остальные one-to-many. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 10:37 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Можно на примере двух измерений времени: Год-неделя-день и год-месяц-день отношение неделя:месяц - many-to-many. Тут не только неделя к месяцу many-to-many, но и год из одной иерархии не совпадает с годом из другой иерархии. Либо регион-город-магазин и регион-територия-магазин. отношение город:територия - many-to-many, остальные one-to-many. А как звучит постановка вопроса? Что на выходе вам желательно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 11:46 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
backfire Можно на примере двух измерений времени: Год-неделя-день и год-месяц-день отношение неделя:месяц - many-to-many. Тут не только неделя к месяцу many-to-many, но и год из одной иерархии не совпадает с годом из другой иерархии. Почему? Давайте для простоты считать что год начинается и заканчивается неполной неделей. т.е. года совпадают. backfire Либо регион-город-магазин и регион-територия-магазин. отношение город:територия - many-to-many, остальные one-to-many. А как звучит постановка вопроса? Что на выходе вам желательно? Например, продажи по териториальным единицам. Естественно без дублирования продаж магазинов. Moshaесли просто наивно создать иерархию с членами "Дешевое", "Российское", "Светлое" - то тогда будет double-counting на уровне All, т.к. пиво может быть и дешевым и светлым и российским ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 12:10 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Например, продажи по териториальным единицам. Естественно без дублирования продаж магазинов. А у вас, что один магазин в нескольких территориях находится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 23:41 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
у меня как и у Guest_321 магазины классифицируются по нескольким классификаторам: города и територии. Естественно, что каждый магазин строго в одном городе и строго в одной территории. Но територии к городам - многие ко многим. Есть територии, которые объединяют мелкие города, и есть територии, которые делят крупные города. А теперь берём запрос: територии, города, магазины on rows, Measures.Продажи on columns. В результате не смотря на то, что в каждой строке сумма продаж правильная, Grand Total больше, чем есть на самом деле, т.к. один и тот же магазин появляется в нескольких строках. Судя по ссылке с этим справляется 2005, а решение для 2000? backfire MoshaОписание задачи выглядит как классическое many-to-many relationship между аттрибутами, и главная тонкость здесь не столько в том чтобы промоделировать это в OLAP кубе без дупликации членов измерений, а в том чтобы это аггрегировалось как DISTINCT SUM. Делать many-to-many и DISTINCT SUM может Analysis Services 2005. Подробнее об этом например здесь: http://sqljunkies.com/WebLog/sqlbi/archive/2004/10/04/4447.aspx Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights Тоже самое могу вам продемострировать и в AS2K. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 10:57 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Вообще то я пытался разделить две разные проблемы, но они почему то все время путаются :) Когда внутри измерения у атрибутов отношение many to many, как например недели к месяцам, то это более простая задача. Все равно они 1-to-many к ключу измерения (дни), который фигурирует в fact table. А вот когда атрибут одного измерения имеет many-to-many relationship к атрибуту другого измерения, и не связан напрямую с fact table, вот тогда дело сложнее. Например в fact table есть ключ по продукту (пиво) и measure "Продажи", но характеристики продукта (светлое, дешевое и т.д.) в fact table не хранятся, потому что им там не место - им место в другой таблице, где продаж нету, а есть только характеристики продукта. С первой проблемой Константин Лисянский описал как справляются OLAP продукты - строят "разветвляюшуюся иерархию". А вот про вторую проблему, которая решается в AS2005 при помощи many-to-many dimensions, никто почему то не говорит, хотя она на мой взгляд гораздо более интересная. backfire - когда Вы говорили что решали это на AS2K, Вы имели в виду первую или вторую проблему ? Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 11:26 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
У меня, например, - вторая. Измерения: города и територии. Отношение между ними многие ко многим. В таблице фактов - только ключ измерения магазины. А в таблице магазинов уже хранятся его атрибуты: город и територия. В любом случае хотелось бы видеть решения г-на backfire по любой из двух проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 12:20 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Dmitry BiryukovУ меня, например, - вторая. Измерения: города и територии. Отношение между ними многие ко многим. В таблице фактов - только ключ измерения магазины. А в таблице магазинов уже хранятся его атрибуты: город и територия. В любом случае хотелось бы видеть решения г-на backfire по любой из двух проблем. Тогда я что то не пойму в вашем дизайне. Вы же писали, что у вас 2 измерения (одно измерение с 2 мя иерархиями) 1. Регион-Город-Магазин 2. Регион-Територия-Магазин Обе иерархии (измерения) имеют одинаковый листовой уровень. Правильно? в любом случае у вас таблица фактов связана с таблицей магазинов по одному полю в одношении один-к-многим. Так что это подпадает под случай 1. (по Моше) Во вторых. Что такое Grand Totals? В MDX нет такой функции. (Приведите лучше MDX запрос, который возвращает вам неправильные суммы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 12:47 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Moshabackfire - когда Вы говорили что решали это на AS2K, Вы имели в виду первую или вторую проблему ? Моша ---------------------------------------------------- This posting is provided "AS IS" with no warranties, and confers no rights Я имел ввиду вторую проблему. В двух словах ее не изложить. Напишу более подробно на выходных. Сейчас времени нет даже 15 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 12:51 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
4 плоских измерения: регион,город,територия,магазин Grand Total - это то, что выводит Excel в последней строке(колонке) MDX SELECT HIERARCHIZE({[Measures].[Sales]}) DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON COLUMNS , CROSSJOIN(HIERARCHIZE({DrillDownLevel({[Area].[All Area]})}), HIERARCHIZE({DrillDownLevel({[City].[All City]})})) DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM [Sales] WHERE ([Region].[Region].&[1]) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 13:18 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
запустив этот mdx в MDX Sample Application увидел, что Grand Total - это первая строчка, т.е. ([All Area], [All City], [Sales], [Region].&[1]) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 13:42 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Dmitry Biryukov4 плоских измерения: регион,город,територия,магазин Grand Total - это то, что выводит Excel в последней строке(колонке) MDX SELECT HIERARCHIZE({[Measures].[Sales]}) DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON COLUMNS , CROSSJOIN(HIERARCHIZE({DrillDownLevel({[Area].[All Area]})}), HIERARCHIZE({DrillDownLevel({[City].[All City]})})) DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM [Sales] WHERE ([Region].[Region].&[1]) Правильно ли я понимаю, что регион,город,територия это виртуальные измерения и в схеме куба они связаны только с таблицей магазин? Если это так, то ваш запрос ни при каком раскладе не вернет "двойной" счет. Если Excel сам там ничего не напортачит. У меня таких use case навалом и даже в Excel все правильно. Только что проверил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 16:08 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
backfireПравильно ли я понимаю, что регион,город,територия это виртуальные измерения и в схеме куба они связаны только с таблицей магазин? Если это так, то ваш запрос ни при каком раскладе не вернет "двойной" счет. Если Excel сам там ничего не напортачит. У меня таких use case навалом и даже в Excel все правильно. Только что проверил Ваша феноменальная способность видеть дизайн куба на расстоянии меня поражает! Всё верно. И у меня двойного счёта нет. Раньше был, сейчас избавился путём создания многоуровневого измерения (листья - магазины) и виртуальных измерений на каждый уровень. Меня сейчас интересуют возможные решения в других более сложных ситуациях. Проблемы описаны Мошей, а вашего решения придётся ждать аж до понедельника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 16:14 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Dmitry BiryukovИ у меня двойного счёта нет. Раньше был, А кто ж тогда сегодня писал о двойном счете не далее чем сегодня несколько часов назад? Dmitry BiryukovВ результате не смотря на то, что в каждой строке сумма продаж правильная, Grand Total больше, чем есть на самом деле, т.к. один и тот же магазин появляется в нескольких строках. Тень отца Гамлета? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 16:35 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
я рассказывал о том, что было и о том что может быть так где же всё-таки обещанный рассказ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2005, 17:30 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
Dmitry Biryukovя рассказывал о том, что было и о том что может быть так где же всё-таки обещанный рассказ? Вариантов решения может быть 2. 1. Вводим "избыточное измерение". На нашем примере "признаки пива". У него должен быть мембер "все пиво", на том же уровне, что и другие признаки (или Data_Member в Parent/Child измерении). Этот мембер является default member измерения. При таком подходе + аггрегаты рассчитаны. - количество строк в кубе больше чем количество строк в таблице фактов - multiple select на данном измерении не работает. 2. Подход. Построить куб с таблицей фактов "признаки пива". Затем свести его в виртуальный с основным. В этом случае запрося с "признакам пива" на Axes получать одним из нескольких способов: - с помощью MDX (стандартные клиенты a la Excel тогда отпадают) - Cell Calculation (работает только в AS EE, который есть далеко не у всех :-( - .... ну кто еще что придумает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 10:56 |
|
||
|
Хитрая иерархия (классификатор)
|
|||
|---|---|---|---|
|
#18+
2 Mosha: В данном примере нужно сделать 3 независимых иерархических измерения. А вот как с этим справляется Cognos - действительно интересно. В Cognos эта задача решается следующим образом: 1) Создается 3 алиаса к справочнику товаров 2) Между таблицей фактов и каждым из алиасов к таблице справочника товаров делается связь, например: T1.Item_ID = T2.ID and Klassificator_Type = 1. То есть связь - не поле к полю, а более сложная. 3) Поля этих алиасов используются для создания трех независимых измерений в OLAP-кубе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2005, 19:50 |
|
||
|
|

start [/forum/topic.php?all=1&fid=49&tid=1871505]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 423ms |

| 0 / 0 |
