Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

v8: Операции преобразования Число в Строку и обратно в запросах

Операции преобразования Число в Строку и обратно в запросахАвтор статьи:
Последняя редакция №1 от 27.04.08
URL: http://kb.mista.ru/article.php?id=666

Ключевые слова: Число, Строка, SQL, Запрос, Подстрока


Стандартно преобразовать поле в строку из числа и в число из строки нельзя.

Но можно вот таким извратом:



Функция ТекстЗапросаИзЧислаВСтроку(пИмяПоля, пДлинаЦел, пДлинаДробь, пЛидирующийСимвол="")
   лЗапрос=Новый Запрос("ВЫБРАТЬ ВЫРАЗИТЬ(0.5 КАК ЧИСЛО (15, 0)) КАК Проверка");
   лВыборка=лЗапрос.Выполнить().Выбрать();
   лВыборка.Следующий();
   лЗапросОкругляетПоАрифметическимПравилам=лВыборка.Проверка=1;
   
   лТекст="ВЫБОР КОГДА "+пИмяПоля+"<0 Тогда ""-"" ИНАЧЕ """" КОНЕЦ "+Символы.ПС;
   лИмяПоляАбс=" ВЫБОР КОГДА "+пИмяПоля+"<0 ТОГДА -"+пИмяПоля+" ИНАЧЕ "+пИмяПоля+" КОНЕЦ ";
   лПараметр=Pow(10, пДлинаЦел-1);
   Для лИнд=1 По пДлинаЦел+пДлинаДробь цикл
       лТекст=лТекст+?(лИнд=пДлинаЦел+1, "+"".""+", "+");
       лТекст=лТекст+" ВЫБОР "+Символы.ПС+
       ?(лИнд<пДлинаЦел, " КОГДА "+лИмяПоляАбс+" < "+Формат(лПараметр, "ЧРД=.; ЧГ=")+" ТОГДА """+пЛидирующийСимвол+""" "+Символы.ПС, "");
       Для лЦифра=0 По 9 Цикл
           лТекст=лТекст+" КОГДА "+лИмяПоляАбс+"-"+Формат(лПараметр*10, "ЧРД=.; ЧГ=")+"*ВЫРАЗИТЬ(("+лИмяПоляАбс+?(лЗапросОкругляетПоАрифметическимПравилам, "-"+Формат(лПараметр*5, "ЧРД=.; ЧГ="), "")+")/"+Формат(лПараметр*10, "ЧРД=.; ЧГ=")+" КАК ЧИСЛО(15, 0))"+" >= "+Формат((9-лЦифра)*лПараметр, "ЧН=0; ЧРД=.; ЧГ=")+" ТОГДА """+Формат(9-лЦифра, "ЧН=0; ЧРД=.; ЧГ=")+""" "+Символы.ПС;
       КонецЦикла;
       лТекст=лТекст+" ИНАЧЕ ""0"""+Символы.ПС+" Конец "+Символы.ПС;
       лПараметр=лПараметр/10;
   КонецЦикла;
   Сообщить(лТекст);
   Возврат лТекст;
КонецФункции

Функция ТекстЗапросаИзСтрокиВЧисло(пИмяПоля, пДлинаСтроки, пСимволРазделителя=".")
   лТекст="ВЫБОР ";
   Для лДлинаЦелойЧасти=0 По пДлинаСтроки Цикл
       Если лДлинаЦелойЧасти=пДлинаСтроки Тогда
           лТекст=лТекст+"ИНАЧЕ"+Символы.ПС;
       Иначе
           лТекст=лТекст+"КОГДА ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""+пСимволРазделителя+""" ИЛИ ПОДСТРОКА("+пИмяПоля+", "+(лДлинаЦелойЧасти+1)+", 1)="""" ТОГДА "+Символы.ПС;
       КонецЕсли;
       Если лДлинаЦелойЧасти=0 Тогда лТекст=лТекст+"    0"+Символы.ПС; КонецЕсли;
       Для лИнд=1 По лДлинаЦелойЧасти Цикл
           лТекст=лТекст+"    ВЫБОР "+Символы.ПС;
           Для лЦифра=0 По 9 Цикл
               лТекст=лТекст+"    КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
           КонецЦикла;
           лТекст=лТекст+"    ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "*"+Формат(Pow(10, лДлинаЦелойЧасти-лИнд), "ЧРД=.; ЧГ=0")+"+")+Символы.ПС;
       КонецЦикла;
       Для лИнд=лДлинаЦелойЧасти+2 По пДлинаСтроки Цикл
           лТекст=лТекст+"+ ВЫБОР";
           Для лЦифра=0 По 9 Цикл
               лТекст=лТекст+"    КОГДА ПОДСТРОКА("+пИмяПоля+", "+лИнд+", 1)="""+лЦифра+""" ТОГДА "+лЦифра+Символы.ПС;
           КонецЦикла;
           лТекст=лТекст+"    ИНАЧЕ 0 КОНЕЦ"+?(лИнд=лДлинаЦелойЧасти, "", "/"+Формат(Pow(10, лИнд-лДлинаЦелойЧасти-1), "ЧРД=.; ЧГ=0"))+Символы.ПС;
       КонецЦикла;
   КонецЦикла;
   лТекст=лТекст+"КОНЕЦ";
   Возврат лТекст;
КонецФункции


Для проверки:


Процедура КнопкаВыполнить1(Кнопка)
   лЗапрос=Новый Запрос;
   лЗапрос.Текст="ВЫБРАТЬ ""Полученная строка : ""+"+ТекстЗапросаИзЧислаВСтроку(12, 2, 0)+" КАК Строка";
   лТзЗапроса=лЗапрос.Выполнить().Выгрузить();
   лТзЗапроса.ВыбратьСтроку();
КонецПроцедуры

Процедура КнопкаВыполнить2(Кнопка)
   лЗапрос=Новый Запрос;
   лЗапрос.УстановитьПараметр("а", "1333.3");
   лЗапрос.Текст="ВЫБРАТЬ "+ТекстЗапросаИзСтрокиВЧисло("&а", 6)+" КАК Число";
   Сообщить(лЗапрос.Текст);
   лТзЗапроса=лЗапрос.Выполнить().Выгрузить();
   лТзЗапроса.ВыбратьСтроку();
КонецПроцедуры


За текст функции ТекстЗапросаИзЧислаВСтроку спасибо NewNick

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика