Varchar i obciecie ciagu

0

Witam. Poniżej mam procedure i komunikat. Moim zdaniem problem jest w NRPARTII, bo gdy wprowadzam w debuggerze na wejście np 14011042 to nie przekształca mi na varchar tylko wyskakuje komunikat

Treść : fMnu.fProcDef.DMProcDef.fProcDefEd.stQr.SelectQuery:
Can't format message 13:198 -- message file C:\Windows\firebird.msg not found.
Arithmetic exception, numeric overflow, or string truncation.
Numeric value is out of range.

poniżej błąd przy tworzeniu procedury w IBExpert i sama procedura

can't format message 13:393 -- message file C:\Windows\firebird.msg not found.
unsuccessful metadata update.
STORE RDB$PROCEDURES failed.
Malformed string.

 CREATE PROCEDURE SP$_ANALIZA_PRODUKTU_V1
(
  NRPARTII VARCHAR(60)
)
RETURNS
(
  KOMUNIKAT VARCHAR(60)
)
AS
  DECLARE VARIABLE ID_POZ_MIESZANIE INTEGER;
  DECLARE VARIABLE NRDOSTAWY VARCHAR(60);
  DECLARE VARIABLE ID_KARTOTEKA INTEGER;
  DECLARE VARIABLE DATA TIMESTAMP;
  DECLARE VARIABLE ILOSC NUMERIC(18,4);
  DECLARE VARIABLE ID_DOSTAWA INTEGER;
  DECLARE VARIABLE ID_POZ INTEGER;
  DECLARE VARIABLE ID_NAGL INTEGER;
BEGIN
  if (trim(:nrpartii) <> '') then
  begin
  
      if (position('(10)' in :nrpartii) > 0) then
          nrpartii = substr(:nrpartii, position('(10)' in :nrpartii) + 4, char_length(:nrpartii));
  
      /* MIESZANIE */
  
      select first 1 d.id_dostawa, d.id_poz, d.nrdostawy, k.id_kartoteka, d.datadok, d.iloscdost from dostawa d
      join kartoteka k on d.id_kartoteka = k.id_kartoteka
      where trim(d.nrdostawy) = :nrpartii
      order by d.datadok desc
      into :id_dostawa, :id_poz_mieszanie, :nrdostawy, :id_kartoteka, :data, :ilosc;
  
      insert into arit_analiza_produktu (id_dostawa, id_kartoteka, nrdostawy, data, ilosc, mieszanie, pakowanie)
          values (:id_dostawa, :id_kartoteka, :nrdostawy, :data, :ilosc, 1, 0);
  
      /* POBIERANIE SUROWCÓW */
  
      select  id_nagl from poz
      where id_poz = :id_poz_mieszanie
      into :id_nagl;
  
      SELECT  Id_NaglCzym
      FROM NAGLSPRZ
      WHERE
      ( RODZAJSPRZNAGL = 25 AND Id_NaglCo = :id_nagl)
      into :id_nagl;
  
      for SELECT P.ID_POZ, r.id_dostawa
          FROM  POZ P
          JOIN POZKPRZPMAT PM ON PM.ID_POZ = P.ID_POZ
          JOIN KARTOTEKA K ON K.ID_KARTOTEKA = P.ID_KARTOTEKA
          left join rozchdost r on p.id_poz = r.id_poz
          WHERE
              ( P.ID_NAGL = :id_nagl)
          into :id_poz, :id_dostawa do
      begin
          
          insert into arit_analiza_produktu_skladniki (id_poz, id_dostawa)
              values (:id_poz, :id_dostawa);
  
      end
  
      /* PAKOWANIE */
  
     select  id_dostawa from dostawa
      where id_poz = :id_poz_mieszanie
      into :id_dostawa;
  
      for   select  id_poz from rozchdost
          where id_dostawa = :id_dostawa
          into :id_poz do
      begin
  
          select id_nagl from poz
          where id_poz = :id_poz
          into :id_nagl;
  
          select id_naglco from naglsprz
          where id_naglczym = :id_nagl
          into :id_nagl;
  
          select first 1 id_poz from poz
          where id_nagl = :id_nagl
          into :id_poz;
  
          select   d.id_dostawa, d.nrdostawy, k.id_kartoteka, d.datadok, d.iloscdost from dostawa d
          join kartoteka k on d.id_kartoteka = k.id_kartoteka
          where d.id_poz = :id_poz
          into :id_dostawa, :nrdostawy, :id_kartoteka, :data, :ilosc;
  
          insert into arit_analiza_produktu (id_dostawa, id_kartoteka, nrdostawy, data, ilosc, mieszanie, pakowanie)
              values (:id_dostawa, :id_kartoteka, :nrdostawy, :data, :ilosc, 0, 1);
  
      end
  
  
  end
  
  komunikat = 'Raport wygenerowany.';
  
  suspend;
END
0

macie jakieś pomysły, bo nigdzie nie mogę znaleźć sensownego rozwiązania

0
  1. Wrzuć plik firebird.msg z ../firebird2_5/bin do *C:\Windows*
  2. Masz polskie znaki w procedurze, baza jest w win1250, ale metadane w UTF (na FB2.5.x już takie działanie nie przejdzie - malformed string). Wrzuć bazę do katalogu ../firebird2_5/bin i zrób plik cos.bat, wklej tekst z niżej i uruchom: cos.bat nazwa_bazy_bez_rozszerzenia (rozszerzenie .fdb):
gfix -v  -f     -i          -user sysdba -password masterkey %.FDB
gfix -mend -i  -f           -user sysdba -password masterkey %.FDB
gbak -B -i                  -user sysdba -pas      masterkey %.FDB %.FCP
gbak -REP                   -user sysdba -pas      masterkey %.FCP %.FDB 
gfix -online                -user sysdba -password masterkey %.FDB
  1. Pokaż jak wywołujesz procedurę.
0

ok super pomogło :) ale teraz po wpisaniu na wejście wartości 140912001 wyskakuje błąd poniżej zaprezentowany. Czyżby ten parametr wejściowy wpisywał jako integer i nie zamieniał na varchar?? :O

d77722f879.png

bf49c57743.png

0
  1. Błąd numeric value is out of range wskazuje na problem z wielkością numeric(18,4), gdzieś przy cast`owaniu na int, przy insercie lub przypisywaniu do zmiennej. Bez struktury więcej nie wywróżę.
  2. Strasznie to wszystko dziwnie zrobione. Słyszałeś o insert into ... select...?
0

Procedura nie jest mojego autorstwa, ja mam tylko wyeliminować błąd i jak najmniej ingerować w kod

0

Zmień NUMERIC(18,4) na NUMERIC(15,4). Jak nie zadziała daj strukturę tabelek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1