|
|
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
Здравствуйте ! Подскажите пожалуйста, как можно организовать загрузку данных из базы в DataSet по мере надобности этих данных... К примеру имеется несколько тысяч записей в таблице... пользователь последовательно переключает записи и редактирует их... ему же не обязательно иметь сразу все записи в памяти. К тому же если база удаленная это особенно актуально. Буду благодарен за ссылки на материалы по данной теме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2009, 07:47 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2009, 10:40 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
Paging - это же для Web... А про фильтр не совсем понятно... если подразумевается фильтрация записей (св-во RowFilter различ. компонентов), то это не вариант, ведь все равно все записи уже будут извлечены из базы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2009, 13:45 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
Чистяк КонстантинPaging - это же для Web... datagridview paging Чистяк Константинесли подразумевается фильтрация записей (св-во RowFilter различ. компонентов), то это не вариант, ведь все равно все записи уже будут извлечены из базы Фильтровать нужно не локально (RowFilter), а средствами СУБД (SQL запросами, условиями WHERE, динамические фильтры). P.S. Посмотрите линк, который я Вам дал. Там именно это и сделано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2009, 18:24 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
Вот, накидал Вам пример, как это делается. Сделан простейкий юзер контрол GridPager.cs. Для его работы нужно всего-лишь инициализировать его евентом на делегат: GridPager.Page(LoadPage) Sample Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. Фильтрация данных идет средствами SQL сервера, а не локальными средствами источника данных (именно так и нужно работать и отрывать руки разработчикам за локальные фильтры). Paging - это еще более удобное средство навигации по "страницам" грида + оптимальность (не грузим сервер лишними наборами данных). Не представляю, как, вообще, разработчики могут писать программы под БД без динамических серверных фильтров и пейджинга Сорцы: скачать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2009, 10:55 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
МСУ, огромное спасибо за ответы и терпимость к моему непониманию данного аспекта ! Отедльное спасибо за код - на конкретном примере всегда лучше понимается :) Надеюсь больше вопросов не возникнет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2009, 16:33 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
Чистяк КонстантинНадеюсь больше вопросов не возникнет :) Если возникнет вопрос по выборке данных из БД на основе пейджинг-запроса, то В Linq 2 SQL / EF это делается так: Код: plaintext 1. 2. В NHibernate это делается так: Код: plaintext 1. 2. 3. На Transact SQL (2005 сиквел) это делается так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. P.S. Под каждую ORM или чистый SQL - решение может выглядеть по-разному. Главное одно - выбирайте данные с условием Where + Paging - серверными манипуляциями, а не клиентскими. Эта манупуляция заложена в методе LoadPage(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2009, 17:07 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2009, 17:29 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
МСУЧутка допилил контрол, сделал его поюзабельнее :) а зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2009, 18:10 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семкиМСУЧутка допилил контрол, сделал его поюзабельнее :) а зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого 1. Это не в контроле, это отдельное окно, мониторящее происходящее. Его, конечно, нужно убрать потом. 2. Запрос на Count(*) нужен для формирования пейджинга . Это классика. RTFM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2009, 21:58 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
МСУ 2. Запрос на Count(*) нужен для формирования пейджинга . Это классика. RTFM. деточка, какой пейджинг, если твой второй запрос вернет число <=50, т.е. количество элементов, возвращенное в первом запросе? тебя видно бес попутал, что считать-то надо.. RTFM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 00:07 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семкиМСУ 2. Запрос на Count(*) нужен для формирования пейджинга . Это классика. RTFM. деточка, какой пейджинг, если твой второй запрос вернет число <=50, т.е. количество элементов, возвращенное в первом запросе? тебя видно бес попутал, что считать-то надо.. RTFM Сынок, Вы видимо перепили с бодуна - первый запрос возвращает PageSize=50 строк, и как изволите узнать, на сколько страниц мне рисовать paging? Ведь если без пейджинга - то запрос должен вернуть 70 строк. RTFM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 11:18 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семки Берем башку и включаем мозг: // Запрос на Count(*) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Если не сделать Запрос на Count(*), как я узнаю, на сколько страниц мне делать пейджер? Ну, допетрил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 11:26 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
В плане оптимизации, можно, конечно, не делать лишний запрос на Count(*), если первый запрос возвращает Count < PageSize , а не PageSize=50 , как сказали Вы, сынок. Но это только для тех случаев, когда сама выборка меньше PageSize. Код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Но, как понимать вот этот пук не в тему? семячкиа зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого Ась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 11:49 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 11:52 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
МСУВ плане оптимизации, можно, конечно, не делать лишний запрос на Count(*), если первый запрос возвращает Count < PageSize , а не PageSize=50 , как сказали Вы, сынок. Но это только для тех случаев, когда сама выборка меньше PageSize. Нет, даже это не будет работать, тока щас дотумкал. А вот почему: если мы включили последнюю страницу, то она вправе вернуть меньшее кол-во строк, чем сам PageSize. Поэтому, нужны дополнительные танцы с бубном. Поэтому, нужно (так пейджинги и работают) рабоать всегда с: 1. Count(*) 2. Select ... WHERE <Paging> AND <FILEDS> P.S. Даже сам LinqDataSource + GridView + Paging так работает, профайлером снимал запросы Семячки , Вы куда пропали, сынок? RTFM зачитались? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 12:59 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
МСУсемки Берем башку и включаем мозг: // Запрос на Count(*) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Если не сделать Запрос на Count(*), как я узнаю, на сколько страниц мне делать пейджер? Ну, допетрил? да мне как-то пофиг на этот код, выше на скриншоте у тебя два запроса. Накрути свою извилинку на палец и начни вкуривать: первый запрос: 1) select TOP 50 ... from Roles - тут все отлично, получаем первые 50 ролей. 2) select COUNT (*) from ( select TOP 50 ... from Roles ) а тут уже придется поднапрячься и подумать, что это вообще за высер и откуда он взялся? Разберем по частям. Первая часть - это подзапрос, он возвращает как и первый запрос первые 50 записей и сохраняет их во временное хранилище. Вторая часть - это подсчет числа элементов COUNT(*), вот только считает он количество элементов, возвращенное подзапросом. Все ещё накручиваешь на палец? А первый подзапрос у тебя вернет либо 50, либо меньше. Так какой тут пейджинг, а? Может ты в коде все и верно конечно написал, не заметить что пейджинг не работает очень сложно но диагностика у тебя явно выдает какую-то лажу. МСУ Семячки , Вы куда пропали, сынок? RTFM зачитались? не льсти себе, рановато мне ещё к тебе прислушиваться. В отличие от тебя, кододрочера, я спал сном младенца и не думал о сишарпе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 13:43 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семкида мне как-то пофиг на этот код, выше на скриншоте у тебя два запроса. Накрути свою извилинку на палец и начни вкуривать: первый запрос: 1) select TOP 50 ... from Roles - тут все отлично, получаем первые 50 ролей. 2) select COUNT (*) from ( select TOP 50 ... from Roles ) Да мне как-то пофиг на Ваши детские потуги, напряги пупок и вдумайся: 1. Сначала выполняется COUNT(*) 2. Потом выполняется TOP 50 / ROW_NUMBER Разницу улавливаем, сынок? Нет? Тогда продолжаем: Вот это: Код: plaintext 1. 2. не выполнение запроса. Вот это: Код: plaintext выполнение запроса. Сначала: count(*), потом пейджинг-запроса. Ясно, милок? Жмурим щечки и идем читать букварь про linq lazy load и что такое отложенный запрос и с чем его кушают семкиа тут уже придется поднапрячься и подумать, что это вообще за высер и откуда он взялся? Чтобы понять, откуда что взялось, нужно обладать хотя-бы минимумом серого вещества и уметь читать код. Итак, проверим, есть ли у Вас серость и умеете ли Вы читать код? Вот код: http://sql.ru/forum/actualpost.aspx?bid=12&tid=717843&mid=8034559&p=1&act=quot#8026941 Что так когда должно выполняться, Count(*) перед общим селектом или общий селект перед каутном? Ась? семкиРазберем по частям. Ага, поехали семкиПервая часть - это подзапрос, он возвращает как и первый запрос первые 50 записей и сохраняет их во временное хранилище. Какое к черту временное хранилище, дубина - первый запрос это Count(*) семкиВторая часть - это подсчет числа элементов COUNT(*), вот только считает он количество элементов, возвращенное подзапросом. Все ещё накручиваешь на палец? А первый подзапрос у тебя вернет либо 50, либо меньше. Так какой тут пейджинг, а? А вторая часть - это как-раз и подзапрос Детсад Все ещё накручиваешь на ухо? Так пейджинг тут причем или не при чем? Упал со стула, программист-любитель мля семкиМожет ты в коде все и верно конечно написал, не заметить что пейджинг не работает очень сложно но диагностика у тебя явно выдает какую-то лажу Да лажа есть. Но не в коде и не в пейджинге, а у тебя в голове. RTFM, милок :) семкине льсти себе, рановато мне ещё к тебе прислушиваться. В отличие от тебя, кододрочера, я спал сном младенца и не думал о сишарпе. Дядя профессионал, выкручиваться как будем после позорного ведра помоев, которые я слил Вам на голову? :) RTFM или семки? Да, Вы выбираете семки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 14:00 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семки, я понимаю, Вас сбил с понталыку порядок запросов на скрине но это не значит, что они в таком порядке выполняются Вот эту строчку: Код: plaintext нужно было написать перед всеми запросами, а у меня эта строка затесалась ниже. В результате, Ваш тупоголовый ум выкакал: семячкиа зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого Особенно обратим внимание на выделенное "достаточно первого". Сын, Вы действительно считаете, что для формирования пейджинга достаточно первого запроса, да? :) Если да, то отправляйтесь сразу в сад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 14:05 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семки, а хотите последний хук под ребро? :) Держите: не имеет даже значения, кто перед каким запросом выполнился, один фих они оба должны выполниться. Пошевелите полым мозгом и ощутите разницу запросов: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Так что в диагностике как не было проблем, так и нету. Дошло, нет? Первый запрос - чисто для пейжера. Второй запрос - это реальная порция данных с сервера для текущей PageIndex семячкиа зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого Жду ответа на вопрос - достаточно ли первого? :) Ась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 14:17 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
Данилка, ну ты смешной, ей богу. Это ж надо был столько букв ВЫСРАТЬ за такой короткий промежуток времени. Я просто сижу и ржу с твоей предсказуемости. Кстати я посмотрел на твой первый пост с кучей заныканного в спойлер говнокода и понял, откуда у тебя этот бред в логе. Но для начала немного отступим и пожуем вместе твои сопли МСУ семкиПервая часть - это подзапрос, он возвращает как и первый запрос первые 50 записей и сохраняет их во временное хранилище. Какое к черту временное хранилище, дубина - первый запрос это Count(*) семкиВторая часть - это подсчет числа элементов COUNT(*), вот только считает он количество элементов, возвращенное подзапросом. Все ещё накручиваешь на палец? А первый подзапрос у тебя вернет либо 50, либо меньше. Так какой тут пейджинг, а? А вторая часть - это как-раз и подзапрос Детсад ага, т.е. конструкцию вида select count(*) from (select top 50 ... from .. ) as t1 скуль сервер у тебя выполняет в порядке 1) count(*), 2) select top 50 ага, ага, привет соседям по палате :) МСУЖмурим щечки и идем читать букварь про linq lazy load и что такое отложенный запрос и с чем его кушают ба, да никак ты за год подтянул свои знания, браво а теперь применим их на практике и вернемся от твоего ВЫСЕРА к сути вопроса: grid.DataSource = result ; gridPager.Render(totalRecords, result.Count() ); вот тут, деточка, в твой лог оказывается и падают последовательно 1) select top 50 2) select count(*) from (select top 50) а кто-то там про отложенные запросы хотел рассказать и как они выполняются, ась? ну и ещё раз для закрепления вернемся сюда и вспомним, что я там тебе написал семкиа зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого ну а дальше пошел высер на тему пейджинга, от чего я откровенно недоумевал, причем тут оно вообще семкидеточка, какой пейджинг, если твой второй запрос вернет число <=50, т.е. количество элементов, возвращенное в первом запросе ? тебя видно бес попутал, что считать-то надо.. RTFM давно принимаешь галлюциногенные препараты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 14:27 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семкиДанилка, ну ты смешной, ей богу. Это ж надо был столько букв ВЫСРАТЬ за такой короткий промежуток времени. Я просто сижу и ржу с твоей предсказуемости. Ага, а я сижу и ржу с твоей тупости. А что, успех - я Вас научил работать с пейджерами и, самое главное, рассказал что это такое :) семкиКстати я посмотрел на твой первый пост с кучей заныканного в спойлер говнокода и понял, откуда у тебя этот бред в логе. Но для начала немного отступим и пожуем вместе твои сопли Ты ж моя прелесть. Ну ок. семенаага, т.е. конструкцию вида select count(*) from (select top 50 ... from .. ) as t1 скуль сервер у тебя выполняет в порядке 1) count(*), 2) select top 50 ага, ага, привет соседям по палате :) Ооо, да мы реально и код чЕтать не умеем? Врача! А ну-ка по букавкам => какие запросы и в каком порядке выполнятся на сиквеле Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ? Ась? Только отвечайте быстро, не мешкайтесь. Разрешаю читать RTFM. семенавот тут, деточка, в твой лог оказывается и падают последовательно 1) select top 50 2) select count(*) from (select top 50) Ты реально под дурку косишь? Это - правильный запрос, чЕтатель ты наш Сам запрос - это select top 50 А кол-во записей под пеёджер - это select count(*) from (select top 50) + WHERE TOP - Это для PAGE=1 В остальных случаях идет ROW_NUMBER Еще раз осознеам серым веществом этот код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Ась? А кто нам резалтсет генерит? Прааавильно: Код: plaintext 1. 2. можете мне промямлить, как этот запрос отрабатывает в случае PageIndex=0 и в случае PageIndex>0? Ась? Пипец, давно с таким ламером не общался ))) Ну точно, - семки , не более того ;) семкину и ещё раз для закрепления вернемся сюда и вспомним, что я там тебе написал семки а зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого Э, паря? А где ответ на вопрос? :) Я и так знаю, что Вы выпукали "эти" буквы, но ценности в них нет никакой. И это никак не коррелирует с этим: семкидеточка, какой пейджинг, если твой второй запрос вернет число <=50, т.е. количество элементов, возвращенное в первом запросе? тебя видно бес попутал, что считать-то надо.. RTFM Почему? Отвечаю: 1. Запрос Count(*) может вернуть число <=50. И что дальше? 2. Во-вторых, вот в этом высере полоумного: семкиа зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого нигде не говорится о каких-либо условиях. Условия сами что-ли на ходу выдумали? И так, повторяю вопрос: Вы действительно считаете, что для формирования пейджинга достаточно первого запроса, да? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 14:48 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
МСУ семенавот тут, деточка, в твой лог оказывается и падают последовательно 1) select top 50 2) select count(*) from (select top 50) Ты реально под дурку косишь? Это - правильный запрос, чЕтатель ты наш Сам запрос - это select top 50 А кол-во записей под пеёджер - это select count(*) from (select top 50) + WHERE TOP - Это для PAGE=1 В остальных случаях идет ROW_NUMBER ох майн гад, это п....ц реально, "смотрю в книгу, вижу слово из трех букв, мужской половой орган называется" - это про тебя и твой скриншот МСУ Еще раз осознеам серым веществом этот код: да причем тут этот твой код ты перевозбужден, тебе моча в мозги ударила МСУ И так, повторяю вопрос: Вы действительно считаете, что для формирования пейджинга достаточно первого запроса, да? :) да причем тут, тваю мать, пейджинг? ты дебил? // мысли в слух не ну а что, зато Данилка от возбуждения облизал свои десять строчек ещё пятьдесят раз за пол часа и узнал, что порядок запросов оказывается не важен, во всем свои маленькие плюсы жаль только в то что ему говорят вникнуть не смог, мда... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 14:54 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
семкиох майн гад, это п....ц реально, "смотрю в книгу, вижу слово из трех букв, мужской половой орган называется" - это про тебя и твой скриншот Это и всё, что можете сказать по делу, сынуля? Не, ну зачем так сливать сразу Побарахтайтесь еще чутка, ок? семкида причем тут этот твой код ты перевозбужден, тебе моча в мозги ударила Да ладно Вам, я веселюсь Ну так что там у нас по делу? Или увиливаете от прямых вопросов, семянко? ) семкида причем тут, тваю мать, пейджинг? ты дебил? Да, сливаете по-чёрному http://sql.ru/forum/actualpost.aspx?bid=12&tid=717843&mid=8035386&p=1&act=quot#8025650 семкине ну а что, зато Данилка от возбуждения облизал свои десять строчек ещё пятьдесят раз за пол часа и узнал, что порядок запросов оказывается не важен, во всем свои маленькие плюсы жаль только в то что ему говорят вникнуть не смог, мда... За то, что семки узнали сегодня: 1. Что такое пейджинг 2. Зачем он нужен 3. Вот этот выперд: семкиа зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого реально левый и не в кассу 4. о отложенной (lazy) загрузке данных 5. о порядке выполнения запросов ставлю ему твердую тройку. Но на следующую лекцию попрошу Вас прийти более подготовленным, а то нет интереса с ламосом терки тереть P.S. Упал со стула Ламерам зеленый свет! Да, Семки? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 15:03 |
|
||
|
Извлечение данных по мере надобности
|
|||
|---|---|---|---|
|
#18+
Самое шизофреничное от семячек, что меня реально порадовало, это семянаа зачем в контроле в списке скуль запросов справа нужен второй запрос? достаточно первого и семянада причем тут, тваю мать, пейджинг? ты дебил? То есть, чувак пыжится разбираться в пейджинговом запросе, смотрит и анализирует пейджинговые выборки, читает клиентский пейджинговый код, а потом недоумевая выливает: семянада причем тут, тваю мать, пейджинг? Нет, семки, пейджинг тут абсолютно не при чем. Он тут так, случайно затесался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2009, 15:06 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=36353906&tid=1351566]: |
0ms |
get settings: |
4ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
141ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
78ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 458ms |

| 0 / 0 |
