Вход | Регистрация


1С:Предприятие ::

Метки: 

В чем ошибка связи при левом запросе?

Я
   KIraA
 
11.09.18 - 10:57
Вот запрос

  "ВЫБРАТЬ
      |    Перечень.Контрагент,
      |    Перечень.Объект,
      |    Перечень.Ссылка КАК Ссылка
      |ПОМЕСТИТЬ Поставить
      |ИЗ
      |    Документ.Перечень КАК Перечень
      |ГДЕ
      |    НЕ Перечень.ПометкаУдаления
      |    И Перечень.Контрагент = &Контрагент
      |    И Перечень.ОбъектОхраны = &ОбъектОхраны
      |    И Перечень.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Поставить)
      |;
      |
      ////////////////////////////////////////////////////////////////////////////////

      |ВЫБРАТЬ
      |    Перечень.Контрагент КАК Контрагент,
      |    Перечень.Объект,
      |    Перечень.Ссылка КАК Ссылка
      |ПОМЕСТИТЬ Снять
      |ИЗ
      |    Документ.Перечень КАК Перечень
      |ГДЕ
      |    НЕ Перечень.ПометкаУдаления
      |    И Перечень.Контрагент = &Контрагент
      |    И Перечень.Объект = &Объект
      |    И Перечень.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Снять)
      |;
      |
      ////////////////////////////////////////////////////////////////////////////////

      |ВЫБРАТЬ
      |    Поставить.Контрагент,
      |    Поставить.Объект,
      |    Снять.Контрагент КАК Контрагент1,
      |    Снять.Объект КАК Объект1,
      |    Поставить.Ссылка,
      |    Снять.Ссылка КАК Ссылка1
      |ИЗ
      |    Поставить КАК Поставить
      |        ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять
      |        ПО Поставить.Контрагент = Снять.Контрагент
      |            И Поставить.Объект = Снять.Объект"


Запрос1
Количество 4
Запрос2
Количество 2
Запрос3
Количество 8???????? ПОЧЕМУ?
 
 
   Lexey_
 
1 - 11.09.18 - 11:01
Документ "Перечень" и Перечисление "Тип" это мощно конечно
   Borteg
 
2 - 11.09.18 - 11:03
(0) 4*2=8
   Borteg
 
3 - 11.09.18 - 11:03
(0) если хочется 6 надо объединить все, если 4 то объединить
   unregistered
 
4 - 11.09.18 - 11:14
Если во всех записях как первого запроса так и второго один и тот же объект и один и тот же контрагент, то имеет место ситуация из (2).
   KIraA
 
5 - 11.09.18 - 11:17
(4) Конечно один и тот же. Что при этом делать чтоб получить правильную связь?
   Borteg
 
6 - 11.09.18 - 11:18
(5) а какой результат ожидается?
   KIraA
 
7 - 11.09.18 - 11:20
Мне нужно вытащить документы при которых    
 ГДЕ
           Снять.Контрагент ЕСТЬ NULL 
           И Снять.Объект ЕСТЬ NULL
   1Сергей
 
8 - 11.09.18 - 11:20
Так работает левое соединение
   1Сергей
 
9 - 11.09.18 - 11:21
(7) с пустой ссылкой не путаешь?
   catena
 
10 - 11.09.18 - 11:23
(5)Если там 4 ссылки "Поставить" и 2 "Снять", он их соединить рандомно должен или какая-то стратегия у вас есть?
 
 Рекламное место пустует
   catena
 
12 - 11.09.18 - 11:23
Пардон, наврала про не может быть.
   KIraA
 
13 - 11.09.18 - 11:32
(9) Да там пока нет ни одного ни другого. Связь полная идет, раз 8 шт
   hhhh
 
14 - 11.09.18 - 11:39
(13) ну, так и должно быть, Должно быть 8 шт, и получилось 8. Всё в порядке.
   KIraA
 
15 - 11.09.18 - 11:44
(14) А как сделать чтоб не было?)) Вот в чем вопрос?. Есть 4 документа с типом перечисления поставить и 2 с перечислением снять. Как получить 4-2 =2?
   1Сергей
 
16 - 11.09.18 - 11:55
(15) нужно ещё какое-то поле для соединения, уникальное. чтобы каждой конкретной строке из таблицы справа соответствовала конкретная строка из таблицы слева
   Re_agent
 
17 - 11.09.18 - 11:57
(15) попробуй третий запрос переписать
      |ВЫБРАТЬ
      |    Поставить.Контрагент,
      |    Снять.Контрагент КАК Контрагент1
      |ИЗ
      |    Поставить КАК Поставить
      |        ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять
      |        ПО Поставить.Контрагент = Снять.Контрагент
      |            И Поставить.Объект = Снять.Объект"

и станет 4 ;)
   Re_agent
 
18 - 11.09.18 - 11:59
(15) не, ошибся

      |ВЫБРАТЬ
      |    Поставить.Контрагент,
      |    Поставить.Объект
      |ИЗ
      |    Поставить КАК Поставить
      |        ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять
      |        ПО Поставить.Контрагент = Снять.Контрагент
      |            И Поставить.Объект = Снять.Объект"
   1Сергей
 
19 - 11.09.18 - 11:59
(17) с чего бы это?
   1Сергей
 
20 - 11.09.18 - 11:59
(18) аналогично
   Borteg
 
21 - 11.09.18 - 11:59
(15)    |ВЫБРАТЬ
      |    Поставить.Контрагент,
      |    Снять.Контрагент КАК Контрагент1
      |ИЗ
      |    Поставить КАК Поставить
      |        ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять
      |        ПО Поставить.Контрагент = Снять.Контрагент
      |            И Поставить.Объект = Снять.Объект
      | Где Снять.Контрагент Eсть NULL
   Borteg
 
22 - 11.09.18 - 12:01
(15) |ВЫБРАТЬ
      |    Поставить.Контрагент,
      |    Поставить.Объект,
      |    Снять.Контрагент КАК Контрагент1,
      |    Снять.Объект КАК Объект1,
      |    Поставить.Ссылка,
      |    Снять.Ссылка КАК Ссылка1
      |ИЗ
      |    Поставить КАК Поставить
      |        ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять
      |        ПО Поставить.Контрагент = Снять.Контрагент
      |            И Поставить.Объект = Снять.Объект
 | Где Снять.Контрагент Eсть NULL

Приминительно к 0
   dmt
 
23 - 11.09.18 - 12:02
(15) Тебе нужны объекты на охране? Спроектировано по дурацки. Но как вариант (в одну секунду м.б. 1 док постановки):

выбрать
П.К,
П.ОХ,
Максимум(П.Дата) КАК ДП,
Максимум(Сн.Дата) КАК ДСн
поместить ВТ_МаксДаты
из П левое соединение Сн
по П.К = Сн.К
 И П.ОХ = Сн.ОХ
сгруппировать по П.К, П.ОХ
имеющие Максимум(П.Дата) > Максимум(Сн.Дата)
;

Выбрать
П.*
из П
правое соединение ВТ_МаксДаты КАК МД
по П.К = МД.К
 И П.ОХ = МД.ОХ
 И П.Дата = МД.ДП
   dmt
 
24 - 11.09.18 - 12:05
(15) а как надо: периодический РС, измерения Контрагент, ОбъектОхраны, ресурс НаОхране. Документы делают движения, ты обращаещься к срезу последних РС
   KIraA
 
25 - 11.09.18 - 12:06
(15) Да не настроено тут движение, приходится выкручиваться, искать методом исключения
   Вафель
 
26 - 11.09.18 - 12:08
если нужно те кторые не сняты, то запрос пойдет, если нужны и те которые сняты, сто "снять" нужно группировать по "контрагент, объект"
   Borteg
 
27 - 11.09.18 - 12:08
(25) где есть null допиши тогда и все, а вообще надо сделать правильною
   catena
 
28 - 11.09.18 - 12:10
(25)Как их связывать-то нужно? По старшинству периода? Вручную объясни, как ты хочешь связать те 4, но вчера и эти 2, но сегодня.
   KIraA
 
29 - 11.09.18 - 12:14
(27) с нулем вообще результтат нулевой, потому что связь есть и естественно с нулевым полем нету
   KIraA
 
30 - 11.09.18 - 12:15
(28) По дате видимо )))
   catena
 
31 - 11.09.18 - 12:17
(30)Даты у них последовательные (поставить-снять-поставить-снять) или бардак?
   dmt
 
32 - 11.09.18 - 12:17
(29) исходные данные сюда скопируй. У тебя наверное 2 объекта, по разу поставлены-сняты, и еще раз поставлены
   Borteg
 
33 - 11.09.18 - 12:18
(29) показывай запрос с нулем
 
 
   dmt
 
34 - 11.09.18 - 12:18
(30) а ты вообще понимаешь что хочешь получить?
   KIraA
 
35 - 11.09.18 - 12:20
(29) Да тут 2 дока поставлено потом 2 снято потом 2 опять поставлено. В принципе не важно в какой последовательности что когда проводилось, важны оставшиеся документы не связаные по перечислению поставить/снять.
   KIraA
 
36 - 11.09.18 - 12:22
(29)
     |ИЗ
         |    Поставить КАК Поставить
         |        ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять
         |        ПО Поставить.Контрагент = Снять.Контрагент
         |            И Поставить.Объект = Снять.Объект
         |ГДЕ
         |    Снять.Контрагент ЕСТЬ NULL "
   KIraA
 
37 - 11.09.18 - 12:24
Может нужно гденить Максимум указать? Чтоб в правой части было только 2 документа?
   dmt
 
38 - 11.09.18 - 12:24
(37) см 23 и 24
   Borteg
 
39 - 11.09.18 - 12:25
(35)
"ВЫБРАТЬ
      |    Перечень.Контрагент,
      |    Перечень.Объект,
      |    Перечень.Ссылка КАК Ссылка
      |ПОМЕСТИТЬ Поставить
      |ИЗ
      |    Документ.Перечень КАК Перечень
      |ГДЕ
      |    НЕ Перечень.ПометкаУдаления
      |    И Перечень.Контрагент = &Контрагент
      |    И Перечень.ОбъектОхраны = &ОбъектОхраны
      |    И Перечень.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Поставить)
      |;
      |
      ////////////////////////////////////////////////////////////////////////////////


      |ВЫБРАТЬ
      |    Поставить.Контрагент,
      |    Поставить.Объект,
      |    Снять.Контрагент КАК Контрагент1,
      |    Снять.Объект КАК Объект1,
      |    Поставить.Ссылка,
      |    Снять.Ссылка КАК Ссылка1
      |ИЗ
      |    Поставить КАК Поставить
      |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Перечень КАК Снять
      |        ПО Поставить.Контрагент = Снять.Контрагент
      |            И Поставить.Объект = Снять.Объект
      |            И Снять.Тип = ЗНАЧЕНИЕ(Перечисление.Тип.Снять) И НЕ Снять.ПометкаУдаления
      | Где Снять.Контрагент ЕСть NULL"
   OldCondom
 
40 - 11.09.18 - 12:27
В конфе документ с именем "Перечень", реквизитами "Объект" и "Тип" типа "ПеречислениеСсылка.Тип".
Полагаю реквизит "Объект" - это "СправочникСсылка.Объекты".

Развлекаются как могут.
   Borteg
 
41 - 11.09.18 - 12:27
(37) быстрее сделать ((24)), там кода на пару строчек
   dmt
 
42 - 11.09.18 - 12:29
(40) причем в славном документе Перечень есть реквизит Объект, а есть ОбъектОхраны!
   KIraA
 
43 - 11.09.18 - 12:30
(42) да это просто не затерлось)))
   KIraA
 
44 - 11.09.18 - 12:33
(41) Менять не дают, только дописать
   Borteg
 
45 - 11.09.18 - 12:45
(44) а ничего менять и не надо, создать один регистр и добавить в обработке проведения движения
   KIraA
 
46 - 11.09.18 - 12:50
(45) А 4-2 =2 НИКАК не сделать? И (23) Выберет только 1 последний документ? Или 2 оставшихся?
   DexterMorgan
 
47 - 11.09.18 - 12:55
(46) Вопрос в том, какие два документа из 4 ты хочешь не выводить в конечном итоге
   DexterMorgan
 
48 - 11.09.18 - 12:56
у тебя 4 с типом поставить и 2 - снять. Что в итоге ты хочешь увидеть?
   catena
 
49 - 11.09.18 - 12:58
(46)Если их просто по старшинству периода выводить, то можно упорядочить по дате обе таблицы, пронумеровать строки и соединять по номеру строки.
 
 Рекламное место пустует
   Borteg
 
50 - 11.09.18 - 13:00
(46) так не получится, программа не додумает какие две записи отминусовать)

Давай определимся - тебе надо узнать в каком состоянии объект находится?(поставлен/снят)
Ты можешь просто выбрать последний документ по объекту контрагенту и узнать его состояние тогда
   DexterMorgan
 
51 - 11.09.18 - 13:00
А все понятно, эмулируем работу оборотного РН в запросе.
   DexterMorgan
 
52 - 11.09.18 - 13:00
РукаЛицо
   KIraA
 
53 - 11.09.18 - 13:06
Мне нужно получить оставшиеся 2 документа с поставить Все.
   dmt
 
54 - 11.09.18 - 13:11
(53) Тебе не это нужно. Догадываюсь, что  тебе нужны объекты на охране. Значит, вопрос ты должна была задать такой:  как получить последние документы Постановки, для которых нет более поздних документов Снятие (для каждой пары Контрагент-Объект).
   KIraA
 
55 - 11.09.18 - 13:15
(53) Прям с языка снял. Прав прав прав))
   DexterMorgan
 
56 - 11.09.18 - 13:16
(53) Ну в твоем примере в качестве изврата - получить разницу между количеством документов поставить и снять, выбрать все документы поставить, отсортировать по дате УБЫВ и взять первые такое то количество
   DexterMorgan
 
57 - 11.09.18 - 13:20
(53) Можно, кстати и в одном запросе: пронумеровать таблицу поставить, получить количество документов поставить, соединить и отобрать по НомерСтроки <= КоличествоДокументов. Только не понятно правда зачем такой изврат=)
   DexterMorgan
 
58 - 11.09.18 - 13:21
(57) * "получить количество документов поставить" - Получить разницу в количестве документов поставить/снять
   KIraA
 
59 - 12.09.18 - 09:24
Доброе время суток (23) оказалось правильным решением, но одна загвоздка вот в этом куске...
|ВЫБРАТЬ
         |    МАКСИМУМ(Поставить.Дата) КАК ДП,
         |    МАКСИМУМ(Снять.Дата) КАК ДСн,
         |    Поставить.Контрагент,
         |    Поставить.Объект,
         |ПОМЕСТИТЬ ВТ_МаксДаты
         |ИЗ
         |    Поставить КАК Поставить
         |        ЛЕВОЕ СОЕДИНЕНИЕ Снять КАК Снять
         |        ПО Поставить.Контрагент = Снять.Контрагент
         |            И Поставить.ОбъектОхраны = Снять.Объект
         |
         |СГРУППИРОВАТЬ ПО
         |    Поставить.Контрагент,
         |    Поставить.Объект
         |
         |ИМЕЮЩИЕ
         |    МАКСИМУМ(Поставить.Дата) > МАКСИМУМ(Снять.Дата)
         |;

Если у меня нет ни одного документа о "Снять" то и даты соответственно нет.
Я так полагаю нужно впихнуть что то такое....
ВЫБОР 
    КОГДА Снять.Дата ЕСТЬ NULL ТОГДА Снять.Дата = ДАТАВРЕМЯ(1,1,1)
    ИНАЧЕ Снять.Дата
КОНЕЦ
   catena
 
60 - 12.09.18 - 09:28
(59)Это конструкция пишется намного проще: ЕстьNULL(Снять.Дата,ДАТАВРЕМЯ(1,1,1))
   KIraA
 
61 - 12.09.18 - 09:30
(60) Спасибо
   KIraA
 
62 - 12.09.18 - 09:33
Отдельное спасибо dmt и  catena. Все заработало. Пост можно закрывать.



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует