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
Положу тут, чтоб не потерять.