Firebird: вычисление пользовательских формул.

Модератор: Модераторы

Re: Firebird: вычисление пользовательских формул.

Сообщение wofs » 02.04.2018 19:23:32

alexs писал(а):Как вариант - можно сделать простейший парсер-компилятор на стороне клиента. Его задача будет превращать конструкции из формата fpexprpars в формат функций firebird-а. И передовать в базу уже готовые выражения SQL для выполнения через execute.

Это для меня пока недостижимо. Но есть одна идея, требующая проверки на практике.
alexs писал(а):Кстати - если использовать FB3 - то там уже есть полноценные функции.

Да, у меня FB3. Посмотрю, спасибо!

Код: Выделить всё
Меня все устраивает в синтаксисе SQL для формул кроме треклятого CASE THEN END.... IF(,,) смотрится менее громоздко.

Ух, ты IIF есть.

Да и с бух округлением не знаю как в SQL - надо посмотреть.

А никак
Код: Выделить всё
Round(2.5) = 3

А должно быть
Код: Выделить всё
Round(2.5) = 2

Буду писать свою...

Добавлено спустя 4 часа 9 минут 20 секунд:
wofs писал(а):Буду писать свою...

Содрал у оракловодов:
Код: Выделить всё
//Банковское округление чисел Firebird 3.0
CREATE OR ALTER FUNCTION RND (
    VAL NUMERIC(15,4),
    RND_DIGIT INTEGER)
RETURNS NUMERIC(15,4)
AS
DECLARE VARIABLE V_RND_DIGIT INTEGER;
DECLARE VARIABLE V_REMAINDER NUMERIC(15,4);
BEGIN
V_RND_DIGIT = TRUNC(RND_DIGIT);

V_REMAINDER = (VAL - TRUNC(VAL,V_RND_DIGIT)) * POWER(10,V_RND_DIGIT + 1);

RETURN IIF (ABS(V_REMAINDER) < 5 OR (ABS(V_REMAINDER) = 5 AND MOD(TRUNC(VAL * POWER(10,V_RND_DIGIT)),2) = 0),
   TRUNC(VAL,V_RND_DIGIT)
,
   ROUND(VAL,V_RND_DIGIT));
END

На контрольной группе вроде работает.
Пример из википедии тоже норм:
Код: Выделить всё
2,5 → 2
3,5 → 4

Положу тут, чтоб не потерять.
Последний раз редактировалось wofs 05.04.2018 11:57:59, всего редактировалось 2 раз(а).
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Firebird: вычисление пользовательских формул.

Сообщение *Rik* » 03.04.2018 08:14:23

Можно ещё EXECUTE BLOCK использовать, только столбцы заранее существовать должны, их лучше заранее сделать с запасом на будущее. Вообще смешивать DDL и DML зло.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 426
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Firebird: вычисление пользовательских формул.

Сообщение alexs » 03.04.2018 09:12:44

olegy123
А что не так? При хорошем наборе функций в базе вообще ничего не надо переписывать. Если все вычисления идут в рамках одной строки данных. Если есть зависимости от других даных/таблиц - то тут надо подумать немного. В этой ситуации очень хороши возможности 3-й птицы.
*Rik* писал(а):Вообще смешивать DDL и DML зло.

При грамотно спроектированной структуре в данной ситуации этого не будет.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird: вычисление пользовательских формул.

Сообщение olegy123 » 04.04.2018 21:43:09

alexs писал(а):А что не так?

Все так. При вариативном "клиентском" использовании проще сделать некий транслятор из языка верхнего уровня в низкий SQL. Чтобы клиент написал хитрую функцию, в итоге получил хитрый SQL запрос.
Но лучше бы если внутри процедуры можно было генерировать результат или SQL запрос на итоговый реузльтат, тогда можно получить на уровне SQL сервера практически трехзвенку. Клиент тут будет тонким.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Пред.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru