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





