Имя: Пароль:
1C
1С v8
Запрос. Внутреннее соединенние не могу настроить связь
0 scanduta
 
22.02.13
18:53
вот картинка там все есть http://s1.ipicture.ru/uploads/20130222/eDJwRSuv.jpg

не пойму почему запись строка которая выделена и еще пару строк под ней попадают в запрос . свзяь я вроде верное поставил.

Помогите а то я че т не пойму. Может по другому свзяь сделать
1 scanduta
 
22.02.13
19:02
не много ни так написал, уточню:
по задумке выделенная строка и еще пара строк под ней должны попадать в выборку..

А вот почему остальные попадают, хотя условию они не соотвествуют
2 GANR
 
22.02.13
19:29
(1) Периоды не должны пересекаться - такое ДОЛЖНО быть условие?
3 scanduta
 
22.02.13
20:00
(2) да все правильно вы поняли. как же мне это реализовать?
4 Vesa
 
22.02.13
20:21
Какая конкретно строка не должна попадать?
5 scanduta
 
22.02.13
20:30
Должны остаться только те строки таблицы ВТ3 дапазоны дат которы не пересекаются с диапазонами таблицы остатки
6 scanduta
 
22.02.13
20:31
то есть по сути должны остаться выделенная строка, и 2 строки которые прямо под ней
7 GANR
 
22.02.13
20:38
Если исходить из предположения, что данные корректны и для каждой записи таблиц ВТ3 и Остатки выполняется условие

ВТ3.ДатаНач < ВТ3.ДатаКон И
Остатки.ДатаНач < Остатки.ДатаКон

то условие соединения может выглядеть так

ВТ3.ДатаКон < Остатки.ДатаНач
ИЛИ ВТ3.ДатаНач > Остатки.ДатаКон

или нет?
8 GANR
 
22.02.13
20:40
Нарисуй на картинке область допустимых вариантов с 2-мя отрезками как в школе - должно стать ясно.
9 scanduta
 
22.02.13
20:49
(7) по предложенному вариант не взлетает
http://s2.ipicture.ru/uploads/20130222/MkJL436o.jpg
10 scanduta
 
22.02.13
20:50
11 GANR
 
22.02.13
20:53
(10) запрос в ветку
12 scanduta
 
22.02.13
20:56
Запрос я может усложинл слекга но вот он:

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

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

СГРУППИРОВАТЬ ПО
   ВТ.Период
;

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

СГРУППИРОВАТЬ ПО
   ВТ.Период,
   ЗаказыКлиентовОстаткиИОбороты.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, 1) КАК ДатаНачала,
   ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, МакКоличетсвоУлсуг.ВремяОказанияУслуги * 60 * ЕСТЬNULL(ЗаказыКлиентовОстаткиИОбороты.КОформлениюПриход, 0) - 1) КАК ДатаЗавершения
ПОМЕСТИТЬ ОСТАТКИ
ИЗ
   РегистрСведений.МакКоличетсвоУлсуг КАК МакКоличетсвоУлсуг,
   РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты(
           &ДатаНач,
           ,
           Запись,
           ,
           ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт)
               ИЛИ ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке)) КАК ЗаказыКлиентовОстаткиИОбороты
ГДЕ
   ЗаказыКлиентовОстаткиИОбороты.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга)

СГРУППИРОВАТЬ ПО
   ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, 1),
   ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, МакКоличетсвоУлсуг.ВремяОказанияУслуги * 60 * ЕСТЬNULL(ЗаказыКлиентовОстаткиИОбороты.КОформлениюПриход, 0) - 1)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ3.ДатаНачала,
   ВТ3.ДатаЗАвершения
ИЗ
   ВТ3 КАК ВТ3
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОСТАТКИ КАК ОСТАТКИ
       ПО (НЕ(ОСТАТКИ.ДатаНачала МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения
                   ИЛИ ОСТАТКИ.ДатаЗавершения МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения))

СГРУППИРОВАТЬ ПО
   ВТ3.ДатаЗАвершения,
   ВТ3.ДатаНачала
13 scanduta
 
22.02.13
20:57
но важна вот эта часть разумеется



