Имя: Пароль:
1C
1С v8
Как запросом из регистра выбрать последние 100 кг прихода
,
0 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кг
5 Garykom
 
гуру
29.04.19
10:39
Данная задача в общем виде без запросов в цикле не решается на sql
6 Simod
 
29.04.19
10:41
Речь вроде о приходе, а не о приходах на сумму.
7 catena
 
29.04.19
10:41
Найти именно приход с указанным количеством или с накоплением по фифо до нужного количества?
8 Жан Пердежон
 
29.04.19
10:41
(5) это ваши ограниченные знания sql заставляют так думать?
(6) это всё один большой приход!
9 Simod
 
29.04.19
10:43
Если один приход, то:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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