Ошибка при создании отчета
Модераторы: kdv, Alexey Kovyazin
Ошибка при создании отчета
Привет! Тут есть такая проблема: есть база данных (куча таблиц, процедур и 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'ов ничего не выявила.
Где искать ошибку?
Все работало хорошо, и тут выплыл глюк: при создании отчета (нормально до сего дня работавшего) выскакивает сообщение об ошибке: "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 писал(а):В данных, или в запросе, формирующем отчёт.
Тебе ж ясно написали - переполнение числа или строки или типа того.
В UDF'ах описана функция STRLEN, которую используют процедуры. Не подскажешь, это стандартная UDF-функция IB?
А не может глюк (по крайней мере на моей локальной машине) быть связан с тем, что накануне переставлялась система? Эта библиотека, кроме как в базе, где еще может находиться? (Я начал заниматься данным проектом совсем недавно)WildSery писал(а):Это библиотека rFunc скорее всего.
Я понимаюWildSery писал(а):Может, приведёшь наконец какую-нибудь информацию по выполняемому запросу/процедуре ?
Телепатов тут мало, все заняты

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