Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите как правильней посчитать время для отчета СКД
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Система компоновки данных
kosalex
Добрый день! Есть РС, у него есть несколько ресурсов типа "дата/время". Мне нужно находить разницу времени в часах между значениями этих ресурсов. Считаю кол-во часов простоя на предприятии.

Сейчас у меня в Отчете общее время простоя считается как сумма времени в часах полученные в результате разницы между определенными ресурсами.

Вот разница считается в запросе, "УстановкаПодПогрузку - Прибытие" = ВремяДоПогрузки
ОкончаниеПогрузки - УстановкаПодПогрузку = ВремяПогрузки
Отправка - ОкончаниеПогрузки = ВремяОтправки

ОбщКолВоЧасов = ВремяДоПогрузки + ВремяПогрузки + ВремяОтправки

Если ресурс УстановкаПодПогрузку не заполнен, а прибытие и отправка были, то все равно есть простой, при выше описанном варианте в отчет не получается вывести общее время простоя, т.к. РАЗНОСТЬДАТ не посчитает.

Есть вариант множественного использование ВЫБОР ТОГДА КОГДА, но что то подсказывает что есть вариант решения этой задаче по лучше)

Подскажите как правильно сделать?


kosalex
Не понятен вопрос, что никто не реагирует? smile.gif

Непонятен вопрос, что никто не реагирует? smile.gif
andr_andrey
Цитата(kosalex @ 14.12.14, 15:04) необходимо зарегистрироваться для просмотра ссылки
...
Вот разница считается в запросе, "УстановкаПодПогрузку - Прибытие" = ВремяДоПогрузки
ОкончаниеПогрузки - УстановкаПодПогрузку = ВремяПогрузки
Отправка - ОкончаниеПогрузки = ВремяОтправки

ОбщКолВоЧасов = ВремяДоПогрузки + ВремяПогрузки + ВремяОтправки

Если ресурс УстановкаПодПогрузку не заполнен, а прибытие и отправка были, то все равно есть простой, при выше описанном варианте в отчет не получается вывести общее время простоя, т.к. РАЗНОСТЬДАТ не посчитает.

Есть вариант множественного использование ВЫБОР ТОГДА КОГДА, но что то подсказывает что есть вариант решения этой задаче по лучше)

Подскажите как правильно сделать?

Вы про это имеете ввиду ЕСТЬNULL(УстановкаПодПогрузку, ДАТАВРЕМЯ(0001,01,01,0,0,0))?
kosalex
Цитата(andr_andrey @ 15.12.14, 10:12) необходимо зарегистрироваться для просмотра ссылки
Вы про это имеете ввиду ЕСТЬNULL(УстановкаПодПогрузку, ДАТАВРЕМЯ(0001,01,01,0,0,0))?


Нет, у меня есть значения в ресурсах Прибытие, УстановкаПодПогрузку,ОкончаниеПогрузки, УстановкаПодВыгрузку,ОкончаниеВыгрузки, Отправка. Мне нужно посчитать общее количесвто простоя в часах.

В запросе я высчитываю время по операциям, т.е.
ВремяДоУстановкиПодВыгрузку = УстановкаПодВыгрузку - Прибытие.
ВремяВыгрузки = ОкончаниеВыгрузки - УстановкаПодВыгрузку.
и так далее.

Сделал так, а как можно еще?

ВЫБРАТЬ
    ПростойВагона.НомерВагона,
    ПростойВагона.ПрибытияВагона,
    ПростойВагона.УстановкаПодВыгрузку,
    ПростойВагона.ОкончаниеВыгрузки,
    ПростойВагона.ПрибытиеДокументовПослеДекларирования,
    ПростойВагона.ПрибытиеИнструкцийВОтправкуПОРПВ,
    ПростойВагона.УстановкаПодПогрузку,
    ПростойВагона.ОкончаниеПогрузки,
    ПростойВагона.ПрибытиеДокументовПослеТаможирования,
    ПростойВагона.ВозвратПВст,
    ПростойВагона.Ответственный,
    ПростойВагона.ПринадлежностьВагона,
    ПростойВагона.НоменклатураПрибытие,
    ПростойВагона.НоменклатураОтправка,
    ПростойВагона.СостояниеВагона,
    ПростойВагона.ПростойПоКоманде
ПОМЕСТИТЬ ВТ_РСПростой
ИЗ
    РегистрСведений.ПростойВагона КАК ПростойВагона
ГДЕ
    ПростойВагона.ПрибытияВагона >= &ДатаНачала
    И ПростойВагона.ПрибытияВагона <= &ДатаКонец
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_РСПростой.НомерВагона,
    ВТ_РСПростой.ПрибытияВагона,
    ВТ_РСПростой.УстановкаПодВыгрузку,
    ВЫБОР
        КОГДА ВТ_РСПростой.ПрибытияВагона <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.УстановкаПодВыгрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.ПрибытияВагона, ВТ_РСПростой.УстановкаПодВыгрузку, ЧАС)
        ИНАЧЕ 0
    КОНЕЦ КАК ВремяДоУстановкиПодВыгрузку,
    ВТ_РСПростой.ОкончаниеВыгрузки,
    ВЫБОР
        КОГДА ВТ_РСПростой.УстановкаПодВыгрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.ОкончаниеВыгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.УстановкаПодВыгрузку, ВТ_РСПростой.ОкончаниеВыгрузки, ЧАС)
        ИНАЧЕ 0
    КОНЕЦ КАК ВремяВыгрузки,
    ВТ_РСПростой.ПрибытиеДокументовПослеДекларирования КАК ПрибытиеДокументовДекларирования,
    ВТ_РСПростой.ПрибытиеИнструкцийВОтправкуПОРПВ КАК ПрибытиеИнструкции,
    ВТ_РСПростой.УстановкаПодПогрузку,
    ВЫБОР
        КОГДА ВТ_РСПростой.ОкончаниеВыгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.УстановкаПодПогрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.ОкончаниеВыгрузки, ВТ_РСПростой.УстановкаПодПогрузку, ЧАС)
        ИНАЧЕ 0
    КОНЕЦ КАК ВремяВОжиданииПогрузки,
    ВТ_РСПростой.ОкончаниеПогрузки,
    ВЫБОР
        КОГДА ВТ_РСПростой.УстановкаПодПогрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.ОкончаниеПогрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.УстановкаПодПогрузку, ВТ_РСПростой.ОкончаниеПогрузки, ЧАС)
        ИНАЧЕ 0
    КОНЕЦ КАК ВремяПогрузки,
    ВТ_РСПростой.ПрибытиеДокументовПослеТаможирования КАК ПрибытияДокументовТаможирования,
    ВТ_РСПростой.ВозвратПВст КАК СдачаНаСт,
    ВЫБОР
        КОГДА ВТ_РСПростой.ОкончаниеПогрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.ВозвратПВст <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.ОкончаниеПогрузки, ВТ_РСПростой.ВозвратПВст, ЧАС)
        ИНАЧЕ 0
    КОНЕЦ КАК ВремяВозвратаНаСт,
    ВЫБОР
        КОГДА ВТ_РСПростой.ПрибытияВагона <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.УстановкаПодВыгрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.ОкончаниеВыгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.УстановкаПодПогрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.ОкончаниеПогрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                И ВТ_РСПростой.ВозвратПВст <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.ПрибытияВагона, ВТ_РСПростой.УстановкаПодВыгрузку, ЧАС) + РАЗНОСТЬДАТ(ВТ_РСПростой.ОкончаниеВыгрузки, ВТ_РСПростой.УстановкаПодПогрузку, ЧАС) + РАЗНОСТЬДАТ(ВТ_РСПростой.УстановкаПодПогрузку, ВТ_РСПростой.ОкончаниеПогрузки, ЧАС) + РАЗНОСТЬДАТ(ВТ_РСПростой.ОкончаниеПогрузки, ВТ_РСПростой.ВозвратПВст, ЧАС)
        ИНАЧЕ ВЫБОР
                КОГДА ВТ_РСПростой.ПрибытияВагона <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                        И ВТ_РСПростой.УстановкаПодВыгрузку = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                        И ВТ_РСПростой.ОкончаниеВыгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                        И ВТ_РСПростой.УстановкаПодПогрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                        И ВТ_РСПростой.ОкончаниеПогрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                        И ВТ_РСПростой.ВозвратПВст <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                    ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.УстановкаПодПогрузку, ВТ_РСПростой.ПрибытияВагона, ЧАС) + РАЗНОСТЬДАТ(ВТ_РСПростой.УстановкаПодПогрузку, ВТ_РСПростой.ОкончаниеПогрузки, ЧАС) + РАЗНОСТЬДАТ(ВТ_РСПростой.ОкончаниеПогрузки, ВТ_РСПростой.ВозвратПВст, ЧАС)
                ИНАЧЕ ВЫБОР
                        КОГДА ВТ_РСПростой.ПрибытияВагона <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                И ВТ_РСПростой.УстановкаПодВыгрузку <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                И ВТ_РСПростой.ОкончаниеВыгрузки <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                И ВТ_РСПростой.УстановкаПодПогрузку = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                И ВТ_РСПростой.ОкончаниеПогрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                И ВТ_РСПростой.ВозвратПВст <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.УстановкаПодВыгрузку, ВТ_РСПростой.ПрибытияВагона, ЧАС) + РАЗНОСТЬДАТ(ВТ_РСПростой.УстановкаПодВыгрузку, ВТ_РСПростой.ОкончаниеВыгрузки, ЧАС) + РАЗНОСТЬДАТ(ВТ_РСПростой.ОкончаниеПогрузки, ВТ_РСПростой.ВозвратПВст, ЧАС)
                        ИНАЧЕ ВЫБОР
                                КОГДА ВТ_РСПростой.ПрибытияВагона <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                        И ВТ_РСПростой.УстановкаПодВыгрузку = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                        И ВТ_РСПростой.ОкончаниеВыгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                        И ВТ_РСПростой.УстановкаПодПогрузку = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                        И ВТ_РСПростой.ОкончаниеПогрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                        И ВТ_РСПростой.ВозвратПВст <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                    ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.ПрибытияВагона, ВТ_РСПростой.ВозвратПВст, ЧАС)
                                ИНАЧЕ ВЫБОР
                                        КОГДА ВТ_РСПростой.ПрибытияВагона <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                                И ВТ_РСПростой.УстановкаПодВыгрузку = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                                И ВТ_РСПростой.ОкончаниеВыгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                                И ВТ_РСПростой.УстановкаПодПогрузку = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                                И ВТ_РСПростой.ОкончаниеПогрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                                И ВТ_РСПростой.ВозвратПВст = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                                            ТОГДА РАЗНОСТЬДАТ(ВТ_РСПростой.ПрибытияВагона, &ТекДата, ЧАС)
                                    КОНЕЦ
                            КОНЕЦ
                    КОНЕЦ
            КОНЕЦ
    КОНЕЦ КАК ВсегоЧасовПростоя,
    ВТ_РСПростой.ПринадлежностьВагона,
    ВТ_РСПростой.НоменклатураПрибытие,
    ВТ_РСПростой.НоменклатураОтправка,
    ВТ_РСПростой.СостояниеВагона,
    ВТ_РСПростой.ПростойПоКоманде
ИЗ
    ВТ_РСПростой КАК ВТ_РСПростой
andr_andrey
Почему бы еще в первом запросе не посчитать разницы?
    РАЗНОСТЬДАТ(ПростойВагона.ПрибытияВагона, ПростойВагона.УстановкаПодВыгрузку, ЧАС) КАК ВремяДоУстановкиПодВыгрузку,
    РАЗНОСТЬДАТ(ПростойВагона.УстановкаПодВыгрузку, ПростойВагона.ОкончаниеВыгрузки, ЧАС) КАК ВремяВыгрузки,
    РАЗНОСТЬДАТ(ПростойВагона.ОкончаниеВыгрузки, ПростойВагона.УстановкаПодПогрузку, ЧАС) КАК ВремяВОжиданииПогрузки,
    РАЗНОСТЬДАТ(ПростойВагона.УстановкаПодПогрузку, ПростойВагона.ОкончаниеПогрузки, ЧАС) КАК ВремяПогрузки,
    РАЗНОСТЬДАТ(ПростойВагона.ОкончаниеПогрузки, ПростойВагона.ВозвратПВст, ЧАС) КАК ВремяВозвратаНаСт,


А потом реагировать на знак?
kosalex
Цитата(andr_andrey @ 15.12.14, 11:40) необходимо зарегистрироваться для просмотра ссылки
Почему бы еще в первом запросе не посчитать разницы?
    РАЗНОСТЬДАТ(ПростойВагона.ПрибытияВагона, ПростойВагона.УстановкаПодВыгрузку, ЧАС) КАК ВремяДоУстановкиПодВыгрузку,
    РАЗНОСТЬДАТ(ПростойВагона.УстановкаПодВыгрузку, ПростойВагона.ОкончаниеВыгрузки, ЧАС) КАК ВремяВыгрузки,
    РАЗНОСТЬДАТ(ПростойВагона.ОкончаниеВыгрузки, ПростойВагона.УстановкаПодПогрузку, ЧАС) КАК ВремяВОжиданииПогрузки,
    РАЗНОСТЬДАТ(ПростойВагона.УстановкаПодПогрузку, ПростойВагона.ОкончаниеПогрузки, ЧАС) КАК ВремяПогрузки,
    РАЗНОСТЬДАТ(ПростойВагона.ОкончаниеПогрузки, ПростойВагона.ВозвратПВст, ЧАС) КАК ВремяВозвратаНаСт,


А потом реагировать на знак?



Если сразу считать, что делать если не ввели УстановкаПодВыгрузку?, а время прибытия и отправки есть.
andr_andrey
Цитата(kosalex @ 15.12.14, 12:16) необходимо зарегистрироваться для просмотра ссылки
Если сразу считать, что делать если не ввели УстановкаПодВыгрузку?, а время прибытия и отправки есть.

Заранее определиться, какие могут быть не заполнены, а какие нет.
(Вы в описании сказали только об УстановкаПодПогрузку, а в коде мы видим, что проверяются на заполненность ещё и другие.)
Заранее определиться, незаполненность каких данных делает бессмысленным каждое вычисление.
В первом запросе вычислить максимально возможное количество выражений, чтобы они были определены и заполнены (нулевой датой, если надо).
Продолжать вычисления согласно алгоритму, конструируя результат из ранее вычисленных выражений.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.