Версия для печати темы (https://pro1c.org.ua/index.php?s=e7c0f760ebc98b94225eb0b18f7ff180&showtopic=9307)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Условие Между

Автор: VolandMaster 10.10.12, 15:21

Добрый день.Есть ЗАПРОС

ВЫБРАТЬ
        Администратор,
        Компютер,
        НачалоСеанса,
        ОкончаниеСеанса,
        Тариф,
        Сумма,
        ТипЦен,
        РСТипЦен.НачалоТарифа КАК НачалоТарифа,
            РСТипЦен.ОкончаниеТарифа КАК ОкончаниеТарифа,
        Цена

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

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

В конечном варианте ЗАПРОС должен считать Сумму сеанса при том что сеанс может сразу проходить через разные тарифы.К примеру с часа до двух один тариф, с двух до 3 другой.
Сеансы и Тарифы имеют тип дата.
Помогите с задачей пожалуйста

Автор: sava1 10.10.12, 15:40

Цитата(VolandMaster @ 10.10.12, 16:21) *
ГДЕ
ВЫБОР
ТипЦен КОГДА МЕЖДУ НачалоТарифа И НачалоСеанса И ТипЦен МЕЖДУ ОкончаниеТарифа И ОкончаниеСеанса
ТОГДА
Сумма = 1
КОНЕЦ


и что это за хрень? Выражение в условии должно возвращать БООЛ а не 1 или НУЛЛ

Автор: VolandMaster 10.10.12, 15:47

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

Автор: sava1 10.10.12, 15:55

тогда написать

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

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

Описание рС.ТипЦен в студию

Автор: logist 10.10.12, 15:58

Цитата(VolandMaster @ 10.10.12, 16:47) *
Насколько понял

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

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

Автор: VolandMaster 10.10.12, 16:07

РСТипЦен.ТипЦен это имя тарифа, тариф имеет имя, временной промежуток(к примеру с 08:00:00 до 20:00:00) и цену.

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

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

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

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

Тут ничего не написано про параметр который должен быть перед между, без параметра консоль выдает ошибку.

Автор: kivals 10.10.12, 16:14

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

А то пока видится такое решение:

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


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

Автор: logist 10.10.12, 16:15

Цитата(VolandMaster @ 10.10.12, 17:07) *
Тогда какой параметр должен быть перед МЕЖДУ? я это тоже не понял.

Пример: ВЫБОР КОГДА (2 МЕЖДУ 1 И 2) И (2 МЕЖДУ 2 И 3) ТОГДА 2 ИНАЧЕ 0 КОНЕЦ

Автор: VolandMaster 10.10.12, 16:42

Цитата(logist @ 10.10.12, 17:15) http://pro1c.org.ua/index.php?act=findpost&pid=58093
Не, так долго гадать можно...
Опишите, плиз, структуры данных, участвующих в приведенном запросе.
в см - реквизиты Документ.ДокументОплаты, РегистрСведений.ТипЦен с типами данных.

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


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

http://pro1c.org.ua/redirect.php?http://www.ex.ua/view_storage/123380258493

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

Цитата(kivals @ 10.10.12, 17:14) http://pro1c.org.ua/index.php?act=findpost&pid=58092
Понял


http://pro1c.org.ua/redirect.php?http://www.ex.ua/view_storage/123380258493

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


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

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

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

Автор: MATEVI 10.10.12, 16:46

VolandMaster, ознакомьтесь с правилами.
Особенно обратите внимание на:

 i 

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


Я уж даже не знаю, что убирать из Вашего последнего поста. Потом буду просто удалять сообщения....

Автор: VolandMaster 10.10.12, 16:50

Ознакомился,извините .

Автор: sava1 11.10.12, 9:50

По-мне постановка задачи некорректна - где стоимость тарифа?

Опишите систему ценообразования

Автор: VolandMaster 11.10.12, 10:15

Цитата(sava1 @ 11.10.12, 10:50) *
где стоимость тарифа?

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

ДокументОплаты имеет реквизиты Наименование(название тарифа)
ВремяНачало(Дата.Время)
ВремяОкончания(Дата.Время)
Цена(Число)

Автор: sava1 11.10.12, 10:29

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

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

объединить

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


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

итог:
выбираем из регистра все тарифы
проходя по выборке, строим текст запроса, устанавливаем параметры
выполняем запрос, получаем И-строк (по количеству тарифов)
если не надо И-строк - группируем инфо в запросе

Автор: VolandMaster 11.10.12, 10:37

sava1
При таких условиях пользователь не сможет самостоятельно создавать тарифы

Автор: sava1 11.10.12, 10:39

SQl -щики - предложите решение по-красивше

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

А каким образом создание тарифов привязано к запросу (выборке результатов работы)?

Автор: VolandMaster 11.10.12, 10:43

Цитата(sava1 @ 11.10.12, 11:39) *
А каким образом создание тарифом привязано к запросу

Условие задачи, сделать при помощи запроса,на встроеном языке было бы легче.

Автор: sava1 11.10.12, 10:51

Цитата(VolandMaster @ 11.10.12, 11:43) *
сделать при помощи запроса,на встроеном языке

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

При таком решении как в конфигураторе - по-другому не получиться

Автор: VolandMaster 11.10.12, 10:52

Цитата(sava1 @ 11.10.12, 11:49) http://pro1c.org.ua/index.php?act=findpost&pid=58158
А каким образом создание тарифов привязано к запросу (выборке результатов работы)?

Значит не понял вопроса

Автор: sava1 11.10.12, 10:57

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

все.Обед

Автор: alex040269 11.10.12, 11:05

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

способ вполне жизненный, только нужна грамотная реализация.

Автор: VolandMaster 11.10.12, 15:03

Как задать параметр &КонецТарифа и &НачалоТарифа, создавать вложений запрос с РС?

Автор: sava1 11.10.12, 15:56

Каркас для работы (умному достаточно имхо)

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

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

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

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


код написан на коленке - поэтому прошу не пинать

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua