Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Условие Между
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
VolandMaster
Добрый день.Есть ЗАПРОС
ВЫБРАТЬ
        Администратор,
        Компютер,
        НачалоСеанса,
        ОкончаниеСеанса,
        Тариф,
        Сумма,
        ТипЦен,
        РСТипЦен.НачалоТарифа КАК НачалоТарифа,
            РСТипЦен.ОкончаниеТарифа КАК ОкончаниеТарифа,
        Цена

ИЗ
        Документ.ДокументОплаты КАК ДокОп
ЛЕВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ТипЦен.СрезПоследних КАК РСТипЦен
ПО
        ДокОп.Тариф = РСТипЦен.ТипЦен
ГДЕ
ВЫБОР
        ТипЦен КОГДА МЕЖДУ НачалоТарифа И НачалоСеанса И ТипЦен МЕЖДУ ОкончаниеТарифа И ОкончаниеСеанса
   ТОГДА
           Сумма = 1
КОНЕЦ

После в консоли все поля пустые.

В конечном варианте ЗАПРОС должен считать Сумму сеанса при том что сеанс может сразу проходить через разные тарифы.К примеру с часа до двух один тариф, с двух до 3 другой.
Сеансы и Тарифы имеют тип дата.
Помогите с задачей пожалуйста
sava1
Цитата(VolandMaster @ 10.10.12, 16:21) необходимо зарегистрироваться для просмотра ссылки
ГДЕ
ВЫБОР
ТипЦен КОГДА МЕЖДУ НачалоТарифа И НачалоСеанса И ТипЦен МЕЖДУ ОкончаниеТарифа И ОкончаниеСеанса
ТОГДА
Сумма = 1
КОНЕЦ


и что это за хрень? Выражение в условии должно возвращать БООЛ а не 1 или НУЛЛ
VolandMaster
Цитата(sava1 @ 10.10.12, 16:40) необходимо зарегистрироваться для просмотра ссылки
и что это за хрень? Выражение в условии должно возвращать БООЛ а не 1 или НУЛЛ
Насколько понял если в КОГДА истина то переходит в ТОГДА если Лож то в ИНАЧЕ или КОНЕЦ
sava1
тогда написать

ГДЕ
ТипЦен МЕЖДУ НачалоТарифа И НачалоСеанса И ТипЦен МЕЖДУ ОкончаниеТарифа И ОкончаниеСеанса

в результате - вернет записи где типЦен между указанными значениями
(по-мне так там не ТипЦен а какие-то значения должны быть ???)

Описание рС.ТипЦен в студию
logist
Цитата(VolandMaster @ 10.10.12, 16:47) необходимо зарегистрироваться для просмотра ссылки
Насколько понял

Неправильно поняли, читайте хотя бы встроенную справку по использованию.

ВЫБОР КОГДА 'УСЛОВИЕ' ТОГДА 'ЕСЛИ УСЛОВИЕ ИСТИНА' ИНАЧЕ 'ЕСЛИ УСЛОВИЕ ЛОЖЬ' КОНЕЦ
Пример: ВЫБОР КОГДА 2=2 ТОГДА 2 ИНАЧЕ 0 КОНЕЦ
VolandMaster
РСТипЦен.ТипЦен это имя тарифа, тариф имеет имя, временной промежуток(к примеру с 08:00:00 до 20:00:00) и цену.

Цитата(logist @ 10.10.12, 16:58) необходимо зарегистрироваться для просмотра ссылки
Неправильно поняли, читайте хотя бы встроенную справку по использованию.

ВЫБОР КОГДА 'УСЛОВИЕ' ТОГДА 'ЕСЛИ УСЛОВИЕ ИСТИНА' ИНАЧЕ 'ЕСЛИ УСЛОВИЕ ЛОЖЬ' КОНЕЦ
Пример: ВЫБОР КОГДА 2=2 ТОГДА 2 ИНАЧЕ 0 КОНЕЦ

Понял,СПАСИБО.

Тогда какой параметр должен быть перед МЕЖДУ? я это тоже не понял.
Из справки
Оператор МЕЖДУ позволяет проверить, входит ли значение выражения, указанного справа от него, в диапазон, указанный слева (вместе с границами диапазона). Если входит – результатом оператора будет ИСТИНА, иначе – ЛОЖЬ.

Тут ничего не написано про параметр который должен быть перед между, без параметра консоль выдает ошибку.
kivals
Не, так долго гадать можно...
Опишите, плиз, структуры данных, участвующих в приведенном запросе.
в см - реквизиты Документ.ДокументОплаты, РегистрСведений.ТипЦен с типами данных.

А то пока видится такое решение:
...
ИЗ
        Документ.ДокументОплаты КАК ДокОп
        ЛЕВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ТипЦен.СрезПоследних КАК РСТипЦен
ПО
        ДокОп.Тариф = РСТипЦен.ТипЦен И
        ДокОп.НачалоСеанса МЕЖДУ РСТипЦен.НачалоТарифа И РСТипЦен.ОкончаниеТарифа


Оно, конечно, сильно упрощенное, но жизнеспособное при определенных условиях smile.gif
logist
Цитата(VolandMaster @ 10.10.12, 17:07) необходимо зарегистрироваться для просмотра ссылки
Тогда какой параметр должен быть перед МЕЖДУ? я это тоже не понял.

Пример: ВЫБОР КОГДА (2 МЕЖДУ 1 И 2) И (2 МЕЖДУ 2 И 3) ТОГДА 2 ИНАЧЕ 0 КОНЕЦ
VolandMaster
Цитата(logist @ 10.10.12, 17:15) необходимо зарегистрироваться для просмотра ссылки
Пример: ВЫБОР КОГДА (2 МЕЖДУ 1 И 2) И (2 МЕЖДУ 2 И 3) ТОГДА 2 ИНАЧЕ 0 КОНЕЦ

Понял

Цитата(kivals @ 10.10.12, 17:14) необходимо зарегистрироваться для просмотра ссылки
Не, так долго гадать можно...
Опишите, плиз, структуры данных, участвующих в приведенном запросе.
в см - реквизиты Документ.ДокументОплаты, РегистрСведений.ТипЦен с типами данных.

А то пока видится такое решение:
...
ИЗ
        Документ.ДокументОплаты КАК ДокОп
        ЛЕВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ТипЦен.СрезПоследних КАК РСТипЦен
ПО
        ДокОп.Тариф = РСТипЦен.ТипЦен И
        ДокОп.НачалоСеанса МЕЖДУ РСТипЦен.НачалоТарифа И РСТипЦен.ОкончаниеТарифа


Оно, конечно, сильно упрощенное, но жизнеспособное при определенных условиях smile.gif

необходимо зарегистрироваться для просмотра ссылки

Выгрузка, думаю так ясней всего будет.

Цитата(kivals @ 10.10.12, 17:14) необходимо зарегистрироваться для просмотра ссылки
Не, так долго гадать можно...
Опишите, плиз, структуры данных, участвующих в приведенном запросе.
в см - реквизиты Документ.ДокументОплаты, РегистрСведений.ТипЦен с типами данных.

А то пока видится такое решение:
...
ИЗ
        Документ.ДокументОплаты КАК ДокОп
        ЛЕВОЕ СОЕДИНЕНИЕ
        РегистрСведений.ТипЦен.СрезПоследних КАК РСТипЦен
ПО
        ДокОп.Тариф = РСТипЦен.ТипЦен И
        ДокОп.НачалоСеанса МЕЖДУ РСТипЦен.НачалоТарифа И РСТипЦен.ОкончаниеТарифа


Оно, конечно, сильно упрощенное, но жизнеспособное при определенных условиях smile.gif

Да так, когда понял до конца как работает между.
ВЫБОР 
    КОГДА
          НачалоТарифа МЕЖДУ НачалоСеанса И ОкончаниеСеанса И ОкончаниеСеанса МЕЖДУ НачалоСеанса И ОкончаниеСеанса  
    ТОГДА
          РАЗНОСТЬДАТ Сумма=(НачалоСеанса - ОкончаниеСеанса,МИНУТА) * Цена
    ИНАЧЕ
          РАЗНОСТЬДАТ Сумма = (НачалоСеанса - ОкончаниеТарифа)* Цена + (НачалоСеанса - ОкончаниеТарифа)* Цена    
Конец


Цитата(VolandMaster @ 10.10.12, 17:37) необходимо зарегистрироваться для просмотра ссылки
Понял


необходимо зарегистрироваться для просмотра ссылки

Выгрузка, думаю так ясней всего будет.


Да так, когда понял до конца как работает между.
ВЫБОР 
    КОГДА
          НачалоТарифа МЕЖДУ НачалоСеанса И ОкончаниеСеанса И ОкончаниеСеанса МЕЖДУ НачалоСеанса И ОкончаниеСеанса  
    ТОГДА
          РАЗНОСТЬДАТ Сумма=(НачалоСеанса - ОкончаниеСеанса,МИНУТА) * Цена
    ИНАЧЕ
          РАЗНОСТЬДАТ Сумма = (НачалоСеанса - ОкончаниеТарифа)* Цена + (НачалоСеанса - ОкончаниеТарифа)* Цена    
Конец

Примерно так должно быть, но я опять не доконца все понял походу

МИНУТА забыл дописать, а матерится на Сумма.
MATEVI
VolandMaster, ознакомьтесь с правилами.
Особенно обратите внимание на:

 i 

Правила пункт № 13
 


Я уж даже не знаю, что убирать из Вашего последнего поста. Потом буду просто удалять сообщения....
VolandMaster
Ознакомился,извините .
sava1
По-мне постановка задачи некорректна - где стоимость тарифа?

Опишите систему ценообразования
VolandMaster
Цитата(sava1 @ 11.10.12, 10:50) необходимо зарегистрироваться для просмотра ссылки
где стоимость тарифа?

Стоимость задается через документ СозданиеТарифа,данные сохраняются в регистре сведений.В запросе мне нужно узнать под какой тариф попадает сеанс,попадает под один или несколько, и рассчитать сумму оплаты, ЦенаТарифа*ВремяСеанса.

ДокументОплаты имеет реквизиты Наименование(название тарифа)
ВремяНачало(Дата.Время)
ВремяОкончания(Дата.Время)
Цена(Число)
sava1
Итак:
1.Запрос надо будет формировать динамически (по-большому счету) ;
секции запроса через Объединить
количество секций равно количеству тарифов.
Приблизительно так: (для двух тарифов)

выбрать
     // здесь лирика
     (&КонецТарифа1 - выбрать когда НачалоРаботы<&НачалоТарифа1 тогда  &НачалоТарифа1 иначе НачалоРаботы конец ) как ПродолжительностьРаботы
из документа
где док.НачалоРаботы<&Конецтарифа1 или конецРаботы>&началоТарифа1    

объединить

выбрать
     // здесь лирика
     (&КонецТарифа2 - выбрать когда НачалоРаботы<&НачалоТарифа2 тогда  &НачалоТарифа2 иначе НачалоРаботы конец ) как ПродолжительностьРаботы
из документа
где док.НачалоРаботы<&Конецтарифа2 или конецРаботы>&началоТарифа2


и т.д . до упора

итог:
выбираем из регистра все тарифы
проходя по выборке, строим текст запроса, устанавливаем параметры
выполняем запрос, получаем И-строк (по количеству тарифов)
если не надо И-строк - группируем инфо в запросе
VolandMaster
sava1
При таких условиях пользователь не сможет самостоятельно создавать тарифы
sava1
SQl -щики - предложите решение по-красивше

Цитата(VolandMaster @ 11.10.12, 11:37) необходимо зарегистрироваться для просмотра ссылки
При таких условиях пользователь не сможет самостоятельно создавать тарифы

А каким образом создание тарифов привязано к запросу (выборке результатов работы)?
VolandMaster
Цитата(sava1 @ 11.10.12, 11:39) необходимо зарегистрироваться для просмотра ссылки
А каким образом создание тарифом привязано к запросу

Условие задачи, сделать при помощи запроса,на встроеном языке было бы легче.
sava1
Цитата(VolandMaster @ 11.10.12, 11:43) необходимо зарегистрироваться для просмотра ссылки
сделать при помощи запроса,на встроеном языке

А я о чем здесь распинаюсь - или это на С++ или SQL/PL ?

При таком решении как в конфигураторе - по-другому не получиться
VolandMaster
Цитата(sava1 @ 11.10.12, 11:49) необходимо зарегистрироваться для просмотра ссылки
А я о чем здесь распинаюсь - или это на С++ или SQL/PL ?

Нет) 1с
Цитата(sava1 @ 11.10.12, 11:39) необходимо зарегистрироваться для просмотра ссылки
А каким образом создание тарифов привязано к запросу (выборке результатов работы)?

Значит не понял вопроса
sava1
Тарифы создаются документом.
Хранятся в РС.
Мы же здесь строим запрос, чтобы получить информацию из документов оплаты (или в документе,что не прописано) по продолжительности работы
в разных тарифных периодах для расчета к-примеру Суммы оплаты или получения отчета по работе пользователя

все.Обед
alex040269
Цитата(VolandMaster @ 11.10.12, 11:37) необходимо зарегистрироваться для просмотра ссылки
При таких условиях пользователь не сможет самостоятельно создавать тарифы

способ вполне жизненный, только нужна грамотная реализация.
VolandMaster
Как задать параметр &КонецТарифа и &НачалоТарифа, создавать вложений запрос с РС?
sava1
Каркас для работы (умному достаточно имхо)

запрос= Новый Запрос();
запрос.Текст = "
|ВЫБРАТЬ
  |    ТипЦенСрезПоследних.Цена,
  |    ТипЦенСрезПоследних.НачалоТарифа,
  |    ТипЦенСрезПоследних.ОкончаниеТарифа
  |ИЗ
  |    РегистрСведений.ТипЦен.СрезПоследних КАК ТипЦенСрезПоследних
  |ГДЕ
  |    ТипЦенСрезПоследних.ТипЦен = &ТипЦен"
|";

запрос.УстановитьПараметр("ТипЦен", );
тз = запрос.Выполнить().Выгрузить();

запрос = Новый Запрос();
ТекстЗапроса="";
сч=1;
Для каждого стр Из тз Цикл
    Если сч>1 Тогда
        ТекстЗапроса=ТекстЗапроса+"UNION ALL "+Символы.ПС;        
    КонецЕсли;
    ТекстЗапроса=ТекстЗапроса+"
    |ВЫБРАТЬ
      |    ДокументОплаты.Администратор,
      |    ДокументОплаты.Компютер,
      |    ДокументОплаты.НачалоСеанса,
      |    ДокументОплаты.ОкончаниеСеанса,
      |    ДокументОплаты.Тариф,
      |    (CASE WHEN ОкончаниеСеанса>&ОкончаниеСеанса"+сч+" THEN &ОкончаниеСеанса"+сч+" ELSE  ОкончаниеСеанса END -
      |    CASE WHEN НачалоСеанса<&ОкончаниеСеанса"+сч+" THEN &ОкончаниеСеанса"+сч+" ELSE  НачалоСеанса END) как ПродолжРаботыВСекундах
//      | дальше можно умножить на цену , чтобы получить сумму
      |ИЗ
      |    Документ.ДокументОплаты КАК ДокументОплаты
      |ГДЕ
      |    ДокументОплаты.НачалоСеанса = &НачалоСеанса"+сч+"
      |    И ДокументОплаты.ОкончаниеСеанса = &ОкончаниеСеанса"+сч+"
    |";
    
    запрос.УстановитьПараметр("НачалоСеанса"+сч,стр.НачалоТарифа);
    запрос.УстановитьПараметр("ОкончаниеСеанса"+сч,стр.ОкончаниеТарифа);
    
    сч=сч+1;
КонецЦикла;

табл=Запрос.Выполнить().Выгрузить();
табл.ВыбратьСтроку()


код написан на коленке - поэтому прошу не пинать
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.