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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

exteris

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

Код:
 
create or alter procedure new_procedure
returns (
    kol2 numeric(18,6))
as
declare variable a numeric(18,6);
begin  
  a = 2;
  kol2 = a*a*a;
--  kol2 = a*a*a*a;
  suspend;
end^
 

Отработает нормально, так как 6+6+6 знаков после запятой = 18, влезает. А вот больше уже нет, у FB ограничение на 18 знаков после запятой. Не согласен с таким поведением, поэтому стараюсь не использовать нумерики.

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 15:06 02-04-2012
ant0ni02004

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

Цитата:
если я убираю *:NACEN_OPT_NDS то ошибка исчезает


Цитата:
процедура не может умножить 0.040800 на 18.0

 
с одной стороны должно получится ровно 0,7344
а с другой там вполне может быть что-то типа 0,73499999999... что уже не влазит в (18,6)
 
попробуйте всё выражение завернуть в ROUND до 6 знаков после запятой
 
как-то так:

Код:
 
KOL2 = round(((:KOL_ALL*Round(:CENA1*:sto)/:sto)/:sto)*:NACEN_OPT_NDS,6);
 


Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 17:39 02-04-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ant0ni02004
Это весело было бы просто шикарно, но более половины клиентов не хотят переходить на FireBird 2.5. Они ползают на 1.5, и SQL строится с учётом этого. Round с дополнительным параметром в 1.5 не работает, грехи мои тяжкие.
 
Добавлено:
exteris
Спасибо, реально натолкнуло мыслить в нужном направлении. Думаю экспрессии более 3х роскошь. Numeric так же как и тип Extended (в пример Delphi 64), я считаю очень достойными типами данных. Вполне состоятельные типы данных без влияния директората. Прежде чем оспаривать - предложу изучить типы с плавающей точкой в Linux. Extended конечно только Delphi компилятор знает, но в Linux есть тоже точные типы данных, но эта тема не для этого топика. Итог:
 
exteris - моя уважуха...

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 18:47 02-04-2012
ant0ni02004

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

Цитата:
Они ползают на 1.5

как я Вас понимаю... аналогичная фигня
 
для Firebird 1.5 есть UDF rfunc.dll, там "более правильный" round (и много чего другого)

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 20:42 02-04-2012 | Исправлено: ant0ni02004, 20:45 02-04-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ant0ni02004
Благодарю
 
Фибрахи спасибо за фильтры

 
Добавлено:
А вопрос если ATD не корректный как от фибов узнать об ошибке?

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 21:07 03-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тема уже наверное 100500 изъезжена, но все же... подскажите, каким образом лучше всего реализовать автоинкремент?
FB 2.5 + Delphi 7. Пока лучше идеи генератора идей в голову не приходило..
p.s. RETURNING ID в делфе, насколько я понял, не поддерживается

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 11:03 07-05-2012
X11



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

Цитата:
RETURNING ID в делфе, насколько я понял, не поддерживается

Дельфи тут при чем?
RETURNING ID - это SQL
в чем сложность-то?
 
 

Цитата:
каким образом лучше всего реализовать автоинкремент?  

В огнептице генератор+триггер перед добавлением. И только такой будет путь будет наиболее правильный.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 11:37 07-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
X11
А вытягивать значение добавленного поля каким образом? В триггере влупить возвращаемое значение?

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 11:39 07-05-2012
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а что такое "значение добавленного поля" О_о

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 11:50 07-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
X11
В программе мы делаем запрос INSERT, не указывая ID, его нам делает триггер при помощи генератора. Но в программе нам надо получить этот ID, который только что был добавлен. В этом собственно говоря и вопрос. С returning id однозанчно какой-то подвох, потому что все жалуются, что его из квери не получается вытянуть.

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 11:54 07-05-2012
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
значение ключевого поля при добавлении новой записи можно получить примерно так
 
в запросе: insert .... returning ID
 
query.open(или execSQL)// добавляется запись
iNewID := query.Fields[0].AsInt64;//получаем новый ID (значение ключевого поля)
spTREKLAMA_INS.Close;//закрываем кверю
 
Что сложного?
Сложить в уме добавление записи INSERT + получение значения нужно поля SELECT (В данном случае returning)
 
Я уверен, что в тырнете есть примеры. Почему их не посмотреть?
 
Добавлено:

Цитата:
С returning id однозанчно какой-то подвох, потому что все жалуются, что его из квери не получается вытянуть.  

 
ВСЕ???!!!!
Первый раз вижу такое сообщение!
И не нужно отвечать за всех пока сам не выучил матчасть.

----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 11:56 07-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
X11
Все получилось. Спасибо. И чего ж я столько мучался-то.
Может, IBDAC кривой компонент был..
Спасибо еще раз.

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 12:21 07-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Автоинкремент конечно ключевое понятие, и проблемм с автоинкрементом нет ни в FIB-ах ни в стандартных IB нет их даже в Вижуал Студио+FB, тоже мне надо было. Однако матчасть по этому явлению родила много чего в чём легко заблудится. Например 3 автоинкремента на одну таблицу - зачем это может понадобиться? Простите ламера - имхо. Второе - если автоинкремент работает стабильно, те как положено, то это поле уникальное в принципе, даже для Int32 инкремента - это 4 миллиарда записей. (В FB базе с двумя таблицами по 3 миллиона уже сложно работать - ждёшь по 3 минуты так как все процедуры делает сервер и техподдержка - дело не в ФБ а в практике). Так вот почему автоинкрементное поле не индексируется изначально?
 
Ну и теперь запретная тема - индексы. Написав свою БД с индексами просто уже стало очевидно, что SQL - это язык запросов... ) Пользуватели пишут очень сложный математический SQL запрос который работает медленно потому что сервер вынужден делать за программиста предположения об использовании индекса. Масса примеров когда сервер неспособен вычленить из SQL запроса обязательное условие - мастер детейл, который сократит операцию по времени в 100 раз. В интербейзе 2 способа - писать OrderBy или Plan, но оба способа совершенно не подходят. OrderBy - теряет реальную последовательность, Plan - не вычленяет главного условия как мастер-детейл. Так что тут либо пользователи ущербны - либо SQL как язык запросов, не обеспечивающий требуемого быстродействия. В общем Автоинкремент оброс массой ненужного и не приобрёл полезного. В моей демонстрашке 3 миллиона записей по мастер детейлу фильтруются за одну миллисекунду примерно - глаз не замечает. При этом стандартный фильтр от Delphi делает это примерно минуту. Так что и выводы об необходимости первичного индекса в SQL запросе я уже сделал.
 
Добавлено:
Я бы расширил SQL язык просто из тех принципов что слова Master-Detail поймёт даже тех поддержка не умеющая писать план индексов. Даже из того что Мастер детайл это заведомо небольшое количество записей в считанные миллисикунды. И даже из того принципа что это заведомо экономит электроэнергию. Стандарт SQL не ставит похоже экономию электроэнергии, пока не ставит, на должное место.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 15:51 09-05-2012 | Исправлено: delover, 16:08 09-05-2012
X11



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

Цитата:
Так вот почему автоинкрементное поле не индексируется изначально?  

индекс по ключевому полю создается автоматически

Код:
ALTER TABLE OBJNAME ADD CONSTRAINT PK_OBJNAME PRIMARY KEY (ID);



----------
/не мы такие, жизнь такая/

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 16:16 09-05-2012
delover

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

Цитата:
индекс по ключевому полю создается автоматически  

Да впереди я писал про автоинкремент - их может быть 8 автоинкрементов - ключевое поле одно. Да и вообще я пто такой SQL
Подробнее...
Я примерно про такой SQL.
 
Добавлено:
Да и PrimaryKey придуман не для одного поля - например их может быть 2. А SQL сервер тупо не знает что я оба поля задал.
 
Добавлено:


Для меня SQL - это япришол в ресторан. В яйцах курицы есть всё что мне нравится, но то что принёс повар мне не нравится - либо курица виновата либо повар. Будь я не глуп и напиши this или мастер-детейл - я знал что пишу, но повар не знал... this может быть равно может быть бетвин а может быть >CURRENT_DATE. Если я писал дату я знал что делаю, но серверу увы это всё неведомо...
 
Добавлено:
Тут ключевое слово Optimal, Но Optimal id=:mas_id мне не очень, тут я боюсь повлиять. Если юзер уверен в оптимальности пусть будет уверен, но всем юзерам не надо знать что это способ оптимизировать. По этому я не знаю как лучше это в английском запросе.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 17:17 09-05-2012 | Исправлено: delover, 06:43 11-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это как в семье ((((. Я ей говорю - я мужик я сказал что тебя жду. Она говорит ага - щас уйду и ты заснёш.
Моё слово не дождался никто, но ладно у меня forewer, или forever.
 
Добавлено:
зы
Тему не афишируем - локальное индексирование на клиент датасете, и можно мимо багов.  
 
Добавлено:
Это не основная моя мысль. Я хотел пообщаться вобщето. Баги не обязательное явление сейчас.
 
Добавлено:
Тема закрыта я не виноват

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 20:20 09-05-2012 | Исправлено: delover, 05:14 10-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Limp Bizkit - Take a Look Around

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 22:33 09-05-2012 | Исправлено: delover, 06:42 11-05-2012
AlexCoRu

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

Цитата:
А SQL сервер тупо не знает что я оба поля задал.
???

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 22:47 09-05-2012
SevereK20

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в хорошее направление пошла беседа)))))

Всего записей: 7699 | Зарегистр. 07-05-2010 | Отправлено: 23:08 09-05-2012
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
Незнаю запрос один ковырял, как ни кручу - неиндексированное чтение. Выполняется долго, а по идее должен быстро. Когда смотрел таблицу - там составной примари, думаю из-за этого.
 
Добавлено:
Ага OrderBy пишу - схватывает индекс.
 
Добавлено:
Во ещё один запрос ковыряю - пишу OrderBy всё равно не индексированное чтение. Да мне хоть в каком порядке давай - юзай индексы. Я из одной хранимки другую for селектю и потом уже сортирую. Был бы я автором Файрборды я бы расцеловал юзера который мне бы сказал - хочу мастер-детайл показать.
 
Добавлено:
У меня проблеммы только с названием, то я хочу написать Майн, то я хочу написать Детайл. Похоже это главное препятствие к тому чтобы всем было лучше.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 05:16 10-05-2012
Открыть новую тему     Написать ответ в эту тему

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