Имя: Пароль:
1C
1С v8
Коллеги, подсобите в запросе. Хромаю пока...
0 Обработка
 
29.11.13
10:01
Есть РС Измерение -  "ТранспортноеСредство" - Спр-к
        Ресурс  - "ДатаЗаменыМасла" - Дата
Нужно запросом вытащить по каждому ТС (Транспортное Средство)
за период "дату первой" ближайшей замены к дату начала и "дату последней "замены ближайший к концу периода.

Вначале был такой запрос:
ВЫБРАТЬ
    ДатыЗаменМаселСрезПервых.ТС,
    ДатыЗаменМаселСрезПервых.ДатаЗамены КАК ДатаЗаменыПервое,
    ДатыЗаменМаселСрезПоследних.ДатаЗамены КАК ДатаЗаменыКонечное
ИЗ
    РегистрСведений.ДатыЗаменМасел.СрезПервых(&Дата1, ) КАК ДатыЗаменМаселСрезПервых
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДатыЗаменМасел.СрезПоследних(&Дата2, ) КАК ДатыЗаменМаселСрезПоследних
        ПО ДатыЗаменМаселСрезПервых.ТС = ДатыЗаменМаселСрезПоследних.ТС

Потом стал такой:

ВЫБРАТЬ
    ДатыЗаменМаселСрезПервых.ТС,
    ДатыЗаменМаселСрезПервых.ДатаЗамены КАК ДатаЗаменыПервое,
    ДатыЗаменМаселСрезПоследних.ДатаЗамены КАК ДатаЗаменыКонечное
ИЗ
    РегистрСведений.ДатыЗаменМасел.СрезПервых(&Дата1, Период В(ВЫБРАТЬ МИНИМУМ(ДатыЗаменМаселСрезПервых.Период)
            ИЗ  РегистрСведений.ДатыЗаменМасел.СрезПервых() КАК ДатыЗаменМаселСрезПервых)) КАК ДатыЗаменМаселСрезПервых
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДатыЗаменМасел.СрезПоследних(&Дата2,
            Период В(ВЫБРАТЬ МАКСИМУМ(ДатыЗаменМаселСрезПоследних.Период)
        ИЗ  РегистрСведений.ДатыЗаменМасел.СрезПоследних() КАК ДатыЗаменМаселСрезПоследних)) КАК ДатыЗаменМаселСрезПоследних
        ПО ДатыЗаменМаселСрезПервых.ТС = ДатыЗаменМаселСрезПоследних.ТС

Но пока то что хочу не получил. Как это сделать?
1 Maxus43
 
29.11.13
10:09
первый запрос почему не сработал? что не так?
2 Maxus43
 
29.11.13
10:11
в первом запросе сделай ПОЛНОЕ СОЕДИНЕНИЕ,
а в выборке
ЕстьNull(ДатыЗаменМаселСрезПервых.ТС, ДатыЗаменМаселСрезПоследних
.ТС)
3 Обработка
 
29.11.13
10:11
(1) По одной Машине выводит несколько значений а мне нужна только одна строчка в выборке.
Вот только по одной машине:
MG - (H25) - A 490 HL    03.11.2013    11.03.2013
MG - (H25) - A 490 HL    03.11.2013    03.11.2013
MG - (H25) - A 490 HL    03.11.2013    20.03.2013
MG - (H25) - A 490 HL    03.11.2013    06.07.2013
4 Maxus43
 
29.11.13
10:13
жиу хрень убери Период В(ВЫБРАТЬ МИНИМУМ(ДатыЗаменМаселСрезПервых.Период)
5 Maxus43
 
29.11.13
10:14
короче понял примерно что хочешь
6 Обработка
 
29.11.13
10:17
Не совсем понял к чему ЕстьNull(ДатыЗаменМаселСрезПервых.ТС, ДатыЗаменМаселСрезПоследних.ТС)? и где?
7 Feunoir
 
29.11.13
10:18
(0) Странно как-то. Срез первых/последних работает по периоду. У тебя дата замены просто ресурс. А периодичность регистра как установлена?

Мне кажется, что срез первых/последних тут вообще не поможет.
8 Обработка
 
29.11.13
10:21
(7) Периодичность "В пределах дня"

"Мне кажется, что срез первых/последних тут вообще не поможет."

Я тоже думал что придется без срезов.
9 makfromkz
 
29.11.13
10:25
Если РС периодический нафиг нужно :  Ресурс  - "ДатаЗаменыМасла" - Дата   ???
10 makfromkz
 
29.11.13
10:26
тогда ресурс должен быть числовым - типо количествоМасла
11 Feunoir
 
29.11.13
10:27
(8) Одним вложенным запросом получаешь первую дату, вторым последнюю, эти запросы соединяешь полным соединением по ТС.

Запросы типа

ВЫБРАТЬ
    ДатыЗаменМасел.ТС,
    МИНИМУМ(ДатыЗаменМасел.ДатаЗамены) КАК ДатаЗаменыПервое
ИЗ
    РегистрСведений.ДатыЗаменМасел КАК ДатыЗаменМасел
ГДЕ ДатыЗаменМасел.ДатаЗамены > &Дата1
ГРУППИРОВАТЬ ПО
    ДатыЗаменМасел.ТС
12 Maxus43
 
29.11.13
10:28
Да родится Монтр...
ВЫБРАТЬ
    ЕСТЬNULL(ВоинскийУчетСрезПоследних.Физлицо, ВоинскийУчетСрезПоследних1.Физлицо) КАК ФизЛицо,
    МАКСИМУМ(ВоинскийУчетСрезПоследних.Период) КАК Период,
    МАКСИМУМ(ВоинскийУчетСрезПоследних1.Период) КАК Период1
ПОМЕСТИТЬ втПериоды
ИЗ
    РегистрСведений.ВоинскийУчет.СрезПоследних(&Дата1, ) КАК ВоинскийУчетСрезПоследних
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ВоинскийУчет.СрезПоследних(&Дата2, ) КАК ВоинскийУчетСрезПоследних1
        ПО ВоинскийУчетСрезПоследних.Физлицо = ВоинскийУчетСрезПоследних1.Физлицо

СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ВоинскийУчетСрезПоследних.Физлицо, ВоинскийУчетСрезПоследних1.Физлицо)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВоинскийУчет.Звание,
    ВоинскийУчет1.Звание КАК Звание1,
    втПериоды.ФизЛицо
ИЗ
    втПериоды КАК втПериоды
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВоинскийУчет КАК ВоинскийУчет
        ПО втПериоды.ФизЛицо = ВоинскийУчет.Физлицо
            И втПериоды.Период = ВоинскийУчет.Период
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ВоинскийУчет КАК ВоинскийУчет1
        ПО втПериоды.ФизЛицо = ВоинскийУчет1.Физлицо
            И втПериоды.Период1 = ВоинскийУчет1.Период

в ВТ срезпоследних надо бы не юзать, для быстроты сделал, чтоб в одну ВТ запихнуть, а не на 2 дробить
13 Обработка
 
29.11.13
10:57
Спасибо за советы буду пробовать.
14 Обработка
 
29.11.13
15:48
Получилось

ВЫБРАТЬ
    ЕСТЬNULL(ДатыЗаменМаселСрезПервых.ТС, ДатыЗаменМаселСрезПоследних.ТС) КАК ТС,
    МИНИМУМ(ДатыЗаменМаселСрезПервых.Период) КАК Первая,
    МАКСИМУМ(ДатыЗаменМаселСрезПоследних.Период) КАК Последняя
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрСведений.ДатыЗаменМасел.СрезПервых(&Дата1, ) КАК ДатыЗаменМаселСрезПервых
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ДатыЗаменМасел.СрезПоследних(&Дата2, ) КАК ДатыЗаменМаселСрезПоследних
        ПО ДатыЗаменМаселСрезПервых.ТС = ДатыЗаменМаселСрезПоследних.ТС
ГДЕ
    ДатыЗаменМаселСрезПервых.ПоказательПробега = &Показатель
    И ДатыЗаменМаселСрезПоследних.ПоказательПробега = &Показатель

СГРУППИРОВАТЬ ПО
    ЕСТЬNULL(ДатыЗаменМаселСрезПервых.ТС, ДатыЗаменМаселСрезПоследних.ТС)
;
15 Обработка
 
29.11.13
15:50
У меня есть продолжение задачи в запросе.

Теперь из другого регистра Нужно вытащить пробеги Авто между заменами.

Пишу:

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПробегиОстаткиИОбороты.ТС,
    ПробегиОстаткиИОбороты.ПробегПриход,
    ВТ.Первая,
    ВТ.Последняя
ИЗ
    ВТ КАК ВТ
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Пробеги.ОстаткиИОбороты (,,день,,) КАК ПробегиОстаткиИОбороты
        ПО ВТ.ТС = ПробегиОстаткиИОбороты.ТС
И        ПробегиОстаткиИОбороты.Период МЕЖДУ ВТ.Первая И ВТ.Последняя


Но не суммирется пробег а выводится отдельно
16 Sabbath
 
29.11.13
15:50
(14) вот видишь, только я вошел, и получилось. Все-таки есть от меня польза. Не надо благодарностей, это моя работа
17 Salimbek
 
29.11.13
16:00
(15) ОстаткиИОбороты (,,день,,) <- а как оно поймет за какой период пробег нужен?
Бери напрямую из регистра "Пробеги", с условием, что Дата движения между "Первая" и "Последняя"
18 Обработка
 
29.11.13
16:10
(17) Пробовал что-то пока не вяжется...
19 Salimbek
 
29.11.13
16:10
+(17) типа:
Выбрать ТС, Первая, Последняя, СУММА(Пробег)
(ВЫБРАТЬ
    ВТ.ТС,
    Пробеги.Пробег,
    ВТ.Первая,
    ВТ.Последняя
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Пробеги КАК Пробеги ПО
ПО ВТ.ТС = Пробеги.ТС И ВТ.Первая<=Пробеги.Период И ВТ.Последняя>=Пробеги.Период) КАК Выборка
СГРУППИРОВАТЬ ПО ТС, Первая, Последняя
20 Обработка
 
29.11.13
16:18
(19) Почему два раза выбрать и второй раз со скобкой?
Не работает это..
21 mc lammer
 
29.11.13
16:29
не уверен что верно понял описание,  но попробуй так:

ВЫБРАТЬ
    ДатыЗаменМасел.ТС,
    МИНИМУМ(ДатыЗаменМасел.ДатаЗамены) КАК ДатаЗаменыПервое,
    МАКСИМУМ(ДатыЗаменМасел.ДатаЗамены) КАК ДатаЗаменыПоследнее,
ИЗ
    РегистрСведений.ДатыЗаменМасел КАК ДатыЗаменМасел
ГДЕ ДатыЗаменМасел.ДатаЗамены >= &Дата1 и ДатыЗаменМасел.ДатаЗамены <= &Дата2
ГРУППИРОВАТЬ ПО
    ДатыЗаменМасел.ТС
22 Обработка
 
29.11.13
16:32
Второй запрос такой получился. Уже данные получил но не проверял:

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

СГРУППИРОВАТЬ ПО
    Выборка.ТС,
    Выборка.Первая,
    Выборка.Последняя
23 Обработка
 
29.11.13
16:33
Меня смущает это:

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПробегПоСпидометру.Обороты(, &Дата2, Регистратор, )
24 Salimbek
 
29.11.13
16:57
(20) Ты еще скажи, что Вложенные запросы запрещены
25 Salimbek
 
29.11.13
16:57
Консоль запросов в этой твоей конфе есть?
26 Обработка
 
29.11.13
17:03
(25) Пишу прямо в скд.
Консолем пользуюсь редко.
Хотя надо бы.
27 Salimbek
 
29.11.13
17:05
Попробуй запрос из 19 туда поставить, только везде вместо ВТ. - поставь Параметры
Выбрать ТС, Первая, Последняя, СУММА(Пробег)
(ВЫБРАТЬ
    Пробеги.ТС,
    Пробеги.Пробег,
    &Первая,
    &Последняя
ИЗ
    РегистрНакопления.Пробеги КАК Пробеги ГДЕ
ПО Пробеги.ТС = &ТС И &Первая<=Пробеги.Период И &Последняя>=Пробеги.Период) КАК Выборка
СГРУППИРОВАТЬ ПО ТС, Первая, Последняя