Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Суммирование значений в исполняемой процедуре


Автор: Nappy 20.5.2009, 13:19
Здравствуйте, помогите правильно написать хранимую процедуру.

Firebird 1,5, BDE

есть хранимая процедура, возвращает 4 поля. Одно из полей - стоимость - STOIM_RAB типа numeric (15,2). 

Можно ли получить еще одно поле, в котором была бы итоговая сумма значений поля стоимость. 
 код ХП:
Код

CREATE PROCEDURE STOIM_ISSLED (
    DATE_BEGIN DATE,
    DATE_END DATE)
RETURNS (
    DATE_PODACHI DATE,
    NAIM_OBORUD VARCHAR(100),
    VREM_RAB NUMERIC(15,1),
    STOIM_RAB NUMERIC(15,2))
AS
BEGIN
for
SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
   (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB
FROM
  oborudovanie
  INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)
where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)
INTO
:date_podachi,
:naim_oborud,
:vrem_rab,
:stoim_rab
 do 
 begin 
  SUSPEND;
 end
END


заранее спасибо.

Автор: Akella 20.5.2009, 17:23
Можно, используй в запросе SUM(суммируемое поле), тогда нужно группировку включать.

Автор: Easy 20.5.2009, 21:20
в селекте пишу так: 

Код

SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB,  
     sum ((zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB))

FROM oborudovanie

  INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)

where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)

  group by (:stoim_rab)


подскажите, плиз в чем ошибка

Автор: Akella 20.5.2009, 21:26
Где ошибка?

Добавлено через 12 секунд
Текст ошибки...

Автор: Easy 21.5.2009, 23:08
пишет 
Код

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 25, char 12.

 и предлагает только откат транзакции

Автор: Akella 21.5.2009, 23:19
Цитата(Easy @  21.5.2009,  23:08 Найти цитируемый пост)
Token unknown - line 25, char 12.

а ниже что? про какой именно токен?

Автор: Easy 21.5.2009, 23:31
Код

ALTER PROCEDURE STOIM_ISSLED (
    DATE_BEGIN DATE,
    DATE_END DATE)
RETURNS (
    DATE_PODACHI DATE,
    NAIM_OBORUD VARCHAR(100),
    VREM_RAB NUMERIC(5,1),
    STOIM_RAB NUMERIC(15,2))
AS
BEGIN
for
SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB,  
     sum ((zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB))

FROM oborudovanie

  INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)

where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)

  group by (:stoim_rab)

INTO
:date_podachi,
:naim_oborud,
:vrem_rab,
:stoim_rab


 do 
 begin 
  SUSPEND;
 end
END

Автор: Gluttton 22.5.2009, 00:06
Цитата

    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB,  
     sum ((zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB))


В SELECT'е 1, 2, 3, 4, 5 столбцов, а

Цитата

  group by (:stoim_rab)


в GROUP BY 1 (и помоему "левый"), а не 4.

Рекомендую, перед тем как создавать процедуру, "погонять" запрос обычным SELECT'ом, и лишь когда запрос будет работать коректно, "обернуть" его в процедуру (опыт выстраданый smile рекомендую прислушаться smile )!

Автор: Easy 22.5.2009, 00:16
Цитата(Gluttton @  22.5.2009,  00:06 Найти цитируемый пост)
Рекомендую, перед тем как создавать процедуру, "погонять" запрос обычным SELECT'ом, и лишь когда запрос будет работать коректно, "обернуть" его в процедуру (опыт выстраданый  рекомендую прислушаться  )!


спс за совет smile буду дальше разбираться

Добавлено @ 00:25
а может кто-нибудь показать пример создания хранимой процедуры с оператором SUM и выборкой данных из нескольких таблиц? smile 
тогда по образцу будет легче делать.

Автор: Akella 22.5.2009, 00:31
Быть может здесь в переменную нужно суммировать с учётом For Select?

Автор: Nappy 22.5.2009, 12:35
Akella, спасибо за помощь. Проблема решилась несколько другим путем, вот так
Код

CREATE PROCEDURE STOIM_ISSLED (
    DATE_BEGIN DATE,
    DATE_END DATE)
RETURNS (
    DATE_PODACHI DATE,
    NAIM_OBORUD VARCHAR(100),
    VREM_RAB NUMERIC(15,1),
    STOIM_RAB NUMERIC(15,2),
    STOIM NUMERIC(15,2))
AS

declare variable l_stoim_rab numeric(15, 2);
BEGIN
  stoim_rab = 0;
for
  SELECT 
    zayavka.date_podachi,
    oborudovanie.naimenovan_oborud,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173 as VREM_RAB,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOim,
    (zayavka.vrem_okonchan_rabot - zayavka.vrem_nachala_rabot)/24/173*(OBORUDOVANIE.STOIM_CHASA_RAB) as STOIM_RAB
  FROM 
    oborudovanie
    INNER JOIN ZAYAVKA ON (oborudovanie.id_oborudovanie = ZAYAVKA.id_oborudovanie)
  where  ( :date_begin < zayavka.date_podachi and zayavka.date_podachi < :date_end)
INTO
  :date_podachi,
  :naim_oborud,
  :vrem_rab,
  :stoim,
  :l_stoim_rab
DO 
  begin 
    stoim_rab = stoim_rab + l_stoim_rab;
    SUSPEND;
  end
END

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)