Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос. Условие
,
0 IShootTo Sheriff
 
08.10.12
07:30
|SELECT
   |  Спр.PARENTEXT as [Продукция $Справочник.Продукция]
   |FROM
   |  $Справочник.Движение as Спр
   |WHERE
   |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
   |  AND $Спр.Операция IN (SELECT Val FROM "+Операция_2+")
   |  AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
   |  AND Спр.ISMARK=$ПустойИД
   |GROUP BY
   |  Спр.PARENTEXT";

Доброго времени суток.
Недавно работаю с прямыми запросами.
Задача: по подчиненному справочнику "ТехнологическиеОперации" выбрать элементы содержащие операцию1,операцию2...операциюN и не содержащие операцию1,операцию2...операциюN (операции в списке значений (с пометками),выбираемые пользователем).
С помощью метода "УложитьСписокОбъектов" запрос работает с условием: "ИЛИ","ИЛИ".
Подскажите как заставить работать запрос с условием: "И","И" ??
1 dk
 
08.10.12
07:41
вроде условия в запросе совпадают с условиями задачи. Что не устраивает?
2 dk
 
08.10.12
07:42
или "разжуй" условия на примере
3 Андрей_Андреич
 
naïve
08.10.12
07:43
AND Спр.ISMARK=$ПустойИД
Здесь ничего не напутано?
4 IShootTo Sheriff
 
08.10.12
07:43
запрос работает,НО в выборку попадают элементы, которые равны одной из множества операций в СЗ. Нужно чтобы попадали только элементы, которые равны всем операциям в СЗ
5 chelentano
 
08.10.12
07:44
лично меня смущают условия:
 AND $Спр.Операция IN (SELECT Val FROM "+Операция_2+")
 AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
6 IShootTo Sheriff
 
08.10.12
07:44
Справочник.Движение
    Операция1=Операции1ВСЗ
    Операция2=Операции2ВСЗ
    ОперацияN=ОперацииNВСЗ
7 IShootTo Sheriff
 
08.10.12
07:45
AND $Спр.Операция IN (SELECT Val FROM "+Операция_1+")
AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")

ошибся при создании топика
8 IShootTo Sheriff
 
08.10.12
07:47
|SELECT
   |  Спр.PARENTEXT as [Продукция $Справочник.Продукция]
   |FROM
   |  $Справочник.Движение as Спр
   |WHERE
   |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
   |  AND $Спр.Операция = :Операция_1
   |  AND $Спр.Операция = :Операция_2
   |  AND $Спр.Операция = :Операция_N
   |  AND $Спр.Операция <> :Операция_1
   |  AND $Спр.Операция <> :Операция_2
   |  AND $Спр.Операция <> :Операция_N
   |  AND Спр.ISMARK=$ПустойИД
   |GROUP BY
   |  Спр.PARENTEXT";
только по списку значений
9 dk
 
08.10.12
07:48
(4) ты пример-то приведи ))
а то хочешь чтобы
цвет яблока был ОДНОВРЕМЕННО желтым, красным, зеленым, синим и белым
10 IShootTo Sheriff
 
08.10.12
07:52
Реле 1Н Спр.Номенклатура
     200123456789 Спр.Продукция
        Контрольная  Спр.Движение(Операция)
        Передача на склад Спр.Движение(Операция)
        Отгрузка Спр.Движение(Операция)

Выбрать элементы Спр.Продукция которые, равны выбранным пользователем операциям
11 IShootTo Sheriff
 
08.10.12
08:00
Может я плохо пояснил...
Выбрать элементы Спр.Продукция, для которого в подчиненном ему Спр.Движение существуют операции из СпискаЗначений1 и не существуют операции из СпискаЗначений2
12 dk
 
08.10.12
08:26
тогда что-то вроде
Select
  Владелец
Group by
  Владелец
Where
  $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
Having
  (SUM(CASE($Спр.Операция IN (SELECT Val FROM "+Операция_2+") THEN 1 ELSE 0))) >= N
13 ADirks
 
08.10.12
08:26
Чисто к сведению.  Эквивалентом к

AND $Спр.Операция IN (SELECT Val FROM "+Операция_1+")
AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")


будет

AND ($Спр.Операция = :Операция_1_1
 OR $Спр.Операция = :Операция_1_2
 OR $Спр.Операция = :Операция_1_N
)
AND Not($Спр.Операция = :Операция_2_1
 OR $Спр.Операция = :Операция_2_2
 OR $Спр.Операция = :Операция_2_N
)
14 Светлый Гений
 
08.10.12
08:36
(0)а что не работает-то в итоге?
15 Светлый Гений
 
08.10.12
08:37
(0)база СКЛ или ДБФ?
16 Светлый Гений
 
08.10.12
08:38
если ДБФ, то надо заменить

AND Спр.ISMARK=$ПустойИД

на

AND Спр.ISMARK <> '*'
17 Светлый Гений
 
08.10.12
08:40
а если СКЛ, то
$Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~

меняем на

$Спр.ДатаОперации BETWEEN :НачДата AND :КонДата
18 IShootTo Sheriff
 
08.10.12
08:41
База ДБФ.
(16) не работает
работает ПустойИД

сейчас пробую (12)
19 Светлый Гений
 
08.10.12
08:44
(18)все равно $ПустойИД - бред какой-то здесь использовать
20 IShootTo Sheriff
 
08.10.12
08:46
(18)
если не помечен на удаление - пустое значение (физически в файле, в колонке ISMARK)
21 Светлый Гений
 
08.10.12
08:51
(20) $ПустойИД это значение '    0    ', а у поля ISMARK размер 1 байт. И если объект помечен на удаление, то его значение равно '*'.
22 IShootTo Sheriff
 
08.10.12
08:53
(21) а если не помечен?
23 Светлый Гений
 
08.10.12
08:54
тогда пустая строка - ''
24 IShootTo Sheriff
 
08.10.12
08:56
(12)
FAILED! ICommandText::Execute(): SQL: Invalid use of subquery
(23)
спасибо. буду знать
25 dk
 
08.10.12
08:57
ну ты текст=то запроса скинь, я ж тока пример скинул, а не готовый
26 Светлый Гений
 
08.10.12
08:57
короче пишешь либо Спр.ISMARK <> '*', либо Спр.ISMARK = ''
27 olegves
 
08.10.12
08:59
(11) во вложенном запросе примени условие не содержит операций, а во внешнем уже на вхождение операций проверяй, - и будет тебе щастье
28 Светлый Гений
 
08.10.12
09:04
(27)да правильный у него запрос в (0), должно все работать
29 dk
 
08.10.12
09:04

Select
  Влож.Владелец
FROM
(Select
  Владелец
  SUM(CASE($Спр.Операция IN (SELECT Val FROM "+Операция_2+") THEN 1 ELSE 0)) Сум
Group by
  Владелец
Where
  $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
)Влож
WHERE
  Влож.Сум > N
30 IShootTo Sheriff
 
08.10.12
09:05
(25)

   |SELECT
   |  Спр.PARENTEXT as [Продукция $Справочник.Продукция]
   |FROM
   |  $Справочник.Движение as Спр
   |WHERE
   |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
   |  AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
   |  AND Спр.ISMARK=$ПустойИД
   |GROUP BY
   |  Спр.PARENTEXT
   |HAVING
   |  (SUM(CASE($Спр.Операция IN (SELECT Val FROM "+Операция_1+") THEN 1 ELSE 0))) >= 2 ";

для двух операций
31 Светлый Гений
 
08.10.12
09:08
(30)еще раз говорю, не работает из-за этой строки

AND Спр.ISMARK=$ПустойИД
32 dk
 
08.10.12
11:22
автор куда пропал?
33 IShootTo Sheriff
 
08.10.12
11:26
(32) отвлекают по работе...

SUM(CASE($Спр.Операция IN (SELECT Val FROM "+Операция_2+") THEN 1 ELSE 0))
можешь пояснить как отрабатывает это условие?
34 IShootTo Sheriff
 
08.10.12
11:58
(30) корректно срабатывает и с ПустойИД и с Спр.ISMARK <> '*', либо Спр.ISMARK = ''
35 dk
 
08.10.12
12:00
CASE($Спр.Операция IN (SELECT Val FROM "+Операция_2+") THEN 1 ELSE 0)
возвращает 1, если операция попала в список нужных
sum - накапливает итоги - сколько операций из списка попало на 1 владельца
соответственно если sum больше N значит есть N нужных операций по данному владельцу
Это если нет дублей связок владелец - вид операции, а то может получиться что 3 раза одна и та же операция, вместо 3-х разных
36 IShootTo Sheriff
 
08.10.12
12:03
(35) большое спасибо...
Но к сожалению дубли могут быть
37 dk
 
08.10.12
12:05
для исключения дублей есть волшебное слово distinct
38 dk
 
08.10.12
12:07

Select
  Влож.Владелец
FROM
(Select
  Владелец
  SUM(CASE($Спр.Операция IN (SELECT Val FROM "+Операция_1+") THEN 1 ELSE 0)) Сум
FROM
  (SELECT DISTINCT Владелец, Операция FROM $Справочник.Движение)
Group by
  Владелец
Where
  $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
)Влож
WHERE
  Влож.Сум > N
39 IShootTo Sheriff
 
08.10.12
12:10
(37) (38) еще раз благодарю....
буду пробовать вложенный запрос (еще не делал ни разу) )))
о результате отпишусь
40 dk
 
08.10.12
12:17
фильтр лучше внутрь перенести

Select
  Влож.Владелец
FROM
(Select
  Владелец
  SUM(CASE($Спр.Операция IN (SELECT Val FROM "+Операция_1+") THEN 1 ELSE 0)) Сум
FROM
  (SELECT DISTINCT Владелец, Операция FROM $Справочник.Движение Where $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
)
Group by
  Владелец
)Влож
WHERE
  Влож.Сум > N
41 IShootTo Sheriff
 
08.10.12
12:22
|Select
   |   Влож.Владелец
   |FROM
   |(Select
   |   Владелец
   |   SUM(CASE($Спр.Операция IN (SELECT Val FROM "+Операция_1+") THEN 1 ELSE 0)) Сум
   |FROM
   |   (SELECT DISTINCT Владелец, Операция FROM $Справочник.Движение as Спр Where $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
   |)
   |Group by
   |   Владелец
   |)Влож
   |WHERE
   |   Влож.Сум > КоличествоОпераций";

FAILED! ICommandText::Execute(): Syntax error.
42 dk
 
08.10.12
12:34
ну запятые еще не мешало бы проставить после селектов и правильно обозвать таблицы
43 dk
 
08.10.12
12:42

SELECT
 Влож2.Владелец as [Продукция $Справочник.Продукция]
FROM
(SELECT
  Влож1.PARENTEXT as Владелец
  SUM(CASE(Влож1.Операция IN (SELECT Val FROM "+Операция_1+") THEN 1 ELSE 0)) Сум
FROM
(SELECT DISTINCT
 Спр.PARENTEXT,
 $Спр.Операция
FROM
 $Справочник.Движение as Спр
WHERE
 $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
 AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
 AND Спр.ISMARK=$ПустойИД
) Влож1
GROUP BY
 Влож1.PARENTEXT
) Влож2
WHERE
  Влож2.Сум >= "+Количество_N+"
44 IShootTo Sheriff
 
08.10.12
13:23
|SELECT
   |  Влож2.Владелец as [Продукция $Справочник.Продукция]
   |FROM
   |(SELECT
   |   Влож1.PARENTEXT as Владелец,
   |   SUM(CASE(Влож1.Операция IN (SELECT Val FROM   "+Операция_1+") THEN 1 ELSE 0)) as Сум
   |FROM
   |(SELECT DISTINCT
   |  Спр.PARENTEXT,
   |  $Спр.Операция
   |FROM
   |  $Справочник.Движение as Спр
   |WHERE
   |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
   |  AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
   |  AND Спр.ISMARK=$ПустойИД
   |) Влож1
   |GROUP BY
   |  Влож1.PARENTEXT
   |) Влож2
   |WHERE
   |   Влож2.Сум >= "+КоличествоОпераций+"";

та же ошибка
Перепробовал всяко...
все равно не
45 dk
 
08.10.12
13:34
запускай по очереди

   |SELECT DISTINCT
   |  Спр.PARENTEXT,
   |  $Спр.Операция
   |FROM
   |  $Справочник.Движение as Спр
   |WHERE
   |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
   |  AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
   |  AND Спр.ISMARK=$ПустойИД

потом

   |SELECT
   |   Влож1.PARENTEXT as Владелец,
   |   SUM(CASE(Влож1.Операция IN (SELECT Val FROM   "+Операция_1+") THEN 1 ELSE 0)) as Сум
   |FROM
   |(SELECT DISTINCT
   |  Спр.PARENTEXT,
   |  $Спр.Операция
   |FROM
   |  $Справочник.Движение as Спр
   |WHERE
   |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
   |  AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
   |  AND Спр.ISMARK=$ПустойИД
   |) Влож1
   |GROUP BY
   |  Влож1.PARENTEXT

потом
полный и найдешь в каком запросе ошибка
46 IShootTo Sheriff
 
08.10.12
13:39
первый отработал
на втором
FAILED! ICommandText::Execute(): Function name is missing ).
47 dk
 
08.10.12
13:45
SUM(CASE(Влож1.Операция IN (SELECT Val FROM   "+Операция_1+") THEN 1 ELSE 0 END)) as Сум
48 dk
 
08.10.12
13:47
SUM(CASE (Влож1.Операция IN (SELECT Val FROM   "+Операция_1+") WHEN 1 ELSE 0 END) as Сум
49 dk
 
08.10.12
13:50
SUM(CASE WHEN (Влож1.Операция IN (SELECT Val FROM   "+Операция_1+") THEN 1 ELSE 0 END) as Сум

))
50 IShootTo Sheriff
 
08.10.12
14:10
для каждого из трех не работает )))
51 dk
 
08.10.12
14:17
SUM(CASE WHEN Влож1.Операция IN (SELECT Val FROM   "+Операция_1+") THEN 1 ELSE 0 END) as Сум
52 Светлый Гений
 
08.10.12
14:19
че-то я не понял, а откуда в VFPOLEDB структура CASE? Там только IIF можно использовать
53 dk
 
08.10.12
14:23
ндя про дбф я не заметил ))
54 IShootTo Sheriff
 
08.10.12
14:24
(53) :)

(52) тогда как быть?
55 Светлый Гений
 
08.10.12
14:24
(54)Использовать IIF(,,)
56 Светлый Гений
 
08.10.12
14:35
+(55)тока, по-моему, в этой функции нельзя вложенные запросы использовать...
57 IShootTo Sheriff
 
08.10.12
14:36
|   SUM(IIF (Влож1.Операция IN (SELECT Val FROM +Операция_1+"),1,0)) as Сум

FAILED! ICommandText::Execute(): Missing comma (,)
58 Светлый Гений
 
08.10.12
14:36
судя по тексту кавычки перед первым "+" не хватает
59 Светлый Гений
 
08.10.12
14:37
а если с кавычками все прально, то см (56)
60 IShootTo Sheriff
 
10.10.12
14:34
Спасибо всем откликнувшимся....
Добился правильной отработки запроса на вхождение операций:

  |SELECT
  |   Запрос_1.PARENTEXT as [Продукция $Справочник.Продукция],
  |   COUNT(*) as Количество
  |FROM
  |(SELECT DISTINCT
  |  Спр.PARENTEXT,
  |  $Спр.Операция
  |FROM
  |  $Справочник.Движение as Спр
  |WHERE
  |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
  |  AND $Спр.Операция IN (SELECT Val FROM "+Операция_1+")
  |  AND Спр.ISMARK=' '
  |) Запрос_1
  |GROUP BY
  |  Запрос_1.PARENTEXT
  |HAVING
  |  COUNT(*)=:КоличествоОпераций_Вхождение";

Теперь нужно, чтобы работал на "вхождение - не вхождение"
Так отрабатывает не корректно:

  |SELECT
  |   Запрос_1.PARENTEXT as [Продукция $Справочник.Продукция],
  |   COUNT(*) as Количество
  |FROM
  |(SELECT DISTINCT
  |  Спр.PARENTEXT,
  |  $Спр.Операция
  |FROM
  |  $Справочник.Движение as Спр
  |WHERE
  |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
  |  AND $Спр.Операция IN (SELECT Val FROM "+Операция_1+")
  |  AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
  |  AND Спр.ISMARK=' '
  |) Запрос_1
  |GROUP BY
  |  Запрос_1.PARENTEXT
  |HAVING
  |  COUNT(*)=:КоличествоОпераций_Вхождение";

Помогите советом Улыбка
61 ЧеловекДуши
 
10.10.12
14:36
Query Analyzer - наше все для SQL отладки :)
62 dk
 
11.10.12
06:58
(60) т.е. разница только в 1 строке
AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
?
покажи как у тебя Операция_2 заполняется
да и тупо
SELECT Val FROM "+Операция_2+"
погляди, может что интересное заметишь
63 Светлый Гений
 
11.10.12
07:00
(61)для базы ДБФ особенно актуально )
64 Светлый Гений
 
11.10.12
07:02
(60)какого рода ошибка? что именно не корректно отрабатывает?
65 Mikeware
 
11.10.12
07:25
(63) 1СQA работает и в файловых базах
66 IShootTo Sheriff
 
11.10.12
07:47
(62) Доброе утро. Да, разница в одной строке
Операция_2 заполняется так:

Операция_2="";
Запрос.УложитьСписокОбъектов(ЗагрузитьПомеченные(СЗ_ТехОперация_2),Операция_2);

Где ЗагрузитьПомеченные - функция отбора операций из СЗ с пометками

(64) ошибок нет. запрос срабатывает. некорректно отбирает по условию NOT IN
67 Mikeware
 
11.10.12
07:50
(66) Тупо сформируй строковое условие, и проверь...
причины "некорректного отбора" чаще всего прячутся в некорректных запросах или условиях
68 Светлый Гений
 
11.10.12
07:54
(66)просто посмотри так, как тебе в (62) советуют:

тз = Запрос.ВыполнитьИнструкцию("SELECT Val FROM "+Операция_2);
тз.Выбрать();
69 IShootTo Sheriff
 
11.10.12
08:03
(68)
Запрос для трех операций
Таб=Запрос.ВыполнитьИнструкцию("SELECT Val FROM "+Операция_2);

Отладка
SELECT Val FROM ea06c354-edd9-45c4-a1e9-746695607163
    C  
   83  
  15R  
СЗ заполняется правильно. УложитьСписокОбъектов срабатывает.
Что еще нужно посмотреть?
70 Светлый Гений
 
11.10.12
09:41
(69) Еще можно посмотреть, что подзапрос выдает то или не то, что от него требуется

  |SELECT DISTINCT
  |  Спр.PARENTEXT,
  |  $Спр.Операция
  |FROM
  |  $Справочник.Движение as Спр
  |WHERE
  |  $Спр.ДатаОперации BETWEEN :НачДата~~ AND :КонДата~~
  |  AND $Спр.Операция IN (SELECT Val FROM "+Операция_1+")
  |  AND $Спр.Операция NOT IN (SELECT Val FROM "+Операция_2+")
  |  AND Спр.ISMARK=' '
71 Светлый Гений
 
11.10.12
09:41
+(70)по идее в нем не должно быть операций из списка "Операция_2"
72 dk
 
11.10.12
12:35
странное использование уложитьсписок )
обычно через Запрос.УложитьСписокОбъектов(СЗ, "#МояТаблица2")
а потом в запросе .. (select val from #МояТаблица2)
---
еще проверь так же, что в таблица1 у тебя хранится и нет ли пересечений
73 IShootTo Sheriff
 
11.10.12
12:40
(72) из документации 1с++
Замечание: Рекомендуется использовать локальные временные таблицы – префикс #. В этом случае не нужно заботиться об уникальности имени таблицы для разных пользователей, а также об их последующем удалении.

В ДБФ версии драйвер сам создает такие таблицы и сам же генерирует им имя.
74 varelchik
 
11.10.12
13:06
А может проще заменить Спр.ISMARK<>'*'
Независимо от того, куда вы едете — это в гору и против ветра!