Страница 1 из 1

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

Добавлено: 11 мар 2012, 14:19
Hadroran
В базе создал процедуру

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

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;
Помогите разобраться.

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

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

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

Добавлено: 12 мар 2012, 10:46
Hadroran
Спасибо за совет.
В итоге получилось вот так.

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

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;