Имя: Пароль:
1C
1С v8
v8: Как узнать одним запросом хватит ли товара двум покупателям, а если не хватит то сколько и кому?
0 zoro-z
 
21.11.12
18:43
Задача:
Есть два покупателя на один и тот же товар, есть товар на складе. Как узнать одним запросом хватит ли товар двум покупателям, а если не хватит то сколько и кому.
1 shuhard
 
21.11.12
18:46
(0) [и кому]
учетная система телепатически расставит приоритеты ?
2 zoro-z
 
21.11.12
18:48
Приоритет по списку от А до Я.
3 zoro-z
 
21.11.12
18:49
Главное как в запросе учитывать динамический остаток.
4 Fragster
 
гуру
21.11.12
18:50
можно фифо в запросе, можно фифо постобработкой запроса с итогами за 1 проход результата.
5 zulu_mix
 
21.11.12
18:50
поглядеть как устроено резервирование?
6 zoro-z
 
21.11.12
18:51
(5) можно но долго.
Нужен какой нибуть маленький примерчик, куда хоть двигаться.
7 shuhard
 
21.11.12
18:52
(3) ну тут два покупателя и достаточно двух временных таблиц
8 Fragster
 
гуру
21.11.12
18:53
а что иль кто есть "динамический остаток"?
9 zoro-z
 
21.11.12
18:53
(7) Покупателей может быть сколько угодно, это пример.
10 zoro-z
 
21.11.12
18:54
(8)
Ост = 10
П1 = 8
П2 = 5

Ост = 10 - 8 = 2
Ост = 2 - 5 = -3

Типа того.
11 shuhard
 
21.11.12
18:55
(9) тогда в поиск
нарастающий итог запросом
12 Fragster
 
гуру
21.11.12
19:04
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    ""Склад"" КАК Склад,
|    12 КАК Остаток
|ПОМЕСТИТЬ Остатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ""Склад"" КАК Склад,
|    ""К1"" КАК Контрагент,
|    8 КАК Количество
|ПОМЕСТИТЬ Заказы
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    ""Склад"",
|    ""К2"",
|    7
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Остатки.Склад КАК Склад,
|    Остатки.Остаток КАК Остаток,
|    Заказы.Контрагент,
|    Заказы.Количество КАК Количество
|ИЗ
|    Остатки КАК Остатки
|        ЛЕВОЕ СОЕДИНЕНИЕ Заказы КАК Заказы
|        ПО Остатки.Склад = Заказы.Склад
|ИТОГИ
|    СУММА(Количество) КАК Количество
|ПО
|    Склад,
|    Остаток";

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
   Если
       Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке
       И Выборка.Группировка() = "Остаток"
   Тогда
       Остаток = Выборка.Остаток;
       Если Остаток < Выборка.Количество Тогда
           Сообщить("Не хватает " + (Выборка.Количество-Остаток) + " шт");
       КонецЕсли;
   КонецЕсли;
   
   Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ДетальнаяЗапись Тогда
       КоличествоЗаписи = Мин(Выборка.Количество, Остаток);
       Сообщить("Клиенту " + Выборка.Контрагент + "досталось" + КоличествоЗаписи);
       Остаток = Остаток - КоличествоЗаписи;
   КонецЕсли;
   
КонецЦикла;
13 Fragster
 
гуру
21.11.12
19:04
(11) медленно
14 shuhard
 
21.11.12
19:06
(13) угу
страшно медленно
но ТС поставил себе задачу сделать это в запросе
15 Fragster
 
гуру
21.11.12
19:06
(14) в итоге пришел к построению разных фифо по принципу (12), вполне шустро получается
16 Fragster
 
гуру
21.11.12
19:07
знай себе сортировку добавляй нужную
17 zoro-z
 
21.11.12
19:13
Запрос должен выдать сразу - П2 не хватило 3 штуки.
18 Fragster
 
гуру
21.11.12
19:15
(17) а (12) что, не выдал? ну тогда  Мин(Выборка.Количество, Остаток); замени на Макс(0, Остаток) - Выборка.Количество,
19 Fragster
 
гуру
21.11.12
19:22
ну тормозной вариант типа такой
ВЫБРАТЬ
   "Склад" КАК Склад,
   12 КАК Остаток
ПОМЕСТИТЬ Остатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   "Склад" КАК Склад,
   "К1" КАК Контрагент,
   8 КАК Количество
ПОМЕСТИТЬ Заказы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   "Склад",
   "К2",
   7
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Заказы.Склад,
   Заказы.Контрагент,
   СУММА(ЗаказыПред.Количество) КАК Количество
ПОМЕСТИТЬ ЗаказыНарастающий
ИЗ
   Заказы КАК Заказы
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Заказы КАК ЗаказыПред
       ПО Заказы.Склад = ЗаказыПред.Склад
           И Заказы.Контрагент >= ЗаказыПред.Контрагент

СГРУППИРОВАТЬ ПО
   Заказы.Склад,
   Заказы.Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Остатки.Склад КАК Склад,
   ЗаказыНарастающий.Контрагент,
   Остатки.Остаток - ЗаказыНарастающий.Количество КАК Досталось
ИЗ
   Остатки КАК Остатки
       ЛЕВОЕ СОЕДИНЕНИЕ ЗаказыНарастающий КАК ЗаказыНарастающий
       ПО Остатки.Склад = ЗаказыНарастающий.Склад
20 zoro-z
 
21.11.12
19:42
Спасибо, попробую.