Имя: Пароль:
1C
 
Как сделать условие в запросе...
0 WED
 
21.05.08
13:18
В запросе контрагент получается таким образом:

ВЫБРАТЬ
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЗаказИзделия.Ссылка.Контрагент
       ИНАЧЕ ВЫБОР
               КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент
                   ТОГДА ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100))
               ИНАЧЕ ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
           КОНЕЦ
   КОНЕЦ КАК Контрагент,

Контрагент, в итоге, либо ссылка на справочник либо просто строка

Мне надо написать в запросе условие подобное
ГДЕ ЗаказИзделия.Ссылка.Контрагент = &Контрагент
но для обоих случаев (ссылка и строка)

как?
1 vladnet
 
21.05.08
13:19
не парься сделай вложенный запрос и там сделай нужное тебе условие уже на простое поле
2 WED
 
21.05.08
13:21
Маленькое уточнение:
Логика документов такова:

Если Документ ЗаказИзделия.Ссылка создан НЕ на основании Документа ЗамерУстановка, то контрагент однозначно - ссылка, иначе контрагент берется из ЗамерУстановка и при этом он может быть как ссылкой, так и просто строкой.
3 WED
 
21.05.08
13:21
(1) а что вложенный запрос должен выдавать и как его соединить с основным запросом?
4 vladnet
 
21.05.08
13:23
Выбрать

...
...

ИЗ

(
Выбрать ...
тут твой запрос
КАК ...
) Как Таблица
ГДЕ
Таблица.Контрагент=&sd или Таблица.Контрагент=&sd2
5 WED
 
21.05.08
13:27
(4) я не очень силен в запросах..
можно подробней?

Допустим есть запрос ,который выдает перечень документов ЗаказИзделия и контрагентов в них. При этом если ЗаказИзделия выпсан на основании ЗамерУстановка, то контрагент берется из ЗамерУстановка.

Теперь надо отфильтровать все ЗаказИзделия на определнного контрагента...

Можешь что-то подобное привести сюда?

Я сам запрос осилил, а вот как условие к нему прикрутить не знаю :(
6 vladnet
 
21.05.08
13:30
(5) нужно просто обернуть его другим запросом, и условие тогда можно наложить просто как на поле

В структуру не охота вникать запрос покажи
7 WED
 
21.05.08
13:34
ВЫБРАТЬ
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЗаказИзделия.Ссылка.Контрагент
       ИНАЧЕ ВЫБОР
               КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент
                   ТОГДА ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100))
               ИНАЧЕ ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
           КОНЕЦ
   КОНЕЦ КАК Контрагент,
   ЗаказИзделия.Ссылка
ИЗ
   Документ.Заказ.Изделия КАК ЗаказИзделия
8 WED
 
21.05.08
13:36
Здесь ЗаказИзделия - это табличная часть Изделия, документа Заказ
9 vladnet
 
21.05.08
13:37
ВЫБРАТЬ
 ЗаказИзделия.Контрагент, ЗаказИзделия.Ссылка
(ВЫБРАТЬ
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЗаказИзделия.Ссылка.Контрагент
       ИНАЧЕ ВЫБОР
               КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент
                   ТОГДА ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100))
               ИНАЧЕ ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
           КОНЕЦ
   КОНЕЦ КАК Контрагент,
   ЗаказИзделия.Ссылка
ИЗ
   Документ.Заказ.Изделия КАК ЗаказИзделия) КАК ЗаказИзделия

ГДЕ ЗаказИзделия.Контрагент=&Контрагент1 или ЗаказИзделия.Контрагент=&Контрагент2

Если конечно вообще правлиьно понимаю задачу
10 vladnet
 
21.05.08
13:38
Забыл:

ВЫБРАТЬ
 ЗаказИзделия.Контрагент, ЗаказИзделия.Ссылка
ИЗ

....
11 НЕА123
 
21.05.08
13:39
(0) а это зачем?
....
КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент
                   ТОГДА ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100))
...
12 НЕА123
 
21.05.08
13:40
(11)+ Зачем тебе нужен составной тип?
13 WED
 
21.05.08
13:40
(11) Читай (2)
14 WED
 
21.05.08
13:42
(10) Угу, логику понял. Спасибо.
15 WED
 
21.05.08
13:44
(12) Мне не нужен.

Есть бухгалтерия, которая хочет, чтобы все частные лица во всех документах как контрагент "ЧАСТНОЕ ЛИЦО", и есть менеджеры, которым надо отслеживать документы пофамильно...
16 НЕА123
 
21.05.08
13:46
(13) сделай все строкой.
(11)+ это лишняя ненужная проверка.

и вообще
ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100)) если это ссылка - не сработает.
надо:
ЗаказИзделия.Ссылка.ДокументОснование.Контрагент.Наименование
17 WED
 
21.05.08
13:50
(16) Нельзя. Потому что результат запроса выводиться в ТЗ на форме. А там контрагента надо "просматривать"...

Насчет "ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100)) если это ссылка - не сработает. " - работает. Проверено. Потому что в данном случае контрагент - строка!
18 НЕА123
 
21.05.08
13:51
типа так:

ВЫБРАТЬ
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЕСТЬNULL(ЗаказИзделия.Ссылка.Контрагент.Наименование,"")
       ИНАЧЕ ВЫБОР
    ЕСТЬNULL(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент.Наименование,ЗаказИзделия.Ссылка.ДокументОснование.Контрагент)
           КОНЕЦ
   КОНЕЦ КАК Контрагент
19 НЕА123
 
21.05.08
13:52
(17) ??? так кто же такой &ПустойКонтрагент???
20 WED
 
21.05.08
13:53
(17)
Запрос.Параметры.Вставить("ПустойЗамер", Документы.ЗамерУстановка.ПустаяСсылка());
Запрос.Параметры.Вставить("ПустойКонтрагент", Справочники.Контрагенты.ПустаяСсылка());
21 WED
 
21.05.08
13:54
+20 Вок как ни странно это оказалось самым простым способом проверить строка или ссылка контрагент
22 НЕА123
 
21.05.08
13:55
(20) понятно. и когда же тип строка = типу ссылка???

ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент
23 WED
 
21.05.08
14:00
(22)
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЗаказИзделия.Ссылка.Контрагент
       ИНАЧЕ ВЫБОР
               КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент
                   ТОГДА ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100))
               ИНАЧЕ ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
           КОНЕЦ
   КОНЕЦ КАК Контрагент

Тепреь по-русски:
Если ЗаказИзделия.Ссылка НЕ на основании ЗамерУстановка, то контрагент берется из ЗаказИзделия (и это всегда ссылка)

Иначе (ЗаказИзделия выписан на основании ЗамерУстановка) и

Если ЗамерУстановка.Контрагент = ПустаяСсылка То Контрагент = ЗамерУстановка как Строка
Иначе
Контрагент = ЗамерУстановка.Контрагент (и это ссылка)


Тут надо пояснить. Как оказалось: для реквизита с составным типом данных и значением в одном из типов - все остальные типы имеют пустые значения.
24 НЕА123
 
21.05.08
14:04
(23)
сомневаюсь. сильно сомневаюсь. но, надо проверить.
25 WED
 
21.05.08
14:06
(24) Я уже проверил.
26 НЕА123
 
21.05.08
14:14
Врешь.
27 НЕА123
 
21.05.08
14:15
ВЫБРАТЬ
   БанковскиеСчета.Владелец,
   ПРЕДСТАВЛЕНИЕ(БанковскиеСчета.Владелец),
   ВЫБОР
       КОГДА БанковскиеСчета.Владелец = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
           ТОГДА "ПустаяССылка"
       ИНАЧЕ "НеПустая"
   КОНЕЦ КАК Поле1
ИЗ
   Справочник.БанковскиеСчета КАК БанковскиеСчета
28 WED
 
21.05.08
14:17
(27) И что выдает?
29 WED
 
21.05.08
14:18
Попробуй
БанковскиеСчета.Владелец = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

заменить на
БанковскиеСчета.Владелец = &ПустойКонтрагент
и
Запрос.Параметры.Вставить("ПустойКонтрагент", Справочники.Контрагенты.ПустаяСсылка());
30 WED
 
21.05.08
14:19
Вобщем добился я того что мне надо. Через вложенный запрос. Спасибо товарищу vladnet
31 НЕА123
 
21.05.08
14:26
(30)
это хорошо. только врать не надо.
на форуме немало людей, а ты их вводишь в заблуждение.
32 WED
 
21.05.08
14:26
(31) гм. В чем я соврал?
33 НЕА123
 
21.05.08
14:31
ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = &ПустойКонтрагент

всегда ложь, если ЗаказИзделия.Ссылка.ДокументОснование.Контрагент - тип строка.

правильнее было бы проверить так

ВЫРАЗИТЬ(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент КАК СТРОКА(100))
ЕСТЬ НЕ NULL
34 WED
 
21.05.08
14:33
Синтаксически возможно так и более правильно, но мне было удобнее так.

Я проверял свой, частный, случай. Реквизит Контрагент в документе ЗамерУстановка имеет составной тип данных: Строка и Справочник.Контрагент.

При отладке я увидел, что если в ЗамерУстановка.Контрагент заноситься строка, то ЗамерУстановка.Контрагент.Ссылка  = Справочник.Контрагенты.ПустаяСсылка()

Подобный эффект был еще на одном реквизите, у которого типы: Справочник.Номенклатура, Справочник.Изделия, Справочник.Комплекты.
При заполнении данными одного типа все остальные - пустые ссылка их типа.

Проверка в запросе показала, что это условие работает. Работает и для ЗамерУстановка.Контрагент и для второго реквизита. Что я и использовал в своем запросе в условии.
35 WED
 
21.05.08
14:34
При твоем синтаксисе придется подобное условие писать для каждого типа данных реквизита. В моем я сразу проверил нужный мне.
36 НЕА123
 
21.05.08
14:36
>>При отладке я увидел, что если в ЗамерУстановка.Контрагент заноситься строка, то ЗамерУстановка.Контрагент.Ссылка  = Справочник.Контрагенты.ПустаяСсылка()

чем смотрел-то?
ЗамерУстановка.Контрагент.Ссылка IS NULL
37 WED
 
21.05.08
14:36
Есть еще один нюанс в мою пользу: ЗаказИзделия.Ссылка.ДокументОснование.Контрагент может быть вообще не заполнен. т.е. он ни строки ни ссылка. и как поведет твое условие?
38 WED
 
21.05.08
14:36
(36) В табло и смотрел.
39 WED
 
21.05.08
14:38
Ладно, думаю что всё это уже не по теме.

Ты хочешь проверять по-своему - ради бога. Не возражаю :)
Мне было удобней проверить по-своему. О чем я и написал.

Думаю, что уместно закрыть тему.
40 НЕА123
 
21.05.08
14:43
(37)
бредишь.
ЗаказИзделия.Ссылка.ДокументОснование.Контрагент может быть
ССЫЛКА
СТРОКА
НЕОПРЕДЕЛЕНО
ну и NULL.

если НЕОПРЕДЕЛЕНО то, естественно Выразить как строка даст NULL.
41 WED
 
21.05.08
14:46
(40) Не брежу, но согласен. Упустил.
42 WED
 
21.05.08
14:47
+41 Я уже сказал, что в запросе ПРАВИЛЬНО для моего частного случая.
43 НЕА123
 
21.05.08
14:51
(42)
лишняя проверка, всегда отрабатывает ИНАЧЕ.
44 WED
 
21.05.08
14:52
(43) Ну хорошо.
Напиши как по-твоему должны выглядеть эти условия в запросе.
45 НЕА123
 
21.05.08
15:08
ВЫБРАТЬ
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЕСТЬNULL(ЗаказИзделия.Ссылка.Контрагент.Наименование,"")
       ИНАЧЕ
    ЕСТЬNULL(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент.Наименование,
ЕСТЬNULL(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент,""))
   КОНЕЦ КАК Контрагент


получишь строку.
немного офф.  вопрос: почему тип контрагента составной? нельзя было группы указывать?
46 НЕА123
 
21.05.08
15:12
(45)+неа, не так.

ВЫБРАТЬ
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЕСТЬNULL(ЗаказИзделия.Ссылка.Контрагент.Наименование,"")
       ИНАЧЕ
    ЕСТЬNULL(ЗаказИзделия.Ссылка.ДокументОснование.Контрагент.Наименование,
ЕСТЬNULL(
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = НЕОПРЕДЕЛЕНО
           ТОГДА ""
       ИНАЧЕ
       ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
       КОНЕЦ
,""))
   КОНЕЦ КАК Контрагент
47 WED
 
21.05.08
15:24
(45)(46)
Почему тип составной я уже ответил в (15).

в (46):

ТОГДА ЕСТЬNULL(ЗаказИзделия.Ссылка.Контрагент.Наименование,"")

вернет из запроса строку с наименованием контрагента или "", так?
48 НЕА123
 
21.05.08
15:29
(47)
да.
в (15) смотрел, но может можно было как-то с группами выкрутиться...
составной тип, тем более строковый... гемор.
49 WED
 
21.05.08
15:36
(48)
1. У тебя во всем условии при всех вариантах возвращается строка, а мне надо чтобы ссылкой, если он ссылка в ЗаказИзделия или ЗаказИзделие.ДокументОснование) и строкой если он строка. Его дальше из ТЗ будут открывать.

2. С группами можно конечно было сделать. Но далеко не на каждый документ "Замер" (он же является ЗаказИзделия.ДокументОснование) будет создан ЗаказИзделия. т.е. очень много замеров с такими контрагентами, которые будут только 1 раз и больше никогда. Руководство решило, что все такие будут проходит в бухгалтерии как "Частное лицо", чтобы справочник контрагентов не рос как на дрожжах, ну а менеджерам естественно нужно пофамильно, чтобы замеры найти... вот и извращаюсь теперь :(
50 НЕА123
 
21.05.08
15:48
ВЫБРАТЬ
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование = &ПустойЗамер
           ТОГДА ЗаказИзделия.Ссылка.Контрагент
       ИНАЧЕ
       
       ВЫБОР
           КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент ССЫЛКА Справочник.Контрагенты
           Тогда ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
        Иначе    
ЕСТЬNULL(
   ВЫБОР
       КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент = НЕОПРЕДЕЛЕНО
           ТОГДА ""
       ИНАЧЕ
       ЗаказИзделия.Ссылка.ДокументОснование.Контрагент
       КОНЕЦ
,"")
   КОНЕЦ
Конец КАК Контрагент

насчет синтаксиса не проверял.
вернет либо строку либо ссылку.
51 WED
 
21.05.08
16:02
(50) И так я тоже делал. Причем с самого начала.

В условии
КОГДА ЗаказИзделия.Ссылка.ДокументОснование.Контрагент ССЫЛКА Справочник.Контрагенты

всегда истина, проверено. именно поэтому я стал проверять на пустую ссылку, а не на тип.