2014-09-10 2 views
3

Привет, есть таблица, которая получает данные из процедуры, процедура работает нормально, но при попытке вставить эти данные я получаю арифметическую ошибку, и я не уверен, как вы ее устраняете. любая помощь будет оценена по достоинству.Ошибка арифметического переполнения -802

здесь процедура:

SET TERM^; 
CREATE PROCEDURE REPORT_CONTROLLEDGER (
    DATESTART Date, 
    DATEEND Date, 
    INCOMPANYID Integer) 
RETURNS (
    GLCODE Varchar(8), 
    DATUM Date, 
    PERIOD Varchar(2), 
    SOURCE Varchar(30), 
    REFERENCENO Varchar(200), 
    GLDESCRIPTION Varchar(200), 
    DESCRIPTION Varchar(1000), 
    DR Numeric(10,2), 
    CR Numeric(10,2), 
    COSTCODE Varchar(8), 
    BALANCE Numeric(10,2), 
    COMPANYID Integer) 
AS 
    declare lastglcode varchar (8); 
    declare grouptype integer; 
    declare tglcode varchar (8); 
    declare tdatum date; 
    declare tperiod varchar (2); 
    declare tsource varchar (30); 
    declare treferenceno varchar (200); 
    declare tdescription varchar (1000); 
    declare tdr numeric (10,2); 
    declare tcr numeric (10,2); 
    declare tcostcode varchar (8); 


begin 
    lastglcode = ''; 
    balance = 0; 
    companyid = incompanyid; 
    for select glcode, datum, period, source, referenceno, description, dr, cr, costcode from controlledger where companyid = :companyid and datum between :datestart and :dateend order by GLCODE, datum, id 
    into tglcode, tdatum, tperiod, tsource, treferenceno, tdescription, tdr, tcr, tcostcode 
do 
begin 
    select description from subcode where glcode = :tglcode and companyid = :companyid into :gldescription; 
    if (lastglcode <> tglcode) then 
    begin 
    select grouptype from subcode where glcode = :tglcode and companyid = :companyid into :grouptype; 

    if (grouptype = 1) then 
    begin 
    select sum (dr - cr) from CONTROLLEDGER where companyid = :companyid and glcode = :tglcode and datum < :datestart into :balance; 
    if (balance is null) then balance = 0; 
    glcode = tglcode; 
    referenceno = null; 
    description = 'Balance Brought Forward'; 
    cr = null; 
    dr = null; 
    source = null; 
    costcode = null; 
    datum = null; 
    period = null; -- added by Andre 
    suspend; 

    end 
    else 
    begin 
    balance = 0; 
    end 
    lastglcode = tglcode; 
end 
glcode = tglcode; 
referenceno = treferenceno; 
description = tdescription; 
cr = tcr; 
dr = tdr; 
source = tsource; 
costcode = tcostcode; 
datum = tdatum; 
period = tperiod; -- added by Andre 

balance = balance + (tdr - tcr); 
suspend; 
end 

end^ 
SET TERM ;^

GRANT EXECUTE 
ON PROCEDURE REPORT_CONTROLLEDGER TO SYSDBA; 

здесь заявление вставки:

insert into tblreport_ledgercontrol select cast('03/01/2013' as date), 
      cast('04/30/2014' as date), 
      iif(cl.DATUM is null, 'now', cl.DATUM)as datum, 
      'Detailed Ledger Report from 0000.000 to 9999.999 for period 01/03/2013 to 30/04/2014' as reporttitle, 
       'ubuntu' as processedby, 
       iif(cl.GLCODE is null, 00, cl.GLCODE)as glcode, 
       iif(cl.PERIOD is null, 0 , cl.PERIOD)as period, 
       iif(cl.SOURCE is null, 'n/a', cl.SOURCE)as source, 
       iif(cl.REFERENCENO is null, 'n/a', cl.REFERENCENO)as referenceno, 
       cl.GLDESCRIPTION, 
       cl.DESCRIPTION, 
       iif(cl.dr is null, 0, cl.dr)as dr, 
       iif(cl.cr is null, 0, cl.cr)as cr, 
       iif(cl.COSTCODE is null, 00, cl.COSTCODE)as costcode, 
       cl.BALANCE, 
       cl.COMPANYID, 
       955, 
       gen_id (GEN_TBLREPORT_LEDGERCONTROL_ID, 1) 
     from report_controlledger ('03/01/2013','04/30/2014', 676) cl 

ответ

0

Благодарим вас за ввод данных, вы не были вдали от того, что было не так. Процедура позволила описанию быть varchar (1000), в то время как таблица, в которую она была вставлена, позволила описанию быть varchar (200), и это вызвало ошибку переполнения.

Душой здесь было изменение поля описания в таблице назначения на blob или увеличение размера символа описания в соответствии с процедурой, использующей инструкцию alter.

СУБД Firebird:

alter table TBLREPORT_LEDGERCONTROL alter description type varchar(1000) 
+0

Хорошо. Говорит ли Firebird SQL «арифметическое переполнение», когда это ошибка усечения? – programmer43229

+0

на самом деле говорит как об арифметическом переполнении, так и об ошибке строчки строки. что делает его немного трудно понять, особенно когда у вас есть числовые поля. мое скромное мнение –

0

Я считаю, что числовое переполнение означает, что вы пытаетесь поставить 5 цифр в поле с 4 цифр. (то есть: не может вставить 12345 в цифровую колонку (4,0))

Смежные вопросы