powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Смена типа данных домена
44 сообщений из 44, показаны все 2 страниц
Смена типа данных домена
    #38924101
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть примерно следующая: сейчас данные хранятся в DOUBLE PRECISION и при работе с данными постоянно появляется погрешность в одну копейку. К тому же в некоторых запросах используется конструкция типа x/y/z - где типы данных каждого поля - DOUBLE PRECISION. При использовании такой конструкции выскакивает ошибка "Arithmetic exception, numeric overflow, or string truncation". Я так понимаю дробная часть получается слишком большой...

В связи с этим было принято решение изменить тип данных полей на numeric(18,6). Для этого был создан новый домен с требуемым типом данных. Для полей созданы копии с новым доменом. Данные перенесены update'ом в новые поля.
Код: plsql
1.
update table a set a.field = cast((select b.field from table b where b.rdb$db_key = a.rdb$db_key) as NEW_DOMAIN)


Закомментированы все процедуры, триггеры и удалены все связи на эти поля. Удалены поля со старым доменом. Новые поля с новым доменом переименованы в старые. Все связи восстановлены, триггеры и процедуры раскомментированы. И напоследок даже Backup-Restore сделаны, но проблемы это не решило. Как писали одной похожей теме:
kdvв IB/FB существует "версионность метаданных таблиц". то есть, когда ты меняешь структуру таблицы - порядок, типы или размер столбцов - данные не трогаются, а просто показываются в новом формате.
В моем случае данные точно так же просто отображаются в новом формате. Что было сделано не так? Alter domain читал, собственно по форуму тоже почитал, но однозначного ответа не нашел. Вроде бы все сделано по технологии, но результат не соответствует ожиданию.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924110
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,

1. Какой диалект?
2. Если ты создавал новое поле с новым типом, то почему же ты скопировал это поле само в себя, а не новое поле?
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924117
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,

какой диалект? а то с одной стороны разговор про double, а с другой - про numeric(18,6) и всякие arithmeric exception.

Freddie26update table a set a.field = cast((select b.field from table b where b.rdb$db_key = a.rdb$db_key) as NEW_DOMAIN)
ересь какая-то. ну каст из домена, а тип field остался тем же. Где тут "новые поля"?

Freddie26Вроде бы все сделано по технологии
по какой-такой технологии?
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924221
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про технологию не понял, но запрос вырвиглазный.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924270
MrCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос будет куда проще, если новое поле делать в той же таблице, что и старое. Получится не "технология", а классическая смена типа через буферное поле, которую ещё Борри описала. В этом случае вопрос про "версионность метаданных" должен отпасть сам собой - создано новое поле и его номер формата - 0.

"дробная часть получается слишком большой" - странные слова. Overflow, скорее, вызывает большой порядок (что-то около 10^308) результата. Который получается, небось, из-за многократного деления на "что-то около нуля" ("x/y/z"). Которое получается, небось, как разница между двумя "почти равными" (float же ж) значениями. В этом случае переход на NUMERIC не спасёт, ибо будет деление уже на чистый ноль.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924279
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrCat,

можно много чего гадать, пока автор не ответит. Вообще тут много всякого.
- с одной стороны, автор показал свою крутизну использованием rdb$db_key
- с другой стороны, автор что-то говорит про "версионность метаданных", при этом обновляя столбец через каст.
Нафига ему понадобился вложенный запрос, я вообще не понял. Потому что, если он поменял тип столбца, то он просто мог бы сделать
update table set field = field
и из одного типа столбец преобразовался бы в другой.
Но что-то у меня такое в памяти, что столбец double precision не превратится в int64 если его тип поменять на numeric(18,6) (надо проверять, но мне это не интересно).

Если он добавил столбец нового типа к таблице, то опять же достаточно
update table set field1 = field
и зачем тут cast к "новому домену" - совершенно непонятно. Каст к новому домену имел бы какой-то смысл при проверке на конвертируемость столбца из старого типа в новый, и то при select.

А с переполнением в конструкции x/y/z совсем мутно. Я скорее поверю, что переполнение будет при numeric(18,6) в третьем диалекте, чем с double precision в любом диалекте. Потому что при умножении и делении numeric в третьем диалекте точность (scale) складывается. То есть num(18,6)/num(18,6) будет num(18,12), т.е. для целой части остается всего 6 знаков.
А double precision будет прекрасно делиться хоть 20 раз.

Так что автор намешал мешанину. А истина где-то рядом, но не здесь.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924445
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, что ввел в заблуждение. Постараюсь ответить всем.

Симонов Денис 1. Какой диалект?
1. Используем третий диалект
Симонов Денис 2. Если ты создавал новое поле с новым типом, то почему же ты скопировал это поле само в себя, а не новое поле?
2. Поле я копировал не в само себя, а в этих таблицах было создано буферное поле. В него и копировал. Запрос набросал на скорую руку.
kdv - с одной стороны, автор показал свою крутизну использованием rdb$db_key
3. если это не сарказм, то... не считаю это крутизной, потому что не придумал иного способа как скриптом на 600 полей в которых может быть составной первичный ключ найти соответствие по полю (каюсь, sql не на столько хорошо знаю, как стоило бы, но познаю потихоньку по мере надобности).
kdv Если он добавил столбец нового типа к таблице, то опять же достаточно
update table set field1 = field
и зачем тут cast к "новому домену" - совершенно непонятно.
4. Не знал о таких нюансах.
MrCatOverflow, скорее, вызывает большой порядок (что-то около 10^308) результата. Который получается, небось, из-за многократного деления на "что-то около нуля" ("x/y/z"). Которое получается, небось, как разница между двумя "почти равными" (float же ж) значениями. В этом случае переход на NUMERIC не спасёт, ибо будет деление уже на чистый ноль.
kdv А с переполнением в конструкции x/y/z совсем мутно. Я скорее поверю, что переполнение будет при numeric(18,6) в третьем диалекте, чем с double precision в любом диалекте. Потому что при умножении и делении numeric в третьем диалекте точность (scale) складывается. То есть num(18,6)/num(18,6) будет num(18,12), т.е. для целой части остается всего 6 знаков.
На сколько я теперь понимаю нашей проблемы смена домена не решит. Не знаю всех причин, но вроде как основная причина - ошибка при делении трех столбцов "Arithmetic exception, numeric overflow, or string truncation".
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924452
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чуть не забыл повторить, вторая известная мне проблема - откуда-то берется копейка. Видимо где-то не округляется и потом в отчеты попадает эта самая копейка - я так понимаю это погрешность.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924517
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26Чуть не забыл повторить, вторая известная мне проблема - откуда-то берется копейка. Видимо где-то не округляется и потом в отчеты попадает эта самая копейка - я так понимаю это погрешность.Наоборот, это следствие округления.
Простой пример:
Берем рубль, делим на три. Получается 3 раза по 33 копейки.
Умножаем обратно, 3*0.33 = 0.99 рубля, одна копейка куда-то пропала. Или наоборот, осталсь лишней, если сравнивать с тем рублем.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924588
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S.G.,

Вам известны методы борьбы с "копейкой" ? На сколько я понял банки, например, округляют через раз: один раз происходит округление в большую сторону, другой в меньшую. Других примеров мне не известно.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924599
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26S.G.,

На сколько я понял банки, например, округляют через раз: один раз происходит округление в большую сторону, другой в меньшую.

Особенно приятно, если строк в таблице нечетное количество, ага.

Freddie26 Других примеров мне не известно.

Перевести в INTEGER (т.е. все хранить сразу в копейках).
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924653
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26Вам известны методы борьбы с "копейкой" ?
Самый простой метод: не делить промежуточные результаты. То есть сначала складывать, а
потом делить вместо того чтобы сначала делить, а потом складывать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924694
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterFreddie26S.G.,

На сколько я понял банки, например, округляют через раз: один раз происходит округление в большую сторону, другой в меньшую.

Особенно приятно, если строк в таблице нечетное количество, ага.

Не путайте банковское и чередующее округление
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924706
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26Вам известны методы борьбы с "копейкой" ?
Ну например, вычислять "погрешность" и учитывать её при следующем округлении
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924837
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26Вам известны методы борьбы с "копейкой" ?Самое главное это внутренне осознать, что:
результат действия над округленными операндами отличается от результата действия над операндами и округление результата.
Причем для душевного спокойствия лучше считать, что отличается всегда, и только иногда мы этого (разницы результата) не замечаем.
Все остальное это вопросы реализации.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38924867
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26S.G.,

Вам известны методы борьбы с "копейкой" ? На сколько я понял банки, например, округляют через раз: один раз происходит округление в большую сторону, другой в меньшую. Других примеров мне не известно.

Например, все суммы кратны 18 копейкам.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38925024
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока что у меня вопросов больше не осталось. С ошибкой "Arithmetic exception, numeric overflow, or string truncation" вроде разобрался, по крайней мере приведение результата деления cast-ом к numeric(18,6) помогло... Осталось проверить сотруднику, которому нужна эта реализация.

По поводу копейки методы реализации будем рассматривать. Лично мне подсказанное помогло узнать что-то новое, за что я всем благодарен.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926120
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем начальству не нравится, что запросы надо переделывать, им подавай поля с новым доменом и чтобы все работало. Потому пытаюсь копать дальше...

Сейчас создал буферные поля, заполнил их запросами типа:
Код: plsql
1.
2.
3.
update table A set A.Field1 =  (select B.field from table B where B.RDB$DB_KEY = A.RDB$DB_KEY)
/*Собственно такие запросы выполнились быстрее, чем следующий, а результат тот же*/
update table set field1 = field


Получаю: значение в ячейке отображается как 7589,030000, а при двойном клике по ячейке вижу значение 7589,0299999999998. Тип поля Numeric(18,6). Просматриваю таблицу через IBExpert.
Вопрос: Почему значение показывается с некоторой погрешностью (и можно ли так выражаться в данном случае вообще??) и отразится ли это как-то на результатах запросов к этим полям?
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926136
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Freddie26!
You wrote on 3 апреля 2015 г. 12:16:37:

Freddie26> при двойном клике по ячейке вижу значение 7589,0299999999998.
> Тип поля Numeric(18,6).
у тебя поле создано не в третьем диалекте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926140
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или ты врёшь про диалект, или это баг эксперта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926143
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv Но что-то у меня такое в памяти, что столбец double precision не превратится в int64 если его тип поменять на numeric(18,6) (надо проверять, но мне это не интересно).
В какой тип можно конвертировать double precision? Что сделать, чтобы не отображалось этой погрешности?

В другой теме спрашивали как сменить numeric на double precision, советовали для применения сделать "холостой update" т.е. поле присвоить самому себе - тоже не помогает.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926154
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий Hello, Freddie26!
You wrote on 3 апреля 2015 г. 12:16:37:

Freddie26
> при двойном клике по ячейке вижу значение 7589,0299999999998.
> Тип поля Numeric(18,6).

у тебя поле создано не в третьем диалекте.


Диалект БД судя информации записанной в RDB$DATABASE - 3.
При подключении к БД я явно нигде не указываю диалект и собственно не нашел где его можно явно указать. Да и вроде бы он по умолчанию должен быть третьим.

Dimitry Sibiryakov Или ты врёшь про диалект, или это баг эксперта.
Что за выражение "врешь"? Я заинтересован в нахождении истины, зачем мне намеренно давать ложные данные?
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926171
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26Что за выражение "врешь"?
У DS это синоним "вводишь в заблуждение"

зы. Обращай внимание на смысл его советов и не обращай внимания на некоторую "резкость" его высказываний,
он в большинстве случаев прав
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926173
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,

чем подключаешься?
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38926217
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Выполняю скрипты в IBExpert в редакторе скриптов. На сколько я понял вы говорите, что я поля создал не в 3-м диалекте. Так вот мои действия:
Код: plsql
1.
2.
3.
4.
5.
SET SQL DIALECT 3;
...
alter table TABLE add FIELD1 MONEYRUB_NUM;
--и так далее
--где MONEYRUB_NUM - домен с типом numeric(18,6)



Код: plsql
1.
2.
3.
4.
5.
SET SQL DIALECT 3;
...
update table set field1 = field;
update table2 set field1 = field;
--и так далее
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38927703
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть у кого-нибудь еще мнения, почему не конвертируются данные между типами данных? Или как можно их привести в итоге к numeric...
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38927710
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26поля создал не в 3-м диалекте
SET SQL DIALECT 3; эта команда не меняет диалекта базы.
Диалект базы можно назначить только командой create database
Т.е. базу надо создать в нужном диалекте, далее подключаться в нужном же диалекте (как минимум не мешать в этом серверу, он и сам неплохо разбирается с каким диалектом подключиться, если оный не указывать при коннекте)
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38927734
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky,

Как я уже писал... диалект в БД в таблице RDB$DATABASE = 3. При подключении я не указываю диалект, т.к. то ли этого нет в моей версии IBExpert, то ли я попросту не знаю где именно его надо указать. Значит по умолчанию у меня должен быть с Ваших слов третий диалект... Вроде бы все верно... Если мне не верите, скажите что сделать чтобы предоставить вам достоверную информацию (логи, метаданные БД или что еще). А SET SQL DIALECT 3; я указывал чтобы наверняка задать третий диалект, в любом случае хуже от этого быть не должно.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38927741
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26Как я уже писал... диалект в БД в таблице RDB$DATABASE = 3Вот тут давай подробнее. Начни с вывода содержимого RDB$DATABASE. Продолжи тем, как ты там нашёл диалект. И закончи показом gstat -h.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38927770
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

Прошу прощения - MON$DATABASE, а не RDB$DATABASE.





Database "C:\Database\MYBASE.FDB"
Database header page information:
Flags 0
Checksum 12345
Generation 6615
Page size 16384
ODS version 11.2
Oldest transaction 6573
Oldest active 6574
Oldest snapshot 6574
Next transaction 6607
Bumped transaction 1
Sequence number 0
Next attachment ID 4
Implementation ID 26
Shadow count 0
Page buffers 0
Next header page 0
Database dialect 3
Creation date Apr 3, 2015 15:46:57
Attributes force write

Variable header data:
Sweep interval: 0
*END*
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38927783
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38927789
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,

проверь в sql editor, сколько будет
select 1/3 from rdb$database
или
select 22/7 from rdb$database
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928155
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Если галочка "использовать масштаб поля" должна стоять, то она у меня и так стоит...

kdv,

select 1/3 from rdb$database - возвращает 0
select 22/7 from rdb$database - возвращает 3
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928169
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,

а ну ка покажи DDL той таблицы в которую ты новый филд добавил и нового домена. Чувствую что-то тут не то.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928189
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Я так понимаю нужны запросы на создание домена и любой таблицы... Вытаскиваю из IBExpert'a как есть.

Код: plsql
1.
2.
CREATE DOMAIN MONEYRUB_NUM AS
NUMERIC(18,6);



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
/******************************************************************************/
/***               Generated by IBExpert 06.04.2015 15:37:13                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE DOCTAB_AMOUNTBALANCE_NOM (
    ID            KEYS NOT NULL /* KEYS = CHAR(16) */,
    OWNER         KEYS /* KEYS = CHAR(16) */,
    NOMENCLATURE  KEYS /* KEYS = CHAR(16) */,
    UNIT          KEYS /* KEYS = CHAR(16) */,
    FINSOURCE     KEYS /* KEYS = CHAR(16) */,
    SERIES        KEYS /* KEYS = CHAR(16) */,
    PARTIES       KEYS /* KEYS = CHAR(16) */,
    SUMMA         MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    PRICENOM      MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    PRICENOM1     MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */,
    SUMMA1        MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE DOCTAB_AMOUNTBALANCE_NOM ADD CONSTRAINT PK_DOCTAB_AMOUNTBALANCE_NOM PRIMARY KEY (ID);


