Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении. / 12 сообщений из 12, страница 1 из 1
06.08.2018, 19:06
    #39683921
eonae
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Express Edition (64-bit) on Windows 10 Home Single Language 10.0 <X64> (Build 16299: )

Уважаемые знатоки!

Довольно нетривиальная (или мне так кажется..) задача.

Есть данные посещения занятий в учебном заведении:

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE Visits
(VisitID [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED,
 LessonID [int] FOREIGN KEY (ClientID) REFERENCES Clients (ClientID)
 ClientID [int] FOREIGN KEY (LessonID) REFERENCES Lessons (LessonID)
 Status [bit] NOT NULL) -- 0 - не был, 1 - был


Таблица Client содержит данные об учениках.

Таблица Lessons имеет примерно такой вид:

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE Lessons
(LessonID [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED,
 UnitID [int] FOREIGN KEY (UnitID) REFERENCES Units (UnitID) -- Unit - есть учебная группа.
 LessonDate [date] NOT NULL),
 ....) --Есть ещё поля, но для задачи они не важны.



И из этих данных необходимо получить ведомость посещения с за определённый месяц и в определённой группе
примерно такого вида:

Client2018-06-012018-06-042018-06-12Jhon Doe111Jane Doe001Alex Mills011Andy Coin101
В общем, как в школьном журнале.

В связи с этим два вопроса:

1) Я вполне себе представляю, как я могу переработать информацию из БД, чтобы получить искомую таблицу на стороне клиента (с#). Но может быть можно каким-то образом делать это на стороне сервера? Средствами T-SQL?

2) Возможно, кто-то может посоветовать другую схему таблиц для хранения этих данных, чтобы получить искомый результат было легче?

Опыта работы с БД нет, но есть производственная необходимость.. Всё делается по наитию. Буду благодарен не только за готовое решение, но и вообще за любую наводку на плодотворную мысль.

Заранее благодарен!
С уважением, Сергей.
...
Рейтинг: 0 / 0
06.08.2018, 19:55
    #39683947
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
Однозначно делать на стороне клиента.

Можете и на стороне SQL Server'a, конечно, PIVOT вам в помощь. Просто вы наверняка захотите dynamic pivot, это тоже возможно, но нафиг такой гемор творить на стороне SQL - не совсем понятно.
...
Рейтинг: 0 / 0
06.08.2018, 20:15
    #39683960
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
eonae ведомость посещения с за определённый месяц и в определённой группе
примерно такого вида:

Client2018-06-012018-06-042018-06-12Jhon Doe111Jane Doe001Alex Mills011Andy Coin101
В общем, как в школьном журнале.

Таки лучше подумать и написать кошерно.

CREATE TABLE Visits
(VisitID [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED,
LessonID [int] FOREIGN KEY (ClientID) REFERENCES Lessons (LessonID)
ClientID [int] FOREIGN KEY (LessonID) REFERENCES Clients (ClientID)
Status [bit] NOT NULL) -- 0 - не был, 1 - был


Начните со списка Clients, присоединив к нему через cross join выборку ВСЕХ дат из таблицы дат. Ну или до максимальной даты LessonDate для выбранного месяца из таблицы Lessons.

А уже потом на пересечении ученика и даты выбирайте нужные значения из Visits. Хотя бы потом, что пересечение ученика и даты может дать несколько разных записей в Lessons - и я никак не пойму, почему Вы в ведомости рисуете 0 и 1.
А если уроков должно было быть 5, а ученик посетил только 4?
Или Вам нужно, чтобы он посетил хотя бы один урок из выбранной даты?
...
Рейтинг: 0 / 0
06.08.2018, 20:16
    #39683961
Andy_OLAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
Andy_OLAP,

Поправлю таки сам себя - присоединив через cross join выборку всех даты выбранного для ведомости месяца.
...
Рейтинг: 0 / 0
06.08.2018, 21:03
    #39683973
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
+1
За то чтобы делать на клиенте.
По описанию это вообще обычный сводный отчет, возможно вам нужно просто выбрать "правильный" тип отчета в вашем reporting framework в c#.
...
Рейтинг: 0 / 0
06.08.2018, 21:47
    #39683979
eonae
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
Большое спасибо за ответы!

Remindно нафиг такой гемор творить на стороне SQL - не совсем понятно
Честно говоря, думал побыстрее работать будет. Конечно, когда речь идёт об одной группе и одном месяце - говорить о производительности смешно. Но если нужно в масштабах учебного центра сделать отчёт - 40 групп за год, скажем.. PIVOT вообще не в курсе - буду гуглить..

Andy_OLAP Хотя бы потом, что пересечение ученика и даты может дать несколько разных записей в Lessons - и я никак не пойму, почему Вы в ведомости рисуете 0 и 1.
А если уроков должно было быть 5, а ученик посетил только 4?
Или Вам нужно, чтобы он посетил хотя бы один урок из выбранной даты?

На самом деле, может быть название Visits не совсем корректно по смыслу. Имеется ввиду статус занятия для данного ученика: Null - не заполнено, 0 - отсутствовал, 1 - присутствовал.. там ещё будет статусы: оплачиваемый пропуск, неоплачиваемый и много чего ещё.
Записи в Visits генерируются автоматически при появлении записи в таблице Lessons, для каждого клиента, привязанного к данной группе. И дальше неважно, пока его "не отвязать", записи для него генерятся, хоть даже его ни разу не было на занятии. Наверное немного путанно объяснил.. С cross join поэкспериментирую обязательно.

Владимир_Затуливетер По описанию это вообще обычный сводный отчет, возможно вам нужно просто выбрать "правильный" тип отчета в вашем reporting framework в c#.
Большое спасибо за наводку. В с# я пока тоже не гуру далеко )). Думал "ручками" делать. Буду смотреть!
...
Рейтинг: 0 / 0
07.08.2018, 14:30
    #39684271
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
eonae,

Пусть в группе 30 человек, в месяце 30 дней, т.е. из таблицы Visits нужно взять 30*30=900 строк и развернуть. Пусть еще и 40 групп. Если это гемор, то что тогда не гемор?

С одной строны " Status [bit] NOT NULL) -- 0 - не был, 1 - был ", с другой стороны " Null - не заполнено, 0 - отсутствовал, 1 – присутствовал "

" Записи в Visits генерируются автоматически при появлении записи в таблице Lessons, для каждого клиента, привязанного к данной группе ".
Действительно, "немного путанно", Lessons – это расписание занятий, формируется один раз в начале семестра, с возможной коррекцией в течение семестра, а Visits заполняется после каждого занятия в соответствии с реальной посещаемостью. Не важно каким способом.
...
Рейтинг: 0 / 0
07.08.2018, 14:46
    #39684285
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
eonaeИ из этих данных необходимо получить ведомость посещения с за определённый месяц и в определённой группе
примерно такого вида:

Отчет всегда будет выдаваться за календарный месяц?
Или возможна выборка за несколько месяцев?
...
Рейтинг: 0 / 0
07.08.2018, 17:37
    #39684413
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
Wlr-lПусть в группе 30 человек, в месяце 30 дней, т.е. из таблицы Visits нужно взять 30*30=900 строк и развернуть. Пусть еще и 40 групп. Если это гемор, то что тогда не гемор?
Для меня гемор - это решать задачи тулзами, которые для этого не предназначены. Да пусть там хоть 1 строка, писать динамический pivot ради этого считаю нецелесообразным. Это как решать data science задачи на чистом T-SQL без использования python и т.п.
...
Рейтинг: 0 / 0
07.08.2018, 18:42
    #39684456
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
RemindОднозначно делать на стороне клиента.

Можете и на стороне SQL Server'a, конечно, PIVOT вам в помощь. Просто вы наверняка захотите dynamic pivot, это тоже возможно, но нафиг такой гемор творить на стороне SQL - не совсем понятно.
можно не динамический, а вполне статический, если "необходимо получить ведомость посещения с за определённый месяц и в определённой группе"
да и группу, можно отображать, при желании

пример с тестовыми данными внизу
идея в том, чтобы выдавать пивотом посещения за следующие 31 день, начиная с интересующей даты

функция
Код: sql
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.
create function fn_show_pivot (@dt datetime)
returns table 
as
return
with data([client],[dt],[presence]) as (
select 'Alex','20180101',1 union all select 'Alex','20180102',1 union all select 'Alex','20180103',0 union all select 'Alex','20180104',1 union all select 'Alex','20180105',1 union all 
select 'Alex','20180106',0 union all select 'Alex','20180107',1 union all select 'Alex','20180108',1 union all select 'Alex','20180109',1 union all select 'Alex','20180110',0 union all 
select 'Alex','20180111',0 union all select 'Alex','20180112',0 union all select 'Alex','20180113',0 union all select 'Alex','20180114',1 union all select 'Alex','20180115',1 union all 
select 'Alex','20180116',0 union all select 'Alex','20180117',1 union all select 'Alex','20180118',1 union all select 'Alex','20180119',1 union all select 'Alex','20180121',0 union all 
select 'Alex','20180122',1 union all select 'Alex','20180123',1 union all select 'Alex','20180124',1 union all select 'Alex','20180125',0 union all select 'Alex','20180126',1 union all 
select 'Alex','20180127',0 union all select 'Alex','20180128',1 union all select 'Alex','20180129',1 union all select 'Alex','20180130',1 union all select 'Alex','20180131',1 union all 
select 'Alex','20180201',0 union all select 'Alex','20180202',1 union all select 'Alex','20180203',1 union all select 'Alex','20180204',0 union all select 'Alex','20180205',1 union all 
select 'Alex','20180206',1 union all select 'Alex','20180207',1 union all select 'Alex','20180208',0 union all select 'Alex','20180209',1 union all select 'Alex','20180210',1  union all select 'Alex','20180120',0
union all 
select 'Piter','20180101',1 union all select 'Piter','20180102',0 union all select 'Piter','20180103',1 union all select 'Piter','20180104',1 union all select 'Piter','20180105',0 union all 
select 'Piter','20180106',0 union all select 'Piter','20180107',1 union all select 'Piter','20180108',1 union all select 'Piter','20180109',1 union all select 'Piter','20180110',0 union all 
select 'Piter','20180111',1 union all select 'Piter','20180112',0 union all select 'Piter','20180113',1 union all select 'Piter','20180114',1 union all select 'Piter','20180115',0 union all 
select 'Piter','20180116',1 union all select 'Piter','20180117',1 union all select 'Piter','20180118',1 union all select 'Piter','20180119',1 union all select 'Piter','20180121',0 union all 
select 'Piter','20180122',0 union all select 'Piter','20180123',0 union all select 'Piter','20180124',1 union all select 'Piter','20180125',1 union all select 'Piter','20180126',0 union all 
select 'Piter','20180127',1 union all select 'Piter','20180128',1 union all select 'Piter','20180129',1 union all select 'Piter','20180130',1 union all select 'Piter','20180131',0 union all 
select 'Piter','20180201',1 union all select 'Piter','20180202',0 union all select 'Piter','20180203',1 union all select 'Piter','20180204',1 union all select 'Piter','20180205',0 union all 
select 'Piter','20180206',1 union all select 'Piter','20180207',1 union all select 'Piter','20180208',1 union all select 'Piter','20180209',1 union all select 'Piter','20180210',0  union all select 'Piter','20180120',0
union all
select 'Mary','20180101',1 union all select 'Mary','20180102',1 union all select 'Mary','20180103',1 union all select 'Mary','20180104',1 union all select 'Mary','20180105',1 union all 
select 'Mary','20180106',0 union all select 'Mary','20180107',0 union all select 'Mary','20180108',1 union all select 'Mary','20180109',0 union all select 'Mary','20180110',1 union all 
select 'Mary','20180111',1 union all select 'Mary','20180112',0 union all select 'Mary','20180113',1 union all select 'Mary','20180114',0 union all select 'Mary','20180115',1 union all 
select 'Mary','20180116',1 union all select 'Mary','20180117',1 union all select 'Mary','20180118',0 union all select 'Mary','20180119',1 union all select 'Mary','20180121',1 union all 
select 'Mary','20180122',0 union all select 'Mary','20180123',1 union all select 'Mary','20180124',1 union all select 'Mary','20180125',1 union all select 'Mary','20180126',1 union all 
select 'Mary','20180127',1 union all select 'Mary','20180128',0 union all select 'Mary','20180129',0 union all select 'Mary','20180130',0 union all select 'Mary','20180131',1 union all 
select 'Mary','20180201',0 union all select 'Mary','20180202',0 union all select 'Mary','20180203',1 union all select 'Mary','20180204',1 union all select 'Mary','20180205',1 union all 
select 'Mary','20180206',1 union all select 'Mary','20180207',0 union all select 'Mary','20180208',1 union all select 'Mary','20180209',1 union all select 'Mary','20180210',1  union all select 'Mary','20180120',0
union all
select 'John','20180101',1 union all select 'John','20180102',0 union all select 'John','20180103',1 union all select 'John','20180104',1 union all select 'John','20180105',1 union all 
select 'John','20180106',1 union all select 'John','20180107',1 union all select 'John','20180108',1 union all select 'John','20180109',0 union all select 'John','20180110',0 union all 
select 'John','20180111',0 union all select 'John','20180112',0 union all select 'John','20180113',1 union all select 'John','20180114',1 union all select 'John','20180115',0 union all 
select 'John','20180116',0 union all select 'John','20180117',1 union all select 'John','20180118',1 union all select 'John','20180119',0 union all select 'John','20180121',0 union all 
select 'John','20180122',1 union all select 'John','20180123',1 union all select 'John','20180124',1 union all select 'John','20180125',0 union all select 'John','20180126',1 union all 
select 'John','20180127',1 union all select 'John','20180128',1 union all select 'John','20180129',0 union all select 'John','20180130',0 union all select 'John','20180131',0 union all 
select 'John','20180201',0 union all select 'John','20180202',1 union all select 'John','20180203',0 union all select 'John','20180204',0 union all select 'John','20180205',1 union all 
select 'John','20180206',0 union all select 'John','20180207',0 union all select 'John','20180208',0 union all select 'John','20180209',1 union all select 'John','20180210',0  union all select 'John','20180120',0
union all
select 'Irene','20180101',1 union all select 'Irene','20180102',1 union all select 'Irene','20180103',1 union all select 'Irene','20180104',0 union all select 'Irene','20180105',0 union all 
select 'Irene','20180106',1 union all select 'Irene','20180107',1 union all select 'Irene','20180108',0 union all select 'Irene','20180109',0 union all select 'Irene','20180110',0 union all 
select 'Irene','20180111',1 union all select 'Irene','20180112',0 union all select 'Irene','20180113',1 union all select 'Irene','20180114',0 union all select 'Irene','20180115',1 union all 
select 'Irene','20180116',1 union all select 'Irene','20180117',0 union all select 'Irene','20180118',1 union all select 'Irene','20180119',1 union all select 'Irene','20180121',1 union all 
select 'Irene','20180122',1 union all select 'Irene','20180123',0 union all select 'Irene','20180124',1 union all select 'Irene','20180125',0 union all select 'Irene','20180126',1 union all 
select 'Irene','20180127',1 union all select 'Irene','20180128',0 union all select 'Irene','20180129',0 union all select 'Irene','20180130',1 union all select 'Irene','20180131',1 union all 
select 'Irene','20180201',1 union all select 'Irene','20180202',0 union all select 'Irene','20180203',1 union all select 'Irene','20180204',0 union all select 'Irene','20180205',1 union all 
select 'Irene','20180206',1 union all select 'Irene','20180207',0 union all select 'Irene','20180208',0 union all select 'Irene','20180209',1 union all select 'Irene','20180210',1 union all select 'Irene','20180120',0
)
,data_prepared as ( 
select 
	client
	,datediff(dd,@dt,dt) [diff_dd]
	,presence 
from data 
)

select 
	@dt [month]
	,client
	,[0],[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]
from data_prepared 
pivot 
(max(presence) for [diff_dd] in ([0],[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])
	) p




пример вызова и результат
Код: sql
1.
select * from fn_show_pivot ('20180101')


monthclient01234567891011121314151617181920212223242526272829302018-01-01 00:00:00Alex11011011100001101110011101011112018-01-01 00:00:00Irene11100110001010110110110101100112018-01-01 00:00:00John10111111000011001100011101110002018-01-01 00:00:00Mary11111001011010111010101111100012018-01-01 00:00:00Piter1011001110101101111000011011110


Код: sql
1.
select * from fn_show_pivot ('20180201')


monthclient01234567891011121314151617181920212223242526272829302018-02-01 00:00:00Alex0110111011NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00Irene1010110011NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00John0100100010NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00Mary0011110111NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00Piter1011011110NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL

* столбцы 0..30 - это кол-во дней вперед от переданной даты, т.е. 0 - переданная дата, 1 - следующий день и т.д.
...
Рейтинг: 0 / 0
08.08.2018, 10:46
    #39684664
eonae
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
В итоге сделал всё-таки на c#. Работает хорошо, вполне быстро даже при выгрузке всей информации за год.

Но за новый импульс в изучении sql всем большое спасибо!
...
Рейтинг: 0 / 0
08.08.2018, 14:36
    #39684837
Wlr-l
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
RemindWlr-lПусть в группе 30 человек, в месяце 30 дней, т.е. из таблицы Visits нужно взять 30*30=900 строк и развернуть. Пусть еще и 40 групп. Если это гемор, то что тогда не гемор?
Для меня гемор - это решать задачи тулзами, которые для этого не предназначены. Да пусть там хоть 1 строка, писать динамический pivot ради этого считаю нецелесообразным. Это как решать data science задачи на чистом T-SQL без использования python и т.п.

Пример статического запроса уже привели. Приведу пример динамического запроса:

Код: sql
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.
if object_id(N'tempdb..#k') is not null  drop table #k;
create table #k (dt date, y int, m int, d int); --фрагмент календаря
insert #k (       dt,    y, m, d)
  values ('20180701', 2018, 7, 1),
         ('20180702', 2018, 7, 2),
         ('20180703', 2018, 7, 3),
         ('20180704', 2018, 7, 4),
         ('20180705', 2018, 7, 5);

if object_id(N'tempdb..#v') is not null  drop table #v; --таблица посещений
create table #v (n nvarchar(10), dt date, s smallint);
insert #V (    n,         dt, s)
  values ('Alex', '20180701', 1),
         ('Alex', '20180702', 1),
         ('Alex', '20180703', 0),
         ('Mary', '20180701', 1),
         ('Mary', '20180702', 0),
         ('Mary', '20180703', 1),
         ('Mary', '20180704', 1);
--select * from #k;
--select * from #v;

declare @sql varchar(1000) = '';
declare @cc  varchar( 400) = '';

--с помощью календаря и pivot
select @cc=stuff ( (select distinct concat(',[',d,']') from #k for xml path('') ), 1, 1,'');
--select @cc;
select @sql=concat('select * from (select n,d,s from #k k left join #v v on v.dt=k.dt) as t pivot (sum(s) for d in (',@cc,')) as pt');
--print @sql
exec(@sql);

--можно и без календаря, но с pivot
--в этом случае в колонках будут только те даты, которые есть в таблице посещений
select @cc=stuff ( (select distinct concat(',[',day(dt),']') from #v for xml path('') ), 1, 1,'');
--select @cc;
select @sql=concat('select * from (select n,d,s from #k k left join #v v on v.dt=k.dt) as t pivot (sum(s) for d in (',@cc,')) as pt');
--print @sql
exec(@sql);

--так же легко можно сформировать и стандартный запрос с "case when d=1 then sum(s) end as [1]",
--как с использованием календаря, так и без него
--я уже приводил пример формирования такого запроса, поэтому здесь приводить его не буду.



Для мышки(Wlr-l) кошка (python) страшнее зверя нет!
Проблема использования тех или иных языков для решения тех или иных задач сводится к известной проблеме Мастера и подмастерья. Мастер с помощью молотка и зубила (чистый T-SQL) может сделать то, что подмастерье не сможет сделать даже с помощью станков (python).
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении. / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]