![]() |
|
Дата в строку в запросе.. | ☑ | ||
---|---|---|---|---|
0
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" КОНЕЦ + " г." КАК НомерДатаДоговора |
|||
1
Defender aka LINN
06.02.09
✎
13:01
|
Жесть...
|
|||
2
MoneG
06.02.09
✎
13:04
|
Зато работает! )))
|
|||
3
hhhh
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"; |
|||
4
hhhh
06.02.09
✎
13:37
|
(2)+ пока с ошибками
|
|||
5
MoneG
06.02.09
✎
13:40
|
(4) расскажи про них (ошибки)
|
|||
6
Aprobator
06.02.09
✎
13:51
|
хм, а функция запроса Предсталвение(...) не помогает?
|
|||
7
Михей
06.02.09
✎
13:52
|
(0) ееепт...
писал УПП? |
|||
8
Defender aka LINN
06.02.09
✎
13:55
|
(6) Очередной теоретик?
|
|||
9
Serg_1960
06.02.09
✎
13:55
|
ALL: Всегда интересовало: зачем, как и куда "это" надо - дата строкой в запросе? Неужели так "неординарно" мыслят, что не могут запрос в "типовые" рамки уложить?
|
|||
10
MoneG
06.02.09
✎
13:59
|
(6) в (0) написано, что не помогает. Не веришь - проверь на Справочнике ДоговорыКонтрагентов.
(7) :))) нет конечно! Вот если бы в запросе результат ПРЕДСТАВЛЕНИЕ() было именно таким, как оно описано в доках (типа, это строка), можно было бы ординарно сделать. (9) реальный пример, который заставил "не уложиться": справочник ДоговорыКонтрагентов имеет помимо "Наименования" поля "Номер" и "Дата". Хочется прям в запросе получить строку типа "Договор №_ от ""__ 200_" безо всяких обработок выборки потом. |
|||
11
73
06.02.09
✎
13:59
|
(9) Вся проблема в бедности встроенных функций языка запросов,
а люди хотят получить готовый результат от запроса. Вот и мучаются |
|||
12
Defender aka LINN
06.02.09
✎
14:01
|
(10) А зачем он прямо в запросе нужен вообще?
|
|||
13
MoneG
06.02.09
✎
14:03
|
(12) > безо всяких обработок выборки потом
чтобы можно было затем, к примеру, что-то такое сделать без "опасений": Табл.Загрузить(Запрос.Выполнить.Выгрузить()); или ЗаполнитьЗначенияСвойств(); |
|||
14
Aprobator
06.02.09
✎
14:07
|
(10) не метод .Представление, а ПРЕДСТАВЛЕНИЕ(ТвояДата).
|
|||
15
MoneG
06.02.09
✎
14:13
|
(14)ПРЕДСТАВЛЕНИЕ() в отличие от .Представление нельзя использовать совместно с чем-нибудь ещё.. т.е.
"№1 от " + ПРЕДСТАВЛЕНИЕ(Дата) // - невозможно "№1 от " + Ссылка.Представление // - возможно, но не дает результат При этом, ПРЕДСТАВЛЕНИЕ() - вроде как строка (как в описании), но никакими средствами запроса (кроме результата запроса) как строка не распознается. |
|||
16
KalachevDV
06.02.09
✎
14:17
|
Если указать например вот так
ВЫБРАТЬ ПРЕДСТАВЛЕНИЕ(ЗаказПокупателя.Дата) ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя Результат - строка. |
|||
17
Defender aka LINN
06.02.09
✎
14:17
|
(13) Я и так всегда так делаю.
Хотя иногда неудобно, да. |
|||
18
Defender aka LINN
06.02.09
✎
14:17
|
(16) Это на выходе из запроса оно строка. В запросе - нет.
|
|||
19
Serg_1960
06.02.09
✎
14:20
|
А если я Вам сообщу более короткий алгоритм - Вы будете счастливы?
|
|||
20
mikecool
06.02.09
✎
14:21
|
(11,12) все что можно надо получать запросом и нех дополнительно обрабатывать данные на клиенте. Вот бедность языка запросов 1С - это да.
|
|||
21
73
06.02.09
✎
14:29
|
(20) с числами в строку - тоже проблема.
А по поводу доп обработок обнаруживается: В клиент-серверном варианте при больших выборках время выполнения запроса на сервере на порядок меньше, чем дальнейшая обработка в клиенте 1С. Поэтому и хочется побольше отдать на сервер, т.е. в запросе обработать как можно больше. |
|||
22
Serg_1960
06.02.09
✎
14:30
|
(20) Ща... подождите... напишу сначала...
|
|||
23
Serg_1960
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) КАК ДатаСтрокой"; Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Сообщить(Выборка.ДатаСтрокой); Возврат; |
|||
24
73
06.02.09
✎
14:36
|
(23) А с числами произвольной длины?
|
|||
25
Serg_1960
06.02.09
✎
14:37
|
(24) А где аплодисменты и крики "Браво!", "Бис!" ??? :))
|
|||
26
73
06.02.09
✎
14:40
|
(25) "Браво!", "Бис!" - это к Автору.
Я тут так, за державу обидно... От себя - АПЛОДИСМЕНТЫ! |
|||
27
Serg_1960
06.02.09
✎
14:43
|
(26) Угу... За державу обидно... почему разработчики преобразование типов не сделали в ВЫРАЗИТЬ...
|
|||
28
73
06.02.09
✎
14:47
|
(27) Хотя бы.
СКЛ может гораздо больше. Там функций даже в стандарте... молчу. |
|||
29
AndOne
06.02.09
✎
15:18
|
вот скажете, почему не использовать компоновку?
а в запросе выполнять много операций лишних кажется не эффективно, да и компоновка табличным полем быстрее работает. |
|||
30
MoneG
06.02.09
✎
16:08
|
(25) за оптимизацию - безусловно, аплодисменты! Зарезюмировал )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |