Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Коллеги, столкнулся с такой задачей - нужно посчитать товар без остатка за период.
выгрузку данных сделали таким образом:
Две таблицы, в одной вся активная номенклатура, во второй только номенклатура, которая на остатках.
Первая таблица
Код | Магазин | Бренд |
---|---|---|
Вторая таблица
Код | Магазин | ДатаОстатка |
---|---|---|
Соответственно, что бы мне получить список номенклатур без остатка, я через left join по ключу (Код+ магазин) создаю 3ю таблицу и в ней только данные, где дата остатка не указана, т.е. вся номенклатура без остатка (что мне и нужно).
Но мне то надо построить отчет за период и я никак не соображу, каким образом написать скрип, что бы на каждую дату из второй таблицы в итоговой появилась нужная мне дата.
Может кто подскажет?
Добрый день.
Периодически мне тоже приходиться с таким сталкиваться. Есть разные варианты решения данной задачи, правда пока не решил какой из вариантов лучше.
Как вариант, попробуй сделать вот так:
Nomenclature:
LOAD * Inline [
NN, NAME_ID, NAME
1, 1001, Milk
2, 1002, Bread
3, 1003, Tea
4, 1004, Coffee
5, 1005, Meat
6, 1006, Egg
7, 1007, Butter
8, 1008, Water
9, 1009, Vodka
10, 1010, Whiskey
];
STORE * from Nomenclature into Nomenclature.qvd (qvd);
DROP Table Nomenclature;
Sale:
LOAD * Inline [
DATE, NAME_ID
01.01.2016, 1001
01.01.2016, 1002
01.01.2016, 1003
01.01.2016, 1004
02.01.2016, 1001
02.01.2016, 1009
03.01.2016, 1007
03.01.2016, 1008
03.01.2016, 1009
03.01.2016, 1010
04.01.2016, 1003
04.01.2016, 1004
04.01.2016, 1005
05.01.2016, 1001
05.01.2016, 1002
05.01.2016, 1003
05.01.2016, 1004
05.01.2016, 1005
05.01.2016, 1006
05.01.2016, 1007
05.01.2016, 1008
06.01.2016, 1008
];
STORE * from Sale into Sale.qvd (qvd);
//DROP Table Sale;
Date:
LOAD Distinct DATE
Resident Sale
//FROM Sale.qvd (qvd)
Order By DATE;
NoConcatenate
Date_01:
LOAD Concat (num(DATE), ', ') as DATE_01
Resident Date
Order By DATE;
DROP Table Date;
DROP Table Sale;
LET v_ListDate = FieldValue ('DATE_01', 1);
DROP Table Date_01;
FOR Each i_01 in $(v_ListDate)
Result:
LOAD DATE,
NAME_ID
FROM Sale.qvd (qvd)
Where DATE = $(i_01);
Result_01:
LOAD Date($(i_01), 'DD.MM.YYYY') as DATE_01,
NAME_ID as NAME_ID_01,
NAME as NAME_01
FROM Nomenclature.qvd (qvd)
Where not Exists (NAME_ID);
DROP Table Result;
NEXT i_01
Привет.
Пример с цифрами был бы весьма кстати.Пока не очень понятна задача. Какая дата нужна в итоговой?
Полагаю, Вам нужно присоединить календарь (искусственно созданный) к второй таблице, если делать этим спопобом. Т.е. чтобы в второй таблице были все возможные(по первой таблице) соотношения Код-Магазин + Дата. Другими словами добавить строки с нулевым остатком.
Скрипт календаря можно использовать,например, такой:
let vStartDate = 39432; //
let vPeriod = num(Today()) - $(vStartDate) ; // период календаря
calendar:
LOAD $(vStartDate) + RowNo() as Дата
AutoGenerate ($(vPeriod));
Нужна дата остатка.
Для примера в первой таблице 40000 записей, во второй 3000 за один день. значит в 3й должно быть 37000.
а теперь берем остатки за 2 дня.
в первой таблице 40000. во второй на один день 3000, на другой день 5000, итого в 3й должно быть 72000 записей, из них на первый день 37000 и на второй день 35000. вот мне хочется понять, как записать дату остатка.
Я тут подумал, надо использовать календарь - сначала обеденить его с первой таблицей, а потом с таблицей остатков добавив в ключ дату... сейчас пробую этот вариант..ищу как его написать, наверное через Concatenate?
Именно об этом и подумал, сейчас как раз пробую
Все это хорошо, я так и думал сделать, вот только как таблицы объединить?
Сейчас есть одна таблица и там 30000 записей и календарь, например на 5 дней.
и должна получиться 3я таблица, где на каждый день 30000 записей, т.е. в данном случае 150000.
Через JOIN. Если нет пересекающихся полей, то он просто перемножит таблицы
Календарь
---------------
1
2
3
4
5
JOIN
Магазин
------------
Магазин1
Магазин2
Получится
Календарь, Магазин
----------------------------------
1, Магазин1
1, Магазин2
2, Магазин1
2, Магазин2
3, Магазин1
3, Магазин2
4, Магазин1
4, Магазин2
5, Магазин1
5, Магазин2
JOIN либо IntervalMatch()
Добрый день.
Периодически мне тоже приходиться с таким сталкиваться. Есть разные варианты решения данной задачи, правда пока не решил какой из вариантов лучше.
Как вариант, попробуй сделать вот так:
Nomenclature:
LOAD * Inline [
NN, NAME_ID, NAME
1, 1001, Milk
2, 1002, Bread
3, 1003, Tea
4, 1004, Coffee
5, 1005, Meat
6, 1006, Egg
7, 1007, Butter
8, 1008, Water
9, 1009, Vodka
10, 1010, Whiskey
];
STORE * from Nomenclature into Nomenclature.qvd (qvd);
DROP Table Nomenclature;
Sale:
LOAD * Inline [
DATE, NAME_ID
01.01.2016, 1001
01.01.2016, 1002
01.01.2016, 1003
01.01.2016, 1004
02.01.2016, 1001
02.01.2016, 1009
03.01.2016, 1007
03.01.2016, 1008
03.01.2016, 1009
03.01.2016, 1010
04.01.2016, 1003
04.01.2016, 1004
04.01.2016, 1005
05.01.2016, 1001
05.01.2016, 1002
05.01.2016, 1003
05.01.2016, 1004
05.01.2016, 1005
05.01.2016, 1006
05.01.2016, 1007
05.01.2016, 1008
06.01.2016, 1008
];
STORE * from Sale into Sale.qvd (qvd);
//DROP Table Sale;
Date:
LOAD Distinct DATE
Resident Sale
//FROM Sale.qvd (qvd)
Order By DATE;
NoConcatenate
Date_01:
LOAD Concat (num(DATE), ', ') as DATE_01
Resident Date
Order By DATE;
DROP Table Date;
DROP Table Sale;
LET v_ListDate = FieldValue ('DATE_01', 1);
DROP Table Date_01;
FOR Each i_01 in $(v_ListDate)
Result:
LOAD DATE,
NAME_ID
FROM Sale.qvd (qvd)
Where DATE = $(i_01);
Result_01:
LOAD Date($(i_01), 'DD.MM.YYYY') as DATE_01,
NAME_ID as NAME_ID_01,
NAME as NAME_01
FROM Nomenclature.qvd (qvd)
Where not Exists (NAME_ID);
DROP Table Result;
NEXT i_01