Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Форматирование чисел средствами SQL (число прочтений - 2217 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Форматирование чисел средствами SQL
08. Февраля 2007 :: 15:31
Печать  
Это просто праздные мысли вслух начинающего ламера и только для таких же ламеров, у которых потом возможно будет меньше вопросов к корифеям...

Иногда, да и наверное достаточно часто, выходные данные прямых запросов требуются только для отображения полученной информации без дальнейшей её обработки. В этом случае в большинстве ситуаций наверное достаточно разумным будет переложить работу по форматированию выводимых числовых значений непосредственно на сам SQL-сервер.

Я уже задавал здесь вопрос как получить средствами языка T-SQL что-то подобное 1С-кому "Ч16.2'," : http://www.1cpp.ru/forum/YaBB.pl?num=1168296603
Ответ был просто идеально классический, но недостаточно универсальный:
Код
Выбрать все
REPLACE(REPLACE(convert(varchar(17), cast($ШапкаСчета.СуммаСТр as money), 1),',',' '),'.',',') As Сумма 



Поэтому рискую предложить частично-универсальное  решение в примерах получения аналога Формат() для числовых значений. На выходе, ессно, получаем строку...

В общем случае выражению Формат(Сумма,"ЧM.N") соответствует
Код
Выбрать все
Str(Сумма,M+1,N) 


Пример: "Ч16.5" :  
Код
Выбрать все
Select Str($Спр.spхх,17,5) as Сумма 


Здесь $Спр.spхх - числовой реквизит справочника, 17 - это 16 разрядов+1 - символ разделителя дробной части.

Пример: "Ч010.5" :  
Код
Выбрать все
Select Цена =  Case When $Спр.spхх = 0 Then '' Else Str($Спр.spxx,11,5) End 


Здесь для подавления вывода нулевых значений используем конструкцию case when else end

Для форматирования периодических числовых реквизитов немного усложним конструкцию за счет необходимой проверки на null:
Код
Выбрать все
Select КурсВалюты =  Case When IsNull($Спр.spхх,0) = 0 Then '' Else Str($Спр.spxx,11,5) End 



При желании заменить символ разделителя дробной части наверное можно воспользоваться функцией REPLACE. По поводу унификации работы с разделителем разрядов целой части ни одной мысли...  Озадачен

Применительно к табличному полю:
Запись в значения полей данных числовой колонки строковых значений позволит реализовать быстрый поиск по первым символам, что несомнено может оказаться полезным, например для быстрого поиска необходимой суммы. Однако, для реализации этой возможности необходимо сделать СокрЛ(Формат(Сумма,"Ч16.5") приблизительно так:
Код
Выбрать все
Select Ltrim(Str($Спр.spхх,17,5)) as Сумма 

. Однако, если предполагается такую колонку сортировать, то Ltrim делать нельзя, иначе Вы будете удивлены полученным эффектом Улыбка. В общем случае, необходимо будет сделать выбор: или Вы эту колонку предположительно будете сортировать, тогда без Ltrim, или поиск по первым символам, что потребует Ltrim если Вам не нравится набирать впереди искомого значения недостающие пробелы.

Как для ламера с 2-хмесячным стажем знакомства с 1С++ и T-SQL любые критические замечания вплоть до "нафиг надо" и ценные идеи и дополнения охотно принимаются  Улыбка
« Последняя редакция: 08. Февраля 2007 :: 16:37 - Kapet »  
Наверх
ICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Форматирование чисел средствами SQL
Ответ #1 - 09. Февраля 2007 :: 03:26
Печать  
ну поиск по "числовому" коду в списках справочников 1С всегда сопровождался донабором лидирующих пробелов, поэтому ничего удивительного и страшного в этом нет
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать