Имя: Пароль:
1C
1С v8
Есть ли у кого-нибудь идеи, как реализовать такое запросом?
,
0 1C-band
 
20.08.12
15:16
Есть таблица, среди прочего, содержащая чётное количество элементов, имеющих определённый признак (в скобках).

Элементы        Значения
Элемент1(0)    0
Элемент2(1)    50
Элемент3(0)    150
Элемент4(0)    50
Элемент5(1)    100
Элемент6(0)    100

Необходимо найти сумму всех значений, в данном случае, с элемента2 по элемент5 включительно минус значение элемента2. Если встретится ещё пара элементов с признаком (1) - сумму их значений за вычетом значения первого элемента с признаком.

...Если ли мысли, как это реализовать запросом?
1 pessok
 
20.08.12
15:17
разбить на втшки, посчитать в них итоги?
2 1C-band
 
20.08.12
15:18
(1) Хе хе, что именно предлагаешь пихать в ВТ-шки?
3 pessok
 
20.08.12
15:20
ну ты получил данные запросом, потом результаты по условиям запихал в втшки, потом посчитал по ним итоги
4 z80a
 
20.08.12
15:22
(0) А смысл делать это запросом?
5 Starhan
 
20.08.12
15:22
(0) пара вопросов из юбопытсва
1. Зачем элемент2 прибалвять и вычитать операция равна 0.
2. Откуда ты знаешь что надо суммировать элементы с 2 по 5. Откуда получаешь аткой порядок?
6 andrewks
 
20.08.12
15:23
нифига не понял. можно пример снабдить требуемым результатом?
7 Axel2009
 
20.08.12
15:23
(0) а почему не
Элементы        Значения
Элемент1(0)    0
Элемент5(1)    100
Элемент4(0)    50
Элемент2(1)    50
Элемент3(0)    150
Элемент6(0)    100

?
8 1C-band
 
20.08.12
15:23
(5) Единичками в скобках я обозначил нужные мне элементы для простоты этого примера. У меня своё условие.
9 Starhan
 
20.08.12
15:25
(8) Интересно само упорядочивание по какому признаку?
10 Axel2009
 
20.08.12
15:25
(8) а усложнять будешь по мере предоставления ответов, потому как чуть более сложное не получить запросом, который поможет для текущей задачи?
11 1C-band
 
20.08.12
15:26
(7) Потому, что это - очерёдность пунктов путевого листа, и их порядок не меняется. Единичками обозначены пункты пограничных терминалов. Хотя, в теории, порядок может быть произвольным. Главное, чт пограничных пунктов - чётное количество, один "открывает", второй "закрывает". Всё, что между ними - суммируется (кроме пункта входа).
12 Explorer1c
 
20.08.12
15:26
(0)Я пришел к тебе на помощь!
13 Axel2009
 
20.08.12
15:27
ВЫБРАТЬ СУММА(Значение)
ИЗ Таблица
ГДЕ Элементы > (ВЫБРАТЬ ПЕРВЫЕ 1 Элемент Из Таблица ГДЕ Признак = 1 УПОРЯДОЧИТЬ ПО Элемент)
И Элементы <= (ВЫБРАТЬ ПЕРВЫЕ 1 Элемент Из Таблица ГДЕ Признак = 1 УПОРЯДОЧИТЬ ПО Элемент УБЫВ)
14 1C-band
 
20.08.12
15:28
(13) Кстати, в таблице есть НомерСтроки. Буду работать через него!
15 Starhan
 
20.08.12
15:28
(13) в (0) такая приписочка
"Если встретится ещё пара элементов с признаком (1) - сумму их значений за вычетом значения первого элемента с признаком. "
16 1C-band
 
20.08.12
15:30
(15) Да, автомобиль может несколько раз пересекать границу туда и обратно.
17 Axel2009
 
20.08.12
15:32
(15) иии?
18 Starhan
 
20.08.12
15:33
(17) и не сработает если будет 4 6 8 и т.д. строчек с признаком 1
19 Axel2009
 
20.08.12
15:34
(18) уверен?
20 1C-band
 
20.08.12
15:34
Через номера строк.
21 Rovan
 
гуру
20.08.12
15:35
(0) я недавно с похожей задачей бился
- оказалось тупо ТЗ быстрее работает чем запрос !
22 grigo
 
20.08.12
15:35
Легко

Элементы        Значения
Элемент1(0)    0
Элемент2(1)    50
Элемент3(0)    150
Элемент4(0)    50
Элемент5(1)    100
Элемент6(0)    100

Элементы        Значения  нумеруем        Ищем чет нечет  Запоминаем первое значение Ищем число пар    
                          вложенным
                         запросом

Элемент1(0)    0
Элемент2(1)    50             1               -                    50
Элемент3(0)    150
Элемент4(0)    50
Элемент5(1)    100            2               +                                            2/2 = 1
Элемент6(0)    100

Дальше суммируем все числа с признаком и вычитаем Элемент2 * количество пар.
Все делается запросом.
23 SUA
 
20.08.12
15:35
1) нарастающей суммой сделать суммирование признака, закинуть в ВТ (только правильно в нарастающий итог вкладывать не "сумму вулючая", а "сумму до")
2) по ВТ просуммировать строки с нечетным значением нарастающего итога
24 Axel2009
 
20.08.12
15:36
(21) нарастающий итог всегда медленней чем через ТЗ просуммировать.
25 grigo
 
20.08.12
15:37
(22) что-то у меня все в цитаты попало
Вообще (23) дело говорит.
(24) а если это СКД?
26 Starhan
 
20.08.12
15:38
(19) да, а ты уверен что сработает? О_о
27 Starhan
 
20.08.12
15:39
(23) а можно пункт 2 по подробней?
28 grigo
 
20.08.12
15:40
Если не срочно - на выходных запрос напишу, сейчас завал по работе.
29 grigo
 
20.08.12
15:43
(23) там вычитается не первый элемент из пары, а первый элемент с единицей
30 Starhan
 
20.08.12
15:44
(29)я так понял как раз из пары.
31 Starhan
 
20.08.12
15:44
Вообщем ТС плохо выразил мысль и привел неполный пример :(.
32 grigo
 
20.08.12
15:46
0. Перенумеровать все меченые.
1. Определяем четность каждого меченого
2. Определяем номер последнего четного НПЧ
3. Суммируем все четные  СЧ
4. Суммируем все нечетные, номер которых Номера последнего четного. СН
5. Находим значение первого меченого. ЗПМ
5. Результат = Сч + Сн - ЗПМ*НПЧ/2
33 Axel2009
 
20.08.12
15:46
(31) так я про это и написал в (10)
34 grigo
 
20.08.12
15:47
(32) 4. Суммируем все нечетные, номер которых МЕНЬШЕ Номера последнего четного. СН
35 Kashemir
 
20.08.12
15:58
В результате тебе нужна общая или детализированная сумма всех пар ?
36 Kashemir
 
20.08.12
16:02
Вобщем вот решение с парами
ВЫБРАТЬ
   ТЗ.НомерСтроки,
   ТЗ.Элемент,
   ТЗ.Признак,
   ТЗ.Сумма
ПОМЕСТИТЬ ТЗ
ИЗ
   &ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТЗ.НомерСтроки
ПОМЕСТИТЬ ПозицииПунктов
ИЗ
   ТЗ КАК ТЗ
ГДЕ
   ТЗ.Признак = 1
;

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

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

СГРУППИРОВАТЬ ПО
   ВложенныйЗапрос.ПозицияВхода,
   ВложенныйЗапрос.ПозицияВыхода
37 Kashemir
 
20.08.12
16:06
38 grigo
 
20.08.12
16:09
Кашемир крут, я не правильно понял задачу )
39 SUA
 
20.08.12
16:10
(27)СУММА(ВТ.Значение)ИЗ ВТ КАК ВТ ГДЕ (ВЫРАЗИТЬ (ВТ.Признак/2 КАК Число(10,0)))*2<>ВТ.Признак
40 Kashemir
 
20.08.12
16:30
+(36) 3 пакетный запрос можно выкинуть - отладочный для четвертого. Выражение приведения к целому стоит увеличить по разрядности целой части.

(38) :)