Как уже в запросе объединить число и строку?
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Единственный метод сделать из числа строку - это деление на 10. Т.е.:
Т.е. делим на 1000 и получаем количество тысяч, потом вычитаем все полные тысячи и получаем количество сотен, потом вычитаем все полные тысячи, сотни и десятки - получаем количество единиц. Через временную таблицу со значениями 0..10 можно сделать более лаконичный код, но количество дней может в перспективе быть и более 9999, что уже дополнительно нужно будет предусмотреть. У Ильдаровича тут были какие-то запросики в минимализмах или еще где - поиском воспользуйтесь.
"ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 0 ТОГДА "0"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 1 ТОГДА "1"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 2 ТОГДА "2"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 3 ТОГДА "3"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 4 ТОГДА "4"
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 5 ТОГДА "5"
...
КОГДА ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) = 9 ТОГДА "9"
КОНЕЦ + ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД - ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) * 1000 КАК ЧИСЛО(1)) = 0 ТОГДА "0"
ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД - ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) * 1000 КАК ЧИСЛО(1)) = 1 ТОГДА "1"
...
ВЫБОР КОГДА ВЫРАЗИТЬ(ЧД - ВЫРАЗИТЬ(ЧД/1000 КАК ЧИСЛО(2)) * 1000 КАК ЧИСЛО(1)) = 9 ТОГДА "9"
КОНЕЦ + ВЫБОР КОГДА ...
...
КОНЕЦ КАК ЧислоСтрокой" ПоказатьТ.е. делим на 1000 и получаем количество тысяч, потом вычитаем все полные тысячи и получаем количество сотен, потом вычитаем все полные тысячи, сотни и десятки - получаем количество единиц. Через временную таблицу со значениями 0..10 можно сделать более лаконичный код, но количество дней может в перспективе быть и более 9999, что уже дополнительно нужно будет предусмотреть. У Ильдаровича тут были какие-то запросики в минимализмах или еще где - поиском воспользуйтесь.
Число в строку можно преобразовать в строку через Представление(значение), однако прибавить к результату строку все равно не получится.
(14) вот, даже круче, чем в сабже
select
2012 as DwnBound
,2015 as UpBound
into InputTable
union select 2000,2005 union select 2024,2032 union select 1997,1999
;
select
0 as num
,"0" as numstr
into digits
union select 1,"1" union select 2,"2" union select 3,"3" union select 4,"4" union select 5,"5"
union select 6,"6" union select 7,"7" union select 8,"8" union select 9,"9"
;
select
digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num as num
,digits4.numstr+digits3.numstr+digits2.numstr+digits1.numstr as numstr
into numbers
from
digits as digits1
,digits as digits2
,digits as digits3
,digits as digits4
index by num
;
select
"период с "+numbers1.numstr+" по "+numbers2.numstr+" год" as BoundPresent
from
InputTable
inner join
numbers as numbers1
on (InputTable.DwnBound=numbers1.num)
inner join
numbers as numbers2
on (InputTable.UpBound=numbers2.num)
Показать
Может кому-то пригодится.
В отчете на СКД нужно было вывести в колонку данные по номенклатуре: "Дата поставки" + ("Количество"). Еще и через запятую, для всех ожидаемых поступлений. Пример: 24.09.2018(14), 28.10.2018(6).
В запросе изначально дата выходила со временем. Получилось так:
Запрос:
В Вычисляемых полях формула: МПоступления = ПОДСТРОКА(ДатаПоступления, 1, 10) + " (" + КоличествоНаДату + ")" .
В Ресурсах: СоединитьСтроки(МПоступления, ", ") .
В отчете на СКД нужно было вывести в колонку данные по номенклатуре: "Дата поставки" + ("Количество"). Еще и через запятую, для всех ожидаемых поступлений. Пример: 24.09.2018(14), 28.10.2018(6).
В запросе изначально дата выходила со временем. Получилось так:
Запрос:
ВЫБРАТЬ
ЗаказыПоставщикамОстатки.Номенклатура КАК Материал,
ЗаказыПоставщикамОстатки.Характеристика КАК МХарактеристика,
ПРЕДСТАВЛЕНИЕ(ЗаказыПоставщикамОстатки.ЗаказПоставщику.Дата) КАК ДатаПоступления,
ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ЗаказыПоставщикамОстатки.ЗаказаноОстаток, 0)) КАК КоличествоНаДату,
СУММА(ЗаказыПоставщикамОстатки.ЗаказаноОстаток) КАК МОтПоставщика
ИЗ
РегистрНакопления.ЗаказыПоставщикам.Остатки КАК ЗаказыПоставщикамОстатки
СГРУППИРОВАТЬ ПО
ЗаказыПоставщикамОстатки.Номенклатура,
ЗаказыПоставщикамОстатки.Характеристика,
ПРЕДСТАВЛЕНИЕ(ЗаказыПоставщикамОстатки.ЗаказПоставщику.Дата),
ПРЕДСТАВЛЕНИЕ(ЕСТЬNULL(ЗаказыПоставщикамОстатки.ЗаказаноОстаток, 0)) ПоказатьВ Вычисляемых полях формула: МПоступления = ПОДСТРОКА(ДатаПоступления, 1, 10) + " (" + КоличествоНаДату + ")" .
В Ресурсах: СоединитьСтроки(МПоступления, ", ") .
Прикрепленные файлы:
В СКД совершенно спокойно можно соединить поле Представление(ИмяПоля) + "текст" на закладке "Вычисляемые поля", можно написать даже выражение для правильной записи "дней", "дня", "день"
неясно, найден ли вариант решения?
Если это СКД, то такой вопрос вообще не должен ставить в тупик, в (18) ответ.
Если это построитель или отчет со своим макетом - то что мешает добавить поле НазваниеДней как-то так:
...
|" дней" КАК стрНазваниеДней,
...
и выводить его сразу за полем, в котором число ДопустимоеЧислоДнейЗадолженности
Если это СКД, то такой вопрос вообще не должен ставить в тупик, в (18) ответ.
Если это построитель или отчет со своим макетом - то что мешает добавить поле НазваниеДней как-то так:
...
|" дней" КАК стрНазваниеДней,
...
и выводить его сразу за полем, в котором число ДопустимоеЧислоДнейЗадолженности
Проверено, работает. Может быть понятнее будет на примере:
Текст строки Вычисляемые поля Выражение
ЭтоБылоЧисло + " а это текст"
Всё прекрасно соединяет
А вот про запрос добавила зря. Извиняюсь.
Текст Набора данных Запрос
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование,
ПРЕДСТАВЛЕНИЕ(Номенклатура.Реквизит1) КАК ЭтоБылоЧисло
ИЗ
Справочник.Номенклатура КАК Номенклатура
ПоказатьТекст строки Вычисляемые поля Выражение
ЭтоБылоЧисло + " а это текст"
Всё прекрасно соединяет
А вот про запрос добавила зря. Извиняюсь.
Если ДЕЙСТВИТЕЛЬНО необходимо это делать в запросе, можно использовать пакет запросов (т.к. даже в справке по функции ПРЕДСТАВЛЕНИЕ указано, что ее результат нельзя дальше использовать, а ВЫРАЗИТЬ вообще для составных типов):
ВЫБРАТЬ
Справочник1.Поле1 КАК Поле1Число, // Это число
ПРЕДСТАВЛЕНИЕ(Справочник.Поле1) КАК Поле1Строка // Это строка
ПОМЕСТИТЬ ВремТаб
ИЗ Справочник.Справочник1 КАК Справочник1;
ВЫБРАТЬ
ВремТаб.Поле1Строка + " тут нужная строка"
ИЗ ВремТаб КАК ВремТаб Показать
Лично я сделал это коряво (но работает). СКД не вариант (переписывать дольше), а конвертить нужно было всего-навсего номер строки, который у нас ограничен количеством 99.
ТекстЗапроса =
"ВЫБРАТЬ
| 1 КАК НомерСтроки,
| ""01"" КАК НомерСтрокиТекст
|ПОМЕСТИТЬ СоответствиеЧислаСтроке
|";
Для Счетчик = 2 По 99 Цикл
ТекстЗапроса = ТекстЗапроса + "ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| " + Счетчик + ",
| """ + Строка(Формат(Счетчик, "ЧЦ=2; ЧВН=")) + """";
КонецЦикла;
Показать
У меня была задача похожего плана в скд один ресурс тип строка "СтатусОплаты" а другой тип число "СуммаОплаты"
сделал так в вычисляемом поле написал: ""+Формат(СтатусОплаты)+Формат(СуммаОплаты)
сделал так в вычисляемом поле написал: ""+Формат(СтатусОплаты)+Формат(СуммаОплаты)
если нужно вывести такие данные в поле отчета
то используете вывод в поле с заполнением по "Шаблон"
Гр.[ИмяГруппы] Ур. [КодУровня]
то используете вывод в поле с заполнением по "Шаблон"
Гр.[ИмяГруппы] Ур. [КодУровня]
я в запросе сделал через подстроку:
ПОДСТРОКА("1234", ВТ_ИсходныеДанные.Квартал, 1) + " кв. "
если к числу нужно привести год, то добавил вычисление разряда:
ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 0.006)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 0.06)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 0.6)) / 6 + 1, 1)
+ ПОДСТРОКА("0123456789", СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_ИсходныеДанные.Год * 6)) / 6 + 1, 1) + " год"
Тема старая, но по итогу объединение в запросе строки с числом невозможно, можно придумывать велосипеды но они не заработают, поэтому раз все сейчас на СКД , то после запроса либо делаешь шаблон в печатной форме, либо как тут выше было написано пишешь вычисляемое поле , хотя мне кажется что вычисляемое поле тоже может вывалиться в ошибку.
Я сделал все через шаблон уже в момент вывода печатной формы.
Я сделал все через шаблон уже в момент вывода печатной формы.
(47) Потому что на начальном этапе может быть удобно получить и далее с этим работать. Мне вообще нравится получать максимум в запросах, а потом уже плюшки СКД и все такое
(52) Извращаться как то не очень хочется. Статьи и т.д. как бы сказать - задача мелкая по своей сути
---
Вообще не понимаю какие могут быть проблемы с преобразованием числа в строку - указал формат и все, обратное - да, чуть сложнее
(52) Извращаться как то не очень хочется. Статьи и т.д. как бы сказать - задача мелкая по своей сути
---
Вообще не понимаю какие могут быть проблемы с преобразованием числа в строку - указал формат и все, обратное - да, чуть сложнее
(45) Если очень нужно и именно в запросе, то в статье написано как это сделать. Там не такое уж громоздкое выражение получается (по сравнению с выделением разрядов делением как предлагается в (49)).
Кстати, в (41) предлагается решение именно из указанной статьи.
(49) Все же это не единственный метод - посмотрите статью по ссылке.
Кстати, в (41) предлагается решение именно из указанной статьи.
(49) Все же это не единственный метод - посмотрите статью по ссылке.
если эта задача узкая, т.е. достаточно в итоге получать
поля вида
"1 день",
..
"25 дней",
"30 дней",
то делаете временную таблицу
что делать дальше очевидно
поля вида
"1 день",
..
"25 дней",
"30 дней",
то делаете временную таблицу
ВЫБРАТЬ
1 КАК КАК ДеньНомер,
"1 день" КАК ДеньИнфо
ОБЪЕДИНИТЬ ВСЕ
...
ВЫБРАТЬ
25 КАК КАК ДеньНомер,
"25 дней" КАК ДеньИнфо
... Показатьчто делать дальше очевидно
Вот написал запросик для значений от 0 до 9999
ВЫБРАТЬ
1 КАК Поле1,
"1" КАК Поле2
ПОМЕСТИТЬ ВТ1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
"2"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3,
"3"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
4,
"4"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
5,
"5"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
6,
"6"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
7,
"7"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
8,
"8"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
9,
"9"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
0,
"0"
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
5432 КАК Поле1
ПОМЕСТИТЬ ВТ2
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ10.Поле2 + ВТ11.Поле2 + ВТ12.Поле2 + ВТ13.Поле2 КАК Поле1
ИЗ
ВТ2 КАК ВТ2
ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ10
ПО ((ВЫРАЗИТЬ(ВТ2.Поле1 / 1000 - 0.49 КАК ЧИСЛО(2, 0))) = ВТ10.Поле1)
ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ11
ПО ((ВЫРАЗИТЬ((ВТ2.Поле1 - ВТ10.Поле1 * 1000) / 100 - 0.49 КАК ЧИСЛО(2, 0))) = ВТ11.Поле1)
ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ12
ПО ((ВЫРАЗИТЬ((ВТ2.Поле1 - ВТ10.Поле1 * 1000 - ВТ11.Поле1 * 100) / 10 - 0.49 КАК ЧИСЛО(2, 0))) = ВТ12.Поле1)
ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ13
ПО ((ВЫРАЗИТЬ(ВТ2.Поле1 - ВТ10.Поле1 * 1000 - ВТ11.Поле1 * 100 - ВТ12.Поле1 * 10 - 0.49 КАК ЧИСЛО(2, 0))) = ВТ13.Поле1) Показать
Как вариант: (ВЫРАЗИТЬ("ВашаСтрока" КАК СТРОКА(100))) + (ВЫРАЗИТЬ(ВашеЧисло) КАК СТРОКА(100)))
Важно: тип СТРОКА(кол-во симв.) должен быть одинаковым у подстрок в операции конкатенации (сцепления)
Важно: тип СТРОКА(кол-во симв.) должен быть одинаковым у подстрок в операции конкатенации (сцепления)
В 8.3.12. для динамических списков можно использовать новое свойство Формата - "Шаблон форматированного числа"
в СКД
Есть поле ЭтоЧисло,
1) в запросе делаем Представление(ЭтоЧисло) как ЧислоСтрокой,
2) в вычисляемых полях тогда уже делаем новое вычисляемое поле: ЧислоСтрокой+"Текст"
Работает
Есть поле ЭтоЧисло,
1) в запросе делаем Представление(ЭтоЧисло) как ЧислоСтрокой,
2) в вычисляемых полях тогда уже делаем новое вычисляемое поле: ЧислоСтрокой+"Текст"
Работает
создал справочник, с полями число - строка с необходимым мне диапазоном,
для решения проблем с отсутствием row_number() over (partition by ... order by ... desc, ...desc)
;(
для решения проблем с отсутствием row_number() over (partition by ... order by ... desc, ...desc)
;(
Вот так работает Строка(РеквизитЧисло) + " некий текст " в запросе
Начиная с версии 8.3.20
Строка(String) – преобразует значение примитивного типа в строку с учетом национальных установок.
Начиная с версии 8.3.20
Строка(String) – преобразует значение примитивного типа в строку с учетом национальных установок.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
