powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задача на накопительный итог
25 сообщений из 40, страница 1 из 2
Задача на накопительный итог
    #38420589
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тривиальная казалось бы задача, но как сделать без цикла/курсора не представляю.

Дано:
1. Таблица ячеек с товаром:
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE Cell(CellId int, Qty int)

INSERT INTO Cell VALUES (1,305)
INSERT INTO Cell VALUES (2,280)
INSERT INTO Cell VALUES (3,250)
INSERT INTO Cell VALUES (4,230)
INSERT INTO Cell VALUES (5,210)



2. Таблица типоразмеров палет, в которой хранится вместимость каждого типоразмера
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE PaletType(PaletTypeId int, Capacity int)

INSERT INTO PaletType VALUES (1, 240)
INSERT INTO PaletType VALUES (2, 50)
INSERT INTO PaletType VALUES (3, 10)



В результате надо получить сколько палет и какого типоразмера нужно для выборки товара из каждой ячейки так, чтобы остаток в ячейке был минимальным.
Для приведенного примера это будет таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE Result(CellId int, PaletTypeId int, PaletQuantity int)

CellId          PaletTypeId           PaletQuantity 
1                1                         1
1                2                         1
1                3                         2
2                1                         1
2                3                         4
3                1                         1
3                3                         1
4                2                         4
4                3                         3
5                2                         4
5                3                         1
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420595
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oblom,

Версию сервера скажите
Код: sql
1.
SELECT @@VERSION
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420619
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
запомнившаяся фраза из книженции
Microsoft® SQL Server® 2008 T-SQL Fundamentals
by Itzik Ben-Gan

Another example of when you should consider cursors is when your set-based solution performs badly and you exhaust your tuning efforts using the set-based approach. As I mentioned, set-based solutions tend to be much faster, but in some cases the cursor solution is faster. Those cases tend to be calculations that, if done by processing one row at a time in certain order, involve much less data access compared to the way SQL Server currently (in SQL Server 2008 and previous versions) optimizes corresponding set-based solutions. One such example is running aggregates . I provided a set-based solution to running aggregates using subqueries in Chapter 4, "Subqueries," in the section "Running Aggregates." Optimization is outside the scope of this book, so I won't go into detail here regarding why the cursor solution to running aggregates is currently more efficient than the set-based solution . When you feel ready to deal with optimization aspects of T-SQL querying, you can find details in Inside Microsoft SQL Server 2008: T-SQL Querying (Microsoft Press, 2009).

чисто к тому, что может, курсором оно и лучше
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420657
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kalimbaOblom,

Версию сервера скажите
Код: sql
1.
SELECT @@VERSION



Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
Feb 10 2012 19:39:15
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420658
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o-oзапомнившаяся фраза из книженции
Microsoft® SQL Server® 2008 T-SQL Fundamentals
by Itzik Ben-Gan

Another example of when you should consider cursors is when your set-based solution performs badly and you exhaust your tuning efforts using the set-based approach. As I mentioned, set-based solutions tend to be much faster, but in some cases the cursor solution is faster. Those cases tend to be calculations that, if done by processing one row at a time in certain order, involve much less data access compared to the way SQL Server currently (in SQL Server 2008 and previous versions) optimizes corresponding set-based solutions. One such example is running aggregates . I provided a set-based solution to running aggregates using subqueries in Chapter 4, "Subqueries," in the section "Running Aggregates." Optimization is outside the scope of this book, so I won't go into detail here regarding why the cursor solution to running aggregates is currently more efficient than the set-based solution . When you feel ready to deal with optimization aspects of T-SQL querying, you can find details in Inside Microsoft SQL Server 2008: T-SQL Querying (Microsoft Press, 2009).

чисто к тому, что может, курсором оно и лучше

Я таких умных книг не читал, но осознание что часто курсор быстрее рекурсивной CTE, особенно на крупных выборках, присутствует :) Однако ж вера в чудо живет, хочется быстро и красиво :)
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420676
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomЯ таких умных книг не читал, но осознание что часто курсор быстрее рекурсивной CTE, особенно на крупных выборках, присутствует :) Однако ж вера в чудо живет, хочется быстро и красиво :)

у вас же 2012 сервер, какие курсоры
http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420712
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillOblomЯ таких умных книг не читал, но осознание что часто курсор быстрее рекурсивной CTE, особенно на крупных выборках, присутствует :) Однако ж вера в чудо живет, хочется быстро и красиво :)

у вас же 2012 сервер, какие курсоры
http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals

О SUM() OVER() в 12-ом сиквеле я тоже в курсе, но как его пришпилить к этой задаче...
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420717
Мистер Хенки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomShakillпропущено...


у вас же 2012 сервер, какие курсоры
http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals

О SUM() OVER() в 12-ом сиквеле я тоже в курсе, но как его пришпилить к этой задаче...
так прямо и пришпильте и про order by в over()не забудьте
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420817
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Цикл тут в самый раз будет.
За один проход цикла нужно обрабатывать все ячейки, "выбирая" из них оставшийся товар палетами заданного типоразмера и вычисляя, сколько таких палет понадобится. Если у палеты минимальный объём, то вычисление будет немного отличаться.

Код: 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.
IF OBJECT_ID('tempdb..#Cell') IS NOT NULL DROP TABLE #Cell;
IF OBJECT_ID('tempdb..#PaletType') IS NOT NULL DROP TABLE #PaletType;

CREATE TABLE #Cell(CellId int, Qty int);

INSERT INTO #Cell VALUES (1,305);
INSERT INTO #Cell VALUES (2,280);
INSERT INTO #Cell VALUES (3,250);
INSERT INTO #Cell VALUES (4,230);
INSERT INTO #Cell VALUES (5,210);

CREATE TABLE #PaletType(PaletTypeId int, Capacity int);

INSERT INTO #PaletType VALUES (1, 240);
INSERT INTO #PaletType VALUES (2, 50);
INSERT INTO #PaletType VALUES (3, 10);

GO

IF OBJECT_ID('tempdb..#CellPalets') IS NOT NULL DROP TABLE #CellPalets;

CREATE TABLE #CellPalets(CellId int, PaletTypeId int, Capacity int, Quantity int);

DECLARE @PaletTypeId int, @Capacity int, @MinCapacity int;

SELECT @MinCapacity = MIN(Capacity)
FROM #PaletType;

DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
   SELECT PaletTypeId, Capacity
   FROM #PaletType
   ORDER BY Capacity DESC;

OPEN cur;

FETCH NEXT FROM cur INTO @PaletTypeId, @Capacity;

WHILE @@FETCH_STATUS = 0
BEGIN
   INSERT #CellPalets(CellId, PaletTypeId, Capacity, Quantity)
   SELECT c.CellId, @PaletTypeId, @Capacity,
          CASE
             WHEN @Capacity <> @MinCapacity
             THEN (c.Qty - ISNULL(t.All_Capacity, 0)) / @Capacity
             ELSE CEILING((c.Qty - ISNULL(t.All_Capacity, 0)) * 1.0 / @Capacity)
          END
   FROM #Cell c
        LEFT OUTER JOIN
        (
           SELECT CellId, SUM(Capacity * Quantity) AS All_Capacity
           FROM #CellPalets
           GROUP BY CellId
        ) t ON c.CellId = t.CellId AND c.Qty > t.All_Capacity
   WHERE  CASE
             WHEN @Capacity <> @MinCapacity
             THEN (c.Qty - ISNULL(t.All_Capacity, 0)) / @Capacity
             ELSE CEILING((c.Qty - ISNULL(t.All_Capacity, 0)) * 1.0 / @Capacity)
          END > 0;

   FETCH NEXT FROM cur INTO @PaletTypeId, @Capacity;
END;

CLOSE cur;

DEALLOCATE cur;

SELECT * FROM #CellPalets ORDER BY CellId, PaletTypeId;
GO
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38420835
рекурсивный CTE прикрутить при большом желании можно.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421013
Фотография Bator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагаю, что подумав можно еще оптимизировать на мелочах, к примеру ключ создать после вставки и т.д., вычисления уменьшить.
Код: 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.
CREATE TABLE #res (
    CellId          INT
   ,Qty             INT
   ,PaletTypeId     INT
   ,Capacity        INT
   ,PaletQuantity   INT
   ,sm              INT
   ,PRIMARY KEY CLUSTERED(cellid ,capacity DESC ,PaletTypeId))

INSERT INTO #res
SELECT *,0,0
FROM Cell CROSS JOIN PaletType

DECLARE @PaletQuantity   INT
       ,@sm              INT
       ,@CellId          INT

UPDATE #res
SET
  @PaletQuantity = 
    PaletQuantity = CASE 
                      WHEN @CellId=CellId THEN @sm
                      ELSE Qty
                    END
                  / Capacity
 ,@sm =
    sm = CASE 
           WHEN @CellId=CellId THEN @sm
           ELSE Qty
         END
       - CASE 
           WHEN @CellId=CellId THEN @sm
           ELSE Qty
         END
       / Capacity * Capacity
 ,@CellId = CellId

DELETE FROM   #res WHERE PaletQuantity = 0

SELECT CellId, PaletTypeId, PaletQuantity
FROM   #res

DROP TABLE #res
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421042
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bator,

Вы из первой ячейки не весь товар вынули.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421055
Фотография Алексей Куренков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421087
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OblomВ результате надо получить сколько палет и какого типоразмера нужно для выборки товара из каждой ячейки так, чтобы остаток в ячейке был минимальным .
задача о рюкзаке? тогда вопрос: количество типоразмеров палет заранее известно и фиксировано?
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421094
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillrunning-totals
Мистер Хенкипро order by в over()не забудьте
Алексей Куренковrunning_totals
Присоединяюсь к вопросу ТСа: как это пришпилить к поставленной задаче?
Правда, очень интересно.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421103
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333Правда, очень интересно.я среагировал на "накопительный итог" в заголовке, сюда оно не очень. но и представленные далее решения не подходят под критерий "минимальный остаток в ячейке", если, например, из списка типоразмеров убрать Capacity = 10.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421155
Мистер Хенки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillГость333Правда, очень интересно.я среагировал на "накопительный итог" в заголовке, сюда оно не очень. но и представленные далее решения не подходят под критерий "минимальный остаток в ячейке", если, например, из списка типоразмеров убрать Capacity = 10.
Я тоже среагировал на накопительный итог в теме а много буков не читал. Вообще задача из множества задач линейного программирования. Решается симплекс-методом через матричные вычисления.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421175
Фотография Bator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333,

1. В условиях задачи "чтобы остаток в ячейке был минимальным"
2. Если нужно выбрать все, то нужно добавить перед DELETE:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
       ,@MinCapacityPaletTypeID  int

select top 1 @MinCapacityPaletTypeID = PaletTypeId
from #PaletType
order by Capacity
...
  @PaletQuantity = 
    PaletQuantity = CASE 
                      WHEN @CellId=CellId THEN @sm
                      ELSE Qty
                    END
                  / Capacity
                  -- выбираем самой малой палетой последний остаток в ячейке (если есть)
                  + case 
                      when PaletTypeId = @MinCapacityPaletTypeID 
                       and @sm / Capacity * Capacity < @sm then 1
                      else 0
                    end
...
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421225
Мистер Хенки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мистер ХенкиShakillпропущено...
я среагировал на "накопительный итог" в заголовке, сюда оно не очень. но и представленные далее решения не подходят под критерий "минимальный остаток в ячейке", если, например, из списка типоразмеров убрать Capacity = 10.
Я тоже среагировал на накопительный итог в теме а много буков не читал. Вообще задача из множества задач линейного программирования. Решается симплекс-методом через матричные вычисления.
Еще хотелось бы добавить, поскольку критерия нет по палетам в данной задаче, то конечно симплекс метод как из пушки по воробьям. Но без критерия на палеты, задача вырождается в определение сколко палет минимального размера необходимо для одной ячейки(нет смысла вообще тогда использовать палеты не минимального размера). Если таки критерий на палеты есть, то есть ощущение, что все приведенные способы решения неправильные, точнее не будут гарантировано давать оптимальный результат.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421240
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мистер ХенкиЕще хотелось бы добавить, поскольку критерия нет по палетам в данной задаче, то конечно симплекс метод как из пушки по воробьям. Но без критерия на палеты, задача вырождается в определение сколко палет минимального размера необходимо для одной ячейки(нет смысла вообще тогда использовать палеты не минимального размера). Если таки критерий на палеты есть, то есть ощущение, что все приведенные способы решения неправильные, точнее не будут гарантировано давать оптимальный результат.размеры минимальной палеты могут быть не кратны остальным, и тогда уже нет очевидного решения в общем случае. я задачу понял как "выбрать из ячейки максимальное количество товара полными палетами" ну и можно предположить, что вторичная цель - минимизировать количество палет
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421264
Мистер Хенки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillМистер ХенкиЕще хотелось бы добавить, поскольку критерия нет по палетам в данной задаче, то конечно симплекс метод как из пушки по воробьям. Но без критерия на палеты, задача вырождается в определение сколко палет минимального размера необходимо для одной ячейки(нет смысла вообще тогда использовать палеты не минимального размера). Если таки критерий на палеты есть, то есть ощущение, что все приведенные способы решения неправильные, точнее не будут гарантировано давать оптимальный результат.размеры минимальной палеты могут быть не кратны остальным, и тогда уже нет очевидного решения в общем случае. я задачу понял как "выбрать из ячейки максимальное количество товара полными палетами" ну и можно предположить, что вторичная цель - минимизировать количество палет
если есть критерий минимизации количества палет то вот, например
Код: sql
1.
2.
3.
4.
5.
6.
7.
truncate table Cell
INSERT INTO Cell VALUES (1,305)
truncate table PaletType
INSERT INTO PaletType VALUES (1, 230)
INSERT INTO PaletType VALUES (2, 26)
INSERT INTO PaletType VALUES (3, 25)
INSERT INTO PaletType VALUES (4, 4)



оптимальный ответ 1 палета первого типа и 3 палеты 3 типа(полностью выбрана ячейка и количество палет минимально). даже если возьмем дважды модифицированное решение Bator, то оно не выдаст такого результата, хотя конечно ячейку выберет полностью. Но такие же неоптимальные результаты можно получать тупо деля вместимость ячейки на вместимость самой маленькой палеты, тогда никакие циклы вообще не понадобятся.

Извиняюсь что я со своей стороны не могу предложить конструктива, но задача вычислительная и средствами TSQL, на мой взгляд, туговато будет решатся.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421279
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мистер Хенки,
если содержимое таблицы типоразмеров невелико и жестко фиксировано, то можно понаписать кроссджойнов PaletType по числу типоразмеров и решить перебором. но это совсем тепличные условия.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421282
guest_123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oblom,
может так?

Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
WITH cell AS (	
	SELECT
		*
	FROM (
		VALUES
			(1, 305),
			(2, 280),
			(3, 250),
			(4, 230),
			(5, 210)) AS v(cell_id, quantaty)
)
, pallet AS (
	SELECT
		*,
		num = ROW_NUMBER() OVER(ORDER BY capacity DESC)
	FROM (
		VALUES	
			(1, 240),
			(2, 50),
			(3, 10)/*,
			(4, 5)*/) AS v(pallet_id, capacity)
)
, cte AS (
SELECT 
	* 
FROM 
	cell
CROSS JOIN
	pallet
)
/*SELECT
	c1.*, c2.*
FROM
	cte AS c1
LEFT JOIN
	cte AS c2
ON
	c1.cell_id = c2.cell_id 
AND c1.num = c2.num - 1
ORDER BY
	c1.cell_id */
, rec AS 
(
	SELECT
		cte.*,
		remains_prev = cte.quantaty,
		pallet_qty = CASE WHEN cte.quantaty / cte.capacity > 0 THEN cte.quantaty / cte.capacity ELSE 0 END,
		remains = cte.quantaty - (cte.quantaty / cte.capacity) * cte.capacity
	FROM
		cte
	WHERE
		cte.num = 1
		
	UNION ALL
	
	SELECT
		cte.*,
		remains_prev = rec.remains,
		pallet_qty = CASE WHEN rec.remains / cte.capacity > 0 THEN rec.remains / cte.capacity ELSE 0 END,
		remains = 
			CASE 
				WHEN rec.remains - (rec.remains / cte.capacity) * cte.capacity > 0 
					THEN 
						rec.remains - (rec.remains / cte.capacity) * cte.capacity 
					ELSE 
						rec.remains 
			END
	FROM
		rec 
	INNER JOIN
		cte 
	ON
		rec.num = cte.num - 1
	AND rec.cell_id = cte.cell_id 
)SELECT 
	cell_id,
	pallet_id,
	--ROW_NUMBER() OVER(PARTITION BY cell_id ORDER BY num DESC),
	pallet_qty + CASE WHEN ROW_NUMBER() OVER(PARTITION BY cell_id ORDER BY num DESC) = 1 AND pallet_qty * capacity < remains_prev THEN 1 ELSE 0 END,
	* 
FROM 
	rec
ORDER BY
	1,2
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421323
Мистер Хенки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillМистер Хенки,
если содержимое таблицы типоразмеров невелико и жестко фиксировано, то можно понаписать кроссджойнов PaletType по числу типоразмеров и решить перебором. но это совсем тепличные условия. тогда это cross join количество палет Х тип палет Х ячейки. Выбираем так чтоб покрывалась ячейка и количество палет в разрезе ячейки было минимальным. Как то так. Но декартово произведение трех множество, причем количество палет зависит от вместимости ячейки. Наверное учоные не просто так придумывали симплекс метод.
...
Рейтинг: 0 / 0
Задача на накопительный итог
    #38421343
Oblom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillМистер Хенки,
если содержимое таблицы типоразмеров невелико и жестко фиксировано, то можно понаписать кроссджойнов PaletType по числу типоразмеров и решить перебором. но это совсем тепличные условия.

Набор типоразмеров не фиксирован и может меняться, именно для этого он вынесен в таблицу.
И да, мой косяк в формулировке: нужно реализовать "жадный" алгоритм, то есть минимальный остаток должен получиться минимальным числом палет. Проще говоря: сначала выбирается весь товар на самые вместительные палеты, потом на менее вместительные и так далее. Палеты заполняются только полностью. Итого 305 = 240 (PaletTypeId = 1) + 50(PaletTypeId = 2) + 10 (PaletTypeId = 3) + 5 (остаток).
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задача на накопительный итог
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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