|
В чем ошибка связи при левом запросе? | ☑ | ||
---|---|---|---|---|
0
KIraA
11.09.18
✎
10:57
|
Вот запрос
"ВЫБРАТЬ | Перечень.Контрагент, | Перечень.Объект, | Перечень.Ссылка КАК Ссылка |ПОМЕСТИТЬ Поставить |ИЗ | Документ.Перечень КАК Перечень |ГДЕ | НЕ Перечень.ПометкаУдаления | И Перечень.Контрагент = &Контрагент | И Перечень.ОбъектОхраны = &ОбъектОхраны | И Перечень.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Поставить) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Перечень.Контрагент КАК Контрагент, | Перечень.Объект, | Перечень.Ссылка КАК Ссылка |ПОМЕСТИТЬ Снять |ИЗ | Документ.Перечень КАК Перечень |ГДЕ | НЕ Перечень.ПометкаУдаления | И Перечень.Контрагент = &Контрагент | И Перечень.Объект = &Объект | И Перечень.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Снять) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Поставить.Контрагент, | Поставить.Объект, | Снять.Контрагент КАК Контрагент1, | Снять.Объект КАК Объект1, | Поставить.Ссылка, | Снять.Ссылка КАК Ссылка1 |ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.Объект = Снять.Объект" Запрос1 Количество 4 Запрос2 Количество 2 Запрос3 Количество 8???????? ПОЧЕМУ? |
|||
1
Lexey_
11.09.18
✎
11:01
|
Документ "Перечень" и Перечисление "Тип" это мощно конечно
|
|||
2
Borteg
11.09.18
✎
11:03
|
(0) 4*2=8
|
|||
3
Borteg
11.09.18
✎
11:03
|
(0) если хочется 6 надо объединить все, если 4 то объединить
|
|||
4
unregistered
11.09.18
✎
11:14
|
Если во всех записях как первого запроса так и второго один и тот же объект и один и тот же контрагент, то имеет место ситуация из (2).
|
|||
5
KIraA
11.09.18
✎
11:17
|
(4) Конечно один и тот же. Что при этом делать чтоб получить правильную связь?
|
|||
6
Borteg
11.09.18
✎
11:18
|
(5) а какой результат ожидается?
|
|||
7
KIraA
11.09.18
✎
11:20
|
Мне нужно вытащить документы при которых
ГДЕ Снять.Контрагент ЕСТЬ NULL И Снять.Объект ЕСТЬ NULL |
|||
8
1Сергей
11.09.18
✎
11:20
|
Так работает левое соединение
|
|||
9
1Сергей
11.09.18
✎
11:21
|
(7) с пустой ссылкой не путаешь?
|
|||
10
catena
11.09.18
✎
11:23
|
(5)Если там 4 ссылки "Поставить" и 2 "Снять", он их соединить рандомно должен или какая-то стратегия у вас есть?
|
|||
12
catena
11.09.18
✎
11:23
|
Пардон, наврала про не может быть.
|
|||
13
KIraA
11.09.18
✎
11:32
|
(9) Да там пока нет ни одного ни другого. Связь полная идет, раз 8 шт
|
|||
14
hhhh
11.09.18
✎
11:39
|
(13) ну, так и должно быть, Должно быть 8 шт, и получилось 8. Всё в порядке.
|
|||
15
KIraA
11.09.18
✎
11:44
|
(14) А как сделать чтоб не было?)) Вот в чем вопрос?. Есть 4 документа с типом перечисления поставить и 2 с перечислением снять. Как получить 4-2 =2?
|
|||
16
1Сергей
11.09.18
✎
11:55
|
(15) нужно ещё какое-то поле для соединения, уникальное. чтобы каждой конкретной строке из таблицы справа соответствовала конкретная строка из таблицы слева
|
|||
17
Re_agent
11.09.18
✎
11:57
|
(15) попробуй третий запрос переписать
|ВЫБРАТЬ | Поставить.Контрагент, | Снять.Контрагент КАК Контрагент1 |ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.Объект = Снять.Объект" и станет 4 ;) |
|||
18
Re_agent
11.09.18
✎
11:59
|
(15) не, ошибся
|ВЫБРАТЬ | Поставить.Контрагент, | Поставить.Объект |ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.Объект = Снять.Объект" |
|||
19
1Сергей
11.09.18
✎
11:59
|
(17) с чего бы это?
|
|||
20
1Сергей
11.09.18
✎
11:59
|
(18) аналогично
|
|||
21
Borteg
11.09.18
✎
11:59
|
(15) |ВЫБРАТЬ
| Поставить.Контрагент, | Снять.Контрагент КАК Контрагент1 |ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.Объект = Снять.Объект | Где Снять.Контрагент Eсть NULL |
|||
22
Borteg
11.09.18
✎
12:01
|
(15) |ВЫБРАТЬ
| Поставить.Контрагент, | Поставить.Объект, | Снять.Контрагент КАК Контрагент1, | Снять.Объект КАК Объект1, | Поставить.Ссылка, | Снять.Ссылка КАК Ссылка1 |ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.Объект = Снять.Объект | Где Снять.Контрагент Eсть NULL Приминительно к 0 |
|||
23
dmt
11.09.18
✎
12:02
|
(15) Тебе нужны объекты на охране? Спроектировано по дурацки. Но как вариант (в одну секунду м.б. 1 док постановки):
выбрать П.К, П.ОХ, Максимум(П.Дата) КАК ДП, Максимум(Сн.Дата) КАК ДСн поместить ВТ_МаксДаты из П левое соединение Сн по П.К = Сн.К И П.ОХ = Сн.ОХ сгруппировать по П.К, П.ОХ имеющие Максимум(П.Дата) > Максимум(Сн.Дата) ; Выбрать П.* из П правое соединение ВТ_МаксДаты КАК МД по П.К = МД.К И П.ОХ = МД.ОХ И П.Дата = МД.ДП |
|||
24
dmt
11.09.18
✎
12:05
|
(15) а как надо: периодический РС, измерения Контрагент, ОбъектОхраны, ресурс НаОхране. Документы делают движения, ты обращаещься к срезу последних РС
|
|||
25
KIraA
11.09.18
✎
12:06
|
(15) Да не настроено тут движение, приходится выкручиваться, искать методом исключения
|
|||
26
Вафель
11.09.18
✎
12:08
|
если нужно те кторые не сняты, то запрос пойдет, если нужны и те которые сняты, сто "снять" нужно группировать по "контрагент, объект"
|
|||
27
Borteg
11.09.18
✎
12:08
|
(25) где есть null допиши тогда и все, а вообще надо сделать правильною
|
|||
28
catena
11.09.18
✎
12:10
|
(25)Как их связывать-то нужно? По старшинству периода? Вручную объясни, как ты хочешь связать те 4, но вчера и эти 2, но сегодня.
|
|||
29
KIraA
11.09.18
✎
12:14
|
(27) с нулем вообще результтат нулевой, потому что связь есть и естественно с нулевым полем нету
|
|||
30
KIraA
11.09.18
✎
12:15
|
(28) По дате видимо )))
|
|||
31
catena
11.09.18
✎
12:17
|
(30)Даты у них последовательные (поставить-снять-поставить-снять) или бардак?
|
|||
32
dmt
11.09.18
✎
12:17
|
(29) исходные данные сюда скопируй. У тебя наверное 2 объекта, по разу поставлены-сняты, и еще раз поставлены
|
|||
33
Borteg
11.09.18
✎
12:18
|
(29) показывай запрос с нулем
|
|||
34
dmt
11.09.18
✎
12:18
|
(30) а ты вообще понимаешь что хочешь получить?
|
|||
35
KIraA
11.09.18
✎
12:20
|
(29) Да тут 2 дока поставлено потом 2 снято потом 2 опять поставлено. В принципе не важно в какой последовательности что когда проводилось, важны оставшиеся документы не связаные по перечислению поставить/снять.
|
|||
36
KIraA
11.09.18
✎
12:22
|
(29)
|ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.Объект = Снять.Объект |ГДЕ | Снять.Контрагент ЕСТЬ NULL " |
|||
37
KIraA
11.09.18
✎
12:24
|
Может нужно гденить Максимум указать? Чтоб в правой части было только 2 документа?
|
|||
38
dmt
11.09.18
✎
12:24
|
(37) см 23 и 24
|
|||
39
Borteg
11.09.18
✎
12:25
|
(35)
"ВЫБРАТЬ | Перечень.Контрагент, | Перечень.Объект, | Перечень.Ссылка КАК Ссылка |ПОМЕСТИТЬ Поставить |ИЗ | Документ.Перечень КАК Перечень |ГДЕ | НЕ Перечень.ПометкаУдаления | И Перечень.Контрагент = &Контрагент | И Перечень.ОбъектОхраны = &ОбъектОхраны | И Перечень.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Поставить) |; | //////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | Поставить.Контрагент, | Поставить.Объект, | Снять.Контрагент КАК Контрагент1, | Снять.Объект КАК Объект1, | Поставить.Ссылка, | Снять.Ссылка КАК Ссылка1 |ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Документ.Перечень КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.Объект = Снять.Объект | И Снять.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Снять) И НЕ Снять.ПометкаУдаления | Где Снять.Контрагент ЕСть NULL" |
|||
40
OldCondom
11.09.18
✎
12:27
|
В конфе документ с именем "Перечень", реквизитами "Объект" и "Тип" типа "ПеречислениеСсылка.Тип".
Полагаю реквизит "Объект" - это "СправочникСсылка.Объекты". Развлекаются как могут. |
|||
41
Borteg
11.09.18
✎
12:27
|
(37) быстрее сделать ((24)), там кода на пару строчек
|
|||
42
dmt
11.09.18
✎
12:29
|
(40) причем в славном документе Перечень есть реквизит Объект, а есть ОбъектОхраны!
|
|||
43
KIraA
11.09.18
✎
12:30
|
(42) да это просто не затерлось)))
|
|||
44
KIraA
11.09.18
✎
12:33
|
(41) Менять не дают, только дописать
|
|||
45
Borteg
11.09.18
✎
12:45
|
(44) а ничего менять и не надо, создать один регистр и добавить в обработке проведения движения
|
|||
46
KIraA
11.09.18
✎
12:50
|
(45) А 4-2 =2 НИКАК не сделать? И (23) Выберет только 1 последний документ? Или 2 оставшихся?
|
|||
47
DexterMorgan
11.09.18
✎
12:55
|
(46) Вопрос в том, какие два документа из 4 ты хочешь не выводить в конечном итоге
|
|||
48
DexterMorgan
11.09.18
✎
12:56
|
у тебя 4 с типом поставить и 2 - снять. Что в итоге ты хочешь увидеть?
|
|||
49
catena
11.09.18
✎
12:58
|
(46)Если их просто по старшинству периода выводить, то можно упорядочить по дате обе таблицы, пронумеровать строки и соединять по номеру строки.
|
|||
50
Borteg
11.09.18
✎
13:00
|
(46) так не получится, программа не додумает какие две записи отминусовать)
Давай определимся - тебе надо узнать в каком состоянии объект находится?(поставлен/снят) Ты можешь просто выбрать последний документ по объекту контрагенту и узнать его состояние тогда |
|||
51
DexterMorgan
11.09.18
✎
13:00
|
А все понятно, эмулируем работу оборотного РН в запросе.
|
|||
52
DexterMorgan
11.09.18
✎
13:00
|
РукаЛицо
|
|||
53
KIraA
11.09.18
✎
13:06
|
Мне нужно получить оставшиеся 2 документа с поставить Все.
|
|||
54
dmt
11.09.18
✎
13:11
|
(53) Тебе не это нужно. Догадываюсь, что тебе нужны объекты на охране. Значит, вопрос ты должна была задать такой: как получить последние документы Постановки, для которых нет более поздних документов Снятие (для каждой пары Контрагент-Объект).
|
|||
55
KIraA
11.09.18
✎
13:15
|
(53) Прям с языка снял. Прав прав прав))
|
|||
56
DexterMorgan
11.09.18
✎
13:16
|
(53) Ну в твоем примере в качестве изврата - получить разницу между количеством документов поставить и снять, выбрать все документы поставить, отсортировать по дате УБЫВ и взять первые такое то количество
|
|||
57
DexterMorgan
11.09.18
✎
13:20
|
(53) Можно, кстати и в одном запросе: пронумеровать таблицу поставить, получить количество документов поставить, соединить и отобрать по НомерСтроки <= КоличествоДокументов. Только не понятно правда зачем такой изврат=)
|
|||
58
DexterMorgan
11.09.18
✎
13:21
|
(57) * "получить количество документов поставить" - Получить разницу в количестве документов поставить/снять
|
|||
59
KIraA
12.09.18
✎
09:24
|
Доброе время суток (23) оказалось правильным решением, но одна загвоздка вот в этом куске...
|ВЫБРАТЬ | МАКСИМУМ(Поставить.Дата) КАК ДП, | МАКСИМУМ(Снять.Дата) КАК ДСн, | Поставить.Контрагент, | Поставить.Объект, |ПОМЕСТИТЬ ВТ_МаксДаты |ИЗ | Поставить КАК Поставить | ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять | ПО Поставить.Контрагент = Снять.Контрагент | И Поставить.ОбъектОхраны = Снять.Объект | |СГРУППИРОВАТЬ ПО | Поставить.Контрагент, | Поставить.Объект | |ИМЕЮЩИЕ | МАКСИМУМ(Поставить.Дата) > МАКСИМУМ(Снять.Дата) |; Если у меня нет ни одного документа о "Снять" то и даты соответственно нет. Я так полагаю нужно впихнуть что то такое.... ВЫБОР КОГДА Снять.Дата ЕСТЬ NULL ТОГДА Снять.Дата = ДАТАВРЕМЯ(1,1,1) ИНАЧЕ Снять.Дата КОНЕЦ |
|||
60
catena
12.09.18
✎
09:28
|
(59)Это конструкция пишется намного проще: ЕстьNULL(Снять.Дата,ДАТАВРЕМЯ(1,1,1))
|
|||
61
KIraA
12.09.18
✎
09:30
|
(60) Спасибо
|
|||
62
KIraA
12.09.18
✎
09:33
|
Отдельное спасибо dmt и catena. Все заработало. Пост можно закрывать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |