|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Вопрос про разделитель при "to_number" в oracle?
27.05.2007 15:10
|
|
|
В кратце суть проблемы: Есть числовое значение типа string. Есть функция, которая преобразовывает число в сумму прописью. Соответственно: Преобразовываем string -> number и передаем в функцию, на выходе получаем число прописью (типа string). Собственно, загвоздка в том, что, если разделитель на локальном компе стоит ',' то to_number отрабатывает число в формате с разделителем запятой, не смотря на то, что на серваке стоит разделитель '.' И в последствии преобразование в сумму прописью вылетает с ошибкой ... Как я вижу сию проблему, так это то, что to_number берет значение разделителя из региональных настроек компа на котором выполняеть эти действия, а не сервера. Задавать разделитель жестко, через формат: 1.to_number('123,33','999999999999D99',nls_numeric_characters='.,') - не катит 2.alter session set NLS_NUMERIC_CHARACTERS='.,'; - тоже не помогает Ну это в кратце ... могу еще что нить добавить, если будут вопросы 
3. кстати, replace тоже не помогает  а именно: summatowords(to_number(replace(SUMMA),',','.'),'9999999999D99',NLS_NUMERIC_CHARACTERS='.,')
Редактировал Veritas (27.05.2007 15:13)
|
Читаю форум и тихонько ох**ваю |
|
|
botWi
|
|
|
|
|
|
|
|
|
Рег.: 22.11.2003
|
|
Сообщений: 10160
|
|
Из: Moscow
|
|
Рейтинг: 1764
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 08:23
|
|
|
В ответ на:
кстати, replace тоже не помогает
как это REPLACE может не помочь? ты явно что-то делаешь не так!
|
Хватит дрочить на рейтинги |
|
|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: BotWi]
28.05.2007 09:55
|
|
|
replace не помогает, т.к. он это делает в string'е. А окончательное преобразование делает to_number. Который собственно и берет разделитель из региональных настроек. А для типа number применить снова replace - это полная лажа, т.к. применимо только к string 
|
Читаю форум и тихонько ох**ваю |
|
|
botWi
|
|
|
|
|
|
|
|
|
Рег.: 22.11.2003
|
|
Сообщений: 10160
|
|
Из: Moscow
|
|
Рейтинг: 1764
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 10:06
|
|
|
В ответ на:
replace не помогает, т.к. он это делает в string'е. А окончательное преобразование делает to_number. Который собственно и берет разделитель из региональных настроек. А для типа number применить снова replace - это полная лажа, т.к. применимо только к string
или я туплю с утра или ты и вправду невнятно пишешь 
но я понял ключевой момент почему replace не катит потому что он всегда будет точки ставить, а региональные настройки могут быть с запятой
|
Хватит дрочить на рейтинги |
|
|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: BotWi]
28.05.2007 10:30
|
|
|
|
|
|
Storm
|
|
:)
|
|
|
|
|
|
|
Рег.: 09.09.2004
|
|
Сообщений: 3301
|
|
Из: hane.ru
|
|
Рейтинг: 132
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 10:45
|
|
|
Бррр.
Quote:
И в последствии преобразование в сумму прописью вылетает с ошибкой...
Ошибка у тебя внутри этой функции.
Quote:
трабла как раз в том, чтобы при обработке to_number получить число, в котором разделитель - '.' а не запятая
Точка или запятая у тебя появится, если ты обратно to_char будешь делать. Самому NUMBER`у пофигу на региональные настройки.
|
|
|
|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Storm]
28.05.2007 11:03
|
|
|
ладно ... вечером напишу или как время будет ... то что функция малек не корректно работает, вполне возможно, НО, она просто заточена под разделитель '.' Ошибка в ней вылетает на стадии определения числа копеек (вернее мин. денежных ед валюты). т.е. .......... nSumma := round(nSummap,nCRRM); nA := TRUNC(nSumma); nX := (nSumma - nA) / nCRCF; .........
на этапе где определяется nX, если у nSummap будет значение копеек через запятую, то функция вылетит с ошибкой, если будет точка, то все пройдет гуд. Или опять непонятно говорю? 
|
Читаю форум и тихонько ох**ваю |
|
|
Storm
|
|
:)
|
|
|
|
|
|
|
Рег.: 09.09.2004
|
|
Сообщений: 3301
|
|
Из: hane.ru
|
|
Рейтинг: 132
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 11:15
|
|
|
И с каким кодом ошибки она вылетает?
Если функция заточена под '.', то пропиши внутри нее у функций конвертирования жестко NLS_NUMERIC_CHARACTERS.
|
|
|
|
Storm
|
|
:)
|
|
|
|
|
|
|
Рег.: 09.09.2004
|
|
Сообщений: 3301
|
|
Из: hane.ru
|
|
Рейтинг: 132
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 11:19
|
|
|
А summatowords у тебя случайно не VARCHAR2 на входе принимает?
|
|
|
|
botWi
|
|
|
|
|
|
|
|
|
Рег.: 22.11.2003
|
|
Сообщений: 10160
|
|
Из: Moscow
|
|
Рейтинг: 1764
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 11:20
|
|
|
В ответ на:
на этапе где определяется nX, если у nSummap будет значение копеек через запятую, то функция вылетит с ошибкой, если будет точка, то все пройдет гуд. Или опять непонятно говорю?
говоришь понятно только то что говоришь - откровенное вранье
приводи полный код своей функции
|
Хватит дрочить на рейтинги |
|
|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: BotWi]
28.05.2007 11:32
|
|
|
Собственно до др. функции NumberToWords не доходит, а вылетает с ошибкой: ORA-01722: invalid number

FUNCTION SummaToWords( nSummap IN NUMBER, p_nCurrencyCode IN NUMBER DEFAULT 810, nMode IN NUMBER DEFAULT 1, p_sLanguage VARCHAR2 DEFAULT 'RUS' ) RETURN VARCHAR2 IS nA NUMBER; nX NUMBER; nSumma NUMBER; str VARCHAR2(254); sRubName VARCHAR2(100); sKoopName VARCHAR2(100); nCurrencyCode NUMBER; nCRRM number; nCRCF number; sKOOP varchar2(20); sROUND varchar(5); BEGIN
nCurrencyCode := NVL(p_nCurrencyCode, REPORT2.CurrentCurrency); BEGIN select '||' || NVL(B74FCNA, '||'), '||' || NVL(B74SCNA, '||'), B74CRRM, B74CRCF into sRubName, sKoopName, nCRRM, nCRCF from B74 where B74CURC = nCurrencyCode;
EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN sRubName := '||||'; sKoopName := '||||'; nCRRM :=2; END; END; nSumma := round(nSummap,nCRRM); nA := TRUNC(nSumma); nX := (nSumma - nA) / nCRCF; sKOOP := RPAD('F',nCRRM+1,'0'); sROUND :=RPAD('0',nCRRM,'0'); IF nMode = 0 THEN - ðåçóëüòàò â âèäå 100 ðóáëåé 50 êîïååê str := to_char(nA)||' '||Declension(nA,sRubName); str := str || ' ' ||to_char(nX,sROUND)||' '|| Declension(nX, sKoopName); END IF;
IF nMode = 1 THEN str := NumberToWords(nA, 'R', sRubName, p_sLanguage); str := str || ' ' || NumberToWords(nX , sKOOP, sKoopName, p_sLanguage); END IF;
IF nMode = 2 THEN str := to_char(nA) || ' ' || NumberToWords(nA, 'R', sRubName, 'M', 2, p_sLanguage); str := str || ' ' || NumberToWords(nX , sKOOP, sKoopName, p_sLanguage); END IF;
RETURN str; END;
|
Читаю форум и тихонько ох**ваю |
|
|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Storm]
28.05.2007 11:41
|
|
|
В ответ на:
А summatowords у тебя случайно не VARCHAR2 на входе принимает?
Думаю вопрос снят? 
|
Читаю форум и тихонько ох**ваю |
|
|
botWi
|
|
|
|
|
|
|
|
|
Рег.: 22.11.2003
|
|
Сообщений: 10160
|
|
Из: Moscow
|
|
Рейтинг: 1764
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 11:54
|
|
|
В ответ на:
ORA-01722: invalid number
у тебя nCRCF нигде не задается вот он и говорит что это не намбер
|
Хватит дрочить на рейтинги |
|
|
botWi
|
|
|
|
|
|
|
|
|
Рег.: 22.11.2003
|
|
Сообщений: 10160
|
|
Из: Moscow
|
|
Рейтинг: 1764
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 11:56
|
|
|
В ответ на:
WHEN NO_DATA_FOUND THEN BEGIN sRubName := '||||';
зачем так писать?
при объявлении нужно задавать начальные значения
code: sRubName VARCHAR2(100) := '||||';
|
Хватит дрочить на рейтинги |
|
|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: BotWi]
28.05.2007 15:04
|
|
|
NCRF задается из таблица select'ом
п.с. функцию разрабы писали и править ее нету полномочий 
|
Читаю форум и тихонько ох**ваю |
|
|
botWi
|
|
|
|
|
|
|
|
|
Рег.: 22.11.2003
|
|
Сообщений: 10160
|
|
Из: Moscow
|
|
Рейтинг: 1764
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: Veritas]
28.05.2007 15:14
|
|
|
В ответ на:
NCRF задается из таблица select'ом
WHEN NO_DATA_FOUND THEN
- если выборки не было то нифига не задается
В ответ на:
п.с. функцию разрабы писали и править ее нету полномочий
во-первых ты ее можешь дебажить во-вторых ты можешь создать свою процедуру с другим именем но тем же кодом и уже мучать ее
|
Хватит дрочить на рейтинги |
|
|
Veritas
|
|
Двухколесник!
|
|
|
|
|
|
|
Рег.: 30.10.2004
|
|
Сообщений: 769
|
|
|
|
Рейтинг: 142
|
|
Re: Вопрос про разделитель при "to_number" в oracle?
[re: BotWi]
29.05.2007 00:57
|
|
|
1).выборка полюбому будет, т.к. это из таблицы где валюты прописаны 2).дебажить хрен дадут, тем более на боевой запустить (ну, по крайней мере на 90%)
|
Читаю форум и тихонько ох**ваю |
|