Вход | Регистрация
 

Дата в строку в запросе..

Дата в строку в запросе..
Я
   MoneG
 
06.02.09 - 12:59
В продолжение темы v8: Как преобразовать дату в строку в запросе ?,
где речь шла о номере и дате документа.
Изящный метод ".Представление" для справочника ДоговорыКонтрагентов, к сожалению, не подходит.
"Забивать" в запрос все возможные даты - тоже не вариант.

Предлагаю другое универсальное решение:

//====================================================================
"Договор № "+ВЫРАЗИТЬ(Табл.Номер КАК Строка(12))+
" от " +             //--------- день ---------
ВЫБОР КОГДА ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) )*10
                   - ДЕНЬ(Табл.Дата) > 0    //округленные десятки
           ТОГДА //десятки округлены в большую сторону
               ПОДСТРОКА("0123",             //десятков + "0"
               ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) )
               ,1) +
               ПОДСТРОКА("0123456789",
               ДЕНЬ(Табл.Дата)-           //единиц + "0"
               ((ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1)) - 1) * 10) + 1
               ,1)
           ИНАЧЕ //десятки округлены в меньшую сторону
               ПОДСТРОКА("0123",  //десятков дней не больше 3х
               ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) ) + 1
               ,1) +
               ПОДСТРОКА("0123456789",
               ДЕНЬ(Табл.Дата)-
               (ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата)/10 КАК Число(1) ) * 10) + 1
               ,1)
   КОНЕЦ  + "." + //---------- месяц --------------
ВЫБОР КОГДА ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) )*10
                   - МЕСЯЦ(Табл.Дата) > 0    //округленные десятки
           ТОГДА //десятки округлены в большую сторону
               ПОДСТРОКА("01",  //десятков месяцев не больше 1
               ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) )
               ,1) +
               ПОДСТРОКА("0123456789",
               МЕСЯЦ(Табл.Дата)-
               ((ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1)) - 1) * 10) + 1
               ,1)
           ИНАЧЕ //десятки округлены в меньшую сторону
               ПОДСТРОКА("01",
               ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) ) + 1
               ,1) +
               ПОДСТРОКА("0123456789",
               МЕСЯЦ(Табл.Дата)-
               (ВЫРАЗИТЬ(МЕСЯЦ(Табл.Дата)/10 КАК Число(1) ) * 10) + 1
               ,1)
   КОНЕЦ    + "." + //--------- год ------------------
// сами понимаете, во что выльется "выбирание" цифр года без переменных,
// поэтому упростим :
// считаем, что кроме 0001, 19хх и 20хх - нет др годов

//тысячи и сотни года    
ВЫБОР КОГДА ГОД(Табл.Дата) <> 1
   ТОГДА
       ВЫБОР КОГДА ГОД(Табл.Дата) > 1999
           ТОГДА "20" + //десятки и единицы года
               ВЫБОР КОГДА ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) )*10
                               - (ГОД(Табл.Дата) - 2000) > 0
                   ТОГДА //десятки округлены в большую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) )
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 2000) -
                       ((ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1)) - 1) * 10) + 1
                       ,1)
                   ИНАЧЕ //десятки округлены в меньшую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) ) + 1
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 2000) -
                       (ВЫРАЗИТЬ((ГОД(Табл.Дата) - 2000)/10 КАК Число(1) ) * 10) + 1
                       ,1)
               КОНЕЦ                
           //-------------------------
           ИНАЧЕ "19" + //десятки и единицы года
                   ВЫБОР КОГДА ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) )*10
                               - (ГОД(Табл.Дата) - 1900) > 0
                   ТОГДА //десятки округлены в большую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) )
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 1900) -
                       ((ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1)) - 1) * 10) + 1
                       ,1)
                   ИНАЧЕ //десятки округлены в меньшую сторону
                       ПОДСТРОКА("0123456789",
                       ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) ) + 1
                       ,1) +
                       ПОДСТРОКА("0123456789",
                       (ГОД(Табл.Дата) - 1900) -
                       (ВЫРАЗИТЬ((ГОД(Табл.Дата) - 1900)/10 КАК Число(1) ) * 10) + 1
                       ,1)
               КОНЕЦ

       КОНЕЦ
   ИНАЧЕ         "0001"
КОНЕЦ             + " г."                        КАК НомерДатаДоговора
   Defender aka LINN
 
1 - 06.02.09 - 13:01
Жесть...
   MoneG
 
2 - 06.02.09 - 13:04
Зато работает! )))
   hhhh
 
3 - 06.02.09 - 13:35
(2) предлагаю другой вариант
ВЫБОР КОГДА День(Табл.Дата) < 10 ТОГДА
    ""0"" + ПОДСТРОКА("0123456789",
                        ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата) КАК Число(1)
                        ,1)
ИНАЧЕ
    ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(ДЕНЬ(Табл.Дата) КАК Число(1) - 10)*3+1 
                        ,2) 
КОНЕЦ
+ "." +
ВЫБОР КОГДА Месяц(Табл.Дата) < 10 ТОГДА
    ""0"" + ПОДСТРОКА("0123456789",
                        ВЫРАЗИТЬ(Месяц(Табл.Дата) КАК Число(1)
                        ,1)
ИНАЧЕ
    ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(Месяц(Табл.Дата) КАК Число(1) - 10)*3+1 
                        ,2) 
КОНЕЦ
+ "." +
ВЫБОР КОГДА Год(Табл.Дата) - 2000 < 10 ТОГДА
    ""0"" + ПОДСТРОКА("0123456789",
                        ВЫРАЗИТЬ(Год(Табл.Дата)-2000 КАК Число(1)
                        ,1)
ИНАЧЕ
    ПОДСТРОКА(&Параметр, (ВЫРАЗИТЬ(Год(Табл.Дата)-2000 КАК Число(1) - 10)*3+1 
                        ,2) 
КОНЕЦ

здесь

&Параметр = "10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33";
   hhhh
 
4 - 06.02.09 - 13:37
(2)+ пока с ошибками
   MoneG
 
5 - 06.02.09 - 13:40
(4) расскажи про них (ошибки)
   Aprobator
 
6 - 06.02.09 - 13:51
хм, а функция запроса Предсталвение(...) не помогает?
   Михей
 
7 - 06.02.09 - 13:52
(0) ееепт...

писал УПП?
   Defender aka LINN
 
8 - 06.02.09 - 13:55
(6) Очередной теоретик?
   Serg_1960
 
9 - 06.02.09 - 13:55
ALL: Всегда интересовало: зачем, как и куда "это" надо - дата строкой в запросе? Неужели так "неординарно" мыслят, что не могут запрос в "типовые" рамки уложить?
   MoneG
 
10 - 06.02.09 - 13:59
(6) в (0) написано, что не помогает. Не веришь - проверь на Справочнике ДоговорыКонтрагентов.
(7) :))) нет конечно! Вот если бы в запросе результат ПРЕДСТАВЛЕНИЕ() было именно таким, как оно описано в доках (типа, это строка), можно было бы ординарно сделать.
(9) реальный пример, который заставил "не уложиться": справочник ДоговорыКонтрагентов имеет помимо "Наименования" поля "Номер" и "Дата".
Хочется прям в запросе получить строку типа "Договор №_  от ""__ 200_"
безо всяких обработок выборки потом.
   73
 
11 - 06.02.09 - 13:59
(9) Вся проблема в бедности встроенных функций языка запросов,
а люди хотят получить готовый результат от запроса. Вот и мучаются
   Defender aka LINN
 
12 - 06.02.09 - 14:01
(10) А зачем он прямо в запросе нужен вообще?
   MoneG
 
13 - 06.02.09 - 14:03
(12) > безо всяких обработок выборки потом
чтобы можно было затем, к примеру, что-то такое сделать без "опасений":
Табл.Загрузить(Запрос.Выполнить.Выгрузить());
или
ЗаполнитьЗначенияСвойств();
   Aprobator
 
14 - 06.02.09 - 14:07
(10) не метод .Представление, а ПРЕДСТАВЛЕНИЕ(ТвояДата).
   MoneG
 
15 - 06.02.09 - 14:13
(14)ПРЕДСТАВЛЕНИЕ() в отличие от .Представление нельзя использовать совместно с чем-нибудь ещё.. т.е.
"№1 от " + ПРЕДСТАВЛЕНИЕ(Дата)// - невозможно
 
"№1 от " + Ссылка.Представление// - возможно, но не дает результат
 

При этом, ПРЕДСТАВЛЕНИЕ() - вроде как строка (как в описании), но никакими средствами запроса (кроме результата запроса) как строка не распознается.
   KalachevDV
 
16 - 06.02.09 - 14:17
Если указать например вот так 
ВЫБРАТЬ
    ПРЕДСТАВЛЕНИЕ(ЗаказПокупателя.Дата)
ИЗ
    Документ.ЗаказПокупателя КАК ЗаказПокупателя

Результат - строка.
   Defender aka LINN
 
17 - 06.02.09 - 14:17
(13) Я и так всегда так делаю.
Хотя иногда неудобно, да.
   Defender aka LINN
 
18 - 06.02.09 - 14:17
(16) Это на выходе из запроса оно строка. В запросе - нет.
   Serg_1960
 
19 - 06.02.09 - 14:20
А если я Вам сообщу более короткий алгоритм - Вы будете счастливы?
   mikecool
 
20 - 06.02.09 - 14:21
(11,12) все что можно надо получать запросом и нех дополнительно обрабатывать данные на клиенте. Вот бедность языка запросов 1С - это да.
   73
 
21 - 06.02.09 - 14:29
(20) с числами в строку - тоже проблема.
А по поводу доп обработок обнаруживается:
В клиент-серверном варианте при больших выборках время выполнения запроса
на сервере на порядок меньше, чем дальнейшая обработка в клиенте 1С.
Поэтому и хочется побольше отдать на сервер, т.е. в запросе обработать
как можно больше.
   Serg_1960
 
22 - 06.02.09 - 14:30
(20) Ща... подождите... напишу сначала...
   Serg_1960
 
23 - 06.02.09 - 14:32
Воот, получите... и будьте счастливы :)
    ЧислоСтрокой = "00";
    Для N = 0 По 99 Цикл
        ЧислоСтрокой = ЧислоСтрокой + Формат(N,"ЧЦ=2; ЧВН=");
    КонецЦикла;
    
    Запрос = Новый Запрос();
    Запрос.УстановитьПараметр("ЧислоСтрокой",    ЧислоСтрокой);
    Запрос.УстановитьПараметр("ТекДата",        ТекущаяДата());
    
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    ""Договор №___ от "" + ВЫБОР
    |    КОГДА ГОД(&ТекДата) > 1900
    |    ТОГДА ""20"" + ПОДСТРОКА(&ЧислоСтрокой, (ГОД(&ТекДата) - 2000) * 2 + 1, 2)
    |    ИНАЧЕ ""19"" +    ПОДСТРОКА(&ЧислоСтрокой, (ГОД(&ТекДата) - 1900) * 2 + 1, 2) КОНЕЦ + ""/"" + 
    |    ПОДСТРОКА(&ЧислоСтрокой, МЕСЯЦ(&ТекДата) * 2 + 1, 2) + ""/"" +
    |    ПОДСТРОКА(&ЧислоСтрокой, ДЕНЬ(&ТекДата) * 2 + 1, 2) КАК ДатаСтрокой";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Сообщить(Выборка.ДатаСтрокой);
    
    Возврат;
   73
 
24 - 06.02.09 - 14:36
(23) А с числами произвольной длины?
   Serg_1960
 
25 - 06.02.09 - 14:37
(24) А где аплодисменты и крики "Браво!", "Бис!" ??? :))
   73
 
26 - 06.02.09 - 14:40
(25) "Браво!", "Бис!" - это к Автору.
Я тут так, за державу обидно...
От себя - АПЛОДИСМЕНТЫ!
   Serg_1960
 
27 - 06.02.09 - 14:43
(26) Угу... За державу обидно... почему разработчики преобразование типов не сделали в ВЫРАЗИТЬ...
   73
 
28 - 06.02.09 - 14:47
(27) Хотя бы.
СКЛ может гораздо больше. Там функций даже в стандарте... молчу.
   AndOne
 
29 - 06.02.09 - 15:18
вот скажете, почему не использовать компоновку?
а в запросе выполнять много операций лишних кажется не эффективно, да и компоновка табличным полем быстрее работает.
   MoneG
 
30 - 06.02.09 - 16:08
(25) за оптимизацию - безусловно, аплодисменты! Зарезюмировал )
 
 


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.