Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
Здравствуйте!
Необходимо проверить параметр хранимой процедуры, чтобы он был указан именно в таком формате 9999.99 (именно 2 знака после запятой - не больше и не меньше даже если оба нули, до запятой - не важно). Если введен с одним знаком после запятой или тремя - возвращать ошибку.

Как это сделать?
для определения случая ввода более двух символов я использую следующий код:
DECLARE
@pa MONEY
SET
@pa = 123.456
print CONVERT(VARCHAR(10), @pa, 2)

Он возращает 123.4560. Теперь просто посмотрю, если в конце не 00 то значит что было введено больше 2-х знаков.
а вот как поступить с вводом типа 123.2???

Есть еще
CONVERT(VARCHAR(10), @pa, 0)
, который вернет для 123.2 значение 123.20, но это не спасает, потому что пользователь мог ввести 123.20 - тогда все должно прокатить, а 123.2 - не должно.
Задача несколько обсурдна, но ее надо решать...

Спасибо, что дочитали :-)
15 мар 06, 10:35    [2449459]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
sander1
Member

Откуда: Москва
Сообщений: 366
Сделайте параметр процедуры строковым и проверяйте
15 мар 06, 10:40    [2449482]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

имхо, не "несколько", а абсолютно абсурдна. ибо для типа money 123.20 и 123.2 - это
абсолютно одно и то же. передавайте в хп varchar - тогда и можно будет проверить,
что там ввел пользователь 123.20 или 123.2


Posted via ActualForum NNTP Server 1.3

15 мар 06, 10:43    [2449505]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
Да я так сразу и сказал, но для этого необходимо переделывать очень много объектов. Заказчик на это не пойдет...
15 мар 06, 10:48    [2449537]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
просто Guest
Guest
Обрезать число до второго знака и сравнить с исходным
Declare @m money
set @m = 156.45
select @m

select @m - round (@m, 2, 1)
if (@m != round (@m, 2, 1))
 print 'wrong'
ELSE
 print 'correct'
15 мар 06, 10:49    [2449543]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
Как я уже говорил проверка более двух знаков уже решена - но Ваше решение наверное более изящное, спасибо!!!

проблема определения ввода одного знака после запятой остается нерешенной :-(
15 мар 06, 10:54    [2449567]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
просто Guest
Guest
Виноват, немного поторопился.
Второе условие невыполнимо, постарайтесь убедить в этом заказчика.
ИБО:
если переменная типа money, то она (уже) не имеет ничего общего со строковым представлением и точное обратное преобразование невозможно.
Это надо было делать в формах ввода данных, где, собственно строка пользователя еще фигурирует.
(Теоретически, эта же строка может фигурировать в запросах (и при передаче параметров), но тогда преобразование выполнит сервер при вызове и отловить это также затруднительно (если вообще возможно - это я просто осторожничаю, думаю, что нельзя)
15 мар 06, 10:59    [2449599]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

автор

проблема определения ввода одного знака после запятой остается нерешенной :-(

и таковой и останется. различить 123.20 и 123.2, если это не строки, нельзя.
_в принципе_ нельзя.


Posted via ActualForum NNTP Server 1.3

15 мар 06, 11:07    [2449649]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
Ну до связи с заказчиком еще есть 6 часов, может кто-то придумает метод :-)
15 мар 06, 11:14    [2449698]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
просто Guest
Guest
Можешь, конечно, в шутку предложить одно решение:
(только если заказчик на него согласится, сбегай от него подальше - пользователи бить будут ;))
В число добавлять флаг. Например (X).XX01
И не пропускать числа, которые не содержат 01 в третьем и четвертом разрядах ;)
Тогда гарантирована проверка ввода 4 знаков после запятой.
Вариант 2:
Использовать флаг, только если число вида (X).X0
То есть 123.14 так и вводить, а 123.20 вводить как 123.2001

Вообще, интересно было бы посмотреть на реакцию ;)
15 мар 06, 11:15    [2449702]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 знака контролируется так:

DECLARE @pa MONEY
SET @pa = 123.456
if @pa <> round( @pa, 2 )  print 'Error'
else print 'ok'

> а вот как поступить с вводом типа 123.2???

сделать параметр строковым и проверять его, скажем, на LIKE '%.[0-9][0-9]'
15 мар 06, 11:17    [2449723]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
Crimean
2 знака контролируется так:

DECLARE @pa MONEY
SET @pa = 123.456
if @pa <> round( @pa, 2 )  print 'Error'
else print 'ok'

> а вот как поступить с вводом типа 123.2???

сделать параметр строковым и проверять его, скажем, на LIKE '%.[0-9][0-9]'


Да - это уже предлагали :-)
и я это буду использовать для определения ввода более 2-х символов
спасибо
15 мар 06, 11:23    [2449770]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
просто Guest
Можешь, конечно, в шутку предложить одно решение:
(только если заказчик на него согласится, сбегай от него подальше - пользователи бить будут ;))
В число добавлять флаг. Например (X).XX01
И не пропускать числа, которые не содержат 01 в третьем и четвертом разрядах ;)
Тогда гарантирована проверка ввода 4 знаков после запятой.
Вариант 2:
Использовать флаг, только если число вида (X).X0
То есть 123.14 так и вводить, а 123.20 вводить как 123.2001

Вообще, интересно было бы посмотреть на реакцию ;)


В том и проблема что вызов процедуры уже существует.
Мало того, он существует в большом количестве объектов.
И мало того - к этим объектам ни я ни заказчик доступа не имеем :-)
Так уж случилось.
15 мар 06, 11:25    [2449792]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
Crimean
2 знака контролируется так:

> а вот как поступить с вводом типа 123.2???

сделать параметр строковым и проверять его, скажем, на LIKE '%.[0-9][0-9]'


При конвертации будет 123,20
15 мар 06, 11:28    [2449811]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
просто Guest
Guest
Yagovdik

В том и проблема что вызов процедуры уже существует.
Мало того, он существует в большом количестве объектов.
И мало того - к этим объектам ни я ни заказчик доступа не имеем :-)
Так уж случилось.


Вышеприведеный метод это не беспокоит.
Единственная проблема, чтобы это число (вообще-то, неправильное) нигде больше не использовалось и никуда не передавалось, кроме процедур, которые "знают", что число с "секретом" и ненужные данные отбрасывают.
Вот смотрите:
вариант 1. передано число 123,1501 - с четырьмя знаками. То есть в процедуре надо будет только проверить что (@m - round (@m, 2, 1)) = 0.0001
Если условие выполненео - все ок.
Вариант 2:
Предварительно убедиться, что число вида (X).X0 и потом проверить на наличие "хвоста".
Если число не содержит "0" во второй позиции - проверить обычным способом.

Общая идея: вводом четырех знаков пользователь "подтверждает", что он знает, что делает.
Недостаток первого метода: надо всегда вводить "хвост",
Недостаток второго: надо помнить, когда этот "хвост" вводить.

P.S. на всякий случай повторяю, метод рассматриваем чисто теоретически ;) Но вдруг кого на дельную мысль натолкнет.
15 мар 06, 11:40    [2449916]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
просто Guest
Guest
Ну и последняя идея: больше вряд ли, что надумаю ;)

Раз уж нельзя определить по money, что было изначально, можно попробовать такой вариант:
Написать шпиона, который должен быть постоянно запущен на клиентской машине и мониторить окно, в которое пользователь вводит данные и "на лету" их форматировать и/или блокировать ввод (кнопку ОК, изменения, сообщения etc).
Достаточно просто реализуемо, если таких форм немного, они все известны и неизменны. Проблематично, если редактирование непосредственно в таблицах, динамических формах и т.п.
15 мар 06, 13:36    [2450743]     Ответить | Цитировать Сообщить модератору
 Re: Проверка MONEY на 2 знака после запятой  [new]
Yagovdik
Member

Откуда:
Сообщений: 8
невозможно
клиентских машин тысячи - вызов осуществляется из WEB-приложений.
и, как я уже говорил доступа к вызывающим объектам нету...

Ну все - всем огромное спасибо.
Заказчику отписался - пусть думает другие методы... :-)

тема закрыта
15 мар 06, 14:43    [2451206]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить