Ошибка при создании отчета

Ремонт и восстановление баз данных InterBase, Firebird, Yaffil

Модераторы: kdv, Alexey Kovyazin

Ответить
slc
Сообщения: 15
Зарегистрирован: 22 авг 2006, 11:45

Ошибка при создании отчета

Сообщение slc » 22 авг 2006, 12:10

Привет! Тут есть такая проблема: есть база данных (куча таблиц, процедур и UDF'ов). Interbase 5.5 под Win2003 Server.
Все работало хорошо, и тут выплыл глюк: при создании отчета (нормально до сего дня работавшего) выскакивает сообщение об ошибке: "Unseccessful execution caused by system error that does not preclude successful execution of subsequent statements. A fatal exception occured during the execution of a user defined function. arithmetic exception, numeric overflow, or string truncation".

Беглая проверка процедур и UDF'ов ничего не выявила.

Где искать ошибку?
Последний раз редактировалось slc 22 авг 2006, 12:16, всего редактировалось 1 раз.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 22 авг 2006, 12:14

В данных, или в запросе, формирующем отчёт.
Тебе ж ясно написали - переполнение числа или строки или типа того.

P.S. Кстати, с 5.5 следовало бы сразу на 5.6 перейти, полностью совместима, но глюков исправлено - вагон.

slc
Сообщения: 15
Зарегистрирован: 22 авг 2006, 11:45

Сообщение slc » 22 авг 2006, 12:20

WildSery писал(а):В данных, или в запросе, формирующем отчёт.
Тебе ж ясно написали - переполнение числа или строки или типа того.
Арифметических операций нет, а на предмет переполнения строки стоят проверки.

В UDF'ах описана функция STRLEN, которую используют процедуры. Не подскажешь, это стандартная UDF-функция IB?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 22 авг 2006, 12:28

Это библиотека rFunc скорее всего.

Может, приведёшь наконец какую-нибудь информацию по выполняемому запросу/процедуре ?
Телепатов тут мало, все заняты ;)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 22 авг 2006, 12:32

Удивительно что 5.5 вообще живёт на W2003.

slc
Сообщения: 15
Зарегистрирован: 22 авг 2006, 11:45

Сообщение slc » 22 авг 2006, 12:41

WildSery писал(а):Это библиотека rFunc скорее всего.
А не может глюк (по крайней мере на моей локальной машине) быть связан с тем, что накануне переставлялась система? Эта библиотека, кроме как в базе, где еще может находиться? (Я начал заниматься данным проектом совсем недавно)
WildSery писал(а):Может, приведёшь наконец какую-нибудь информацию по выполняемому запросу/процедуре ?
Телепатов тут мало, все заняты ;)
Я понимаю :). Еще временами (иногда из пользовательской программы, а иногда - при попытке запуска процедуры изнутри IBExpert'а такое сообщение: "Invalid token. invalid request BLR at offset 581. function STRLEN is not defined. module name or entrypoint could not be found".

Предположительно, ноги у глюки могут расти из этой процедуры:

===

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

CREATE PROCEDURE P_DETAILWITHBILLET (
    ID INTEGER,
    DT DATE)
RETURNS (
    REF_DETAIL INTEGER,
    REF_DATES DATE,
    NAME VARCHAR(50) CHARACTER SET NONE,
    DESIGNATION VARCHAR(50) CHARACTER SET NONE,
    NETTO DOUBLE PRECISION,
    BRUTTO DOUBLE PRECISION,
    LABOUR DOUBLE PRECISION,
    MATERIAL VARCHAR(50) CHARACTER SET NONE,
    LEND DOUBLE PRECISION,
    PARCEL INTEGER,
    LEN DOUBLE PRECISION)
AS
DECLARE VARIABLE J INTEGER;
DECLARE VARIABLE Q INTEGER;
DECLARE VARIABLE D DATE;
DECLARE VARIABLE S DOUBLE PRECISION;
DECLARE VARIABLE MAT VARCHAR(150) CHARACTER SET NONE;
BEGIN
  SELECT t.id, d.dates, t.name, t.designation, d.netto, d.brutto,
         p.name || ' ' || s.name || ' ' || m.sizes,
         d.lend, d.parcel, d.len
    FROM d_detail d, detail t, material m, sortament s, type p
    WHERE (d.ref_detail=:id) AND (d.dates=:dt) AND
          (t.id=d.ref_detail) AND (t.ref_material=m.id) AND
          (m.ref_sortament=s.id) AND (s.ref_type=p.id)
    INTO :ref_detail, :ref_dates,
         :name, :designation, :netto, :brutto, :mat, :lend, :parcel, :len;

  if (strlen(mat) > 50)
    then material = substr(mat, 1, 50);
    else material = mat;

  SELECT  SUM(l.quantity * o.rate * k.k)
    FROM  l_operationd l, d_category o, equipment e, equipment_group k
    WHERE (l.ref_category=o.ref_category) AND (l.ref_dates=o.dates) AND
          (l.ref_detail=:ref_detail) AND (l.ref_datesd=:ref_dates) and
          (l.ref_equipment = e.id) and (e.ref_group = k.id)
    INTO  :labour;

  if (parcel is not null) then
  FOR SELECT (l.quantity * o.rate * k.k) / :parcel
      FROM l_prepared l, d_category o,  equipment e, equipment_group k
      WHERE (l.ref_detail=:ref_detail) AND (l.ref_datesd=:ref_dates) AND
            (l.ref_category=o.ref_category) AND (l.ref_dates=o.dates) and
            (l.ref_equipment = e.id) and (e.ref_group = k.id)
      INTO :s
     DO
     IF (:s IS NOT NULL) THEN labour = :labour + :s;
     if (labour is null) then labour = 0;
  SUSPEND;

  FOR SELECT b.ref_billet, d.dates
      FROM billet b, d_detail d
      WHERE (b.ref_detail=:id) AND (b.ref_billet=d.ref_detail) AND
(d.dates = (SELECT MAX(dates) FROM d_detail WHERE ref_detail=d.ref_detail))
      INTO :j, :d
  DO
    FOR SELECT ref_detail, ref_dates, name, designation,
               netto, brutto, material, lend, parcel, len
        FROM p_DetailWithBillet( :j, :d )
        INTO :ref_detail, :ref_dates, :name, :designation,
             :netto, :brutto, :material, :lend, :parcel, :len
    DO SUSPEND;
END
===

Сорри за большой исходник.

slc
Сообщения: 15
Зарегистрирован: 22 авг 2006, 11:45

Сообщение slc » 22 авг 2006, 12:41

Merlin писал(а):Удивительно что 5.5 вообще живёт на W2003.
А почему бы ей и не жить? :?:

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 22 авг 2006, 14:50

Еще временами (иногда из пользовательской программы, а иногда - при попытке запуска процедуры изнутри IBExpert'а такое сообщение: "Invalid token. invalid request BLR at offset 581. function STRLEN is not defined. module name or entrypoint could not be found".
Неужели отсюда не очевидно? Посмотри как UDF STRLEN описана, если из rfunc, то ищи куда дел.
На 5.5, насколько помню, должна в C:\Program Files\InterBase Corporation\InterBase\UDF\ лежать.

slc
Сообщения: 15
Зарегистрирован: 22 авг 2006, 11:45

Сообщение slc » 22 авг 2006, 15:55

WildSery писал(а):Посмотри как UDF STRLEN описана, если из rfunc, то ищи куда дел.На 5.5, насколько помню, должна в C:\Program Files\InterBase Corporation\InterBase\UDF\ лежать.
Спасибо, нашел.

Ответить