Ошибка при вызове процедуры "XSQLDA index out of range"

Модераторы: kdv, CyberMax

Ответить
Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Ошибка при вызове процедуры "XSQLDA index out of range"

Сообщение Hadroran » 11 мар 2012, 14:19

В базе создал процедуру

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

create or alter procedure GET_LAST_NUMBER
returns (
    OUT_VAL integer)
as
declare variable I_REZ integer;
declare variable I_ORD integer;
declare variable I_SAL integer;
declare variable I_NUL integer;
begin
  /* Находим максимальное значение номера резервов */
  I_NUL = 0;
  for select R_NUMDOC
      from D_REZERVE
      where ID_CODE > 0
      into :I_REZ
  do
  begin
    if (:I_NUL < :I_REZ) then
      I_NUL = :I_REZ;
  end
  I_REZ = :I_NUL;
  /* Находим максимальное значение номера продаж */
  I_NUL = 0;
  for select S_NUMDOC
      from D_SALES
      where ID_CODE > 0
      into :I_SAL
  do
  begin
    if (:I_NUL < :I_SAL) then
      I_NUL = :I_SAL;
  end
  I_SAL = :I_NUL;
  /* Находим максимальное значение номера заказов */
  I_NUL = 0;
  for select O_NUMDOC
      from D_ORDER
      where ID_CODE > 0
      into :I_ORD
  do
  begin
    if (:I_NUL < :I_ORD) then
      I_NUL = :I_ORD;
  end
  I_ORD = :I_NUL;
  /* Находим максимальное значение их всех номеров */
  OUT_VAL = :I_REZ;
  if (:OUT_VAL < :I_ORD) then
    OUT_VAL = :I_ORD;
  if (:OUT_VAL < :I_SAL) then
    OUT_VAL = :I_SAL;
  OUT_VAL = :OUT_VAL + 1;
  suspend;
end
При отладке в IBExpert все проходит нормально. При вызове из программы с помощью компонента TpFIBStoredProc после команды ExecProc;
Помогите разобраться.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Ошибка при вызове процедуры "XSQLDA index out of range"

Сообщение kdv » 11 мар 2012, 19:11

При вызове из программы с помощью компонента TpFIBStoredProc после команды ExecProc;
кто вас научил процедуру с suspend вызывать через ExecProc?
читайте
www.ibase.ru/devinfo/sp_call.htm
разделы "Процедуры с выходными параметрами" и "Селективные процедуры"

Hadroran
Сообщения: 39
Зарегистрирован: 22 фев 2005, 10:23

Re: Ошибка при вызове процедуры "XSQLDA index out of range"

Сообщение Hadroran » 12 мар 2012, 10:46

Спасибо за совет.
В итоге получилось вот так.

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

create or alter procedure GET_LAST_NUMBER
returns (
    OUT_VAL integer)
as
declare variable I_REZ integer;
declare variable I_ORD integer;
declare variable I_SAL integer;
begin
  select max(R.R_NUMDOC), max(S.S_NUMDOC), max(O.O_NUMDOC)
  from D_REZERVE R, D_SALES S, D_ORDER O
  into :I_REZ, :I_SAL, :I_ORD;

  OUT_VAL = :I_REZ;
  if (:OUT_VAL < :I_ORD) then
    OUT_VAL = :I_ORD;
  if (:OUT_VAL < :I_SAL) then
    OUT_VAL = :I_SAL;
  OUT_VAL = :OUT_VAL + 1;
end
И вызов из программы:

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

function TDM.GetLastNumber: integer;
begin
  with FIBSQL do
    begin
      Close;
      SQL.Clear;
      SQL.Append('execute procedure GET_LAST_NUMBER');
      SaveRequest('QueryExe',SQL.Text);
      ExecQuery;
      Result:=Current[0].AsInteger;
    end;
end;

Ответить