Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как запросом из регистра выбрать последние 100 кг прихода

Как запросом из регистра выбрать последние 100 кг прихода
Я
   max1c2011
 
29.04.19 - 10:33
Что то туплю.
Как в ERP 2.4, да в принципе, не только в ней, выбрать ЗАПРОСОМ из некого регистра, скажем "Закупки"

последний приход в количестве N-кг.
Скажем, как выбрать последний приход 100 кг картошки.
Ведь она может закупаться в разные месяцы и разными патриями.

Вроде вопрос простой, но туплю.
 
 
   Ёпрст
 
1 - 29.04.19 - 10:34
Если было куплено 103 кг, попадает в ваше условие, или нужно строгое равенство ?
   Ёпрст
 
2 - 29.04.19 - 10:35
ну а так подзапрос на поиск максимальной даты и его в условие на документ. усё
   Жан Пердежон
 
3 - 29.04.19 - 10:36
накопленную сумму считай сначала
   Вафель
 
4 - 29.04.19 - 10:37
(1) как я понял нужно по партиям собрать 100кг
   Garykom
 
5 - 29.04.19 - 10:39
Данная задача в общем виде без запросов в цикле не решается на sql
   Simod
 
6 - 29.04.19 - 10:41
Речь вроде о приходе, а не о приходах на сумму.
   catena
 
7 - 29.04.19 - 10:41
Найти именно приход с указанным количеством или с накоплением по фифо до нужного количества?
   Жан Пердежон
 
8 - 29.04.19 - 10:41
(5) это ваши ограниченные знания sql заставляют так думать?
(6) это всё один большой приход!
   Simod
 
9 - 29.04.19 - 10:43
Если один приход, то:

выбрать первые 1
    партия
из
    Регистр
где
    Количество = 100
упорядочить по
    Дата убыв
   СвинТуз
 
10 - 29.04.19 - 10:48
(0)
Можно. Через левое соединение, например. Но это не уровень школы.

(5)
"Поставьте на меня небольшую ставочку" (С)
 
 Рекламное место пустует
   Garykom
 
11 - 29.04.19 - 10:52
Задача которая решается циклом аля "набор корзины по порядку пока не хватит".

На языке запросов тоже будет с циклами.
Да современные диалекты sql позволяют кодить и условия и циклы и почти что угодно, не обязательно снаружи цикл делать.
   Garykom
 
12 - 29.04.19 - 10:55
Если ограничить по кол-ву максимально приходов (от 1 до N) то можно запросом, но там пипец будет.

В общем виде для любого даже неразумного N скажем в миллионы приходов которыми будут набираться 100 кг как?
   max1c2011
 
13 - 29.04.19 - 11:04
С циклами то я все понял...

Приход может быть в любое время на любое количество, с разрывами.
Варианты:
- куплена в августе 2018 партия 1000 кг
- куплены партиями разными. но 4 месяца не покупали
- покупаем по 1 кг каждый день
   Garykom
 
14 - 29.04.19 - 11:09
SELECT t.*,
       @sum := @sum + effect
FROM (
  SELECT *
  FROM `table`
  ORDER BY effect DESC
      ) AS t
      JOIN (SELECT @sum := 0) var
WHERE @sum < 100;
https://toster.ru/q/96563

Как это на языке 1С я хз
   max1c2011
 
15 - 29.04.19 - 11:11
говорят в SQL есть функция OVER
   Eiffil123
 
16 - 29.04.19 - 11:13
сложно, но можно.
но проще кодом в цикле, очень похоже на задачу классического списания по партиям по ФИФО.
   Eiffil123
 
17 - 29.04.19 - 11:15
можно даже использовать объектную модель доступа к базе данных (читать записи из регистра пока не наберем нужное количество), возможно даже быстрее будет.
   Генератор
 
18 - 29.04.19 - 11:16
запрос без даты начала, производительность будет ухудшаться с объемом данных
   max1c2011
 
19 - 29.04.19 - 11:17
Просто стала задача - быстро запросом получить стоимость последнего прихода N-кг товара.
   max1c2011
 
20 - 29.04.19 - 11:17
да, данных много - в ERP это все...
   catena
 
21 - 29.04.19 - 11:21
(19)А если в данной задаче быстро - это не запросом?
   catena
 
22 - 29.04.19 - 11:22
Вообще фифо запросом гуглится, по-моему этим все балуются в начале карьеры. Соединение регистра самого с собой по периоду с группировкой суммы по ресурсу.
   Simod
 
23 - 29.04.19 - 11:23
   GANR
 
24 - 29.04.19 - 11:24
(0) Одним только запросом будет стремно. Надо сформировать выборку остатков по партиям, отсортированную по убыванию даты приходного документа (LIFO). Затем перебрать выборку в цикле, в переменной подсчитывая сколько кило осталось до 100.
   lodger
 
25 - 29.04.19 - 11:25
(0) готовь 3 запроса...
1) приходы по номенклатуре за последние N-дней,
2) приходы по номенклатуре за M-месяцев,
3) все приходы по номенклатуре.

все с сортировкой "с конца".

числа N и M должны быть подобраны так, чтобы закрывать ~60% и ~30% от всех случаев.

после каждого запроса из 1 и 2 делать обход выборки пока не наберется, либо делать обход 3 пока не наберется или "как есть".

естественно речь идет только о средствах 1ц. это наиболее простой и нативный способ, имхо.
   max1c2011
 
26 - 29.04.19 - 11:26
(25)ну до этого я сам уже дошел.
Вот думал может как то одним и быстро можно.
   Garykom
 
27 - 29.04.19 - 11:30
(23) Это конечно решение.

Но по сути вместо одного цикла, давайте сделаем несколько десятков, сотен и более циклов уже внутри sql сервера.
   Garykom
 
28 - 29.04.19 - 11:31
(27)+ Хороший антипример как делать через ЖПО, но зато запросами.
   ptiz
 
29 - 29.04.19 - 11:31
(19) Интересует один товар или по списку?
   max1c2011
 
30 - 29.04.19 - 11:32
(23)спасибо
   max1c2011
 
31 - 29.04.19 - 11:32
(29)да без разницы.
Конечно по списку - кому только картошка интересна
   Garykom
 
32 - 29.04.19 - 11:33
(30) Рано благодаришь там FIFO а тебе надо LIFO
   ptiz
 
33 - 29.04.19 - 11:35
(31) Такой запрос по одному товару у меня быстро отработал.
Но "по списку" - торможу, не вижу хорошего решения.

ВЫБРАТЬ ПЕРВЫЕ 1
    ОстаткиТоваров.Период КАК Период,
    ОстаткиТоваров.Номенклатура,
    СУММА(ОстаткиТоваров2.Количество) КАК Количество
ИЗ
    РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров2
        ПО ОстаткиТоваров.Период <= ОстаткиТоваров2.Период
            И ОстаткиТоваров2.Активность
            И ОстаткиТоваров2.Количество > 0
            И (ОстаткиТоваров2.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход))
            И ОстаткиТоваров2.Номенклатура = &Номенклатура
ГДЕ
    ОстаткиТоваров.Активность
    И ОстаткиТоваров.Количество > 0
    И ОстаткиТоваров.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    И ОстаткиТоваров.Номенклатура = &Номенклатура

СГРУППИРОВАТЬ ПО
    ОстаткиТоваров.Период,
    ОстаткиТоваров.Номенклатура

ИМЕЮЩИЕ
    СУММА(ОстаткиТоваров2.Количество) >= 100000

УПОРЯДОЧИТЬ ПО
    Период УБЫВ
 
 
   max1c2011
 
34 - 29.04.19 - 11:41
(33)спасибо! это что то
   Simod
 
35 - 29.04.19 - 11:44
(30) Пример из (23)  представляет чисто академический интерес. На реальных базах, такой запрос может повесить сервер. Это вариация на тему "Нарастающие итоги". Посмотри:
http://catalog.mista.ru/public/201526/
http://catalog.mista.ru/public/262300/
   max1c2011
 
36 - 29.04.19 - 11:53
(35)хм..да. понятно
   Жан Пердежон
 
37 - 29.04.19 - 19:17
(32) внезапно стало можно, и накопленный итог уже норм считается?)
(33) номенклатуру везде в связи добавить
более общая задача (для языка запросов, тоже решаемая):
когда есть список документов расхода/прихода, запросом получить
какие расходники какие поступления спишут по lifo (fifo)
   Garykom
 
38 - 29.04.19 - 21:16
(37) >внезапно стало можно

Реально применимо на реальных данных? Нельзя.
   runoff_runoff
 
39 - 29.04.19 - 21:28
запрос в СКД и ВычислитьВыражение()


Список тем форума
Рекламное место пустует  Рекламное место пустует
Миста — веселый ресурс со своими эксклюзивными тараканами Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует