|
|
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Подскажите есть ли в природе какие-нибудь наработки по взаимодействию с sql сервером ( 2005 ). Интересуют "комплексные" решения по подключению, взаимодействию, обработке ошибок, обработке обрыва связи и т.п. Приступаю к написанию клиента - хотелось бы посмотреть как граммотно реализовать работу. Думаю, что должно быть реализованно через класс - прослойку, который и возьмет на себя всю работу по синхронной/асинхронной передаче, обработке ошибок и т.д. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 05:48 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat Подскажите есть ли в природе какие-нибудь наработки по взаимодействию с sql сервером ( 2005 ). Интересуют "комплексные" решения по подключению, взаимодействию, обработке ошибок, обработке обрыва связи и т.п. Приступаю к написанию клиента - хотелось бы посмотреть как граммотно реализовать работу. Думаю, что должно быть реализованно через класс - прослойку, который и возьмет на себя всю работу по синхронной/асинхронной передаче, обработке ошибок и т.д. Posted via ActualForum NNTP Server 1.4 "Все уже изобретено до нас..." (не помню чьё) Есть АДО, можно им работать; В Фоксе есть работа через ОДБЦ. См. в справке статьи по SqlStringConnect, SqlExec и т.д. В "старших" версиях есть еще курсорадаптеры, но с ними я не работал. А вот АДО и ОДБЦ юзал... ОДБС в Фоксе проще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 07:10 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Очень хорошие и серьезные наработки в этом плане у Алексея Климова - ходи на его сайт и прозрееш :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 11:17 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
"Станислав С...кий" <nospam@sql.ru> сообщил/сообщила в новостях следующее: news:5195147@sql.ru... "Все уже изобретено до нас..." (не помню чьё) В Фоксе есть работа через ОДБЦ. См. в справке статьи по SqlStringConnect, SqlExec и т.д. Года три назад писал клиента с доступом к sql 2000. Все команды на сервер передавал через свой собственный класс, которыйотлавливал ошибки связи и проч. Работал в синхронном/асинхронном режиме и т.д. Сейчас все забылось. Востановить оссобых проблем нет, но кто сказал, что я выбрал правильную идеологию в то время? Хотелось бы посмотреть готовые каркасы, классы по работе с sql сервером, которые возможно где-нить обсуждались, коллективно дорабатывались именно с целью ознакомления с технологией наиболее оптимального решения по взаимодейстию клиента с сервером. Понятно, что после все перелопачу (а может и не все) под собственные нужды. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 12:29 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
"CTAC-KO" <nospam@sql.ru> сообщил/сообщила в новостях следующее: news:5196173@sql.ru... Автор: CTAC-KO Очень хорошие и серьезные наработки в этом плане у Алексея Климова - ходи на его сайт и прозрееш :) Тема Ответить Сообщение А вот за это спасибо - посмотрю!!! Может кто еще подскажет куда можно посмотреть? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 12:32 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
автор ... Это взаимодействие происходит с помощью драйвера ODBC посредством передачи команд SQL с использованием функции SQLEXEC. Использование этой функции приводит к необходимости трудоемкого чтения и обновления данных в таблицах БД. Такой подход приводит к необходимости использовать разработчиков, имеющих достаточную квалификацию, понимающие принципы взаимодействия и владеющие знаниями для работы с SQL сервером. Т.к. способ хранения данных, типы полей в таблицах SQL сервера отличаются от типов данных, с которыми может производить вычисления среда FoxPro, разработчики вынуждены контролировать эти различия, производить трудоемки и ресурсоемкие преобразования. Разработчики вынуждены изменять данные на сервере также с помощью отдельных и сложных команд, приемов и способов. Абстракция при таком способе отсутствует. Никаких абстрактных классов, объектов в клиентской части ПО .... не создано и не используется. Трудоемкость и невозможность разработчиками уследить все ситуации приводит к появлению многочисленных ошибок. Незначительные изменения структуры таблиц, хранящихся на сервере SQL приводят к большим трудозатратам по изменению SQL запросов, приведению типов данных к нужному виду, переписыванию отдельных модулей клиентской части (иногда к значительному изменению алгоритмов). Данный способ работы с SQL сервером в версии FoxPro группой разработчиков среды считается неоптимальным и для этого в новых версиях создан абстрактный базовый класс – курсорадаптер. В случае использования VFoxPro 9 можно предложить альтернативный вариант разработки клиентской части с применением улучшенного класса – курсорадаптера. Курсорадаптер – это визуальный класс, который облегчает разработку клиент-серверного приложения, позволяет создавать абстрактные классы, которые автоматически производят преобразование типов данных, изменение данных в таблицах на MS SQL сервере. Курсорадаптер позволяет получать буферизованные (обновляемые) курсоры, с пом. данного класса легко и логично строятся алгоритмы работы с сервером. Курсорадаптер позволяет создать библиотеки визуальных классов и перейти к объектно-ориентированному программированию. Класс курсорадаптер поддерживает обработку широкого ряда источников данных, как если бы они были родными курсорами Visual FoxPro. Типы этих источников данных перечислены ниже: - Родные VFP - Open Database Connectivity (ODBC) - ActiveX Data Object (ADO) - Extensible Markup Language (XML) Объекты CursorAdapter позволяют: - Динамическое использование различных источников данных. - Использование источника данных либо объекта CursorAdapter, либо DataEnvironment. - Совместное использование источников данных в предедах технологии источника данных. - Необязательное определение структуры курсора, связанного с объектом CursorAdapter. - Управление загрузкой данных из источника данных в курсор Visual FoxPro, связанный с объектом CursorAdapter. - Разбор данных, полученных из различных источников данных в курсоры Visual FoxPro, основанный на типе источника данных. - Управление через свойства и методы CursorAdapter добавлением, обновлением и удалением данных. - Возможность добавлять объекты CursorAdapter в контейнеры отличные от DataEnvironment, такие как формы, наборы форма и прочие контейнеры. Использование класса CursorAdapter, как самостоятельного класса без связи с Data Environment. - С объектами CursorAdapter, источник данных представляется просто трубой к слою трансляции, который предоставляет данные из источника данных в курсор Visual FoxPro. При использовании курсорадаптера, Visual FoxPro автоматически генерирует SQL INSERT, UPDATE и DELETE команды для местных (local) и удаленных (remote) представлений. При работе с объектами CursorAdapter можно настраивать и управлять тем, как Visual FoxPro генерирует эти SQL INSERT, UPDATE и DELETE команды. Класс курсорадаптер автоматически отслеживает определенные события, происходящие в процессе взаимодействия с источником данных. В Visual Foxpro 9 класс курсорадаптер имеет возможность автоматически конвертировать(преобразовывать) типы данных из таблиц сервера к необходимым типам в локальные(родные) курсоры Visual Foxpro. В Visual Foxpro 9 класс курсорадаптер имеет возможность обновлять данные в локальном курсоре (делать актуальными) (отдельные или весь курсор в целом). Имеется возможность иметь всегда актуальные данные на клиенте, отслеживать попытки изменения пользователями записей, измененные другими пользователями в момент простоя рабочих станций. Применение такого способа взаимодействия с сервером дает возможность разрабатывать клиентскую часть программистам, имеющим низкую квалификацию (не имеющим обширных знаний Tsql). При написании библиотек визуальных классов с использованием принципов и правил объектно-ориентированного программирования, позволит программистам настраивать Data-сущности(объекты) с помощью визуальных компонентов значительно ускорится разработка и исправление допущенных ошибок. Применение определенных подходов (буферизация, хранение и выполнение только скомпилированного Byte-кода) значительно оптимизирует работу клиентской части ПО. Крайне необходимые улучшения базового класса курсорадаптера появились только в 9-й версии VoxPro. Без этих улучшений невозможно создать оптимальные библиотеки визуальных классов. ...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 13:00 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 13:00 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Я работаю через самописный класс Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2008, 13:43 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
"foxwizard" <nospam@sql.ru> сообщил/сообщила в новостях следующее: news:5197577@sql.ru... Автор: foxwizard Я работаю через самописный класс ..... Вот спасибо, У меня класс уже готовый, навороченный, а самое главное идеологически правильный. А теперь я умею создавать объект этого класса и вызывать на выполнение его методы!!! Ты бы методы класса привел - вот это была бы тема! Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 06:46 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
прошелмимоК сообщению приложен файл (ODBC.ZIP) Спасибо. На досуге обязательно проанализирую! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 07:00 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
oApp.ncon- дискриптор подключения метод con - подключение к серверу Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. discon Method Class: appclass Source Code Код: plaintext 1. 2. 3. 4. 5. 6. dosql Method Class: appclass Source Code Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 07:33 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Автор: foxwizard Ну и метод con, естественно вызывается в событии init ??? А в destroy вызывается disconect ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 10:41 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Автор: foxwizard Ну как минимум сразу недостатки: Нет реализации асинхронного доступа к данным (а ведь не везде нужен синхронный) нет обработки ошибок подлючения/выполнения запросов, кроме MessageBox. Функции всегда возвращают .t. , хотя правильнее при неудаче возвращать "код ошибки" или хотябы .f. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 10:47 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Galyamov RinatНу как минимум сразу недостатки: ... Разработку фреймворков уже не раз обсуждали. Поиск по форуму поможет. Самый идеальный вариант, когда разработчик сам его напишет, т.к. работа класса-оболочки учитывает особенности стиля программирования и предпочтений конкретного разработчика. Любая оболочка создает ограничения использования по сравнению с имеющимися средствами фокса, избавление от ограничений (полное повторение функционала фокса) означает создание инструмента такого же уровня сложности, что и средства фокса. Упрощения требуют только те операции, которые выполняются одинаково во многих местах кода. Чтобы не копипастить постоянно. Например, если в одном месте одного проекта нужен асинхронный запрос, то там его и надо прописать, а не пытаться включить его в класс используемый во всех своих проектах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 10:59 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
"Dima T" <nospam@sql.ru> сообщил/сообщила в новостях следующее: news:5201833@sql.ru... >Самый идеальный вариант, когда разработчик сам его напишет, т.к. работа >класса-оболочки учитывает особенности стиля программирования и предпочтений >конкретного >разработчика. Ну я же так и писал: "Понятно, что после все перелопачу (а может и не все) под собственные нужды." Мне сейчас нужно просто посмотреть готовые решения, чтобы не изобретать велосипед, а просто "поставить свои колеса". >Любая оболочка создает ограничения использования по сравнению с имеющимися >средствами фокса, Здесь я с тобой не согласен. Во первых "имеющимиеся средства фокса" никто не запрещает использовать. Во вторых обертывание этих средств будет скорее обобщением, а не ограничением. Опять таки я ни разу не пожалел, что стандартные классы "textbox", и т.д. обернул в свои и заменил/дополнил код в некоторых событиях + изначально большинство свойств выставил по умолчанию такими, какие мне нужны. Ну а где надо выставить другие значения свойств - там и меняю. >Упрощения требуют только те операции, которые выполняются одинаково во >многих местах кода. Чтобы не копипастить постоянно. Опять таки в тот же sqlexec() можно уже не передавать хандлер соединения, не заботится о том валиден он или нет, произошел обрыв связи или что - то еще случилось. В метод класса просто передаем саму комманду, которую надо выполнить на стороне сервера - остальное забота самого объекта этого класса!!!! (В том числе логиррование ошибки и/или сообщение пользователю о возникших проблеммах) Если произошла ошибка мне уже не надо после каждого вызова sqlexec() анализировать почему она произошла. Метод может только вернуть булево значение удалось или нет выполнить эту комманду. Нужна детализация почему не получилось выполнить комманду? - даем запрос другому методу, который вернет числовое/символьное описание ошибки. >Например, если в одном месте одного проекта нужен асинхронный запрос, то >там его и надо прописать, а не пытаться включить его в класс используемый >во всех своих проектах. poSQL.AsincSQLEcex(....), poSQL.SincSQLEcex(....) не вижу проблем (ну или даже через необязательный параметр передавать как нужно выполнить синхронно или же нет) И кто говорит, что класс по работе с SQL должен обязательно использоваться во всех моих проектах??? А даже если и так, то описание класса займет очень не много места, а тем более добавление двух трех "специфичных" на твой взгляд методов в этот класс. Ну и наконец, в сам класс инкапсулируются всевозможные примочки и вкусности, которые копи/пастом делать совсем не хочется. Ваше мнение осатлось прежним : "Любая оболочка создает ограничения использования"? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 12:27 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat Ваше мнение осатлось прежним : "Любая оболочка создает ограничения использования"? Мнение не изменилось, и дискутировать по этому поводу надоело. Интересно что я думаю - поиск по форуму. Тут например почитай Коротко: Свои классы делал я сам для себя, с учетом собственных потребностей и объяснять почему там нет того или этого не намерен - если нет значит мне не надо, будет надо - сразу добавлю. Поэтому и считаю что подобные наработки дело сугубо индивидуальное. Пользуюсь КА. На нем построена библиотека стандартных форм. Есть класс-обертка для SQLEXEC() Код: 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. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 13:28 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Когда то же примерялся но мне счас нужно только на чтение (да еще из DB2)- поэтому своего фреймворка нет а посмотреть чужй код ради ИДЕЙ это дело полезное - this.Execute('insert into ' + tcTable + '(' + tcFieldList + ') values(' + tcValueList + ') select nNewId = SCOPE_IDENTITY()', 'tnewid') lnId = tnewid.nNewId я вот бы не додумался в 1 строке написать - это обязательно ? или можно в разных коммандах ? to Galyamov Rinat кстати ты и свой код можешь выложить ps почитал по ссылке Dima T вообщем согласен с ним - юзать чужое - иметь проблемы pps to Dima T нельзя ли сюда тоже на базе адаптеров выложить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 16:00 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
я вот бы не додумался в 1 строке написать - это обязательно ? Нет, не обязательно. или можно в разных коммандах ? А там и так две разные команды. Но в одной строке. Разделены пробелом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 16:08 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Гулин Федоря вот бы не додумался в 1 строке написать - это обязательно ? или можно в разных коммандах ? Для SCOPE_IDENTITY() обязательно. Где-то в форуме ВладимирМ обстоятельно описывал что это такое и как это едят. Гулин Федорpps to Dima T нельзя ли сюда тоже на базе адаптеров выложить Это библиотека форм, на 9-ке решил с нуля переделать, еще в стадии активного дописывания. На 6-ке с DBF все проекты. Сами CA обычные без оболочек. В DE формы кладу. Генерю автоматом, потом руками причесываю (генератор в файлике). Много привязок к моим правилам именования таблиц, полей, индексов, объектов. Т.е. это комплекс правил, выдрать из которого кусок невозможно. Точнее будет непонятно что к чему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 16:46 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Dima T..Для SCOPE_IDENTITY() обязательно... Ну я бы не стал утверждать категорчино :) А если у меня ключи в таблице генерятся не с помощью свойства таблицы IDENTITY, а например, с помощью типа данных uniqueidentifier и фунции сервера NewID(). С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 18:24 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Aleksey-K Dima T..Для SCOPE_IDENTITY() обязательно... Ну я бы не стал утверждать категорчино :) А если у меня ключи в таблице генерятся не с помощью свойства таблицы IDENTITY, а например, с помощью типа данных uniqueidentifier и фунции сервера NewID(). С уважением, Алексей Ты прочитал что написал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 18:45 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Да... пятница, пиво,... дают знать..:) "катеГОРЧИЧНО" это я сильно. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 19:13 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Черт.... опять ошибся... Все, на сегодня хватит... С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2008, 19:14 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
Galyamov Rinat Автор: foxwizard Ну как минимум сразу недостатки: Нет реализации асинхронного доступа к данным (а ведь не везде нужен синхронный) нет обработки ошибок подлючения/выполнения запросов, кроме MessageBox. Функции всегда возвращают .t. , хотя правильнее при неудаче возвращать "код ошибки" или хотябы .f. Posted via ActualForum NNTP Server 1.4 Что мешает добавить в класс свойство asynchronous ? = SQLSETPROP(this.ncon, 'asynchronous', this.asynchronous) Мне не надо. >нет обработки ошибок подлючения/выполнения запросов, кроме MessageBox. А должны быть ошибки выполнения запросов? Только в процессе разработки. Мне MessageBox с текстом запроса, вызвавшего ошибку достаточно.А пользователь, если он сможет (а ктож ему даст) выполнить запрос с ошибкой все равно ничего не это не даст. >Ну и метод con, естественно вызывается в событии init ??? >А в destroy вызывается disconect ? Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2008, 08:02 |
|
||
|
Каркас приложения для работы с sql cервером
|
|||
|---|---|---|---|
|
#18+
"Гулин Федор" <nospam@sql.ru> сообщил/сообщила в новостях следующее: news:5204394@sql.ru... > > to Galyamov Rinat кстати ты и свой код можешь выложить > Класс писался в 2002 - ом году и то в качестве "начальной помощи" другому программисту в надежде, что тот доведет класс до ума. До ума никто класс так и не довел. На данный момент этот кусок заброшен и никем не поддерживается. Основные идеи совпадают с реализацией Dima T. Сама реализация естественно отличается, но это уже мелочи. Сейчас надо написать грамотного клиента, но это происходит в промежутках между "срочными" делами (программеров катострофически не хватает - идет реорганизация в конторе). Как напишу клиента, воспользовавшись идеями приведенными здесь + HELP + свои мозги - так обязательно выложу. Хотя бы для того, чтобы услышать объективную критику и исправить недоработки. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2008, 09:07 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35088436&tid=1588054]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 415ms |

| 0 / 0 |
