Ответить

 

Опции темы
Старый 20.10.2010, 18:38   #1
raus
Модератор ФССП
 
Аватар для raus
 
Регистрация: 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
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76 раз(а) в 76 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

а почему нет? с техподдержкой не пробовали связаться? может у них уже есть аналогичная процедура в базе или добавят "по многочисленным просьбам"?
 
В Минюст Цитата Спасибо
Старый 20.10.2010, 20:48   #3
belov-evgenii
Модератор раздела
 
Аватар для belov-evgenii
 
Регистрация: 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
raus
Модератор ФССП
 
Аватар для raus
 
Регистрация: 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
belov-evgenii
Модератор раздела
 
Аватар для belov-evgenii
 
Регистрация: 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
raus
Модератор ФССП
 
Аватар для raus
 
Регистрация: 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
belov-evgenii
Модератор раздела
 
Аватар для belov-evgenii
 
Регистрация: 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
raus
Модератор ФССП
 
Аватар для raus
 
Регистрация: 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
raus
Модератор ФССП
 
Аватар для raus
 
Регистрация: 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
raus
Модератор ФССП
 
Аватар для raus
 
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548 раз(а) в 528 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

таки да - в БД под это поле отводится 1000 символов. мой последний селект в этой ветке занимает 966 символов.
Как вариант - для каждой цифры каждого разряда - своя метка - но это даже если для четвертого разряда - это 9*4 меток, т.е. токуа.... *бьется головой об стену*
__________________
Yo Way Yo, Home Va-Ray,
Yo Ay-Rah, Jerhume Brunnen-G
 
В Минюст Цитата Спасибо
Ответить


Быстрый ответ

Сообщение:
Опции


Ваши права в разделе