powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / PD16 Генерирование вставки после создания таблицы
15 сообщений из 15, страница 1 из 1
PD16 Генерирование вставки после создания таблицы
    #37589130
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Общее описание вопроса:
проектирую хранилище, в нем есть таблицы-измерения.
Нужно, чтобы в таблице по дефолту была 1 запись для неопределенного элемента.
Т.е. условно, если в таблице содержится список клиентов, то нужна 1 запись для "Неизвестного клиента".
Каждый столбец таблицы содержит свои "неизвестные" значения для этой записи, разных типов данных.
Хотелось бы автоматизировать процесс генерации скрипта вставки такой записи.
Для этого добавил в физ.модели расширенный атрибут Unknown Member на колонку и заполняю его наравне с другими атрибутами колонки (Название, Код, Тип данных и т.д.).
Если делать вручную, то можно писать в Script/End таблицы что-то типа
Код: sql
1.
2.
3.
insert into %TABLE%
col1, col2, col3
values (-1, 'unknown', '19000101')


Не очень удобно, особенно, если колонок много, и, если я поменяю какое-то значение в Неизвестном атрибуте, придется идти в скрипт и искать там старое значение, менять его на новое.
Нельзя написать что-то более универсальное, типа
Код: sql
1.
insert into %TABLE% values %unknowns%

?
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37589289
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 22.12.2011 16:17, PassedBI wrote:

> Нельзя написать что-то более универсальное, типа

Можно в свойствах DBMS определить у таблицы вычисляемый extended-атрибут только для чтения, в котором через "Get Method
Script" формировать требуемый запрос на вставку, а потом добавить вывод этого атрибута в Script\Objects\Table\Create.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37589435
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov,

Спасибо за ответ!
Можно несколько уточнений/вопросов? просто 2 недели как открыл PD, еще ничего толком не знаю.

Можно в свойствах DBMS определить у таблицы вычисляемый extended-атрибут только для чтения
Это вот так? Тип атрибута String?


в котором через "Get Method Script" формировать требуемый запрос на вставку
Самый интересный вопрос, что тут писать? Или может примеры есть..


а потом добавить вывод этого атрибута в Script\Objects\Table\Create
Тоже неясно как вызывать этот код. Там стандартная запись. Нужно что-то дописать после нее, только как?
Код: sql
1.
2.
3.
4.
create table [%QUALIFIER%]%TABLE% (
   %TABLDEFN%
)
[%OPTIONS%]



Сори, что столько нубских вопросов =( Идею я понял, но в деталях пока не разберусь.
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37589499
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PassedBIЭто вот так? Тип атрибута String?
..
Самый интересный вопрос, что тут писать? Или может примеры есть..

Да, String, все остальное вроде правильно, а на закладке "Get Method Script" напиши функцию по возврату требуемой вставки. Это VbScript, выглядель будет примерно так (в качестве obj будет Table):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Function %Get%(obj)
   dim col
   %Get% = ""
   for each col in obj.columns
     if %Get% <> "" then %Get% = %Get% & ", " end if
     %Get% = %Get% & col.name
   next
   %Get% = "insert into " & obj.name & "(" & %Get% & ") values (...);"
End Function


и так далее. Примеры VbScript есть в директории "VB Scripts" от установки PowerDesigner'а, объектная модель самого PowerDesigner'а доступна вот так и ниже через одно сообщение, также можно посмотреть в документации .

PassedBIТоже неясно как вызывать этот код. Там стандартная запись. Нужно что-то дописать после нее, только как?
Я бы обозвал атрибут, определенный на первом шаге, как-то вроде SqlInsertUnknowRow и добавил его в конец текста Script\Objects\Table\Create, т.е:

Код: sql
1.
2.
3.
4.
5.
create table [%QUALIFIER%]%TABLE% (
   %TABLDEFN%
)
[%OPTIONS%]
[%SqlInsertUnknowRow%]
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37590533
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov,

Попробовал прокрутить всю схему, не изменяя пока сам скрипт - затык на последнем пункте.
Обозвал атрибут SqlInsertUnknowRow, вбил в него ваш скрипт, дописал вызов атрибута в скрипте создания таблицы через [%SqlInsertUnknowRow%] и сохранил изменения в файле.
Захожу в превью таблицы, получаю ошибку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
/*==============================================================*/
/* Table: DimCustomer                                           */
/*==============================================================*/
1 error(s), 0 warning(s)

(3) (Table "DimCustomer"):
   [translation error] unresolved member: SqlInsertUnknowRow
go



Переобозвал атрибут просто буквой A, подправил вызов, ошибка исчезла, превью показывает создание таблицы, но метод атрибута ничего не возвращает.
Переписал Get Method Script у атрибуа A:
Код: sql
1.
2.
3.
Function %Get%(obj)
  %Get% = "aaa"
End Function

- просто хоть что-то вернуть.
Результат тот же - скрипт создания игнорит этот код.
Чего ему не хватает?
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37590594
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PassedBIЧего ему не хватает?
Ты создал в модели объект Extension и определял атрибут там? Я-то делал это в самой DBMS:
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37590707
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov,

Блин =) Точно, теперь все нормально, спасибо! Пойду теперь скрипт дописывать, надо прикрутить блок values.
А мне этот атрибут Unknown тоже лучше пересоздать в DBMS или можно и в Local Extensions оставить, чтоб заново не перебивать все значения для колонок?
И правильно ли я уловил разницу - если в Local Extensions создавать расширенный атрибут, то он может быть использован только в текущей модели, а если на уровне DBMS, то он будет во всех моделях присутствовать? Хм.. это ведь не нужно..
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37590984
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 23.12.2011 14:56, PassedBI wrote:

> Блин =) Точно, теперь все нормально, спасибо! Пойду теперь скрипт дописывать, надо прикрутить блок values.
> А мне этот атрибут Unknown тоже лучше пересоздать в DBMS или можно и в Local Extensions оставить, чтоб заново не
> перебивать все значения для колонок?

А попробуй. Честно говоря, с Extension я не работал, но если не получиться и придется перемещать атрибут, то и это можно
сделать разово через VBScript, меню Tools->Execute Commands->Edit/Кun script.

> И правильно ли я уловил разницу - если в Local Extensions создавать расширенный атрибут, то он может быть использован
> только в текущей модели, а если на уровне DBMS, то он будет во всех моделях присутствовать?Хм.. это ведь не нужно..

Получается да. Можно поискать возможность доступа к атрибутам из Local Extensions с проверками необходимости генерации.

А второй вариант, по-моему самый простой: сделать отдельный файл свойств DBMS и использовать его там где требуются. Все
эти файлы лежат в директории "Resource Files\DBMS" от установки, также доступны через меню Tools-> Resources-> DBMS. Эти
файлы можно сравнивать, менять, можно переводить модель с одного на другой, меню Database-> Chang Current DBMS.

По-хорошему лучше вообще не трогать исходные файлы, они могут меняться с обновлениями, которые имхо стОит по
необходимости подтягивать в свои копии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37591254
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А попробуй. Честно говоря, с Extension я не работал, но если не получиться и придется перемещать атрибут, то и это можно
сделать разово через VBScript, меню Tools->Execute Commands->Edit/Кun script.
Фуф, добрался до этого local extensions =)
В общем, если атрибут писать в расширение модели, то из скрипта его можно достать через
Код: sql
1.
col.GetExtendedAttribute("Local Extensions.Unknown Member")


Если же определять атрибут в свойствах dbms, то почти то же самое
Код: sql
1.
col.GetExtendedAttribute("MSSQLSRV2008.Unknown Member")


Теперь все грамотно скомпоновать, добавить кавычки в зависимости от типа данных колонки и дело в шляпе.
А второй вариант, по-моему самый простой: сделать отдельный файл свойств DBMS и использовать его там где требуются. Все
эти файлы лежат в директории "Resource Files\DBMS" от установки, также доступны через меню Tools-> Resources-> DBMS. Эти
файлы можно сравнивать, менять, можно переводить модель с одного на другой, меню Database-> Chang Current DBMS.

По-хорошему лучше вообще не трогать исходные файлы, они могут меняться с обновлениями, которые имхо стОит по
необходимости подтягивать в свои копии.
Этот вариант мне нравится больше. Сделал копию файла sqlsv2k8.xdb, натравил модель на нее и пишу все модификации в копию, а оригинал лежит нетронутый. Не получилось только для двух разных физических моделей, которые находятся в одном workspace, указать использование разных файлов свойств. Он, похоже, для всех моделей воркспейса используется. Надо посмотреть, что такое проекты, может они помогут.

Вообще вещь крутая конечно, тока здоровая, а времени на нормальное изучение как всегда нет =) Хорошо, хоть форум есть, самому бы тут мыкаться пришлось на порядок больше времени, спасибо! Скрипт выложу как готов будет, может кому пригодится.
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37591303
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 23.12.2011 18:47, PassedBI wrote:

> Этот вариант мне нравится больше. Сделал копию файла sqlsv2k8.xdb, натравил модель на нее и пишу все модификации в
> копию, а оригинал лежит нетронутый. Не получилось только для двух разных физических моделей, которые находятся в одном
> workspace, указать использование разных файлов свойств. Он, похоже, для всех моделей воркспейса используется.

Думаю что скорее всего это можно обойти. Загляни вовнутрь файла DBMS, это простой XML, может надо поменять во 2-й
строке, что начинается с <?PowerDesigner, значения атрибутов Name и/или ID.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37593067
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis PopovДумаю что скорее всего это можно обойти. Загляни вовнутрь файла DBMS, это простой XML, может надо поменять во 2-й строке, что начинается с <?PowerDesigner, значения атрибутов Name и/или ID.
Лучше не трогать, чего не знаю =) Вторая строка выглядит так
Код: xml
1.
2.
3.
4.
<?PowerDesigner AppLocale="UTF16" Code="MSSQLSRV2008" Family="SQL SERVER;MICROSOFT" HasExtendedMetaClass="TRUE"
ID="{F5C20738-B05A-4F70-BC90-9B5EB9437766}" LastModificationDate="1305116654" 
Name="Microsoft SQL Server 2008" Objects="1359" Symbols="0" Type="{4BA9F647-DAB1-11D1-9944-006097355D9B}" 
signature="XDB_XML" version="16.0.0.3424"?>


Ладно, это уже мелочи, пока все равно с одной моделью работаю.
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37593098
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Набросал скрипт, выложу как обещал, хотя качество кода оставляет желать лучшего :/
Код: javascript
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.
Function %Get%(obj)
	dim col     'колонка в цикле
	dim val     'значение расширенного атрибута Unknown Member
	dim colList 'итоговый список колонок в виде строки
	dim valList 'итоговый список значений в виде строки
	dim i       'номер строки
	dim valLen  'длина значения расширенного атрибута
	dim valLenT 'текстовое выражении длины
	dim warn    'признак ошибки - длина значения превышает длину типа данных
	%Get% = ""
	if left(ucase(obj.name), 3) = "DIM" then   'ген. только для таблиц-измерений
		colList = ""
		valList = ""
		i = 1
		for each col in obj.columns
		'получаем список колонок
		if colList <> "" then colList = colList & vbcrlf & ", " end if
		colList = colList & col.name & vbTab & "-- " & i
		'получаем список значений
		valLen = 0
		valLenT = ""
		warn = ""
		val = col.GetExtendedAttribute("Local Extensions.Unknown Member")
		if val = "" then val = "NULL" end if
		'обрамление кавычками лучше вынести в отдельную ф-ю, где обработать все входящие типы данных
		if val <> "NULL" and (instr(1, col.DataType, "char") or instr(1, col.DataType, "date")) then 
			val = "'" & col.GetExtendedAttribute("Local Extensions.Unknown Member") & "'"
			'если длина превышает длину колонки, то указывать на ошибку
			if instr(1, col.DataType, "char") then 
				valLen = len(val)-2
				valLenT = "  len = " & valLen
				if valLen > col.Length then warn = "ERROR!" end if
			end if
		end if
		'формирование строки списка значений (можно закоментить, что не нужно выводить)
		if valList <> "" then valList = valList & vbcrlf & ", " end if
		valList = valList & val & vbTab &_
		"--" & warn &_         
		"  " & i &_               
		"  " & col.name &_      
		"  " & col.DataType &_  
		valLenT &_        
		" (" & left(col.comment, 30) & ")"
		i = i + 1
		next
		'сборка sql строки для вставки 
		%Get% = "insert into " & obj.name & " (" & vbcrlf &_
			colList & vbcrlf & ")" & vbcrlf &_ 
		"values (" & vbcrlf &_
			valList & vbcrlf & ");"
	end if
End Function



На выходе получается следующее
Код: 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.
insert into DimCustomer (
CustomerKey	-- 1
, CustomerAlternateKey	-- 2
, CustomerName	-- 3
, CustGroupCode	-- 4
, CustGroupName	-- 5
, INN	-- 6
, OKDP	-- 7
, OKPO	-- 8
, OKATO	-- 9
, KPPU	-- 10
, Address	-- 11
, BankAccount	-- 12
, CreatedDate	-- 13
, InsertAuditKey	-- 14
, UpdateAuditKey	-- 15
)
values (
-1	--  1  CustomerKey  int (Суррогатный первичный ключ)
, 'Неизв.'	--  2  CustomerAlternateKey  varchar(20)  len = 6 (Код клиента. Естесственный клю)
, 'Неизвестный клиент'	--  3  CustomerName  varchar(100)  len = 18 (Название клиента)
, 'Неизв.'	--  4  CustGroupCode  varchar(10)  len = 6 (Код группы клиентов)
, 'Неизвестная группа'	--  5  CustGroupName  varchar(40)  len = 18 (Группа клиентов)
, 'Неизв.'	--  6  INN  varchar(12)  len = 6 (ИНН)
, 'Неизв.'	--  7  OKDP  varchar(7)  len = 6 (Вид деятельности по ОКДП)
, 'Неизв.'	--  8  OKPO  varchar(7)  len = 6 (Классификация по ОКПО)
, 'Неизв.'	--  9  OKATO  varchar(11)  len = 6 (ОКАТО)
, 'Неизв.'	--  10  KPPU  varchar(9)  len = 6 (КПП)
, 'Неизвестный адрес'	--  11  Address  varchar(150)  len = 17 (Адрес клиента)
, 'Неизвестный счет'	--ERROR!  12  BankAccount  varchar(10)  len = 16 (Банковский счет)
, '19000101'	--  13  CreatedDate  date (Дата создания)
, -1	--  14  InsertAuditKey  int (Какой процесс загрузил эту зап)
, -1	--  15  UpdateAuditKey  int (Какой процесс последним обновл)
);
go



Код дурной, но мою задачу решает, а учиться писать на vbScript в планы не входило =)
Еще бы как-то оттабировать все коменты по одной линии, независимо от длины текста перед коментом.
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37593111
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 26.12.2011 11:37, PassedBI wrote:

> Еще бы как-то оттабировать все коменты по одной линии, независимо от длины текста перед коментом.

Добавь перед комментарием пробелов через функцию String(<константа минус длина текста перед комментарием>, ' ')

http://msdn.microsoft.com/en-us/library/6978d214

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37593184
PassedBI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что надо!
Итоговые варианты:

Код
Код: vbnet
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.
Function %Get%(obj)
dim col     'колонка в цикле
dim val     'значение расширенного атрибута Unknown Member
dim colList 'итоговый список колонок в виде строки
dim valList 'итоговый список значений в виде строки
dim i       'номер строки
dim valLen  'длина значения расширенного атрибута
dim valLenT 'текстовое выражении длины
dim warn    'признак ошибки - длина значения превышает длину типа данных
const cmntPos = 30 'comment postition - комментарии после столько символов
%Get% = ""
if left(ucase(obj.name), 3) = "DIM" then   'ген. только для таблиц-измерений
	colList = ""
	valList = ""
	i = 1
	for each col in obj.columns
		'получаем список колонок
		if colList <> "" then colList = colList & vbcrlf & ", " end if
		colList = colList & col.name & Space(cmntPos - len(col.Name)) & "-- " & i
		'получаем список значений
		valLen = 0
		valLenT = ""
		warn = ""
		val = col.GetExtendedAttribute("Local Extensions.Unknown Member")
		if val = "" then val = "NULL" end if
		'обрамление кавычками лучше вынести в отдельную ф-ю, где обработать все входящие типы данных
		if val <> "NULL" and (instr(1, col.DataType, "char") or instr(1, col.DataType, "date")) then 
			val = "'" & col.GetExtendedAttribute("Local Extensions.Unknown Member") & "'"
			'если длина превышает длину колонки, то указывать на ошибку
			if instr(1, col.DataType, "char") then 
				valLen = len(val)-2
				valLenT = "  len = " & valLen
				if valLen > col.Length then warn = "ERROR!" end if
			end if
		end if
		'формирование строки списка значений (можно закоментить, что не нужно выводить)
		if valList <> "" then valList = valList & vbcrlf & ", " end if
		valList = valList & val & Space(cmntPos - len(val)) &_
		"--" & warn &_         
		"  " & i &_               
		"  " & col.name &_      
		"  " & col.DataType &_  
		valLenT &_        
		" (" & left(col.comment, 30) & ")"
		i = i + 1
	next
	'сборка sql строки для вставки 
	%Get% = "insert into " & obj.name & " (" & vbcrlf & "  " &_
		colList & vbcrlf & ")" & vbcrlf &_ 
	"values (" & vbcrlf & "  " &_
		valList & vbcrlf & ");"
end if
End Function


Результат
Код: 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.
insert into DimCustomer (
  CustomerKey                   -- 1
, CustomerAlternateKey          -- 2
, CustomerName                  -- 3
, CustGroupCode                 -- 4
, CustGroupName                 -- 5
, INN                           -- 6
, OKDP                          -- 7
, OKPO                          -- 8
, OKATO                         -- 9
, KPPU                          -- 10
, Address                       -- 11
, BankAccount                   -- 12
, CreatedDate                   -- 13
, InsertAuditKey                -- 14
, UpdateAuditKey                -- 15
)
values (
  -1                            --  1  CustomerKey  int (Суррогатный первичный ключ)
, 'Неизв.'                      --  2  CustomerAlternateKey  varchar(20)  len = 6 (Код клиента. Естесственный клю)
, 'Неизвестный клиент'          --  3  CustomerName  varchar(100)  len = 18 (Название клиента)
, 'Неизв.'                      --  4  CustGroupCode  varchar(10)  len = 6 (Код группы клиентов)
, 'Неизвестная группа'          --  5  CustGroupName  varchar(40)  len = 18 (Группа клиентов)
, 'Неизв.'                      --  6  INN  varchar(12)  len = 6 (ИНН)
, 'Неизв.'                      --  7  OKDP  varchar(7)  len = 6 (Вид деятельности по ОКДП)
, 'Неизв.'                      --  8  OKPO  varchar(7)  len = 6 (Классификация по ОКПО)
, 'Неизв.'                      --  9  OKATO  varchar(11)  len = 6 (ОКАТО)
, 'Неизв.'                      --  10  KPPU  varchar(9)  len = 6 (КПП)
, 'Неизвестный адрес'           --  11  Address  varchar(150)  len = 17 (Адрес клиента)
, 'Неизв.счет'                  --  12  BankAccount  varchar(10)  len = 10 (Банковский счет)
, '19000101'                    --  13  CreatedDate  date (Дата создания)
, -1                            --  14  InsertAuditKey  int (Какой процесс загрузил эту зап)
, -1                            --  15  UpdateAuditKey  int (Какой процесс последним обновл)
);
go


Спасибо за помощь, теперь можно двигаться дальше.
...
Рейтинг: 0 / 0
PD16 Генерирование вставки после создания таблицы
    #37595578
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотелось бы автоматизировать процесс генерации скрипта вставки такой записи.
На мой взгляд правильней это делать через Test Data Profiles (Model / Test Data Profiles) и не трогать DBMS и т.п.
К тому же отделишь тогда генерацию данных от скриптов создания/обновления БД.
...
С помощью механизма Test Data Profiles можно задать и количество генерируемых строк и типы данных и т.п. Также автоматически решается проблема со связями и последовательностью вставки в различные таблицы.
Данные могут быть заданы файлом csv.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / PD16 Генерирование вставки после создания таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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