![]() |
![]() |
![]() |
|
"Последний" регистратор в срезе последних | ☑ | ||
---|---|---|---|---|
0
Собеседник
02.07.08
✎
13:53
|
Недавно была тема о срезе последних по 2-измерениям для регистра
где есть 3-измерения. Необходимо было получить последний регистратор и значения ресурсов. Максимум(Регистратор) - понятно, не совсем подходит. Вернее совсем не подходит Сделал вот так.( правда только по одному измерению, но это не суть) Мож кому пригодится. А может я чего-то перемудрил? :) ВЫБРАТЬ ТаблицаСрезПоследних.Номенклатура КАК Номенклатура, ТаблицаСрезПоследних.Цена КАК Цена, ТаблицаСрезПоследних.Регистратор КАК Регистратор, ТаблицаСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В ИЕРАРХИИ (&Номенклатура) И ТипЦен = &ТипЦен) КАК ТаблицаСрезПоследних ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ТаблицаМаксРегистратор.Номенклатура КАК Номенклатура, МАКСИМУМ(ТаблицаМаксРегистратор.Регистратор) КАК Регистратор ИЗ (ВЫБРАТЬ ТаблицаРегистраторыВМаксПериоде.Номенклатура КАК Номенклатура, ТаблицаРегистраторыВМаксПериоде.Регистратор КАК Регистратор ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В ИЕРАРХИИ (&Номенклатура) И ТипЦен = &ТипЦен) КАК ТаблицаРегистраторыВМаксПериоде ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВнутренняяТаблица.Номенклатура КАК Номенклатура, МАКСИМУМ(ВнутренняяТаблица.Регистратор.Дата) КАК РегистраторДата ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В ИЕРАРХИИ (&Номенклатура) И ТипЦен = &ТипЦен) КАК ВнутренняяТаблица СГРУППИРОВАТЬ ПО ВнутренняяТаблица.Номенклатура) КАК ТаблицаМаксПериод ПО ТаблицаРегистраторыВМаксПериоде.Номенклатура = ТаблицаМаксПериод.Номенклатура И ТаблицаРегистраторыВМаксПериоде.Регистратор.Дата = ТаблицаМаксПериод.РегистраторДата) КАК ТаблицаМаксРегистратор СГРУППИРОВАТЬ ПО ТаблицаМаксРегистратор.Номенклатура) КАК ТаблицаСоединенияМаксРегистратора ПО (ТаблицаСоединенияМаксРегистратора.Номенклатура = ТаблицаСрезПоследних.Номенклатура) И (ТаблицаСоединенияМаксРегистратора.Регистратор = ТаблицаСрезПоследних.Регистратор) |
|||
1
Собеседник
02.07.08
✎
21:43
|
сорри за настойчивость,
хотелось бы услышать можеть хоть какую ругань в свой адрес :) так как в (1) - правильно или нет |
|||
2
Garkin
02.07.08
✎
22:21
|
(3) перемудрил однозначно
3 вложенных запроса - это на 2 замного. |
|||
3
Собеседник
03.07.08
✎
19:10
|
(2) несогласен ;)
обосновать? |
|||
4
Долорес И
03.07.08
✎
19:13
|
(0)тему не видела, но разве срез последних не показывает регистратора?
|
|||
5
Собеседник
03.07.08
✎
19:15
|
(4) есть три измерения - надо только по двум
|
|||
6
Долорес И
03.07.08
✎
19:19
|
(5)а, то есть, фиксируешь два, а из оставшихся значений берёшь с наиболее поздним регистратором.
например, так можно: в подзапросе получаем таблицу с датой, соответствующей максимальному регистратору, которую во внешнем запросе соединяем внутренним соединением по дате и совпадающим измерениям и берем максимум уже по регистратору. получим то, что нужно. |
|||
7
Собеседник
03.07.08
✎
19:26
|
(6) (0) - это не моя задача, просто было интересно.
Максимум(регистратор) <> "последний" регистратор, поэтому вложенных запроса 3. 1 - максимальный период 2 - источник для максимального регистратора 3 - максимальный регистратор а потом уже итог |
|||
8
Долорес И
03.07.08
✎
19:28
|
(7)что такое источник для максимального регистратора?
|
|||
9
Собеседник
03.07.08
✎
19:30
|
3 вложенных для нагядности, но как сказано в (2) - не согласен
|
|||
10
Долорес И
03.07.08
✎
19:32
|
не поняла, зачем п.2
если тебе известна дата последнего регистратора, то максимум по всем документам с такой датой и даст необходимый регистратор. поскольку позиция документа - это дата + ид, а максимум по документу вычисляется как раз по ид(то есть, максимальный в пределах нужной даты документ и будет последним). |
|||
11
Собеседник
03.07.08
✎
19:33
|
(8) не вопрос - для краткости можно и так
но как по мне - это менее читаемо ?) ВЫБРАТЬ ТаблицаСрезПоследних.Номенклатура КАК Номенклатура, ТаблицаСрезПоследних.Цена КАК Цена, ТаблицаСрезПоследних.Регистратор КАК Регистратор, ТаблицаСрезПоследних.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В ИЕРАРХИИ (&Номенклатура) И ТипЦен = &ТипЦен) КАК ТаблицаСрезПоследних ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ТаблицаРегистраторыВМаксПериоде.Номенклатура КАК Номенклатура, МАКСИМУМ(ТаблицаРегистраторыВМаксПериоде.Регистратор) КАК Регистратор ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В ИЕРАРХИИ (&Номенклатура) И ТипЦен = &ТипЦен) КАК ТаблицаРегистраторыВМаксПериоде ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВнутренняяТаблица.Номенклатура КАК Номенклатура, МАКСИМУМ(ВнутренняяТаблица.Период) КАК Период ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Номенклатура В ИЕРАРХИИ (&Номенклатура) И ТипЦен = &ТипЦен) КАК ВнутренняяТаблица СГРУППИРОВАТЬ ПО ВнутренняяТаблица.Номенклатура) КАК ТаблицаМаксПериод ПО ТаблицаРегистраторыВМаксПериоде.Номенклатура = ТаблицаМаксПериод.Номенклатура И ТаблицаРегистраторыВМаксПериоде.Период = ТаблицаМаксПериод.Период СГРУППИРОВАТЬ ПО ТаблицаРегистраторыВМаксПериоде.Номенклатура) КАК ТаблицаСоединенияМаксРегистратора ПО (ТаблицаСоединенияМаксРегистратора.Номенклатура = ТаблицаСрезПоследних.Номенклатура) И (ТаблицаСоединенияМаксРегистратора.Регистратор = ТаблицаСрезПоследних.Регистратор) |
|||
12
Собеседник
03.07.08
✎
19:33
|
(10) - ВОТ. вот тут то вы и не правы.
|
|||
13
Garkin
03.07.08
✎
20:07
|
(3) Если интерестно то
посмотри "Проф. разработка в системе 1С:Предприятие 8" А.П. Гарбец и компания стр 126. Там есть пример получения среза последних запросом. |
|||
14
Собеседник
03.07.08
✎
21:16
|
(13) - спасибо за участие. Но вы, господа, не поняли. (на стр 126 - не в тему, все равно, если нужен будет регистратор - необходм будет еще одн вложеный запрос)
В качестве примера мной был приведен рс ЦеныНоменклатуры, не совсем корректно. Не имеет смысла получение цены без учета характеристики... Я не помню как конкретно назывался РС в задаче - пусть это будет "ХарактеристикиПродукции" Исходные данные: РС: "ХарактеристикиПродукции", периодичность - В пределах дня, подчинен регистратору Измерения: "Продукция", "Характеристика1", "Характеристика2" Ресурсы: "Ресурс" Необходимо получить последнее значение "Ресурс" и "Регистратор" для Продукция=ПродА и Характеристика1 = Х11 (т.е. без учета значения измерения "Характеристика2") Имеем данные в РС по ПродА и Х11: Регистратор Период Продукция Х-ка1 Х-ка2 Ресурс 01.01.08 00:00:00 01.01.08 ПродА Х11 <> Зн1 01.01.08 00:00:20 10.01.08 ПродА Х11 Х21 Зн2 01.01.08 00:00:10 10.01.08 ПродА Х11 Х22 Зн3 Все три строки являются срезом последних для ПродА и Х11. Время регистратора во второй строке не является ошибкой - именно так будет представлен список РС(или результат запроса с автоупорядочиванием), при периодичности "День". Причем Регистратор в строке 1 внесен в БД позже "всех". Согласны, что Максимум(Регистратор) - понятие далекое от "последний" на временной оси документ? Т.е. необходимо определить сначала максимальный период, потом макс регистратор в этом периоде и уж потом одну из строк (2 или 3) в зависимости от того, что будем считать макс периодом(и как вополняется регистрация в РС). Можно в первом запросе получать или МАКСИМУМ(Период) и соединять со вторым по Период или МАКСИМУМ(Регистратор.Дата) и соединять со вторым Регистратор.Дата Уф. НапЫсав :) |
|||
15
Immortal
03.07.08
✎
21:32
|
это всё равно что остатки получать из Остатки() с необходимостью получить документ поступления.недавно делал.
то что в(0) нормально соединений могло быть меньше, но при этом вложенных запросов было бы больше. так что один фиг. |
|||
16
Собеседник
03.07.08
✎
21:43
|
(15) - вот это в тему
т.е. я хотел сказать, что по методике (0) можно и "последний" приход получать просто в (0) более нагладно в (11) компактней. вобЧим весь этот мой треп к тому что 1) МАКСИМУМ(Регистратор) - фонарь 2) МАКСИМУМ(Регистратор.МоментВремени) - низзя 3) МАКСИМУМ(Перио) МАКСИМУМ(Регистратор) - аналогично 1) т.е. необходимо как минимум 2 вложенных запроса. Всем спасибо |
|||
17
Garkin
06.07.08
✎
21:28
|
ВЫБРАТЬ
ХарактеристикиПродукции.Регистратор, ХарактеристикиПродукции.Продукция, ХарактеристикиПродукции.Характеристика1 ИЗ РегистрСведений.ХарактеристикиПродукции КАК ХарактеристикиПродукции ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(ХарактеристикиПродукции.Регистратор.Дата) КАК РегистраторДата, МАКСИМУМ(ХарактеристикиПродукции.Период) КАК Период, ХарактеристикиПродукции.Продукция КАК Продукция, ХарактеристикиПродукции.Характеристика1 КАК Характеристика1 ИЗ РегистрСведений.ХарактеристикиПродукции КАК ХарактеристикиПродукции ГДЕ ХарактеристикиПродукции.Период <= &Период СГРУППИРОВАТЬ ПО ХарактеристикиПродукции.Продукция, ХарактеристикиПродукции.Характеристика1) КАК ВложенныйЗапрос ПО ХарактеристикиПродукции.Продукция = ВложенныйЗапрос.Продукция И ХарактеристикиПродукции.Характеристика1 = ВложенныйЗапрос.Характеристика1 И ХарактеристикиПродукции.Регистратор.Дата = ВложенныйЗапрос.РегистраторДата И ХарактеристикиПродукции.Период = ВложенныйЗапрос.Период (14) не подойдет? |
|||
18
Собеседник
09.07.08
✎
22:35
|
(17) - не подойдет.
во первых: если в периоде два регистратора с одной датой(дата время) Регистратор Период Продукция Х-ка1 Х-ка2 Ресурс 01.01.08 00:00:00 01.01.08 ПродА Х11 <> Зн1 01.01.08 00:00:10 10.01.08 ПродА Х11 Х21 Зн2 01.01.08 00:00:10 10.01.08 ПродА Х11 Х22 Зн3 то в результате получим две строки- 2 и 3 а не одну 2) во вторых есть мнение, что если дата регистратора <> период (такое ведь может быть) то в результате МАКСИМУМ(ХарактеристикиПродукции.Регистратор.Дата) КАК РегистраторДата, МАКСИМУМ(ХарактеристикиПродукции.Период) КАК Период можем получить интересные набор данных а после соединени с РегистрСведений.ХарактеристикиПродукции(а не с СрезПоследних) получим у точно не срез последних :) ИМХО. |
|||
19
sapphire
09.07.08
✎
22:36
|
Задолбали. Учите сикель/ЫЙД (SQL)
|
|||
20
Immortal
09.07.08
✎
22:39
|
(19) давай свой вариант, нечего орать=)
|
|||
21
sapphire
09.07.08
✎
22:49
|
(20) Идите нафиг. Сколько можно. Гуглите в конце концов.
|
|||
22
Immortal
09.07.08
✎
22:50
|
(21) в общем нету вариантов=)
|
|||
23
H A D G E H O G s
09.07.08
✎
22:55
|
Спокойно, чего разволновались то? Счаст разберемся.. Так-ссс...
|
|||
24
sapphire
09.07.08
✎
22:56
|
(22) Варианты есть всегда, если есть мозги и желание разобраться. Заниматься генной инженерией последний год мне по-просту влом.
|
|||
25
H A D G E H O G s
09.07.08
✎
22:58
|
А, ну нафих, лом разбираться, я не в теме был..
|
|||
26
sapphire
09.07.08
✎
23:00
|
Нормальному с моей точки зрения программисту понадобиться максимум 2 минуты на решение - иначе мне такой коллега нафиг не нужен.
|
|||
27
Garkin
09.07.08
✎
23:02
|
(18) Согласен, неправ.
|
|||
28
Собеседник
09.07.08
✎
23:06
|
(27) да я без претензий :). самому интересно
вот (19) - грит: "все бобаны, один я - крут. но как я крут не скажу!" :) |
|||
29
Шурик71
09.07.08
✎
23:37
|
Или я чтего-то не понимаю, или
ВЫБРАТЬ ПЕРВЫЕ 1 р1.регистратор ,р1.период ,р2.ресурс1 ,р2.ресурс2 ИЗ регистрсведений.МойРегистр как р1 Левое соединение регистрсведений.МойРегистр как р2 ПО р1.регистратор = р2.регистратор ГДЕ р1.Период <= &ДатаСреза И р1.измерение1 = &ФильтрИзмерения1 И р1.измерение2 = &ФильтрИзмерения2 Упорядочить по Период Убыв это то, что просили? |
|||
30
PowerBoy
10.07.08
✎
06:45
|
А нафига их связывать - нельзя просто сделать:
ВЫБРАТЬ ПЕРВЫЕ 1 р1.регистратор ,р1.период ,р1.ресурс1 ,р1.ресурс2 ИЗ регистрсведений.МойРегистр ГДЕ р1.Период <= &ДатаСреза И р1.измерение1 = &ФильтрИзмерения1 И р1.измерение2 = &ФильтрИзмерения2 Упорядочить по Период Убыв |
|||
31
Шурик71
10.07.08
✎
09:00
|
можно :)
видимо, игра "кто усложнит задачу" заразительна :) |
|||
32
Собеседник
10.07.08
✎
13:19
|
(30) - это не выполняет условия задачи :)
|
|||
33
Шурик71
10.07.08
✎
20:22
|
(32) почему не выполняет?
Или это типа шутка (смайлик в (32) обращен к самому себе как к автору темы)? |
|||
34
Шурик71
10.07.08
✎
20:24
|
Если имеется в виду, что периодичность регистра низкая, то в запросе примерно
Упорядочить по Период Убыв, Регистратор Убыв - смысл все равно не меняется |
|||
35
Immortal
10.07.08
✎
20:30
|
(30) ну ну-) откуда данные фильтров?=)
+ про период выше уже озвучили неоднозначность. |
|||
36
Immortal
10.07.08
✎
20:31
|
(31) нельзя. или ртфм учи
|
|||
37
Immortal
10.07.08
✎
21:31
|
v8: Запрос к вирт. таблице ОстаткиИОбороты
нате, пооптимизируйте-) потом сравним с моим рабочим вариантом-) |
|||
38
Шурик71
10.07.08
✎
22:06
|
(36) Ну-ну...
ВЫБРАТЬ ПЕРВЫЕ 1 ЦеныНоменклатуры.Период КАК Период, ЦеныНоменклатуры.Регистратор, ЦеныНоменклатуры.Регистратор.Дата КАК РегистраторДата, ЦеныНоменклатуры.Цена, ЦеныНоменклатуры.Валюта, ЦеныНоменклатуры.ЕдиницаИзмерения ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.Активность = ИСТИНА И ЦеныНоменклатуры.Номенклатура = &Номенклатура И ЦеныНоменклатуры.ТипЦен = &ТипЦен И ЦеныНоменклатуры.Период <= &ДатаСреза УПОРЯДОЧИТЬ ПО Период УБЫВ, РегистраторДата УБЫВ Как ни странно, работает и выводит на цены, записанные _последним_ регистратором по номенклатуре (1 изм) и типу цен (2 изм), несмотря на то, что в одну дату по этой номенклатуре есть цены по нескольким характеристикам номенклатуры (3 изм), и то, что периодичность регистра = дата (без времени) :) > Недавно была тема о срезе последних по 2-измерениям для регистра > где есть 3-измерения. > Необходимо было получить последний регистратор и значения ресурсов. Разве я отклонился от задачи? |
|||
39
Garkin
10.07.08
✎
22:20
|
(38) Задача не в том чтобы найти последний регистратор для заданных значений измерения, а в том чтобы найти последние регистраторы для всех значений измерений
|
|||
40
Шурик71
10.07.08
✎
23:00
|
(39) Согласись, от постановки (0) это несколько отличается :)
Тогда вот так: ВЫБРАТЬ Подзапрос3.Номенклатура, Подзапрос3.ТипЦен, Подзапрос3.Регистратор, ЦеныНоменклатуры.Цена, ЦеныНоменклатуры.ЕдиницаИзмерения, ЦеныНоменклатуры.Валюта ИЗ (ВЫБРАТЬ Подзапрос2.Номенклатура КАК Номенклатура, Подзапрос2.ТипЦен КАК ТипЦен, Подзапрос2.МаксПериод КАК МаксПериод, Подзапрос2.МаксДата КАК МаксДата, МАКСИМУМ(ЦеныНоменклатуры.Регистратор) КАК Регистратор, МАКСИМУМ(ЦеныНоменклатуры.ХарактеристикаНоменклатуры) КАК ЛюбаяХарактеристика ИЗ (ВЫБРАТЬ Подзапрос1.Номенклатура КАК Номенклатура, Подзапрос1.ТипЦен КАК ТипЦен, Подзапрос1.МаксПериод КАК МаксПериод, МАКСИМУМ(ЦеныНоменклатуры.Регистратор.Дата) КАК МаксДата ИЗ (ВЫБРАТЬ ЦеныНоменклатуры1.Номенклатура КАК Номенклатура, ЦеныНоменклатуры1.ТипЦен КАК ТипЦен, МАКСИМУМ(ЦеныНоменклатуры1.Период) КАК МаксПериод ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры1 ГДЕ ЦеныНоменклатуры1.Активность = ИСТИНА И ЦеныНоменклатуры1.Номенклатура В ИЕРАРХИИ(&Номенклатура) И ЦеныНоменклатуры1.ТипЦен = &ТипЦен И ЦеныНоменклатуры1.Период <= &ДатаСреза СГРУППИРОВАТЬ ПО ЦеныНоменклатуры1.Номенклатура, ЦеныНоменклатуры1.ТипЦен) КАК Подзапрос1 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО Подзапрос1.Номенклатура = ЦеныНоменклатуры.Номенклатура И Подзапрос1.ТипЦен = ЦеныНоменклатуры.ТипЦен И Подзапрос1.МаксПериод = ЦеныНоменклатуры.Период СГРУППИРОВАТЬ ПО Подзапрос1.МаксПериод, Подзапрос1.Номенклатура, Подзапрос1.ТипЦен) КАК Подзапрос2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО Подзапрос2.Номенклатура = ЦеныНоменклатуры.Номенклатура И Подзапрос2.ТипЦен = ЦеныНоменклатуры.ТипЦен И Подзапрос2.МаксПериод = ЦеныНоменклатуры.Период И Подзапрос2.МаксДата = ЦеныНоменклатуры.Регистратор.Дата СГРУППИРОВАТЬ ПО Подзапрос2.Номенклатура, Подзапрос2.ТипЦен, Подзапрос2.МаксПериод, Подзапрос2.МаксДата) КАК Подзапрос3 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО Подзапрос3.Номенклатура = ЦеныНоменклатуры.Номенклатура И Подзапрос3.ТипЦен = ЦеныНоменклатуры.ТипЦен И Подзапрос3.Регистратор = ЦеныНоменклатуры.Регистратор И Подзапрос3.ЛюбаяХарактеристика = ЦеныНоменклатуры.ХарактеристикаНоменклатуры ==== В (11) юзается вирт. таблица СрезПоследних. А вот для данной задачи она никак не катит... В (17) неверно одновременное определение максимума периода и регистратора. P.S. В задаче еще как минимум одна дырка: если в последнем документе устанавливаются значения для нескольких 3-х измерений, то тогда какое брать - неясно. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |