20.10.2010, 18:38 | #1 |
Модератор ФССП
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548
раз(а) в 528 сообщениях
Обратиться по нику Цитата выделенного |
вот это я смотрел, но хранимую процедуру нужно записывать в базу, а это никто не даст сделать ессно, как то чуть по другому нельзя ли сделать? в обычный селект, запехать? может можно как то разбить по разрядам а потом что то типа "if n=1 then "один"???
ЗЫ Конечно же дефолтно Евгению Белову, но мож кто то и другой знает?
__________________
Yo Way Yo, Home Va-Ray, Yo Ay-Rah, Jerhume Brunnen-G |
В Минюст Цитата Спасибо |
20.10.2010, 19:18 | #2 |
Пользователь
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
а почему нет? с техподдержкой не пробовали связаться? может у них уже есть аналогичная процедура в базе или добавят "по многочисленным просьбам"?
|
В Минюст Цитата Спасибо |
20.10.2010, 20:48 | #3 |
Модератор раздела
Регистрация: 03.03.2009
Сообщений: 151
Благодарности: 0
Поблагодарили 45
раз(а) в 45 сообщениях
Обратиться по нику Цитата выделенного |
Код:
execute block( VAL NUMERIC(15,2) = :VAL ,SHOWCURRENCY INTEGER = :SHOWCURRENCY )RETURNS ( CURR_STR VARCHAR(1000) )AS ... |
В Минюст Цитата Спасибо |
21.10.2010, 14:14 | #4 |
Модератор ФССП
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548
раз(а) в 528 сообщениях
Обратиться по нику Цитата выделенного |
Женя, а для особо одаренных судебных приставов как полностью селект прописать, вот например для этого
Код:
select cast (ip.sum_is as double precision ) from ip where ip.SUM_IS > 0 and ip.pk = :pkip
__________________
Yo Way Yo, Home Va-Ray, Yo Ay-Rah, Jerhume Brunnen-G |
В Минюст Цитата Спасибо |
21.10.2010, 15:43 | #5 |
Модератор раздела
Регистрация: 03.03.2009
Сообщений: 151
Благодарности: 0
Поблагодарили 45
раз(а) в 45 сообщениях
Обратиться по нику Цитата выделенного |
Код:
execute block ( ippk INTEGER = :ippk )RETURNS ( CURR_STR VARCHAR(1000) )AS DECLARE RAZRYAD VARCHAR(50); DECLARE RAZRYAD_IDX VARCHAR(28); DECLARE HUNDREDS VARCHAR(64); DECLARE HUNDREDS_IDX VARCHAR(30); DECLARE TENS VARCHAR(69); DECLARE TENS_IDX VARCHAR(40); DECLARE ONES VARCHAR(138); DECLARE ONES_IDX VARCHAR(100); DECLARE SIGN_OF_VAL VARCHAR(6); DECLARE RAZ INT; DECLARE CENTS VARCHAR(3); DECLARE VAL_STR VARCHAR(20); DECLARE NUM VARCHAR(20); DECLARE I INT; DECLARE BUF VARCHAR(200); DECLARE BUF1 VARCHAR(200); DECLARE VAL numeric(15,2); BEGIN select cast(ip.sum_is as numeric(15,2)) from ip where ip.pk = :ippk into :VAL; /* Константы */ razryad_idx = /* 2.2 */ '0100010506071308210829114011'; razryad = 'тысячмиллионмиллиардтриллионквадриллионквинтиллион'; hundreds_idx = /* 2.1 */ '010013046106169257328407479569'; hundreds = 'стодвеститристачетырестапятьсотшестьсотсемьсотвосемьсотдевятьсот'; tens_idx = /* 2.2 */ '0100010001080908170522093110410950116109'; tens = 'двадцатьтридцатьсорокпятьдесятшестьдесятсемьдесятвосемьдесятдевяносто'; ones_idx = /* 3.2 */ '0010000100001000010300406010040140501904023060290603506041110521006210072120 841009411105101151212712'; ones = 'тричетырепятьшестьсемьвосемьдевятьдесятьодиннадцатьдвенадцатьтринадцатьчетыр надцатьпятнадцатьшестнадцатьсемнадцатьвосемнадцатьдевятнадцать'; --IF (ShowCurrency IS NULL) then ShowCurrency = 0; curr_str = ''; /* Смотрим знак */ IF (val < 0) then begin sign_of_val = 'минус '; val = -val; end else sign_of_val = ''; /* Выбираем и запоминаем копейки, убираем их из числа */ val_str = cast(val AS varchar(20)); i = position('.' IN val_str); cents = lpad(substring(val_str FROM i+1 FOR 2), 2, '0'); val_str = lpad(substring(val_str FROM 1 FOR i-1), ((i+1)/3*3), '0'); /* Разбираем число */ raz = 0; curr_str = ''; while (val_str != '') do begin /* Берём триаду символов */ num = RIGHT(val_str, 3); /* Если не нулевое число */ IF (num != '000') then begin /* Берём сотни */ i = cast(substring(num FROM 1 FOR 1) AS int); buf = substring(hundreds FROM cast(substring(hundreds_idx FROM i*3+1 FOR 2) AS int) FOR cast(substring(hundreds_idx FROM i*3+3 FOR 1) AS int)); /* Далее десятки */ /* Для "десятнадцатых" упрощённая обработка */ IF (substring(num FROM 2 FOR 1) = '1') then begin /* Вставляем нужную "десятнадцать" */ i = cast(substring(num FROM 2 FOR 2) AS int); buf1 = substring(ones FROM cast(substring(ones_idx FROM i*5+1 FOR 3) AS int) FOR cast(substring(ones_idx FROM i*5+4 FOR 2) AS int)); IF (buf != '') then buf = buf || ' '; buf = buf || buf1; end else /* Для "нормальных" чисел своя обработка */ begin /* Десятки */ i = cast(substring(num FROM 2 FOR 1) AS int); buf1 = substring(tens FROM cast(substring(tens_idx FROM i*4+1 FOR 2) AS int) FOR cast(substring(tens_idx FROM i*4+3 FOR 2) AS int)); IF (buf != '' AND buf1 != '') then buf = buf || ' '; buf = buf || buf1; /* Единицы */ i = cast(substring(num FROM 3 FOR 1) AS int); /* Смотрим количество для нужного окончания */ IF (i = 1) then begin IF (raz = 1) then buf1 = 'одна'; else buf1 = 'один'; end else IF (i = 2) then begin IF (raz = 1) then buf1 = 'две'; else buf1 = 'два'; end else buf1 = substring(ones FROM cast(substring(ones_idx FROM i*5+1 FOR 3) AS int) FOR cast(substring(ones_idx FROM i*5+4 FOR 2) AS int)); IF (buf != '' AND buf1 != '') then buf = buf || ' '; buf = buf || buf1; end /* Разряд числа */ buf1 = substring(razryad FROM cast(substring(razryad_idx FROM raz*4+1 FOR 2) AS int) FOR cast(substring(razryad_idx FROM raz*4+3 FOR 2) AS int)); IF (buf1 != '') then begin /* Подбор окончания для разряда */ IF (i = 1) then begin IF (raz = 1) then buf1 = buf1 || 'а'; end else IF (i IN (2,3,4)) then begin IF (raz = 1) then buf1 = buf1 || 'и'; else IF (raz > 1) then buf1 = buf1 || 'а'; end else IF (raz > 1) then buf1 = buf1 || 'ов'; buf = buf || ' ' || buf1; end end else buf = ''; /* Присоединяем обработанную триаду к результату */ IF (curr_str != '' AND buf != '') then buf = buf || ' '; curr_str = buf || curr_str; /* Переходим к следующей триаде */ val_str = LEFT(val_str, char_length(val_str)-3); /* Увеличиваем счётчик разряда */ raz = raz + 1; end /* Припысываем знак */ curr_str = sign_of_val || curr_str; /* Делаем первую букву прописной */ curr_str = upper(substring(curr_str FROM 1 FOR 1)) || substring(curr_str FROM 2); /* Флаг "показать название валюты" */ --IF (ShowCurrency = 1) then curr_str = curr_str || ' руб. ' || cents || ' коп.'; suspend; end |
В Минюст Цитата Спасибо |
21.10.2010, 21:13 | #6 |
Модератор ФССП
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548
раз(а) в 528 сообщениях
Обратиться по нику Цитата выделенного |
к сожалению это:
Код:
Arithmetic overflow or division by zero has occurred. arithmetic exception, numeric overflow, or string truncation. понять в этом коде больше половины не могу, так что что то исправить не получается.... вернее только хуже становится....
__________________
Yo Way Yo, Home Va-Ray, Yo Ay-Rah, Jerhume Brunnen-G |
В Минюст Цитата Спасибо |
21.10.2010, 22:40 | #7 |
Модератор раздела
Регистрация: 03.03.2009
Сообщений: 151
Благодарности: 0
Поблагодарили 45
раз(а) в 45 сообщениях
Обратиться по нику Цитата выделенного |
что возвращает запрос
Код:
select cast(ip.sum_is as numeric(15,2)) from ip where ip.pk = :ippk |
В Минюст Цитата Спасибо |
21.10.2010, 23:06 | #8 |
Модератор ФССП
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548
раз(а) в 528 сообщениях
Обратиться по нику Цитата выделенного |
не думаю, ибо это
Код:
select cast(ip.sum_is as numeric(15,2)) from ip решил попробовать обойтись одними селектами, но получается очень громоздко, просто не влезает в метку вот перл: Код:
select ip.sum_is, --- сотни case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 9 then 'девятьсот' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 8 then 'восемьсот' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 7 then 'семьсот' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 6 then 'шестьсот' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 5 then 'пятьсот' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 4 then 'четыреста' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 3 then 'триста' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 2 then 'двести' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 1 for 1) = 1 then 'сто' else '' end, ---- десятки case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 2 for 1) = 9 then ' девяносто' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 2 for 1) = 8 then ' восемьдесят' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 2 for 1) = 7 then ' семьдесят' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 2 for 1) = 6 then ' шестьдесят' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 2 for 1) = 5 then ' пятьдесят' else '' end, case when position('.' IN ip.sum_is) = 4 and substring(ip.sum_is from 2 for 1) = 4 then ' сорок' else '' end from ip where ip.SUM_IS > 0 --and ip.pk = :pkip может как то попроще можно собрать, чувствую что можно, но проблемы с формальной логикой.... ЗЫ - как вариант метка на каждый разряд, но кажется это плохой выход
__________________
Yo Way Yo, Home Va-Ray, Yo Ay-Rah, Jerhume Brunnen-G |
В Минюст Цитата Спасибо |
22.10.2010, 00:12 | #9 |
Модератор ФССП
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548
раз(а) в 528 сообщениях
Обратиться по нику Цитата выделенного |
----------------------------------------------------------------------------------------
как вариант по разрядам пробежаться в разных метках, но как то они криво вылазиют, с кучей лишних пробелов Код:
select case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 1 then 'один' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 2 then 'два' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 3 then 'три' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 4 then 'четыре' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 5 then 'пять' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 6 then 'шесть' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 7 then 'семь' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 8 then 'восемь' else '' end, case when substring(ip.sum_is from position('.' IN ip.sum_is) -1 for 1) = 9 then 'девять' else '' end from ip where ip.SUM_IS > 0 and position('.' IN ip.sum_is) >= 1
__________________
Yo Way Yo, Home Va-Ray, Yo Ay-Rah, Jerhume Brunnen-G |
В Минюст Цитата Спасибо |
22.10.2010, 00:25 | #10 |
Модератор ФССП
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548
раз(а) в 528 сообщениях
Обратиться по нику Цитата выделенного |
таки да - в БД под это поле отводится 1000 символов. мой последний селект в этой ветке занимает 966 символов.
Как вариант - для каждой цифры каждого разряда - своя метка - но это даже если для четвертого разряда - это 9*4 меток, т.е. токуа.... *бьется головой об стену*
__________________
Yo Way Yo, Home Va-Ray, Yo Ay-Rah, Jerhume Brunnen-G |
В Минюст Цитата Спасибо |
|
|
«Закония» в соц. сетях