![]() |
|
Выборка из регистра сведений | ☑ | ||
---|---|---|---|---|
0
User_Agronom
12.08.14
✎
15:28
|
Есть регистр сведений (независимый, периодический):
Измерение: Объект (тип ДокументСсылка.РеализацияТиУ) Ресурс: Статус (перечисление: значения "А","Б","С","Д","Е","Ф") Нужно: для всех записей в которых статус равен "Б" или "Е" найти самую молодую. ВЫБРАТЬ Таблица1.ДокОбъект, МАКСИМУМ(Таблица1.ДатаПоследнегоИзменения) КАК ДатаП ИЗ (ВЫБРАТЬ СР.Период КАК ДатаПоследнегоИзменения, СР.Объект КАК ДокОбъект ИЗ РегистрСведений.ИмяРегистра КАК СР ГДЕ (СР.Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Б ИЛИ СР.Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Е)) КАК Таблица1 СГРУППИРОВАТЬ ПО Таблица1.ДокОбъект В принципе получается почти что нужно, но нет колонки статуса. Полдня думаю как добавить, получается медленно и громозко. Нужен совет. |
|||
1
Господин ПЖ
12.08.14
✎
15:36
|
ловите наркомана
|
|||
2
Classic
12.08.14
✎
15:38
|
Что делать, если самой молодой записи две с разными статусами?
|
|||
3
User_Agronom
12.08.14
✎
15:40
|
(1) Алкоголика))
(2) Регистр периодический. В одну секунду не может две записи с одним объектом. А если секунды разные, тогда можно определить что моложе. |
|||
4
Господин ПЖ
12.08.14
✎
15:40
|
ловите второго наркомана
|
|||
5
User_Agronom
12.08.14
✎
15:41
|
(4) А слабо каждые 15 мин писать про ловлю наркоманов?
|
|||
6
Fram
12.08.14
✎
15:51
|
классическая задачка на умение строить запросы
|
|||
7
User_Agronom
12.08.14
✎
15:54
|
(6) Не умею. Поучусь.
Запрос я написал: я этот регистр сюда добавил левым соединением по объекту и периоду. Но работает долго. |
|||
8
Drac0
12.08.14
✎
15:54
|
(0) СрезПервых(<НачалоПериода>, <Отбор>) ?
|
|||
9
Irbis
12.08.14
✎
15:54
|
(5) А слабо без форум сделать?
|
|||
10
Fram
12.08.14
✎
15:56
|
(8) СрезПоследних ему нужен
|
|||
11
Drac0
12.08.14
✎
15:59
|
(10) "найти самую молодую." Да?
|
|||
12
User_Agronom
12.08.14
✎
16:00
|
(10) Срез последних и в параметрах виртуальной таблицы указать отбор?
|
|||
13
Fram
12.08.14
✎
16:04
|
(11) ну как думаешь кто моложе, 1960 года рождения или 2000?
|
|||
14
Fram
12.08.14
✎
16:04
|
(12) да
|
|||
15
Fram
12.08.14
✎
16:06
|
(12) только вот непонятно тебе в рамках Объекта или нет? если нет, то СрезПоследних не катит
|
|||
16
User_Agronom
12.08.14
✎
16:08
|
(15) Что значит в рамках объекта? У меня так не получалось. Выдавал неправильный результат
|
|||
17
Fram
12.08.14
✎
16:10
|
(16) ну самую "молодую" для каждого Объекта или по всей таблице?
|
|||
18
Drac0
12.08.14
✎
16:11
|
(13) Блин :)
|
|||
19
User_Agronom
12.08.14
✎
16:13
|
Для каждого объекта.
|
|||
20
User_Agronom
12.08.14
✎
16:16
|
Только что ещё раз попробовал.
РегистрСведений.ИмяРегистра.СрезПоследних(&НаДату,Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Б) ИЛИ Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Е)) На каждый объект бывает и по две записи - одна со статусом "Б", другая "Е" |
|||
21
Fram
12.08.14
✎
16:17
|
(19) Тады все просто - СрезПоследних
|
|||
22
RomanYS
12.08.14
✎
16:17
|
(0) срезпоследних, условие на статус в условия вирт. таблицы
|
|||
23
RomanYS
12.08.14
✎
16:23
|
(20) срез вернет одну - самую "молодую"
|
|||
24
Borteg
12.08.14
✎
16:24
|
Выбрать
Статус где? |
|||
25
User_Agronom
12.08.14
✎
16:26
|
(22) см (20)
|
|||
26
Fram
12.08.14
✎
16:36
|
(20) если ты нас в (0) не обманул и Статус это ресурс, то не должно быть
|
|||
27
User_Agronom
12.08.14
✎
16:39
|
(26) Да, к сожалению обманул. Статус это измерение.
Но переделывать регистр нельзя. На нём несколько задач завязано. |
|||
28
Fram
12.08.14
✎
16:41
|
(27) Тогда запрос не через СрезПоследних, а с соединением
|
|||
29
User_Agronom
12.08.14
✎
16:44
|
(28) См. (7) Мне стало интересно, может как проще можно.
|
|||
30
RomanYS
12.08.14
✎
16:46
|
(27) тогда снова становится актуальным вопрос из (2)
|
|||
31
User_Agronom
12.08.14
✎
17:05
|
(30) В рамках данной задачи такое возможно только теоретически. Но тогда должен быть статус "Б".
|
|||
32
bolobol
12.08.14
✎
17:45
|
Чёт не понял проблемы, однако, не понятно и на какой момент должен быть статус Б или Е по условию, допустим - на сегодня:
ВЫБРАТЬ Регистр.Объект ИЗ Регистр.СрезПоследних() ГДЕ Регистр.Статус = Б ИЛИ = Е вот и выбрали Объекты на сегодня только со статусами Б и Е, раз "на сегодня" - значит - самые молодые. |
|||
33
Fram
12.08.14
✎
17:50
|
(32) надо еще выбрать молодого среди Б и Е
|
|||
34
User_Agronom
12.08.14
✎
17:53
|
Статус Б - отправлены документы.
Статус А - Документ изменён. Если Документ изменён после того, как документы отправлены - нужно послать их ещё раз. Но, кроме этого, регистр хранит много всякой мелочи - типа выдана первичка, получено что-то и т.д. Я бы сделал как написал в (0) Измерение и Ресурс. Но предыдущий программер решил по другому. |
|||
35
Eugene_life
12.08.14
✎
18:06
|
(34) так, может, добавить в регистр ресурс. Для старых записей пройдешь обработкой и заполнишь его. Для новых - будешь заполнять оба (измерение и ресурс). Для др задач будет использоваться прежняя часть, а по своей ты сделаешь как надо
|
|||
36
Fram
12.08.14
✎
18:07
|
(35) жесточайший костыль получится
|
|||
37
Fram
12.08.14
✎
18:09
|
+(36) если уж переделывать регистр, то реконструировать его как надо, а не костыль приделывать
|
|||
38
User_Agronom
12.08.14
✎
18:26
|
(37) Согласен. Но это время...
|
|||
39
sirsp
12.08.14
✎
18:30
|
(7) Дык, выбери срез последних в ВТ, а свой запрос делай к ВТ, а не к регистру. Будет быстро..
|
|||
40
bolobol
12.08.14
✎
18:30
|
(33) Не сразу понял, что вы написали, но в купе с (26) стало понятно, что сие не регистр, а тупо - табличка данных с датами, на которой необходимо реализовать СрезПоследних своими силами
(35) Костыль не поможет, т.к. от наличия ресурса состав измерений, а следовательно и СрезПоследних - не поменяется. Ну и по сути: ВЫБРАТЬ Регистр.Объект, Мах(Регистр.Дата) ПОМЕСТИТЬ ВТ; ИЗ Регистр ВЫБРАТЬ Регистр.* ПОМЕСТИТЬ ВТ2 ИЗ ВТ ВНУТР Регистр ПО Объект И МахДата И (Статус = Б ИЛИ = Е) // И что делать если в нужную секунду вместе с Б и/или Е и другие статусы есть? ВЫБРАТЬ Регистр.* ПОМЕСТИТЬ ВТ3 ИЗ ВТ2 ВНУТР ВТ2 ПО Объект И Дата И НЕ Ресурс // И что делать с двумя (Б и Е) в одну секунду статусами?? |
|||
41
Fram
12.08.14
✎
18:39
|
(40)
почему условие не прикрутил к первому запросу? и зачем третий запрос? |
|||
42
bolobol
12.08.14
✎
18:48
|
(41) В первом запросе выбирается СрезПоследних по Объекту, а в условии - да, отбор-то нужен по статусу "для всех записей в которых статус равен "Б" или "Е" найти самую молодую", а затем из них уже Мах(Дата). Да, условие в первом запросе надо. Но это не отменяет тогда третий вопрос. А второй - снят.
|
|||
43
bolobol
12.08.14
✎
18:51
|
(41) То есть, вертаемся к (20) "РегистрСведений.ИмяРегистра.СрезПоследних(&НаДату,Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Б) ИЛИ Статус = ЗНАЧЕНИЕ(Перечисление.Имя.Е))"
- результат более правильный, что делать с двумя статусами (Б и Е) в одну секунду?? |
|||
44
Fram
12.08.14
✎
18:56
|
(43) Нифига не вертаемся, он признался (27), что Статус у него не ресурс, а тоже измерение
|
|||
45
bolobol
12.08.14
✎
19:00
|
(44) СрезПоследних должен быстрее получить даты последнего появления статуса из набора (Б, Е).
Потом уже по дате - внутреннее соединение со всей таблицей Регистра, а там появятся дубли, где статус Б и Е в одну секунду. И последовательности в регистре нет, т.о. - необходимо организовать некий выбор Б или Е в конечном итоге выдать в качестве результата, для этого, после соединения - результат с самим собой на предмет разности статусов и вычеркивание чего-то соединяя ещё раз результат с дублями. |
|||
46
Fram
12.08.14
✎
19:01
|
(45) это будет лишний запрос к тем же самым данным. зачем?!
|
|||
47
bolobol
12.08.14
✎
20:06
|
(46) Хм... Затестить бы, да нет такого регистра с данными, чтоб в выполнении разницу учуять. Но выборка всегда быстрее, чем соединение с выбранными данными, так что не факт.
Ну а запрос, даже к тем же самым данным делается чтобы получить из этих данных нужную выборку, а не ту, которую до этого поимели |
|||
48
Fram
13.08.14
✎
13:31
|
(47) а СрезПоследних это разве не соединение на уровне движка?
|
|||
49
User_Agronom
13.08.14
✎
14:22
|
Сделал временными таблицами.
Первая выбирает нужные записи (со статусами Б и Е) из регистра и помещает их в табл1. (Чтобы сразу "отсечь" ненужные элементы и уменьшить размер таблиц) Вторая группирует табл1 по Объекту и максимуму(Периоду) помещает в табл2 И итоговая, которая к табл2 слева соединяет табл1, чтобы выставить статус. Пояснение: Статус "Б" = "Посланы документы электронным письмом" (пишется обработкой, которой сотрудник шлёт письма контрагентам или регламентным заданием) Статус "Е" = "В документ внесены изменения" (пишется подпиской на событие при записи). Соответственно, если документ менялся после того как ушло письмо - его нужно послать ещё раз. Всем принявшим участие в обсуждении спасибо. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |