Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) как в запросе реализовать условие (число прочтений - 7590 )
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
как в запросе реализовать условие
20. Июня 2013 :: 08:13
Печать  
Объясните по возможности простым языком как в запросе реализовать следующее:
при выборке из док.Реализация проверять на условие:
Если Док.ПР.МатТов.Выбран()=1 тогда
     ДокМ=ПР.МатТов;  //тип Документ
     Если ДокМатр.НайтиДокумент(ПР.МатТов)=1 тогда
           ДокМатр.ВыбратьСтроки();
           Пока ДокМатр.ПолучитьСтроку()=1 цикл
                 Товар = ДокМатр.Товар;
                 ГруппаТовар = Товар.Родитель; 
                 Если (ВыбТов.Выбран()=0) или (ВыбТов=Товар) или (ВыбТов=ГруппаТовар)Тогда
                       ТЗ.НоваяСтрока();      
                       ТЗ.Период = ДатаНач;
                       ТЗ.Клиент = Клиент;
                       ТЗ.ПР = ПР; 
                       ТЗ.Товар = Товар;   
                       ТЗ.ГруппаТовар = ГруппаТовар; 
                       ТЗ.Количество=0;
                       ТЗ.МатрТов=1;
                 Иначе
                       Продолжить;
                 КОнецЕсли;
           КонецЦикла;
     КонецЕсли;
Конецесли;
где ПР - это справочник
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: как в запросе реализовать условие
Ответ #1 - 20. Июня 2013 :: 09:16
Печать  
В твоём коде везде выбран() надо бы выкинуть, это для начала, + выкинуть НайтиДокумент..

ЗЫ: ну и нам отсюда не видно твой текст запроса и какое отношение он имеет к выборке табличной части документа-основания..
  
Наверх
 
IP записан
 
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
Re: как в запросе реализовать условие
Ответ #2 - 20. Июня 2013 :: 09:45
Печать  
Eprst писал(а) 20. Июня 2013 :: 09:16:
ЗЫ: ну и нам отсюда не видно твой текст запроса и какое отношение он имеет к выборке табличной части документа-основания..

А что ты хочешь увидеть? обычная выборка через скл-запрос, результат выкидываеца в тз сгруппированный и отфильтрованный для последующего вывода на печать.
Не знаю только как ЭТО условие "вклинить", чтобы в результирующей тз было видно ТЗ.МатрТов=1 или ТЗ.МатрТов=0.
Предполагаю, что надо какойто подзапрос написать для ДокМатр, но не знаю как  Печаль
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: как в запросе реализовать условие
Ответ #3 - 20. Июня 2013 :: 10:41
Печать  
Обычный select на реализацию + left join к табличной части документа основания.. усё собственно.
  
Наверх
 
IP записан
 
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
Re: как в запросе реализовать условие
Ответ #4 - 20. Июня 2013 :: 12:09
Печать  
Eprst писал(а) 20. Июня 2013 :: 10:41:
Обычный select на реализацию + left join к табличной части документа основания.. усё собственно.

Так и делаю:
Запрос.УстановитьТекстовыйПараметр("МатрТов", МатрТов);
|select
|$ДокументСтроки_.Товар AS [Товар $Справочник.Товары],
Если сФлаг=1 тогда      
|      $ДокументСтроки_Мат.Товар AS [ТоварМ $Справочник.Товары],
|      case when $ДокументСтроки_Мат.Товар=:$ДокументСтроки_.Товар then :МатрТов=:1 else :МатрТов=:0
конецесли;
|      SUM($ДокументСтроки_.Количество) AS [Количество $Число]
|from
|
.....
, но
1. мешает лишнее поле, которое мне потом в группировке запроса не нужно- ДокументСтроки_Мат.Товар
2. с условием $ДокументСтроки_Мат.Товар=:$ДокументСтроки_.Товар лажа.
как реализовать: Если Док.ПР.МатТов.Выбран()=1 тогда
     ДокМ=ПР.МатТов; 
     Если ДокМатр.НайтиДокумент(ПР.МатТов)=1 тогда

и потом уже добавить условие ???
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: как в запросе реализовать условие
Ответ #5 - 20. Июня 2013 :: 13:38
Печать  
Если Док.ПР.МатТов.Выбран()=1 тогда

вот это реализуется простым джоином..

типа того
select
   $Док.РеквизитШапки
   .......
  ,isnull($Вася.РеквизитТабличнойчасти,$ПустойИД)
from $Документ.реализация Док (nolock)
left join  $ДокументСтроки.Вася Вася (nolock) on Right($Док.ПР) = Вася.iddoc
  
Наверх
 
IP записан
 
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
Re: как в запросе реализовать условие
Ответ #6 - 21. Июня 2013 :: 08:49
Печать  
Спасибо, учел.
А с Цитата:
Если ДокМатр.НайтиДокумент(ПР.МатТов)=1 тогда
     Если ДокМатр.НайтиДокумент(ПР.МатТов)=1 тогда
ничего не подскажешь?
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: как в запросе реализовать условие
Ответ #7 - 21. Июня 2013 :: 09:20
Печать  
А зачем тебе ДокМ, если он нигде в указанном тобой коде не используется?
З.Ы. это я вот это комментирую:
Цитата:
Если Док.ПР.МатТов.Выбран()=1 тогда
     ДокМ=ПР.МатТов;  //тип Документ
     Если ДокМатр.НайтиДокумент(ПР.МатТов)=1 тогда
  
Наверх
ICQ  
IP записан
 
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
Re: как в запросе реализовать условие
Ответ #8 - 21. Июня 2013 :: 09:49
Печать  
Salimbek писал(а) 21. Июня 2013 :: 09:20:
А зачем тебе ДокМ, если он нигде в указанном тобой коде не используется?
З.Ы. это я вот это комментирую:
Цитата:
Если Док.ПР.МатТов.Выбран()=1 тогда
    ДокМ=ПР.МатТов;  //тип Документ
    Если ДокМатр.НайтиДокумент(ПР.МатТов)=1 тогда

ДокМ и не нужен, написано чтоб смысл был понятен этой выборки. Вообще должно быть вот так:
Код
Выбрать все
ДокМ=ПР.МатТов;  //тип Документ
     Если ДокМатр.НайтиДокумент(ДокМ)=1 тогда 


но это всего лишь один из способов написания Улыбка
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: как в запросе реализовать условие
Ответ #9 - 21. Июня 2013 :: 10:49
Печать  
А зачем его искать ?
У тебя чего, есть битые ссылки ?

Это условие и есть то, что выше - есть документ в реквизите, будет левый джоин с ТЧ, нету - не будет.
  
Наверх
 
IP записан
 
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
Re: как в запросе реализовать условие
Ответ #10 - 25. Июня 2013 :: 06:53
Печать  
Чета ничего не выходит
Код
Выбрать все
|SELECT
|	CAST(:НачДата as datetime) AS Период,
|	$Док.Клиент AS [Клиент $Справочник.Клиенты],
|	$Док.ПунктРазгрузки AS [ПР $Справочник.ПунктыРазгрузки],
|	СпрТов.ParentID AS [ГруппаТовар $Справочник.Товары],
|	$ДокументСтроки_.Товар AS [Товар $Справочник.Товары],
|	ISNULL(СпрПР.МатТов, $ПустойИД),
//|	$ДокМ.Товар as [ТоварМ $Справочник.Товары],
|	IIF($ДокументСтроки_.Товар=:$ДокМ.Товар,$ДокМ.Товар,$ПустойИД) as ТоварМ,
|	SUM($ДокументСтроки_.Количество) AS [Количество $Число]
|FROM
|	$Документ.РеализацияГП AS Док (NOLOCK)
|	LEFT OUTER JOIN $Справочник.ПунктыРазгрузки AS СпрПР (NOLOCK)  ON ((СпрПР.ID) = $Док.ПунктРазгрузки)
|		LEFT OUTER JOIN $ДокументСтроки.МатТов AS ДокМ (NOLOCK)  ON ((ДокМ.IDDoc) = $СпрПР.МатТов)
|	INNER JOIN _1sJourn AS Жур (NOLOCK)  ON (Жур.IDDoc = Док.IDDoc) AND
|				Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
|				Жур.Closed & 1 = 1
|	INNER JOIN $ДокументСтроки.РеализацияГП AS ДокументСтроки_ (NOLOCK)  ON (ДокументСтроки_.IDDoc = Жур.IDDoc)
|		     INNER JOIN $Справочник.Товары AS СпрТов (NOLOCK)  ON ((СпрТов.ID) = $ДокументСтроки_.Товар)
|"; 


выдает
Цитата:
Неправильный синтаксис около конструкции "=".

Помогите разобраться!
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: как в запросе реализовать условие
Ответ #11 - 25. Июня 2013 :: 10:25
Печать  
IIF выкини, це не фокс, тут токма case
  
Наверх
 
IP записан
 
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
Re: как в запросе реализовать условие
Ответ #12 - 25. Июня 2013 :: 13:38
Печать  
Eprst писал(а) 25. Июня 2013 :: 10:25:
IIF выкини, це не фокс, тут токма case

Выкинул. Теперь в запрос попадают ТОЛЬКО товары удовлетворяющие условию, хотя я для этих товаров отдельную колонку отвел ТоварМ. Убрал группировку - не помогло(((
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: как в запросе реализовать условие
Ответ #13 - 25. Июня 2013 :: 13:44
Печать  
Да ё .. пиши заместо IIF  -  CASE
  
Наверх
 
IP записан
 
GandolF
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 70
Зарегистрирован: 06. Марта 2013
Re: как в запросе реализовать условие
Ответ #14 - 26. Июня 2013 :: 06:13
Печать  
Eprst писал(а) 25. Июня 2013 :: 13:44:
Да ё .. пиши заместо IIF  -  CASE

Ёпрст, так и делаю:
Код
Выбрать все
|	CASE
|	WHEN $ДокументСтроки_.Товар=$ДокМ.Товар THEN
|	$ДокМ.Товар
|	ELSE $ПустойИД END as [ТоварМ $Справочник.Товары], 


Ошибок-то нету, просто выводит не то, что надо. Мне нужно в таком виде:
Товары     |  ТоварыМ   | Количество
--------------------------------------------
Тов1             Пустой           10
Тов2             Пустой           15
Тов3              Тов3_М         10
Тов4             Пустой           20
Тов5             Тов5_М          15
____________________________________
А выводит:

Товары     |  ТоварыМ   | Количество
--------------------------------------------
Тов3              Тов3_М         10
Тов5             Тов5_М          15

Не догоняю, почему он их сворачивает, Группировку убрал
  

Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать