Модераторы: kdv, CyberMax
-
Hadroran
- Сообщения: 39
- Зарегистрирован: 22 фев 2005, 10:23
Сообщение
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
Сообщение
kdv » 11 мар 2012, 19:11
При вызове из программы с помощью компонента TpFIBStoredProc после команды ExecProc;
кто вас научил процедуру с suspend вызывать через ExecProc?
читайте
www.ibase.ru/devinfo/sp_call.htm
разделы "Процедуры с выходными параметрами" и "Селективные процедуры"
-
Hadroran
- Сообщения: 39
- Зарегистрирован: 22 фев 2005, 10:23
Сообщение
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;