powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CA.CursorSchema, Grid и тип smallmoney
15 сообщений из 15, страница 1 из 1
CA.CursorSchema, Grid и тип smallmoney
    #34888350
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Усиленно осваиваю курсорадаптер VFP9SP1.
Наткнулся на интересный глюк: есть (на MS-SQL) поле nSum тип SMALLMONEY, делаю курсорадаптер в DE формы и его подставляю источником для грида. Тут все нормально.

Хочу понизить точность, чтобы не четыре знака после запятой, а два было:
CA.CursorSchema = '... NSUM n(11, 2) ...'
CA.UseCursorSchema = .T.

Вот тут все и начинается: грид показывает 4 знака после запятой (brow тоже), но стоит только встать на эту ячейку так становится 2 знака после запятой.

Пока полечил: Grid.Column1.Format = '999999.99'.
Можно конечно еще Grid.Column1.Text1.Format = '999999.99' и вообще курсорсхему не пользовать,
но как-то это не красиво получается. Может я чего не доделал?
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34888417
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В самом select-e использовать explicit conversion из small money в decimal (12,2)
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34888487
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistВ самом select-e использовать explicit conversion из small money в decimal (12,2)
Выход конечно, но хочется на стороне фокса порешать. Остановлюсь пока на форматах.
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34888501
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если на стороне фокса, то не заставляйте драйвер ODBC выполнять работу по конвертации из одного типа в другой, в фоксовом курсоре необходимо тоже иметь тип данных money
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34888584
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistЕсли на стороне фокса, то не заставляйте драйвер ODBC выполнять работу по конвертации из одного типа в другой...
Ну на счет ODBC драйвера ты допустим загнул. Преобразование по CursorSchema фокс делает.

Как я понимаю свойство CursorSchema как раз и нужно для ручного приведения типа фоксом. Не все типы фокса есть на MSSQL и наоборот. С датами все на ура проходит, кстати без CursorSchema мне никак не удалось DATE получить, нет такого типа у MSSQL.

А глюк этот похоже в наследство от dbf-а достался, где NUMERIC фактически как строка хранится, сохраняется например '100.0000' и точка жестко не забита, например 100 в формате N(5,2) будет хранится как '100.0' (хотя переполнение должно быть), а при выводе форматируется под заданную структуру. Наверно в текстбоксах форматирование под структуру сделали, а в гриде и brow забыли.

PS Money у MSSQL это Currency фокса, аналога smallmoney у фокса нет.

PaulWist... в фоксовом курсоре необходимо тоже иметь тип данных money Что я и сделал через Grid.Column1.Format и Grid.Column1.Text1.Format
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34888710
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T PaulWistЕсли на стороне фокса, то не заставляйте драйвер ODBC выполнять работу по конвертации из одного типа в другой...
Ну на счет ODBC драйвера ты допустим загнул. Преобразование по CursorSchema фокс делает.


Ага, и в browse тоже делает эфемерный CA и так начиная с версии 2.6

Dima T PaulWist... в фоксовом курсоре необходимо тоже иметь тип данных money Что я и сделал через Grid.Column1.Format и Grid.Column1.Text1.Format

Нет, не правильно, ты просто подгоняешь визуализацию по нужную тебе размерность, НО тип данных совсем другой.
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34888730
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Проверь, какой реально тип данных получился у поля курсора. Можно по AFILEDS()

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

3. Если поле нужно только на чтение, то попробуй преобразовать ее на MS SQL через CAST() в тип Real или Decimal. Если поле нужно на модификацию, то посмотри что именно происходит при записи. Записывается то, что нужно или тоде есть проблемы?
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34888801
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ1. Проверь, какой реально тип данных получился у поля курсора. Можно по AFILEDS() Пробовал copy to ... - отрабатывает правильно N(11,2), как я и задал. AFILEDS() тоже N(11,2) дает

ВладимирМ2. Если активная ячейка показывает не то, что не активная, то это может быть ошибка в самих данных. Format всего-лишь прячет проблему не вылечивая ее.
Дак и надо "спрятать". Проблема только в гриде пока не встанешь на ячейку (т.е. пока текстбокс в ячейке не появится). Если поле привязано к текстбоксу на правку - все нормально N(11,2)

ВладимирМ3. Если поле нужно только на чтение, то попробуй преобразовать ее на MS SQL через CAST() в тип Real или Decimal. Если поле нужно на модификацию, то посмотри что именно происходит при записи. Записывается то, что нужно или тоде есть проблемы?
По идеологии клиент-сервера задача сервера предоставлять данные, а клиента отображать. Потому и не хочу сервер лишней работой напрягать если на клиенте задача решается. Чтоб потом когда база распухнет голову не ломать про разгрузку сервера.

PS Вопрос решился. Окончательное решение получилось такое - в Init() базового класса грида прописал обход колонок и для типа currency установку InputMask = '999,999,999.99'. Про Format выше я поторопился, он на currency не действует.
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34889149
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS Вопрос решился. Окончательное решение получилось такое - в Init() базового класса грида прописал обход колонок и для типа currency установку InputMask = '999,999,999.99'. Про Format выше я поторопился, он на currency не действует.

До первого вычисления

Код: plaintext
1.
2.
3.
4.
5.
m.f1 =  1 . 51 
m.f2 = $ 1 . 51 

? 'N = Y - ', m.f1/ 3  = m.f2/ 3  

? 'Y = Y - ',NTOM(m.f1/ 3 ) = m.f2/ 3  
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34889420
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 PaulWist. А так:
Код: plaintext
1.
2.
m.f1 =  1 . 51 
m.f2 = $ 1 . 51 
?  round(m.f1/ 3 ,  2 ) = round(m.f2/ 3 ,  2 )

Деньги считают с точностью до копейки, а не до тысячных долей копейки. И непонятно к чему про точность разговор. Ограничения money форматов известны, также как и преимущества. Формат изначально расчитан на хранение денежных сумм. Четырех десятичных знаков достаточно для точного проведения любых расчетов с делением и последующим округлением результата до копеек.

Физически money это INT у которого показывают точку смещенную на 4 знака при визуализации. Благодаря этому нет проблем с точностью при больших размерностях чисел. Если число влазит в размерность, то оно хранится без искажений:
Код: plaintext
1.
2.
m.f1 =   164328764827687 . 51 
m.f2 = $ 164328764827687 . 51 
? m.f1 = m.f2
2. Меньше места при хранении (для MSSQL money - 8 байт, smallmoney - 4 байта)
3. Быстрее расчеты. Процессор быстрее выполняет операции над целочисленными двоичными операндами, чем с плавающей точкой или двоичнодесятичными.

PS Предлагаю религиозную войну прекратить. Вопрос я все-таки по курсорадаптер задавал.
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34889587
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С типом Numeric тип Money - "не дружит". Проверил на Remote View - результат тот же. Похоже, логика примерно такая:

Сначала данные закачиваются на клиента "как есть", а потом изменяется тип поля курсора. При этом, для поля Numeric не происходит модификация содержимого полей. Поскольку типу Numeric глубоко "по барабану" что именно в нем записано, то в не активных строках и отображается именно то, что было скачано с сервера.

Это справедливо для преобразования любого типа данных в тип Numeric. Тот же эффект будет и для Money, и для Real.

Как вариант решения можно сделать преобразование не в тип Numeric, а в тип Double. Эффект будет тот что нужно, хотя можно потерять точность из-за особенностей хранения типа Double.

Код: plaintext
CA.CursorSchema = '... NSUM B(2) ...'
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34889590
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, еще один вариант решения - это сделать настройку

SET FIXED ON

В этом случае отображаться будет ровно столько знаков после запятой, сколько указано в настройке SET DECIMALS TO. А, по умолчанию, это как раз 2 знака. Но эта настройка отразится на содержимом ВСЕХ отображаемых полей.
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34889804
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМС типом Numeric тип Money - "не дружит" ...
Я думаю Numeric фоксовый ни с кем не дружит. Т.к. в DBF-е он хранится как строка, то гридом и brow выводится как есть. В курсорах вряд ли что поменяли. А КА и вью сначала происходит какое-то стандартное преобразование в numeric, а потом смена типа на заданный. Так видим тоже 4 знака:
Код: plaintext
1.
CA.SelectCmd = 'select ... cast(nSum as numeric(11,4)) as nSum ...'
CA.CursorSchema = '... NSUM n(11, 2) ...'
Хотя numeric MSSQL и numeric фокса это тоже два разны формата.

А вот если nSum = 100 и CA.CursorSchema = '... NSUM n(5, 2) ...' то 1 знак после запятой: 100.0

Такое впечатление что MS с преобразованием типов перемудрили. Переоптимизировали видать

PS Будем считать это фичей, а не багом.
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34889964
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Деньги считают с точностью до копейки, а не до тысячных долей копейки. И непонятно к чему про точность разговор.

Найдите сумму НДС от 1 шт товара стоящего 10 коп, а затем найдите сумму НДС для 10 шт товара по 10 коп, что называется почуствуйте разницу.

Dima TPS Предлагаю религиозную войну прекратить.

Согласен, главное, что когда у Вас "полезут" непонятки с мат действиями над суммами Вы вспомнили данное обсуждение
...
Рейтинг: 0 / 0
CA.CursorSchema, Grid и тип smallmoney
    #34890171
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist Dima T
Деньги считают с точностью до копейки, а не до тысячных долей копейки. И непонятно к чему про точность разговор.

Найдите сумму НДС от 1 шт товара стоящего 10 коп, а затем найдите сумму НДС для 10 шт товара по 10 коп, что называется почуствуйте разницу. Уже почувствовал, лет 7-8 назад. Спасибо нашим законописателям. В опте НДС на сумму считается, в рознице на штуку, а в документах все до копеек округляется. Оптовики же "доброе дело" делают, считают кто во что горазд, под розницу якобы подстраиваются. Вот самые популярные методы:
1. Сумма НДС = ROUND(Сумма без НДС * Ставка НДС, 2)
2. Сумма НДС = ROUND(Сумма с НДС * Ставка НДС / (100% + Ставка НДС), 2)
3. Сумма НДС = ROUND(Цена без НДС * Ставка НДС, 2) * Количество
А потом розница приходует это безобразие и матерится - копейки в суммах не сходятся. Такое типами данных не лечится.
Мой конечный вариант - сделал три алгоритма расчета входящего НДСа при приходе. Тип алгоритма привязывается к поставщику, при появлении расхождений в суммах алгоритм меняется. После этого проблема с "копейками" закрылась.

PaulWistСогласен, главное, что когда у Вас "полезут" непонятки с мат действиями над суммами Вы вспомнили данное обсуждение Не надо вспоминать, надо просто не забывать когда делить собираешься.

PS Я ж не агитирую за использование money форматов повсеместно, а сам прекрасно представляю все ньюансы их использования.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CA.CursorSchema, Grid и тип smallmoney
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]