Имеем документ "Заказ". У документа есть признак статус. Статус у документа меняется со временем. Собственно статусы: - открытый; - подготовка; - в работе; - закрыт.
Смена статуса хранится в регистре сведений в записи типа: Заказ СтатусБыл СтатусСтал
Вот теперь задача: Как отследить заказы у которых в заданный период 1-й раз сменился статус скажем с открытый на подготовка.
Хотелось бы сделать все одним запросом, но что-то потерялась я....
Заранее спасибо.
----------------------------------------------------------------------------------- Единственный, интуитивно понятный интерфейс - мамкина сиська! Всему остальному надо учиться! (с) Не знаю кто....
Группа: Основатель
Сообщений: 13982
Из: Киев
Спасибо сказали: 4549 раз
Рейтинг: 3678.1
Выбираем по этому регистру все записи у которых период между начальной датой и конечной датой - это полностью всё за определенный период. И говорим, чтобы выбирал только те записи, у которых СтатусБыл такой-то, а СтатусСтал такой-то. И делаем группировку по Заказу, СтатусБыл и СтатусСтал и накладываем на период МИНИМУМ. Как-то так:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | МИНИМУМ(МойРегистр.Период), | МойРегистр.Заказ |ИЗ | МойРегистр КАК МойРегистр |ГДЕ | СтатусБыл = &СтатусБыл | И СтатусСтал = &СтатусСтал |СГРУППИРОВАТЬ ПО | МойРегистр.Заказ, | МойРегистр.СтатусБыл, | МойРегистр.СтатусСтал |";
Выбираем по этому регистру все записи у которых период между начальной датой и конечной датой - это полностью всё за определенный период. И говорим, чтобы выбирал только те записи, у которых СтатусБыл такой-то, а СтатусСтал такой-то. И делаем группировку по Заказу, СтатусБыл и СтатусСтал и накладываем на период МИНИМУМ. Как-то так:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | МИНИМУМ(МойРегистр.Период), | МойРегистр.Заказ |ИЗ | МойРегистр КАК МойРегистр |ГДЕ | СтатусБыл = &СтатусБыл | И СтатусСтал = &СтатусСтал |СГРУППИРОВАТЬ ПО | МойРегистр.Заказ, | МойРегистр.СтатусБыл, | МойРегистр.СтатусСтал |";
Навскидочку.
Уточню, не совсем правильно объяснил.
Берем период: с [Дата] по [Дата] Статус менялся может быть и до этого периода, но надо выбрать заказ если статус сменился по заданной схеме именно в этот период. То есть:
01.01.2012 открытый подготовка (первый раз). 02.01.2012 подготовка открытый 03.01.2012 открытый подготовка (второй раз).
Надо отобрать если период скажем с 01.01.2012 по 02.01.2012 а если период с 02.01.2012 по 03.01.2012, тогда не отбирать
----------------------------------------------------------------------------------- Единственный, интуитивно понятный интерфейс - мамкина сиська! Всему остальному надо учиться! (с) Не знаю кто....
Группа: Команда (модераторы)
Сообщений: 1116
Из: Одесса-Луганск
Спасибо сказали: 192 раз
Рейтинг: 0
я бы сделал так. в 1 подзапрос поместил бы различные заказы из регистра за период. Во втором подзапросе подсчитал бы по эти заказам количество записей за период и отобрал бы записи с нужным количеством... Если нужны дополнительные условия - накладывал бы их в следующем запросе пакета.
Правильно поставленный вопрос содержит до 90% ответа.
я почему спрашиваю, , что могут быть ошибки, кот нужно предусматривать
01.01.2012 открытый подготовка 02.01.2012 открытый подготовка 03.01.2012 открытый подготовка 04.01.2012 в работе закрыт.
Конечно, это можно проследить при записи, но это лишняя работа, и еще надо закрывать от ручной правки регистр.
к тому же тут определенные правила: после "в работе" не ставится "открыт", "подготовка"..... бизнес-процессы, что ли?
ну правила, они конечно надо, но в данном случае не важно. заказ может гулять по статусам как хочется, просто первый переход границы между статусами является ключевым. а все последующие нет.
Цитата(pablo @ 26.01.12, 12:55)
я бы сделал так. в 1 подзапрос поместил бы различные заказы из регистра за период. Во втором подзапросе подсчитал бы по эти заказам количество записей за период и отобрал бы записи с нужным количеством... Если нужны дополнительные условия - накладывал бы их в следующем запросе пакета.
вложенными запросами?
----------------------------------------------------------------------------------- Единственный, интуитивно понятный интерфейс - мамкина сиська! Всему остальному надо учиться! (с) Не знаю кто....
сформировать строки "1Открыт1Подготовка1закрыт1Подготовка1Открыт1В работе1" , отбирать по числу вхожедений например подстрокистроки "Открыт1Подготовка" равно 1. 1- разделитель в примере.
Но я как в том анекдоте, про стать зайчикам ёжиками - стратег)) . пока не владею знаниями , как в запросе преобразить данные в строку за период в разрезе заказа.
Сообщение отредактировал Домовик - 26.01.12, 12:50
Статусбыл всегда можно прочитать из предыдущих строк в регистре. достаточно только статусПосле в регистре.
Это исключает ошибки. Когда вы перепроводите документ другим числом, который устанавливает статусы в регистр. Это нужны проверки тогда при проведении. А так устанавливаете новый статус на новое число и все.
Сообщение отредактировал Домовик - 26.01.12, 12:29
Статусбыл всегда можно прочитать из предыдущих строк в регистре. достаточно только статусПосле в регистре.
Это исключает ошибки. Когда вы перепроводите документ другим числом, который устанавливает статусы в регистр. Это нужны проверки тогда при проведении. А так устанавливаете новый статус на новое число и все.
Та ну в этом проблемы нету, документ смены статуса недоступен для прямого редактирования. Все решается административными и немного программными методами. и мне не особо важен размер записей если мне придется анализировать какая запись предыдущая, какая следующая.
В догонку: сложность в том, что как-то не въезжаю как запросом выделить 1-ю запись отвечающую требованиям.
Точнее, так: 1-я проверка, выделить 1-ю запись в регистре отвечающую требованиям перехода между статусами. в моем случае это, (к примеру) открытый - подготовка. 2-я проверка, уже после выделения этой самой записи, на вхождение в заданный интервал.
----------------------------------------------------------------------------------- Единственный, интуитивно понятный интерфейс - мамкина сиська! Всему остальному надо учиться! (с) Не знаю кто....
Ну тогда если добавить в регистр реквизит булевого типа и устанавливать его при первом изменении?
Ну я вообщем думал уже об этом. Просто думаю все-таки существует решение на уровне запроса сделать это, а не потом, как я на данный момент сделал, сравнивать вхождение на заданный период...
----------------------------------------------------------------------------------- Единственный, интуитивно понятный интерфейс - мамкина сиська! Всему остальному надо учиться! (с) Не знаю кто....
единичка меня сбила. значит первое изменение статуса, а не заказы с одним-единственным изменением статуса.
А сначала сделать отбор строк по условию СтатусДо= и статусПосле= , а потом упорядочить по Период. группировки Заказ, за ним группировка период. И снимать только первые записи при обходе выборки...
Сообщение отредактировал Домовик - 26.01.12, 15:07
единичка меня сбила. значит первое изменение статуса, а не заказы с одним-единственным изменением статуса.
А сначала сделать отбор строк по условию СтатусДо= и статусПосле= , а потом упорядочить по Период. группировки Заказ, группировка период. И снимать только первые записи при обходе выборки... не заходить внутрь группировки Период
Как я делал:
ВЫБРАТЬ | Заказы.Ссылка КАК СсылкаНаЗаказ |ИЗ | Документ.Заказ КАК Заказы | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказРолиСотрудников КАК Роли | ПО (Роли.Заказ = Заказы.Ссылка) | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1 | Заказы.Ссылка КАК СсылкаНаЗаказ, | ЗаказыИсторияСтатусов.СтатусБыл КАК СтатусБыл, | ЗаказыИсторияСтатусов.СтатусСтал КАК СтатусСтал, | ЗаказыИсторияСтатусов.Период КАК Период | ИЗ | Документ.Заказ КАК Заказы | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказыИсторияСтатусов КАК ЗаказыИсторияСтатусов | ПО (ЗаказыИсторияСтатусов.Заказ = Заказы.Ссылка) | ГДЕ | НЕ Заказы.ПометкаУдаления | И Заказы.Проведен | И ((ЗаказыИсторияСтатусов.СтатусБыл.ТипСтатуса = &ПарамОткрытый | ИЛИ ЗаказыИсторияСтатусов.СтатусБыл.ТипСтатуса = &ПарамДоПроизводства) | И ЗаказыИсторияСтатусов.СтатусСтал.ТипСтатуса = &ПарамПроизводство | ИЛИ ЗаказыИсторияСтатусов.СтатусБыл.ТипСтатуса = &ПарамДоПроизводства | И ЗаказыИсторияСтатусов.СтатусСтал.ТипСтатуса = &ПарамПроизводство) | И ЗаказыИсторияСтатусов.Период МЕЖДУ &НачДатаВремя И &КонДатаВремя) КАК Отбор23 | ПО Заказы.Ссылка = Отбор23.СсылкаНаЗаказ |ГДЕ | НЕ Отбор23.СсылкаНаЗаказ ЕСТЬ NULL
Правда не работает как надо...
----------------------------------------------------------------------------------- Единственный, интуитивно понятный интерфейс - мамкина сиська! Всему остальному надо учиться! (с) Не знаю кто....
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!