Книга знаний

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

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

Операции преобразования Число в Строку и обратно в запросахАвтор статьи: vladnet | Редакторы:
Последняя редакция №3 от 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-2024 | Mista.ru

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