Help новичку! Вопрос по функциям в IB/Firebird

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
vetal71
Сообщения: 12
Зарегистрирован: 04 сен 2007, 09:58

Help новичку! Вопрос по функциям в IB/Firebird

Сообщение vetal71 » 04 сен 2007, 10:19

Здравствуйте все. Помогите разобраться в следующем вопросе.
Есть таблица видов расчетов, где указана формула расчета типа:
formula = n1+n5+lastval(n10), где lastval - функция, которая находит значение n10 за прошлый месяц. Можно ли средствами IB/Firebird реализовать следующий запрос:
UPDATE <TABLENAME> SET n25 = <FORMULA> ?
Как заставить сервер распозанать lastval() (к примеру в Sybase есть возможность писать собственные internal функции) ? Может есть возможность использования процедуры ?
Помогите, пожалуйста, раобраться с ситуацией.
Спасибо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 сен 2007, 10:23

в IB/FB такого вида функций нет. Следовательно, нужно написать процедуру, в которой сначала надо посчитать чего там последнее, и затем присвоить это в update.

vetal71
Сообщения: 12
Зарегистрирован: 04 сен 2007, 09:58

Сообщение vetal71 » 07 сен 2007, 12:05

kdv писал(а):в IB/FB такого вида функций нет. Следовательно, нужно написать процедуру, в которой сначала надо посчитать чего там последнее, и затем присвоить это в update.
Начал пытаться, но столкнулся с такой вещью:
Код процедуры

Код: Выделить всё

CREATE PROCEDURE LASTVAL (
    RASCHID INTEGER,
    FLAG SMALLINT,
    TAB INTEGER,
    D_W DATE)
RETURNS (
    RASCH_VAL NUMERIC(15,0))
AS
DECLARE VARIABLE SQL_TEXT VARCHAR(1024); /* SQL òåêñò, äëÿ âûïîëíåíèÿ SELECT */
DECLARE VARIABLE D_R DATE; /* Ðàñ÷åòíàÿ äàòà */
begin
  RASCH_VAL = 0;
  if (FLAG = 0) then /* Íå ó÷èòûâàòü äåêàáðü*/
  BEGIN
    if (f_month(d_w) = 1) then
    BEGIN
      SUSPEND;
      EXIT;
    END
  END
  D_R = F_ADDMONTH(D_W,-1);

  SQL_TEXT = 'SELECT S'||CAST(:RASCHID AS VARCHAR(4))||
  ' FROM ZARP_ARH WHERE TAB = '||CAST(:TAB AS VARCHAR(4))||
  ' AND PERIOD = '''||CAST(:D_R AS VARCHAR(10))||'''';
  EXECUTE STATEMENT SQL_TEXT INTO :RASCH_VAL;
  suspend;
end
при вызове SELECT * FROM LASTVAL(100,0,90,'01.02.2007') выдает ошибку Unsuccessful execution caused by an unavailable resource.
Variable type (position 1) in EXECUTE STATEMENT 'SELECT S100 FROM ZARP_ARH WHERE' INTO does not match returned column type.
At procedure 'LASTVAL'.
Что здесь не так ???

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 сен 2007, 12:46

новичок, а уже полез execute statement использовать...
Что здесь не так ???
читай сообщение об ошибке. И описание синтаксиса ES.

vetal71
Сообщения: 12
Зарегистрирован: 04 сен 2007, 09:58

Сообщение vetal71 » 07 сен 2007, 13:05

kdv писал(а):новичок, а уже полез execute statement использовать...
можно конечно без execute statement, просто выполнять динамический запрос на клиенте, но все таки почему при отладке вышеуказанной процедуры в дебугере, она вернула правильное значение ?

vetal71
Сообщения: 12
Зарегистрирован: 04 сен 2007, 09:58

Сообщение vetal71 » 07 сен 2007, 13:38

kdv писал(а):читай сообщение об ошибке. И описание синтаксиса ES.
почитал, подумал, поменял rasch_val на integer и все заработало
Спасибо за ответы

Ответить