////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТ3.ДатаНачала,
   ВТ3.ДатаЗАвершения
ИЗ
   ВТ3 КАК ВТ3
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОСТАТКИ КАК ОСТАТКИ
       ПО (НЕ(ОСТАТКИ.ДатаНачала МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения
                   ИЛИ ОСТАТКИ.ДатаЗавершения МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения))

СГРУППИРОВАТЬ ПО
   ВТ3.ДатаЗАвершения,
   ВТ3.ДатаНачала
14 scanduta
 
22.02.13
20:58
Причем когда мне надо выбрать диапазоны которые пересекаются я спокойно получаю это с помощью функции МЕЖДУ.


А вот выбрать наоборот диапазоны без пересечения ну никак не получается
15 GANR
 
22.02.13
20:59
(10) Но вообще условию (7) в листинге (10) все соответствует, если внимательно присмотреться - либо остатки позже начались (строчка 1), либо раньше закончились (строчка 2)
16 GANR
 
22.02.13
21:00
ВНИМАТЕЛЬНО глянь листинг (10) - может, просто показалось, что неправильно.
17 GANR
 
22.02.13
21:01
(14) так надо с пересечениями?
18 GenV
 
22.02.13
21:01
(16)+1
19 scanduta
 
22.02.13
21:05
(16) нет не показалось ... посмотри диапазоны слева 01.05.13 с 00 00 00 до 08 00 00 справа нету диапазон попадающих в этот диапазон. Поэтому должны остатться только эт три записи.
20 scanduta
 
22.02.13
21:07
(17) с пересечениями не надо. Это получается у меня
21 GenV
 
22.02.13
21:07
(19) Ты сделал условие с НЕпопаданием в диапазон ...
22 scanduta
 
22.02.13
21:11
да но мне необходимо проверить чтобы в диапазон не попадали все записи из таблицы остатков а не частично
23 EugeniaK
 
22.02.13
21:11
Правильное условие
ВТ3.ДатаКон < Остатки.ДатаНач
И ВТ3.ДатаНач > Остатки.ДатаКон
24 GANR
 
22.02.13
21:12
(22) Аааа... Это совсем другой запрос должен быть. Вот это по делу!
25 EugeniaK
 
22.02.13
21:13
(23) Хотя нет, все-таки "ИЛИ"
26 GANR
 
22.02.13
21:14
(25) тут одним условием не ограничиться - тут вложенные запросы со свертками внутри будут иметь место
27 scanduta
 
22.02.13
21:19
Ладно наверное сегодня лучше голову не забивать...утро вечера мудренее... =) всем спасибо за помощь. Если больше я в теме не отпишусь то считайте что я разобрался... всех снаступающим  днем защитника отчечества
28 GANR
 
22.02.13
23:01
(27) Задача (22) решается в несколько этапов:

1. Найти записи ВТ3, которые пересекаются с Остатками хотя бы один раз и выгрузить их в ВТ4 с ВЫБРАТЬ РАЗЛИЧНЫЕ
условие внутреннего соединения таблиц Остатки и ВТ3 такое

ОСТАТКИ.ДатаНачала МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения
                  ИЛИ ОСТАТКИ.ДатаЗавершения МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения

2. Выбрать из ВТ3 записи, которые НЕ попадают в п.1 (ВТ4) запросом ниже и выгрузить их в ВТ5

ВЫБРАТЬ
а.ДатаНачала,
а.ДатаЗавершения
ИЗ ВТ3 КАК а
ГДЕ
НЕ (а.ДатаНачала, а.ДатаЗавершения)
В (ВЫБРАТЬ б.ДатаНачала, б.ДатаЗавершения ИЗ ВТ4 КАК б)

3. Соединить записи п.2 (ВТ5) и Остатки ВНУТРЕННИМ СОЕДИНЕНИЕМ ПО (ИСТИНА) (ВСЁ уже отфильтровано в п.2)

Смысл понятен? Это то????
Все сложности только в том, что форум плохо представляет задачу.
29 GANR
 
22.02.13
23:03
Принцип в (28) прост - найти то, что НЕ соответствует условию, а затем выбрать то, что не попадает в множество не соответствующих записей.