Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

Открыть новую тему     Написать ответ в эту тему

OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR
Доступ к базе в приложении каким образом осуществляется?

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 09:02 06-03-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OXDBA
Через FIBplus

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 09:33 06-03-2014
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тогда что мешает использовать MyFibDataSet.Params[N].isNumericType, isDateType и т.д. для препарированного запроса?
 
Добавлено:
YuriyRR
Извини, немного тебя обманул
 
Добавлено:
Попробуй через  MyFibDataSet.Params[N].isNumericType(MyFibDataSet.Params[N].SQLType)

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 09:57 06-03-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OXDBA
по FibDataSet.Params[N].SQLType разобрал параметры.
перед препарированием делаю .Params.ClearValues чтобы параметры от предыдущего запроса не мешали. Может нужно удалять все параметры перед новым запросом? Не нашел как?

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 11:59 10-03-2014
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR
Вообще-то это вопросы по компонентам, а не по работе IB/FB. После изменения текста запроса, параметры очищать не нужно, далее, в FIB'ах метод Prepare будет вызван автоматически, перед первым выполнением запроса, поэтому, как правило, явно его не вызывают

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 08:58 11-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите пожалуйста с форматами integer и numeric. Сначала:
 
SUM_ROZN_REAL  numeric(18,6)  =  2535.00
SUM_OPT_REAL  numeric(18,6)  =  0.01
r_percent   numeric(16,2)  = ((:SUM_ROZN_REAL/:SUM_OPT_REAL) - 1) * 100
 
При расчёте процента вылетает ошибка:
Integer overflow.  The result of an integer operation caused the most significant bit of the result to carry.
 
Я посчитал r_percent = 25349900 то есть в двоичном формате = 182CF0C
Мы видим что верхний байт = 1, то есть 7 верхних битов свободны, либо я что то не понимаю. Ну то что сумма оптовая одна копейка это тоже у нас ошибка, так как цена то нулевая, не знаем откуда копейка прилетела. В общем
 
r_percent=cast(((:SUM_ROZN_REAL/:SUM_OPT_REAL) - 1) as numeric(16,2)) * 100;
работает без ошибок, но непонятно какой предел величин доступен в первом случае и как его определить.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 11:36 11-03-2014
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
 
numeric(18,6) / numeric(18,6) = numeric(18,6)
 
а numeric(18,6) не влазит в numeric(16,2), вот и ошибка
 
если делать преобразование, то естественно влазит в numeric(16,2)
 
вывод - приведите типы в порядок

Всего записей: 983 | Зарегистр. 30-05-2002 | Отправлено: 13:00 11-03-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OXDBA

Цитата:
 После изменения текста запроса, параметры очищать не нужно

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

Цитата:
Prepare будет вызван автоматически, перед первым выполнением запроса, поэтому, как правило, явно его не вызывают  

как без препарирования определить параметры чтобы присвоить им значения для выполнения запроса - никак.
 
Цитата:
Вообще-то это вопросы по компонентам, а не по работе IB/FB.
Все начиналось с параметров запроса ФБ без всяких компонентов... как-то так

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 17:52 11-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noisy

Цитата:
а numeric(18,6) не влазит в numeric(16,2), вот и ошибка  

Не пишите мне отписки, пожалуйста. Этот говнокод написал я. Не Вася, Петя, Маша, Юля, которые были до меня в проекте. Этот бажный код написал я, тупой старый программист. Который рад увидеть свою ошибку, но не знает что с ней делать?
 
Вот вам лентяи:

Код:
CREATE OR ALTER procedure NEW_PROCEDURE8
returns (
    R_PERCENT numeric(18,6))
as
declare variable SUM_ROZN_REAL numeric(18,6);
declare variable SUM_OPT_REAL numeric(18,6);
begin
  SUM_ROZN_REAL = 2535.00;
  SUM_OPT_REAL = 0.01;
  r_percent = ((:SUM_ROZN_REAL/:SUM_OPT_REAL) - 1) * 100;
  suspend;
end^
 

 
R_PERCENT  - numeric(18,6)!!!!!!
 
PS, а я с вас не слезу, пока не поможете)))))
 
Добавлено:
добавлю, - после деления на копейку имеем целое число, может тут появляется конвертация в Integer. Но даже с Integer непонятно, ведь 6 бит свободны.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 18:07 11-03-2014 | Исправлено: xpin2013, 18:08 11-03-2014
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
изначально то он указан

Цитата:
r_percent   numeric(16,2)  

 
но конечно это не объясняет ошибку,  
это код будет работать
r_percent = :SUM_ROZN_REAL/:SUM_OPT_REAL - 1;
r_percent = r_percent * 100;  
 
Масштабируемые типы с фиксированной точкой

Всего записей: 983 | Зарегистр. 30-05-2002 | Отправлено: 19:23 11-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noisy
Ну да, будет работать, я хочу понять, как определить именно в моём выражении допустимые числа. Я ошибся на 6 бит - это больше чем три нуля допуска. Я ошибся более чем на тысячу в умножении. Вы можете определить допустимые величины для моей строки?
 
Хорошо. По ссылке Вы много написали, много, но я уже почувствовал направление - куда мыслить. Я хочу именно для моего выражения, именно с моими числами, определить допустимый диапазон. Я ошибся на 6 бит в умножении...
 
TypeCast-инг (преобразование типов). Результирующий тип - numeric(18,6), предупреждаю, разницы никакой decimal или numeric. Все равно ошибка, почему?????????????????????????????????????????????????????????????????????????
 
Добавлено:
noisy

Цитата:
изначально то он указан  

не указан, указывайте любой
 
Добавлено:
Хорошо, почему ошибка?

Код:
 
SET TERM ^ ;
 
CREATE OR ALTER procedure NEW_PROCEDURE8
returns (
    R_PERCENT decimal(18,6))
as
declare variable SUM_ROZN_REAL decimal(18,6);
declare variable SUM_OPT_REAL decimal(18,6);
begin
  SUM_ROZN_REAL = 1035.00;
  SUM_OPT_REAL = 0.01;
  r_percent = (:SUM_ROZN_REAL/SUM_OPT_REAL - 1) * 100;
  suspend;
end
^
 
SET TERM ; ^
 

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 19:56 11-03-2014 | Исправлено: xpin2013, 20:34 11-03-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Код:
CREATE OR ALTER procedure NEW_PROCEDURE8
returns (
    R_PERCENT numeric(18,6))
as
declare variable SUM_ROZN_REAL numeric(18,6);
declare variable SUM_OPT_REAL numeric(18,6);
begin
  SUM_ROZN_REAL = 2535.00;
  SUM_OPT_REAL = 0.01;
  r_percent = ((:SUM_ROZN_REAL/:SUM_OPT_REAL) - 1) * 100;
  suspend;
end^
 

У меня все работает ФБ156

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 05:56 12-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR

Я сейчас попытаюсь вычислить свободные биты. У меня FB25, самая лучшая из версий.
 
Добавлено:
Вот последний вариант:

Код:
SET TERM ^ ;
CREATE OR ALTER procedure NEW_PROCEDURE8
returns (
    R_PERCENT numeric(18,6))
as
declare variable SUM_ROZN_REAL numeric(18,6);
declare variable SUM_OPT_REAL numeric(18,6);
begin  
  SUM_ROZN_REAL = 922.34;
  SUM_OPT_REAL = 0.01;  
  r_percent = ((:SUM_ROZN_REAL/:SUM_OPT_REAL) - 1) * 100;  
  suspend;  
end^
SET TERM ; ^

Это работает а если напишем 922.35, то будет ошибка. Результат в хекс виде 0x8CBC84. То есть мы видим, что целый байт свободен, а лишнее неявное преобразование типа даёт ошибку...

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 07:11 12-03-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Это работает а если напишем 922.35, то будет ошибка.

В ИБ эксперте на ФБ 2.05 после того как написал 922,35
запрос select * from new_procedure8 выдал ошибку, а после переконнекта все ок.

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 08:37 12-03-2014
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
xpin2013
Почитайте как хранятся нумерики в 3-м диалекте.
Maxlonging = 9223372036854775807
В первом случае(SUM_ROZN_REAL = 922.34) результат помещается в этот лимит, во втором нет.

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 09:14 12-03-2014 | Исправлено: exteris, 09:15 12-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exteris
))) О спасибо! Начинаю понимать значение этих циферок...
 
Добавлено:
А где можно почитать, ссылочку бы от Вас.
 
Добавлено:
YuriyRR

Цитата:
а после переконнекта все ок.  

У меня после переконнекта ошибка осталась.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 10:01 12-03-2014
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Кое что на английском описано ТУТ

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 10:51 12-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо! Но кстати, там это мало что объясняет. Если int результат 9223300, то непонятно откуда у него взялись дополнительные 12 символов сзади. Число то мы нашли, а вот почему внутренние преобразования 2 раза умножить на 100 дали такую гигантскую цифру не ясно.
 
Добавлено:
Дело в том что они пишут про NUMERIC(18,S) - что это 8 байтов. А вот DOUBLE PRECISION это мол нормальный для паскаля Double.
 
Добавлено:
Добавлю http://www.firebirdfaq.org/faq207/

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 11:10 12-03-2014
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
 
хороший вопрос ты задал. я тоже, пока не нашел на него ответ.
хотя как хранятся числа в 3-м диалекте знаю, кстати почитать можно Хелен Борри. Firebird. РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ ,
но лучше книгу прикупить, что я и сделал
 

Цитата:
Maxlonging = 9223372036854775807  

это не объясняет ошибку
почему даже при принудительном округлении
r_percent = (round(SUM_ROZN_REAL/SUM_OPT_REAL , 6) - 1) * 100;
выдает ошибку?
 
буду читать... пойму почему - напишу.
 
 

Всего записей: 983 | Зарегистр. 30-05-2002 | Отправлено: 11:31 12-03-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noisy

Цитата:
буду читать... пойму почему - напишу.  

Пишите обязательно. Я вот думаю когда операция деления он рассчитывает мантиссу вверх с запасом шести знаков после запятой и когда /0.01=*100 происходит, тогда оказывается что мантисса выбрана не оптимально.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 12:05 12-03-2014
Открыть новую тему     Написать ответ в эту тему

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru