|
|
#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 |
| В Минюст Цитата Спасибо |
|
|
#2 |
|
Пользователь
![]() Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76
раз(а) в 76 сообщениях
Обратиться по нику Цитата выделенного |
а почему нет? с техподдержкой не пробовали связаться? может у них уже есть аналогичная процедура в базе или добавят "по многочисленным просьбам"?
|
| В Минюст Цитата Спасибо |
|
|
#3 |
|
Модератор раздела
Регистрация: 03.03.2009
Сообщений: 151
Благодарности: 0
Поблагодарили 45
раз(а) в 45 сообщениях
Обратиться по нику Цитата выделенного |
Код:
execute block( VAL NUMERIC(15,2) = :VAL ,SHOWCURRENCY INTEGER = :SHOWCURRENCY )RETURNS ( CURR_STR VARCHAR(1000) )AS ... |
| В Минюст Цитата Спасибо |
|
|
#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 |
| В Минюст Цитата Спасибо |
|
|
#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
|
| В Минюст Цитата Спасибо |
|
|
#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 |
| В Минюст Цитата Спасибо |
|
|
#7 |
|
Модератор раздела
Регистрация: 03.03.2009
Сообщений: 151
Благодарности: 0
Поблагодарили 45
раз(а) в 45 сообщениях
Обратиться по нику Цитата выделенного |
что возвращает запрос
Код:
select cast(ip.sum_is as numeric(15,2)) from ip where ip.pk = :ippk |
| В Минюст Цитата Спасибо |
|
|
#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 |
| В Минюст Цитата Спасибо |
|
|
#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 |
| В Минюст Цитата Спасибо |
|
|
#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 |
| В Минюст Цитата Спасибо |
|
|





понять в этом коде больше половины не могу, так что что то исправить не получается.... вернее только хуже становится....

«Закония» в соц. сетях