/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE DOCTAB_AMOUNTBALANCE_NOM ADD CONSTRAINT FK_DOCTAB_AMOUNTBALANCE_NOM_1 FOREIGN KEY (OWNER) REFERENCES DOC_AMOUNTBALANCE (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DOCTAB_AMOUNTBALANCE_NOM ADD CONSTRAINT FK_DOCTAB_AMOUNTBALANCE_NOM_2 FOREIGN KEY (NOMENCLATURE) REFERENCES REF_NOMENCLATURE (ID) ON UPDATE CASCADE;
ALTER TABLE DOCTAB_AMOUNTBALANCE_NOM ADD CONSTRAINT FK_DOCTAB_AMOUNTBALANCE_NOM_3 FOREIGN KEY (UNIT) REFERENCES REF_UNITS (ID) ON UPDATE CASCADE;
ALTER TABLE DOCTAB_AMOUNTBALANCE_NOM ADD CONSTRAINT FK_DOCTAB_AMOUNTBALANCE_NOM_4 FOREIGN KEY (FINSOURCE) REFERENCES REF_FINSOURCES (ID) ON UPDATE CASCADE;
ALTER TABLE DOCTAB_AMOUNTBALANCE_NOM ADD CONSTRAINT FK_DOCTAB_AMOUNTBALANCE_NOM_5 FOREIGN KEY (SERIES) REFERENCES REF_SERIES (ID) ON UPDATE CASCADE;
ALTER TABLE DOCTAB_AMOUNTBALANCE_NOM ADD CONSTRAINT FK_DOCTAB_AMOUNTBALANCE_NOM_6 FOREIGN KEY (PARTIES) REFERENCES REF_PARTIES (ID) ON UPDATE CASCADE;


/******************************************************************************/
/***                              Descriptions                              ***/
/******************************************************************************/

COMMENT ON TABLE DOCTAB_AMOUNTBALANCE_NOM IS 
'Документ "Корректировка суммы остатка" (Табличная часть "Номенклатура")';



/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.ID IS 
'Идентификатор';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.OWNER IS 
'Документ-владелец';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.NOMENCLATURE IS 
'Номенклатура';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.UNIT IS 
'Упаковка';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.FINSOURCE IS 
'Единица измерения';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.SERIES IS 
'Количество';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.PARTIES IS 
'Коэффициент';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.SUMMA IS 
'Сумма';

COMMENT ON COLUMN DOCTAB_AMOUNTBALANCE_NOM.PRICENOM IS 
'Цена';


...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928203
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

или вот более удачная таблица с данными и снимком того, что я вижу вместо нужного формата данных.

картинка:




запрос на создание таблицы (домен тот же):


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
/******************************************************************************/
/***               Generated by IBExpert 06.04.2015 15:42:55                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE DOCTAB_OPER_USLUGI (
    OWNER             KEYS NOT NULL /* KEYS = CHAR(16) */,
    USLUGA            KEYS /* KEYS = CHAR(16) */,
    MEDPERSONAL       KEYS /* KEYS = CHAR(16) */,
    DOLGNOST          KEYS /* KEYS = CHAR(16) */,
    PROFMEDHELP       KEYS /* KEYS = CHAR(16) */,
    RESULT_OBR        KEYS /* KEYS = CHAR(16) */,
    KOL               MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    KOLPLACE          MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    ITOG              MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    DATEON            DOMEN_DATE /* DOMEN_DATE = DATE */,
    ID                KEYS NOT NULL /* KEYS = CHAR(16) */,
    OPLATA_TYPE       KEYS /* KEYS = CHAR(16) */,
    OWNER_DOC         KEYS /* KEYS = CHAR(16) */,
    SUMMA             MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    SUMMAMED          MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    IS_THIS_ANALYS    BOOLEAN /* BOOLEAN = SMALLINT */,
    DS                KEYS /* KEYS = CHAR(16) */,
    CODEST            STRING40 /* STRING40 = VARCHAR(40) */,
    IS_NOT_RASCHET    BOOLEAN /* BOOLEAN = SMALLINT */,
    SUM_ONE           MONEYRUB /* MONEYRUB = DOUBLE PRECISION */,
    DATE_ADD          DOMEN_DATE /* DOMEN_DATE = DATE */,
    N_TOOTH           "INT" /* "INT" = INTEGER */,
    IS_MILK_TOOTH     BOOLEAN /* BOOLEAN = SMALLINT */,
    AUTHOR            KEYS /* KEYS = CHAR(16) */,
    DATEON_END        DOMEN_DATE /* DOMEN_DATE = DATE */,
    IS_OBR_USLUGA     BOOLEAN /* BOOLEAN = SMALLINT */,
    IS_DEFECT_PLOMB   BOOLEAN /* BOOLEAN = SMALLINT */,
    RESULT            STRING255 /* STRING255 = VARCHAR(255) */,
    BRANCH            KEYS /* KEYS = CHAR(16) */,
    IS_NOT_EXPORT     BOOLEAN /* BOOLEAN = SMALLINT */,
    MEDPERSONAL_SRED  KEYS /* KEYS = CHAR(16) */,
    HOSPITAL_TYPE     KEYS /* KEYS = CHAR(16) */,
    KOL1              MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */,
    KOLPLACE1         MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */,
    ITOG1             MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */,
    SUMMA1            MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */,
    SUMMAMED1         MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */,
    SUM_ONE1          MONEYRUB_NUM /* MONEYRUB_NUM = NUMERIC(18,6) */
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT PK_DOCTAB_OPER_USLUGI PRIMARY KEY (ID);


/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_1 FOREIGN KEY (USLUGA) REFERENCES REF_USLUGI (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_10 FOREIGN KEY (MEDPERSONAL_SRED) REFERENCES REF_MEDPERSONAL (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_11 FOREIGN KEY (HOSPITAL_TYPE) REFERENCES REF_HOSPITAL_TYPE (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_2 FOREIGN KEY (MEDPERSONAL) REFERENCES REF_MEDPERSONAL (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_3 FOREIGN KEY (DOLGNOST) REFERENCES REF_DOLGNOSTI (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_4 FOREIGN KEY (PROFMEDHELP) REFERENCES REF_PROFMEDHELP (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_5 FOREIGN KEY (OWNER) REFERENCES DOC_RECEPTION (ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_6 FOREIGN KEY (OPLATA_TYPE) REFERENCES REF_OPLATA_TYPE (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_7 FOREIGN KEY (RESULT_OBR) REFERENCES REF_RESULT_OBR (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_8 FOREIGN KEY (DS) REFERENCES REF_MKB (ID) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE DOCTAB_OPER_USLUGI ADD CONSTRAINT FK_DOCTAB_OPER_USLUGI_9 FOREIGN KEY (AUTHOR) REFERENCES REF_USERS (ID) ON DELETE SET NULL ON UPDATE CASCADE;


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX DOCTAB_OPER_USLUGI_IDX1 ON DOCTAB_OPER_USLUGI (OWNER_DOC);
CREATE INDEX DOCTAB_OPER_USLUGI_IDX2 ON DOCTAB_OPER_USLUGI (DATEON);
CREATE INDEX DOCTAB_OPER_USLUGI_IDX3 ON DOCTAB_OPER_USLUGI COMPUTED BY ((coalesce(IS_THIS_ANALYS, 0)));
CREATE INDEX DOCTAB_OPER_USLUGI_IDX4 ON DOCTAB_OPER_USLUGI (OWNER, OPLATA_TYPE);
CREATE INDEX DOCTAB_OPER_USLUGI_IDX5 ON DOCTAB_OPER_USLUGI (OWNER, DATEON, USLUGA);
CREATE INDEX DOCTAB_OPER_USLUGI_IDXIS_OBR ON DOCTAB_OPER_USLUGI COMPUTED BY ((coalesce(IS_OBR_USLUGA, 0)));


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: DOCTAB_OPER_USLUGI_AD0 */
CREATE OR ALTER TRIGGER DOCTAB_OPER_USLUGI_AD0 FOR DOCTAB_OPER_USLUGI
ACTIVE AFTER DELETE POSITION 0
AS
begin
 delete from reg_oper_tarif a where a.owner=old.id;
end
^


/* Trigger: DOCTAB_OPER_USLUGI_BI0 */
CREATE OR ALTER TRIGGER DOCTAB_OPER_USLUGI_BI0 FOR DOCTAB_OPER_USLUGI
ACTIVE BEFORE INSERT POSITION 0
AS
begin
 new.date_add=current_date;
end
^


SET TERM ; ^



/******************************************************************************/
/***                              Descriptions                              ***/
/******************************************************************************/

COMMENT ON TABLE DOCTAB_OPER_USLUGI IS 
'Документ "Свод услуг" (Табличная часть "Оказанные услуги")';



/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.OWNER IS 
'Документ-владелец';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.USLUGA IS 
'Услуга';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.MEDPERSONAL IS 
'Мед. персонал, оказавший услугу';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.DOLGNOST IS 
'Должность мед. персонала, оказывавшего услугу';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.PROFMEDHELP IS 
'Профиль мед. помощи';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.RESULT_OBR IS 
'Результат обращения';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.KOL IS 
'Кол-во услуги';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.KOLPLACE IS 
'Кол-во мест применения';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.ITOG IS 
'Итого';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.DATEON IS 
'Дата оказания услуги';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.ID IS 
'Идентификатор записи';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.OPLATA_TYPE IS 
'Вид оплаты';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.OWNER_DOC IS 
'Источник данных';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.SUMMA IS 
'Сумма по строке';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.SUMMAMED IS 
'Сумма медикаментов';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.IS_THIS_ANALYS IS 
'Это исследование';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.DS IS 
'Диагноз';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.CODEST IS 
'Код услуги, введеный операторами';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.IS_NOT_RASCHET IS 
'Не расчитывать услугу';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.DATE_ADD IS 
'Дата добавления услуги';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.N_TOOTH IS 
'Номер зуба';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.IS_MILK_TOOTH IS 
'Признак того, что зуб является молочным';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.AUTHOR IS 
'Автор записи в табличной части';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.DATEON_END IS 
'Дата окончания услуги';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.IS_OBR_USLUGA IS 
'Является услугой законченного случая';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.IS_DEFECT_PLOMB IS 
'Дефект пломбы';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.RESULT IS 
'Результат обследования';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.BRANCH IS 
'Филиал (подразделение МО)';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.IS_NOT_EXPORT IS 
'Не выгружать, справочно';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.MEDPERSONAL_SRED IS 
'Соисполнитель. Мед. сестра';

COMMENT ON COLUMN DOCTAB_OPER_USLUGI.HOSPITAL_TYPE IS 
'“ип госпитализации';



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/


/* Privileges of users */
GRANT ALL ON DOCTAB_OPER_USLUGI TO KSAMUUSER;





Думаю тут прекрасно видно, что что-то не так...
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928211
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26,

что даёт вот такой запрос

Код: sql
1.
2.
SELECT CAST(SUMMA AS MONEYRUB_NUM) AS SUMMA1
FROM DOCTAB_AMOUNTBALANCE_NOM D



лишние знаки есть?
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928218
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисчто даёт вот такой запрос
Лучше вот такой:
Код: sql
1.
2.
3.
SELECT CAST(SUMMA AS MONEYRUB_NUM) AS SUMMA1, CAST(CAST(SUMMA AS MONEYRUB_NUM) AS 
VARCHAR(22) AS SUMMAS
FROM DOCTAB_AMOUNTBALANCE_NOM D



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928220
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Данных в этой таблице нет. В другой таблице (с данными) выполняю запрос:
Код: plsql
1.
2.
SELECT CAST(SUMMA AS MONEYRUB_NUM) AS SUMMA1
FROM DOCTAB_OPER_USLUGI D



Результат:


...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928227
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

В виде строки выводит без погрешностей, приведение к numeric не помогает :)




...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928234
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26В виде строки выводит без погрешностей, приведение к numeric не помогает
:)
Отсюда вывод: ты совершенно зря вскипел на слове "врёшь" и проигнорировал вторую часть
предложения о баге в IBExpert. Выкинь эту каку и будет тебе счастье.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928248
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Я не проигнорировал, просто не знал как доказать, что это баг. И в чем собственно заключается сам баг? Я вижу, что в строку кастит из numeric нормально. Но откуда он берет погрешность при касте в numeric? Если это просто баг отображения, то на сколько я понимаю проблем быть не должно.
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928275
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freddie26И в чем собственно заключается сам баг?
В том, что для работы с NUMERIC используется метод TField.AsFloat внутри которого значение
приводится к double и тем теряет точность. Если бы использовалось прямое преобразование в
строку, ошибка не возникала бы. Такой вот баг, характерный для всех наследников FIBC,
наследие рукожопа, который проектировал DB VCL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смена типа данных домена
    #38928358
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собрал тестовый проект в Delphi, подключил эту БД в дизайнере, выполнил запрос: по факту данные хранятся в numeric и погрешности нет. Вопрос со сменой домена отпадает. Останется разобраться с ошибкой "Arithmetic exception, numeric overflow, or string truncation", но на сколько я понимаю тут проблем быть уже не должно. Всем большое спасибо!
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Смена типа данных домена
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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