Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Запрос с параметрами

Запрос с параметрами
Я
   buketovav
 
23.10.19 - 11:08
Доброго дня, дорогие Форумчане!
Вот такой вопрос у меня возник: как сформировать запрос не к таблицам БД, а имея, например, только параметры Дата1 и Дата2 в результат запроса вывести обе этих даты и те даты, которые между ними?
 
 
   Ёпрст
 
1 - 23.10.19 - 11:10
Опять тестовое задание с собеседования ?
   Chum
 
2 - 23.10.19 - 11:12
ВЫБРАТЬ 
   ВЫРАЗИТЬ(&НачДата КАК ДАТА) КАК ДатаП 
ИТОГИ ПО 
   ДатаП ПЕРИОДАМИ(ДЕНЬ, &НачДата, &КонДата)
   buketovav
 
3 - 23.10.19 - 11:13
ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК Поле1,
    КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) КАК Поле2

так могу вывести параметры
   buketovav
 
4 - 23.10.19 - 11:14
(1) не, просто интересно ) раньше не сталкивался с таким )
   buketovav
 
5 - 23.10.19 - 11:17
(1) кстати, кто их такие задания придумывает )))
и что в реальных задачах бывает потребность в таких решениях?
можно ведь взять РС с календарем ))) и там все есть
   piter3
 
6 - 23.10.19 - 11:18
(5) Бывает самописки пользуют
   buketovav
 
7 - 23.10.19 - 11:19
(6) а БСП не дает такой возможности разве?
   piter3
 
8 - 23.10.19 - 11:20
(7) У меня вот есть времен до БСП
   Ёпрст
 
9 - 23.10.19 - 11:22
   Ёпрст
 
10 - 23.10.19 - 11:22
(5) у меня нет никакого календаря в базе
   piter3
 
11 - 23.10.19 - 11:23
Да и календарь может быть не заполнен.
   buketovav
 
12 - 23.10.19 - 11:23
(11) согласен
   buketovav
 
13 - 23.10.19 - 11:23
(10) понял понял, просто размышляю, для чего такое может понадобиться )
   buketovav
 
14 - 23.10.19 - 11:45
не, все равно чет не понимаю, как при таком запросе вывести все даты между &Дата1 и &Дата2

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК НачалоПериода,
    КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) КАК КонецПериода
   Ёпрст
 
15 - 23.10.19 - 11:48
(14) см. (9) там есть текст запроса
   buketovav
 
16 - 23.10.19 - 12:07
чет не доходит (15)
   Ёпрст
 
17 - 23.10.19 - 12:09
(16) чего не доходит ? Там готовый текст запроса в 10 посту
   Жан Пердежон
 
18 - 23.10.19 - 12:10
(16)
ВЫБРАТЬ 0 КАК Б ПОМЕСТИТЬ вт ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1;
ВЫБРАТЬ вт0.Б+2*вт1.Б+4*вт2.Б+8*вт3.Б+16*вт4.Б+32*вт5.Б+64*вт6.Б+128*вт7.Б+256*вт8.Б+512*вт9.Б+1024*вт9.Б КАК ЧИСЛО
ПОМЕСТИТЬ втЧисла
ИЗ вт КАК вт0, вт КАК вт1, вт КАК вт2, вт КАК вт3, вт КАК вт4, вт КАК вт5, вт КАК вт6, вт КАК вт7, вт КАК вт8, вт КАК вт9, вт КАК вт10;

ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число)
ИЗ втЧисла
ГДЕ ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число)<=&Дата2;
   buketovav
 
19 - 23.10.19 - 12:10
(17) чет у меня он пустой результат дает. поэтому не доходит )
   Ёпрст
 
20 - 23.10.19 - 12:13
(19)  путаешь даты начала и конца в параметрах
   DrWatson
 
21 - 23.10.19 - 12:13
В отчетах ЗУПа есть подобное.
   DrWatson
 
22 - 23.10.19 - 12:19
"ВЫБРАТЬ
        |    0 КАК Цифра
        |ПОМЕСТИТЬ ВТЦифры
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    1
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    2
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    3
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    4
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    5
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    6
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    7
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    8
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    9
        |;
        |
        ////////////////////////////////////////////////////////////////////////////////

        |ВЫБРАТЬ
        |    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериодаИнтервала, ЧАС, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ЧАС) КАК ИмяПоляПериод
        |ПОМЕСТИТЬ ИмяВТ
        |ИЗ
        |    ВТЦифры КАК Цифры
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 9)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 99)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры1000
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 999)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10000
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 9999)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100000
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 99999)
        |ГДЕ
        |    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериодаИнтервала, ЧАС, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ЧАС) МЕЖДУ &НачалоИнтервала И &ОкончаниеИнтервала";
   buketovav
 
23 - 23.10.19 - 12:25
хотелось бы понимать, что здесь происходит, а то я что-то все-таки не понимаю ((( может надо выспаться...
   buketovav
 
24 - 23.10.19 - 12:28
(22) спасибо, но непонятно )))
   buketovav
 
25 - 23.10.19 - 12:42
понятно, что надо к дате прибавлять по одному дню и выводить до тех пор пока дата меньше &Дата2

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК НачалоПериода,
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ), ДЕНЬ, 1) КАК Дата,
    КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) КАК КонецПериода

ну так это нужен типа цикл
   Ёпрст
 
26 - 23.10.19 - 13:08
(25) ну так там типа табличка чисел и её фильтрация
   buketovav
 
27 - 23.10.19 - 13:14
вт0.Б + 2 * вт1.Б + 4 * вт2.Б + 8 * вт3.Б + 16 * вт4.Б + 32 * вт5.Б + 64 * вт6.Б + 128 * вт7.Б + 256 * вт8.Б + 512 * вт9.Б + 1024 * вт9.Б - не понимаю это для чего?
   buketovav
 
28 - 23.10.19 - 13:14
и как это работает?
   Ёпрст
 
29 - 23.10.19 - 13:18
(27) в том запросе, (18) который, надо еще различные в селект воткнуть
   Ёпрст
 
30 - 23.10.19 - 13:19
(28) не знаком с двоичной записью числа ?
 
 Рекламное место пустует
   Ёпрст
 
31 - 23.10.19 - 13:20
это для получения таблички цифр
   buketovav
 
32 - 23.10.19 - 13:21
(30) неа )
   buketovav
 
33 - 23.10.19 - 13:22
(31) хорошо, получили мы табличку чисел от 0 до 2048, а дальше что?
   Ёпрст
 
34 - 23.10.19 - 13:22
и чему вас тока в школе учат..
   Ёпрст
 
35 - 23.10.19 - 13:23
(33) дальше выбираем из неё  ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число) и ограничиваем &Дата2
   DrWatson
 
36 - 23.10.19 - 13:23
Вот такой запрос будет с подстройкой его к периодичности по дням.

Запрос.ТекстЗапроса = "ВЫБРАТЬ
|    0 КАК Цифра
|ПОМЕСТИТЬ ВТЦифры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    1
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    2
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    3
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    4
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    5
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    6
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    7
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    8
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    9
|;
|
////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ
|    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), ДЕНЬ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ДЕНЬ) КАК ИмяПоляПериод
|ИЗ
|    ВТЦифры КАК Цифры
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 9)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 99)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры1000
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 999)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10000
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 9999)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100000
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 99999)
|ГДЕ
|    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), ДЕНЬ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ДЕНЬ) МЕЖДУ &НачалоИнтервала И &ОкончаниеИнтервала";

Важно, что параметры должны быть заданы
   Консультант Баранов
 
37 - 23.10.19 - 13:24
(5)> и что в реальных задачах бывает потребность в таких решениях?

Например в Налоге на имущество когда надо остатки получать на накачало каждого месяца.
   Ёпрст
 
38 - 23.10.19 - 13:24
еслси не понял, посмотри так:

Выбать втЧисла.Число,ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число) из втЧисла
   buketovav
 
39 - 23.10.19 - 13:26
(38) да вроде бы понял, спасибо большое )
   buketovav
 
40 - 23.10.19 - 13:27
надо самому написать такое несколько раз проговаривая что и почему и как правильно делать ))) спасибо )
   Ёпрст
 
41 - 23.10.19 - 13:38
Можно даже так написать

ВЫБРАТЬ
    АвтономерЗаписи() как Число,"Вася"
// вт0.Б+2*вт1.Б+4*вт2.Б+8*вт3.Б+16*вт4.Б+32*вт5.Б+64*вт6.Б+128*вт7.Б+256*вт8.Б+512*вт9.Б+1024*вт9.Б КАК ЧИСЛО


а вот если ваю потом убрать, посмотреть, как 1с-ина падает :)
   buketovav
 
42 - 23.10.19 - 14:15
(41) почему падает?
   Ёпрст
 
43 - 23.10.19 - 14:16
(42) вопросы не ко мне, а на Селезнёвку задавай.
   Ёпрст
 
44 - 23.10.19 - 14:16
мне лень даже план запроса посмотреть
   Eiffil123
 
45 - 24.10.19 - 11:37
(5) вообще стандартная задача. пользователь хочет на каждый день видеть остатки товаров/денег на счетах/ДЗ_КЗ на каждый из дней.
И решения вполне стандартные - одним запросом получаем все даты за период, вторым остатки на первую дату, а потом из таблицы оборотов и остатков на начало - остатки на каждую последующую дату.
   Жан Пердежон
 
46 - 24.10.19 - 12:26
(29) там опечатка в последнем слагаемом, РАЗЛИЧНЫЕ не нужны
   Ёпрст
 
47 - 24.10.19 - 12:29
(10) да увидел..


Список тем форума
Рекламное место пустует  Рекламное место пустует
Основная теорема систематики: Новые системы плодят новые проблемы.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.