|
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
|
|
|||
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
|
|
|||
39
IShootTo Sheriff
08.10.12
✎
12:10
|
(37) (38) еще раз благодарю....
буду пробовать вложенный запрос (еще не делал ни разу) ))) о результате отпишусь |
|||
40
dk
08.10.12
✎
12:17
|
фильтр лучше внутрь перенести
|
|||
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
|
|
|||
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
|
запускай по очереди
потом
потом полный и найдешь в каком запросе ошибка |
|||
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<>'*'
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |